Ik gebruik hier de pulseIn() functie, die werkt op elke pin om een willekeurige puls op te pikken. Pin 2 en 3 op de UNO zijn de z.g. hardware interrupt pins. Je kunt daarmee een "Interrupt Service Routine" (ISR) op elk moment aanroepen, ongeacht wat de rest van het programma aan het doen is. Kijk eens naar de code die ik plaatste in post #30, daar worden zelfs beide interrupt pins gebruikt voor twee verschillend kanalen, maar die wel allebei dezelfde ISR aanroepen op het moment dat de status van de pin wijzigt van 0 naar 1 of omgekeerd. Met slimme code worden dan vervolgens de twee uit elkaar gehaald en de tijd tussen 0>1 en 1>0 gemeten, die dan vervolgens weer de variabele met dezelfde naam in de loop wijzigt. Die variabele moet daarom ook als "volatile" bestemd worden, oftewel gevoelig voor wijzigingen die door andere code routines buiten de hoofd-loop gegenereerd worden.
Ook de synchronisatie van inkomende en uitgaande pulsen wordt op dezelfde manier geregeld ( variabele "sync") met een while() loop die uitvoering van de hoofd-loop tegenhoud totdat sync false wordt vanuit de ISR, waardoor de while()-loop verlaten wordt.
Ik heb pin 4 als pulse input gekozen in de huidige code, maar als je niet ook met interrupt werkt is er niets op tegen om 2 of 3 te specificeren.
De squigly duidt op een mogelijke PWM output, dus een pseudo-analoge output pin. Daarmee kun je een analoge waarde simuleren door de pin snel tussen 1 en 0 te laten variëren met een regelbare verhouding en een vaste herhaalfrequentie. Daarmee kun je een gewenste pulslengte genereren, maar ik vind dat onoverzichtelijk. Bovendien is de herhaalfrequentie veel te snel voor een gemiddelde servo, in plaats van 50 Hz gaat dat met 490 Hz (pins 3,9,10,11) of zelfs 980 Hz (pins 5 en 6). Niet alle servo's kunnen daartegen, zeker de analoge types niet. Bovendien is de standaard PWM aansturing te maken met een variabele tussen 0 en 255 (8-bits), waarvan je dus moet berekenen hoe groot die stap moet zijn om de gewenste servopuls te genereren, en dat moet kleiner zijn dan 255, want daarmee genereer je een continue 1 op de pin. Pin 5 en 6 zijn volgens mij helemaal niet bruikbaar voor dat doel, dus houdt je nog maar 4 uitgangen over.
Ik gebruik de Servo_h library om de pulsen te genereren, klaarblijkelijk werkt dat goed op alle digitale pins (inclusief A0 t/m A5), met het bijkomende voordeel dat de herhaling met 50Hz door de library zelf gegenereerd wordt, ook al wacht de loop op nieuwe input met pulseIn().
Ook de synchronisatie van inkomende en uitgaande pulsen wordt op dezelfde manier geregeld ( variabele "sync") met een while() loop die uitvoering van de hoofd-loop tegenhoud totdat sync false wordt vanuit de ISR, waardoor de while()-loop verlaten wordt.
Ik heb pin 4 als pulse input gekozen in de huidige code, maar als je niet ook met interrupt werkt is er niets op tegen om 2 of 3 te specificeren.
De squigly duidt op een mogelijke PWM output, dus een pseudo-analoge output pin. Daarmee kun je een analoge waarde simuleren door de pin snel tussen 1 en 0 te laten variëren met een regelbare verhouding en een vaste herhaalfrequentie. Daarmee kun je een gewenste pulslengte genereren, maar ik vind dat onoverzichtelijk. Bovendien is de herhaalfrequentie veel te snel voor een gemiddelde servo, in plaats van 50 Hz gaat dat met 490 Hz (pins 3,9,10,11) of zelfs 980 Hz (pins 5 en 6). Niet alle servo's kunnen daartegen, zeker de analoge types niet. Bovendien is de standaard PWM aansturing te maken met een variabele tussen 0 en 255 (8-bits), waarvan je dus moet berekenen hoe groot die stap moet zijn om de gewenste servopuls te genereren, en dat moet kleiner zijn dan 255, want daarmee genereer je een continue 1 op de pin. Pin 5 en 6 zijn volgens mij helemaal niet bruikbaar voor dat doel, dus houdt je nog maar 4 uitgangen over.
Ik gebruik de Servo_h library om de pulsen te genereren, klaarblijkelijk werkt dat goed op alle digitale pins (inclusief A0 t/m A5), met het bijkomende voordeel dat de herhaling met 50Hz door de library zelf gegenereerd wordt, ook al wacht de loop op nieuwe input met pulseIn().