Arduino Servo Motor Controleren: Stap-voor-Stap Handleiding
In deze handleiding leer je hoe servomotoren werken en hoe je ze stuurt met Arduino. Servomotoren zijn populair in Arduino-projecten omdat ze gemakkelijk te gebruiken zijn en uitstekende positiecontroler bieden.
Servo's zijn ideaal voor robotica, automatisering, RC-modellen en meer. Ik heb ze al in diverse projecten gebruikt:
- DIY Arduino Robotarm met Smartphone Besturing
- Arduino Mier Hexapod Robot
- DIY Arduino RC Hovercraft
- SCARA Robot | Zelfbouw Arduino Robot
- DIY Mars Perseverance Rover Replica – Arduino Project
Bekijk de video of lees de handleiding met voorbeelden, aansluitschema's, codes en een handleiding voor het besturen van meerdere servo's met de PCA9685 PWM-driver.
Wat is een Servomotor?

Bij industriële servo's is de sensor vaak een hoge-precisie encoder; bij hobby/RC-servo's een potentiometer. De gemeten positie wordt vergeleken met de doelpositie; de controller corrigeert de motor tot beide overeenkomen.

Deze handleiding focust op hobby-servomotoren: werking en besturing met Arduino.

Hobby-servo's zijn kleine actuatoren voor RC-auto's, boten, vliegtuigen. Ook gebruikt door studenten voor robotica-prototyping, robotarmen, bio-geïnspireerde robots, humanoïden.

Hoe Werken Servomotoren?
Een hobby-servo heeft vier hoofdcomponenten: DC-motor, tandwielkast, potentiometer, besturingscircuit. De DC-motor draait snel met laag koppel; de tandwielkast verlaagt de snelheid naar ~60 RPM en verhoogt het koppel.

De potentiometer zit op het laatste tandwiel/uitvoeras. Bij rotatie produceert deze een spanning die evenredig is met de absolute hoek. In het besturingscircuit wordt deze spanning vergeleken met de signaallijn-spanning. Bij verschil activeert de controller een geïntegreerde H-brug, die de motor in de juiste richting laat draaien tot de signalen gelijk zijn.
Een servo wordt gestuurd door een pulsreeks op de signaallijn. Frequentie: 50Hz (elke 20ms een puls). De pulslengte bepaalt de hoek (meestal 0–180°).

Typisch: 1ms = 0°, 1.5ms = 90°, 2ms = 180°. Min/max kan per merk afwijken (bijv. 0.5ms–2.5ms).
Populaire RC/Hobby Servo's voor Arduino Projecten
Bij keuze let je op koppel, spanning, stroomverbruik en afmetingen. Twee populairste modellen: SG90 Micro Servo en MG996R.

SG90 Micro Servo specificaties:
| Stall Koppel | 1.2 kg·cm @4.8V, 1.6 kg·cm @6V |
| Werkspanning | 3.5 – 6V |
| Stroom (geen last) | 100mA |
| Stall Stroom | 650mA |
| Max Snelheid | 60° in 0.12s |
| Gewicht | 9g |
MG996R Servo specificaties:
| Stall Koppel | 11 kg·cm @4.8V, 13 kg·cm @6V |
| Werkspanning | 4.8 – 7.2V |
| Stroom (geen last) | 220mA @4.8V, 250mA @6V |
| Stall Stroom | 650mA |
| Max Snelheid | 60° in 0.20s |
| Gewicht | 55g |
Arduino Servomotor Besturing
We testen met de MG996R (hoge koppel, metalen tandwielen, stall koppel 10 kg-cm). De stall stroom is 2.5A – te hoog voor directe Arduino-voeding. Een aparte voeding is noodzakelijk.

Aansluitschema
Verbinden: controle-pin van servo naar digitale Arduino-pin, Ground en voeding naar externe 5V bron, Arduino ground met servo ground.

Voor de kleinere SG90 Micro Servo is directe voeding via de Arduino 5V-pin *mogelijk* (100–200mA rust, 500–700mA stall; Arduino 5V levert ~500mA via USB, ~1A via barrel jack). Toch raad ik een externe voeding aan voor stabiliteit.

