Een servomotor voor hobbytoepassingen heeft drie aansluitingen: een massa (doorgaans bruin), een positieve voeding (rood) en een signaaldraad (orange). De gewenste positie wordt doorgegeven door de duur van een positieve puls te veranderen. Met een pulsduur van 1500µs zet de servo zich in een middenpositie, met een puls van 1000µs zet de servo zich links en met een puls van 2000µs rechts. De timing kan verschillend zijn van de norm: de uiterste waarden zijn 544 en 2400µs in de library.
De herhalingsfrekwentie van de pulsen is 20ms, maar dat steekt niet zo nauw. Een periodeduur van 10 à 25ms is goed. De motor houdt geen rekening met de puls/pauze verhouding, enkel met de duur van de positieve puls. Er moet een minimum aantal pulsen doorgestuurd worden vooraleer de servo reageert, doorgaans heb je minstens 5 pulsen nodig. Als er geen pulsen meer zijn valt de servomotor stil, zelfs al heeft ie zijn positie nog niet bereikt.
De arduino interface heeft een library om een servomotor te besturen (servo.h), maar de protocol is zo eenvoudig dat een library eigenlijk niet nodig is. Hetzelfde geldt trouwens ook met het RS-232 protocol: die is zo eenvoudig dat je zelf de kode kan schrijven om data uit te sturen via een seriele verbinding.
Op de skoop zie je 5 pulsen: de periode bedraagt 20.03ms en een puls duurt 1.664ms. De spanning varieert tussen 0V en 5V. Je hebt slects enkele instructies nodig om de pulsen te genereren.
We hebben hier een eenvoudig voorbeeld waarbij de servomotor door een potentiometer gestuurd wordt. Het signaal van 0 tot 5V wordt naar de digitale ingang van de arduino gestuurd en de software zet de spanning om in een tijdsduur. Met deze motor hebben we een tijdsduur van 500µs tot 2500µs nodig om de motor van het ene uitserste naar het andere uiterste te laten gaan. De pulsen worden herhaald zolang er een verschil is in ingangsspanning.
Het is aangewezen een aparte voedingsspanning te voorzien voor de servomotor want de motor trekt veel stroom, waardoor de spanning op de potentiometer wat zakt. De motor kan daardoor gaan oscilleren tussen twee posities. De servomotoren zijn normaal voorzien om gevoed te worden met NiCd accus met een spanning van 4.8V tot 7.4V.
Dit is de kode om de positie van een potentiometer over te brengen naar de servomotor:
a = analogRead(0) * 2;
if (abs(b - a) > 5) {
b = a;
for (i = 0; i < 5; i++) {
digitalWrite(13, 1);
delayMicroseconds(500 + a);
digitalWrite(13, 0);
delayMicroseconds(2500 - a);
delay(15);
}
}
De code is zo eenvoudig dat het niet nodig is om een beroep te doen op de library. De tweede instructie delayMicroseconds zorgt dat de periodetijd constant is ongeacht de pûlsduur. Deze instructie is in de praktijk niet nodig.
De library is nauwkeuriger (er wordt een hardware timer interrupt gebruikt), maar aan de andere kant kunnen deze interrupts de werking van andere funkties storen, bijvoorbeeld als je ook de library softwareSerial gebruikt. Indien je deze twee libraries gebruikt moet je ervoor zorgen dat je voldoende lang wacht na het sturen van seriele data vooraleer dat je de servo gaat aansturen. De servo moet je ook loskoppelen na gebruik (detach).
De verhoogde nauwkeurigheid van de library is niet nodig in de praktijk, de nauwkeurigheid van de servo is lager dan 1°. Twee identieke servo's zullen zich lichtjes anders positioneren als ze parallel aangestuurd worden. De servo die bovenaan de pagina getoond wordt is krachtig maar niet nauwkeurig. Als de pulsduur slechts minimaal verandert, dan wordt de servo zelfs niet verdraaid.
|