Tutorial: Servomotor aansturen met Arduino

Heeft jouw project behoefte aan een nauwkeurig mechanische beweging om bijvoorbeeld een robotarm te maken? Dan is de kans groot dat je daar een servomotor voor gaat gebruiken. Met een servo motor kun je door middel van een stuursignaal de motor naar een specifieke positie laten bewegen. Hoe een servomotor werkt, en hoe je deze aanstuurt, leer je in deze tutorial van VDR Electronics.

1. Benodigdheden Servomotor controller

Om een servomotor aan te sturen gaan we gebruik maken van een Arduino, de MG90S servomotor en wat software. Helemaal onderaan deze pagina zijn de spullen te vinden die je nodig hebt en bij ons kunt kopen.

Hardware

Software

  • Arduino IDE

2. De werking van een servomotor

Er zijn veel verschillende elektrische motoren die je kunt gebruiken om iets te laten bewegen. Een elektrisch bestuurdbare auto maakt gebruik van brushless DC motoren met een hoog RPM om zo snel mogelijk van A naar B te gaan. Voor een CNC machine worden stappenmotoren veel toegepast om een freesje heel precies aan te sturen. En voor een robotarm, of andere toepassing waarbij telkens dezelfde nauwkeurige bewegingen nodig zijn, wordt gebruik gemaakt van een servomotor.

De servomotor onderscheidt zich van de andere type motoren doordat deze met een stuursignaal aangestuurd wordt en een closed-loop regelcircuit bevat. Dit betekend dat de servomotor precies weet in welke positie hij staat. Hierdoor is dit type motor uitstekend toe te passen waarbij een hoge nauwkeurigheid gewenst is, en bij hetzelfde stuursignaal zal de servomotor steeds in exact dezelfde positie staan.

Als je een servomotor uit elkaar haalt zul je zien dat deze is opgebouwd uit:

  1. Standaard DC motor
  2. Reductietandwielen, om de snelheid van de motor te reduceren
  3. Printplaatje met regelcircuit
  4. Potmeter

Op de as van het laatste tandwiel kun je een opzetstukje, ook wel hevel genoemd, plaatsen zodat je de beweging van de servomotor mechanisch kunt koppelen aan bijvoorbeeld een grijparm. Ook zit op deze as, in de behuizing van de servomotor, een potmeter die met de as meedraait. Met behulp van deze potmeter kan het regelcircuit meten in welke stand de hevel zich bevindt. Wijkt het stuursignaal af van de hevel stand? Dan zal de servomotor dit proberen bij de sturen zodat de hevel in de gewenste positie staat. Dat is de kracht van een servo.

Het nadeel van een servo is dat het draaibereik vaak klein is. Denk hierbij aan 90, 180 of 360 graden. Om iets continue te laten ronddraaien kun je dus het beste geen servomotor gebruiken.

3. Het aansluiten en aansturen van een servomotor

De servomotor die wij gebruiken in deze tutorial heeft slechts 3 aansluitdraden, namelijk: voedingslijn, massa en een draad voor het stuursignaal. Als je een kleine servo gebruikt kun je deze nog wel aan de 5V van de Arduino knopen, maar bij de zwaardere servo's is het advies om een externe voeding voor de servomotor te gebruiken. Een servomotor kan namelijk redelijk wat stroom trekken als de (belastte) hevel gedraaid gaat worden.

  • Voedingsspanning - Rode draad aansluiten op 4.8V tot 6.0V. In dit geval aansluiten op 5V van de Arduino
  • Massa - Zwarte/Bruine draad aansluiten op de GND van het systeem
  • Data - Gele draad aansluiten op pin 3 van de Arduino

Stuursignaal
Het stuursignaal dat gebruikt wordt om de servomotor aan te sturen is opgebouwd uit een korte puls die elke 20ms naar de servomotor gestuurd moet worden. Je moet het stuursignaal dus continue blijven sturen.

Op afbeelding hierboven zie je de opbouw van dat stuursignaal. Door de breedte van de puls, hierboven is deze 2ms, te variëren kun je de stand van de servomotor instellen. Bij de meeste servomotoren is de minimale pulsbreedte 1 milliseconde, en de maximale pulsbreedte 2 milliseconde. Dat komt respectievelijk overeen met een hevelpositie van 0 graden en 180 graden.