Componenten: MG996R of SG90 Servo, Arduino Board, 5V 2A DC Voeding.
Servomotor Arduino Code
Eenvoudige code zonder bibliotheek: definieer pin, zet als output, genereer 50Hz pulsen met juiste duur.
/* Servo Motor Control - 50Hz Pulse Train Generator
* by Dejan, https://howtomechatronics.com
*/
#define servoPin 9
void setup() {
pinMode(servoPin, OUTPUT);
}
void loop() {
// Een puls elke 20ms
digitalWrite(servoPin, HIGH);
delayMicroseconds(1450); // Pulsduur in µs
digitalWrite(servoPin, LOW);
delayMicroseconds(18550); // 20ms - pulsduur
// Pulslengtes: 600µs=0°; 1450µs=90°; 2300µs=180°
}
Na testen: 0.6ms=0°, 1.45ms=90°, 2.3ms=180°. Gemeten stroom: max 0.63A stall (goedkopere replica).

Handiger: de Arduino Servo-bibliotheek.
/* Servo Motor Control met Arduino Servo Library
* by Dejan, https://howtomechatronics.com
*/
#include <Servo.h>
Servo myservo;
void setup() {
myservo.attach(9, 600, 2300); // (pin, min µs, max µs)
}
void loop() {
myservo.write(0); delay(1000);
myservo.write(90); delay(500);
myservo.write(135); delay(500);
myservo.write(180); delay(1500);
}
Include bibliotheek, definieer servo-object, attach(pin, min, max) voor pulslengtes, write(hoek) voor positie (0–180°).
Meerdere Servomotoren met Arduino Besturen
De Servo-bibliotheek ondersteunt tot 12 servo's (meeste Arduino's) of 48 (Arduino Mega). Besturing is even eenvoudig.

