En servomotor (eller hobbyservo) består av dels ett styrkort, en motor, en växellåda och en lägesåterkoppling i form av en potentiometer (andra återkopplingar finns men då är det mycket dyrare servon). Servomotorn har 3 anslutningar och dessa är 0V (GND), VCC (4.5-6VDC) samt insignal.
De servon vi använder i denna lektion är mycket mindre än standardservon (s.k. Sub-Micro Servo), men de är billigare och drar inte lika mycket ström, så de kan lätt användas (om man inte ansluter för många) direkt med Arduino och matningen från USB (5VDC). De vi använder finns här i vår webshop och de ingår även i vårt add-on kit (säljs inte längre). Bilden nedan visar detta hobbyservo.
Det finns en standard på hur dessa hobbyservon ansluts och färgerna brukar vara RÖD (VCC), SVART (GND) och VIT (IN-SIGNAL) men det finns avvikelser (speciellt på in-signalen) så kontrollera noga om ni använder andra hobbyservon. Genom att ha matningen i mitten kan man sällan fördärva dessa servon då VCC alltid hamnar i mitten.
Som vi skrev tidigare så är består servot av 4 huvuddelar, ett styrkort som tar emot en pulssignal in, en motor med en växellåda som styrs av styrkortet samt en potentiometer som sköter lägesåterkopplingen till styrkortet, det blir således en sluten reglerloop. Man styr servot med en puls och motorn styr ut till det läget och reglerar positionen med hjälp utan potentiometern. Är den strömsatt och man försöker vrida utgående axel så kommer reglerkortet att hålla den på plats (till en viss gräns, dvs till det vridmoment den klarar). Det är dock viktigt att påpeka att man bör inte vrida ett hobbyservo för hand, då man lätt kan ta sönder växellådan, detta gäller även när den inte är strömsatt. Detta då växellådan får då omvänt förhållande. Detta gäller generellt även vanliga DC motorer med inbyggd växellåda när utväxlingen är stor. Bilden nedan visar ett sönderplockat servo.
Pulssignalen in har oftast en frekvens på 50Hz, dvs. det går 20mS från en puls går från låg till hög (flank upp på pulsen) nivå till nästa puls. Längden på denna puls varieras för att styra ut servot från min till max. De flesta servon har 180 graders utstyrning, men det finns även de som har mindre eller mer. Detta servo har 180 grader, men då det är ett mindre och billigare servo kan det vara från 160-180 graders utstyrning. Pulslängden (då signalen är hög) varierar oftast mellan 0.5-2.5mS från min till max och 1.5mS är oftast mittenläget. Bilden nedan visar hur det kan se ut, varje ruta är 2mS och här styrs servot ut med ca 2.2mS (2200uS) samt man kan se att det är 20mS (eller 50Hz) frekvens) från start av puls till nästa start av puls.
Utvecklingsmiljön för Arduino® har stöd för servon dock inte på alla I/O, med en ATMega328P kan man styra upp till 12 servon (tänk bara på att om man använder fler än 1-2st så bör man ha en separat 5-6VDC för servona då USB klarar endast 0.5A). Mer information finns här om servolibbet.
Alla servon är inte lika snabba med att styra ut från MIN till MAX så att styra dem till önskat läge kan gå olika snabbt.
Hur fungerar då biblioteket, det finns ett antal funktioner och man behöver först inkludera servobiblioteket, det gör man med #include <servo.h>, skapa en variabel av typen servo, ansluta ett servo till en I/O, detta gör man med attach() samt styra ut servot till en position, det gör man med write(). Det följer med två enkla testprogram i utvecklingsmiljön, du hittar dem under File->Examples->Servo och här visar vi Sweep, då det kräver ingen annan hårdvara mer än servot.
#include <Servo.h>
Servo myservo; // create servo object to control a servo
int pos = 0; // variable to store the servo position
void setup() { myservo.attach(9); // attaches the servo on pin 9 to the servo object }
void loop() { for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees // in steps of 1 degree myservo.write(pos); // tell servo to go to position in variable 'pos' delay(15); // waits 15ms for the servo to reach the position } for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees myservo.write(pos); // tell servo to go to position in variable 'pos' delay(15); // waits 15ms for the servo to reach the position } }
Då var det dags att koppla in servot, använd vanliga kopplingstrådar, gärna samma färger som för VCC och GND så dessa inte förväxlas, tryck i dem i den 3-poliga hylskontakten på servot och sedan in på utvecklingskortet. Koppla in insignal på servot till I/O 9 och koppla sedan in på 5VDC och GND (när man gör detta kan servot hoppa till, det beror på att det ställer in sig så som insignalen säger), kompilera och ladda ner programmet och servot kommer att röra sig (svepa) från MIN till MAX och omvänt, vill man ändra tiden som det tar så ändrar man detta i delay() funktionen, dock finns det alltid en nedre gräns på hur lång tid detta kan ta, det beror på hur snabbt servo man har. Det finns avancerade inställningar man kan göra med ett servo, dels ställa in MIN platsen i mikrosekunder som motsvarar 0 grader, denna är som standard 544uS och sedan kan man ställa in MAX platsen som är 180 grader, denna är som standard 2400uS, detta gör man via attach() funktionen. Mer information om dessa funktioner finns på engelska på deras hemsida.
Vill man ställa servot i mitten så är det 90 grader. Så att styra ut ett servo till 180 grader direkt i programmet innebär inte att det styr ut 180 grader i verkligheten, varje servo är unikt och det som kommer som standard i biblioteket kanske inte passar det servo du använder, så kontrollera noga hur många grader det faktiskt kan styra ut, justera/testa tiden så det motsvarar den vinkel du styr ut det (om du använder grader för att styra ut det och inte tid i mS). Att försöka styra ut mer än vad servot klarar kan få konstiga resultat.
Vill man hellre styra servot med tid istället för grader kan man använda funktionen writeMicroseconds(), på så vis kan man styra sitt servo mer exakt och inte generellt som standardfunktionen kan hantera. Det varierar en hel del mellan olika servon och servotillverkare så möjligheten att göra detta är bra.
Det finns även servon som är kontinuerliga (eller om man bygger om dem själv), men detta menas att det inte finns någon positionsåterkoppling mellan potentiometern och motorn. Servot kommer då fungera som en vanlig motor (nästan) som du kan styra fram och tillbaka och på det viset använda dem till robothjul. Ett exempel på färdiga servon som är kontinuerliga är dessa enkla från Pololu.
Det finns andra sätt att styra servon med om man skall styra många servon och inte vill använda alla I/O på utvecklingskortet. Då finns det externa kort eller Shields (Sköldar) för att ansluta servon. Adafruit har ett antal kort med en 16-kanalers PWM (dvs 16 servon kan styras) med 12-bitars upplösning som styrs via I2C (endast 2 I/O för att styra alla servon). Dessutom kan man ansluta mer än ett kort och på det viset styra ännu fler. Men då används inte de inbyggda servo-biblioteket men Adafruit har ett som är skrivet för produkterna. Dessa kort finns dels som ett Shield-kort och ett fristående kort. Att använda dessa kort är mycket enkelt och det blir bättre upplösning på styrningen samt man friar upp I/O på utvecklingskortet.
Andra populära servon som vi säljer finns här i webbutiken.