Het bereik van deze pulsbreedte is echter afhankelijk van de fabrikant, en je zult dus altijd de datasheet erop moeten naslaan om het bereik te achterhalen. Onze servomotoren hebben bijvoorbeeld een bereik van 0.5ms tot 2.5ms. Hieronder zie je weergegeven hoe de pulsbreedte de stand van de hevel beïnvloedt.

Als je geen stuursignaal meer naar de servomotor stuurt, dan zal de hevel in dezelfde positie blijven staan, maar deze is dan niet meer bekrachtigd. Dat betekend dat je de hevel handmatig kunt verplaatsen naar een andere positie, en de servomotor zal zich niet corrigeren naar de oude, ingestelde, positie. Het is dus noodzakelijk om de servomotor écht elke 20ms een stuursignaal te geven.

4. Servomotor software voor Arduino

Om het stuursignaal naar de servomotor te sturen maken we gebruik van de ingebouwde Servo.h library. Deze library maakt gebruik van interrupt timers om ervoor te zorgen dat elke 20 milliseconde het datasignaal wordt uitgestuurd zodat je hier zelf geen rekening mee hoeft te houden.

Begin met het aanmaken van een nieuwe Sketch en voeg de library toe door deze te includen. Vervolgens definieer je op welke pin van de Arduino het stuursignaal van de servomotor is aangesloten, in dit geval pin 3. Daarna maak je een instantie aan van het type Servo.

#include <Servo.h>

#define servoPin 3 // Connect the servo data line to this pin
Servo servo; // Create an object to control the servo

Daarna kun je in de setup() de servo initialiseren door de functie attach() aan te roepen. In deze functie moet je 3 argumenten meegeven, namelijk:

  • De pin waarop het stuursignaal is aangesloten
  • De minimale lengte van de puls, in dit geval 500 microseconde
  • de maximale lengte van de puls, in dit geval 2500 microseconde

Je kunt de servo ook initialiseren zonder de minimale- en maximale lengte van de puls mee te geven, waarbij de standaardwaardes van 544 en 2400 microseconden door Arduino worden gebruikt. Het probleem is echter dat dan niet het hele draaibereik van onze servo aangesproken kan worden, en zal gelimiteerd zijn tot een draaibereik van ca. 160-170 graden. Zoals eerder aangegeven zijn deze waardes verschillend per servomotor, en daarom is het verstandig om specifiek aan te geven wat de minimale- en maximale pulstijd moet zijn.

Nadat de servo is geinitialiseerd zetten we de servomotor op de positie van 0 graden door de write(0) functie aan te roepen. Vervolgens nog een kleine delay om de servo te tijd te geven om zich naar deze positie te verplaatsen.


void setup() {
  servo.attach(servoPin,500,2500); // Initialize servo pin
  servo.write(0); // Set servo to 0 degrees position
  delay(500);  
}

Vervolgens kun je in de loop() de servo aansturen door weer een write() commando aan te roepen om zo de hoek van de servomotor in te stellen, zo simpel is het. In onderstaand voorbeeld draait de servomotor langzaam van 0 naar 180 graden en weer terug.


void loop() {
  int angle = 0;
  for(angle = 0; angle <= 180; angle++){
  	servo.write(angle);
  	delay(10);	
  }

  for(angle = 180; angle >= 0; angle--){
  	servo.write(angle);
  	delay(10);	
  }
}

5. Servomotor met hoge precisie aansturen

Met de write() functie kun je direct aangeven in welke hoek de servomotor moet komen te staan, maar de hoek moet als een geheel getal worden opgegeven waardoor er maximaal 181 stappen zijn (tussen 0 en 180 graden). Maar als je meer controle wilt hebben over de hoek van de servo, dan kun je de functie writeMicroseconds() gebruiken.

In deze functie geef je de lengte van de puls op, in microsecondes, om zo de servomotor in te stellen. Aangezien het bereik loopt van 500 tot 2500 microseconde, kun je veel preciezer de servomotor regelen.

servo.writeMicroseconds(1200);

Bouw je eigen servomotor controller

Breadboard 170 punten - 42x35mm (Wit)
50%
OFF
Op voorraad
18 stuks verkocht
€2,50 €1,25
Arduino Uno R3 ATmega328p (CH340G)
Uitverkocht

Verder lezen

Deel deze handleiding