Voorbeeld voor 5 servo's:
/* Meerdere servo's besturen met Arduino
* by Dejan, https://howtomechatronics.com
*/
#include <Servo.h>
Servo servo1, servo2, servo3, servo4, servo5;
void setup() {
servo1.attach(8); servo2.attach(9); servo3.attach(10);
servo4.attach(11); servo5.attach(12);
}
void loop() {
// Alle naar 0°
servo1.write(0); servo2.write(0); servo3.write(0);
servo4.write(0); servo5.write(0); delay(2000);
// Alle naar 90°
servo1.write(90); servo2.write(90); servo3.write(90);
servo4.write(90); servo5.write(90); delay(2000);
// Alle naar 180°
servo1.write(180); servo2.write(180); servo3.write(180);
servo4.write(180); servo5.write(180); delay(2000);
}
Maak voor elke servo een object aan, koppel aan een pin. Elke servo kan op elk moment naar elke positie. Zie mijn Hexapod project (22 servo's met Arduino Mega).
Arduino en PCA9685 PWM/Servo Driver
Alternatief: PCA9685 servo driver. 16-kanaals, 12-bit PWM, I2C-bus. Ingebouwde klok, stuurt 16 servo's onafhankelijk van Arduino.

Tot 62 drivers koppelen (daisy-chain) op één I2C-bus → theoretisch 992 servo's via 2 Arduino-pinnen. Adresselectie via soldeerpads:

Aansluitschema (met aparte voeding voor servo's):

Componenten: MG996R Servo, PCA9685 Driver, Arduino, 5V 6A Voeding.
Arduino en PCA9685 Code
Bibliotheek: PCA9685-Arduino op GitHub.
/* Servo Control met Arduino en PCA9685 Driver
* by Dejan, https://howtomechatronics.com
* Library: https://github.com/NachtRaveVL/PCA9685-Arduino
*/
#include <Wire.h>
#include "PCA9685.h"
PCA9685 driver;
// 12-bit = 4096 stappen
// 2.5% van 20ms = 0.5ms → 102 stappen
// 12.5% van 20ms = 2.5ms → 512 stappen
PCA9685_ServoEvaluator pwmServo(102, 470); // (-90°, +90°)
// Tweede servo: PCA9685_ServoEvaluator pwmServo2(102, 310, 505); // (0°, 90°, 180°)
void setup() {
Wire.begin();
Wire.setClock(400000); // 100kHz, 400kHz, 1000kHz ondersteund
driver.resetDevices();
driver.init(B000000); // Adres pinnen A5-A0
driver.setPWMFrequency(50); // 50Hz
}
void loop() {
driver.setChannelPWM(0, pwmServo.pwmForAngle(-90)); delay(1000);
driver.setChannelPWM(0, pwmServo.pwmForAngle(0)); delay(1000);
driver.setChannelPWM(0, pwmServo.pwmForAngle(90)); delay(1000);
}
Include libraries, definieer PCA9685-object. ServoEvaluator definieert pulsduur/PWM-uitgang. 12-bit resolutie (4096 stappen). Minimaal 0.5ms (0°) = 102 stappen, maximaal 2.5ms (180°) = 512 stappen. Waarden aanpassen per servo (mijn waarden: 102–470 voor 0–180°).
In setup(): I2C klok, driver adres, frequentie 50Hz. In loop(): setChannelPWM() en pwmForAngle() voor gewenste hoek.
Tweede servo had andere positionering (goedkopere kopieën). Oplossing: aparte ServoEvaluator per servo met eigen instellingen, inclusief 90° correctie.
Veel Servo's Besturen met Meerdere PCA9685 Drivers
Voorbeeld met gekoppelde drivers:

Drivers koppelen, adresselectie pads instellen. Schema:

Code: maak apart PCA9685-object per driver, definieer adressen, stel frequentie in. Gebruik setChannelPWM() en pwmForAngle() voor elke servo op elke driver.
/* Veel servo's met Arduino en PCA9685 drivers
* by Dejan, https://howtomechatronics.com
* Library: https://github.com/NachtRaveVL/PCA9685-Arduino
*/
#include <Wire.h>
#include "PCA9685.h"
PCA9685 driver;
// ... zelfde evaluator setup ...
void setup() {
Wire.begin(); Wire.setClock(400000);
driver.resetDevices();
driver.init(B000000); // Adres driver 1
driver.setPWMFrequency(50);
// Herhalen voor extra drivers met andere adressen
}
void loop() {
// Bestuur elke servo op elke driver
}
Probleemoplossing
Servo trilt en reset mijn Arduino
Veelvoorkomend bij SG90 en MG996R. Oorzaak: hoge stroompieken bij belasting, vooral bij voeding via Arduino 5V-pin. Oplossing: condensator over GND en 5V (decoupling capacitor) voor extra stroom bij opstart.
Servo beweegt niet het volledige bereik (0–180°)
Pulsbreedtes verschillen per servo/fabrikant. Standaard: 1ms (of 0.5ms) = 0°, 2ms (of 2.5ms) = 180°. Oplossing: pulslengtes aanpassen in de attach()-functie van de Servo-bibliotheek.
attach() accepteert twee extra parameters: minimum en maximum pulsbreedte in microseconden. Standaard: 544µs (min) en 2400µs (max). Aanpassen voor nauwkeurig bereik:
myservo.attach(9, 600, 2300); // (pin, min µs, max µs)
Afmetingen en 3D Model
3D-modellen van SG90 en MG996R beschikbaar voor download.
SG90 Micro Servo

3D Model: Download van Thangs.

MG996R Servomotor

3D Model: Download van Thangs.

Conclusie
We hebben de basis behandeld voor servo's met Arduino. Er zijn veel fabrikaten/modellen met unieke eigenschappen. De mogelijkheden voor robotica, automatisering en RC-projecten zijn eindeloos – het kiezen van het juiste model is cruciaal.
Vragen? Reacties hieronder. Bekijk ook mijn Arduino Projecten Collectie.
Veelgestelde Vragen (FAQ)
Hoe gebruik ik een servomotor met Arduino?Een servomotor heeft 3 draden: GND, 5V (voeding) en controle-draad naar Arduino. Heel eenvoudig aan te sluiten.
Kan Arduino servomotoren aansturen?Ja, maar bij stroom >500mA kan de Arduino resetten. Gebruik altijd een aparte voeding voor servo's.
Hoeveel servomotoren kan een Arduino aansturen?Met de Servo-bibliotheek: tot 12 (meeste boards), 48 (Arduino Mega). Altijd aparte voeding gebruiken.
Productieproces
- Slimme spaarpot bouwen: Muntenacceptor besturen met Arduino Nano
- Servo-gestuurde obstakelvermijdende robot: Bouw met Arduino & HC-SR04
- Een LED bedienen via Bluetooth met Arduino – Eenvoudige DIY Handleiding
- Twee Stappenmotors Sturen met Arduino Nano & Joystick – Simpele Tutorial
- Arduino & MPU6050: Precieze Servomotor Besturing met SG90 & MG996R
- ThimbleKrox: Vingergemonteerde Muizenbesturing met Arduino Micro & MPU-6050
- Maak Muzikale Tonen met Arduino: Stapsgewijze Handleiding
- Arduino Verbinden met NMEA‑0183: Stap‑voor‑Stap Handleiding
- DIY Arduino Kakerlakbesturingssysteem – Bouw voor minder dan $30
- Aluminium Solderen: Expert Technieken & Stap-voor-stap Handleiding
- De mechanica van koppelingen: uitgebreide industriële gids