Les 85: Inleiding tot servomotoren | Arduino stap-voor-stapcursus
Deze projecthandleiding laat je kennismaken met de wereld van continu roterende servomotoren, ook wel 360-graden servo's genoemd. In tegenstelling tot standaard servo's die naar een specifieke hoek bewegen (zoals 0 tot 180 graden), draaien deze motoren continu in beide richtingen. Dit maakt ze ideaal voor het bouwen van kleine robots, tankrupsbanden of elk project dat eenvoudige, betaalbare aandrijfmotoren vereist. Deze handleiding laat je zien hoe je er één kunt aansturen met een Arduino en een paar drukknoppen, waardoor je hands-on controle hebt over de richting en snelheid.
Hier zijn een paar praktische toepassingen voor een 360-graden servo:
- Het bouwen van een kleine robotauto met twee wielen.
- Het creëren van een pan- en tilt-cameramontage die eindeloos draait.
- Het aandrijven van een kleine transportband of lier.
- Het maken van een eenvoudig radar- of sensorplatform dat scant.

Hardware en componenten
Voor dit project heb je de volgende componenten nodig:
- Arduino-board (bijv. Uno)
- Continu roterende servomotor (bijv. FS90R of vergelijkbaar)
- Drie drukknoppen
- Jumperdraden
- Breadboard (optioneel, voor eenvoudigere bedrading)
Bedradingshandleiding
De bedrading voor dit project is eenvoudig. De servomotor heeft drie draden: meestal bruin (aarde), rood (voeding) en oranje of geel (signaal). De drukknoppen zijn in een eenvoudige configuratie bedraad.
Hier is een overzicht van de verbindingen:
- Servomotor:
- Bruine draad (aarde) verbindt met de GND-pin van de Arduino.
- Rode draad (voeding) verbindt met de 5V-pin van de Arduino.
- Oranje/gele draad (signaal) verbindt met Arduino-pin 9.
- Drukknoppen:
- Eén kant van elke knop is verbonden met de GND-pin van de Arduino.
- De andere kant van de "Tegen de klok in"-knop verbindt met pin 2.
- De andere kant van de "Stop"-knop verbindt met pin 3.
- De andere kant van de "Met de klok mee"-knop verbindt met pin 4.
In de video benadrukt de maker dat de signaaldraad van de servo moet worden aangesloten op een PWM-capabele pin van de Arduino, die vaak is gemarkeerd met een tilde (~) symbool. Pin 9 is één van deze pinnen. De drukknoppen gebruiken de interne pull-up weerstanden van de Arduino, wat de bedrading vereenvoudigt doordat externe weerstanden niet nodig zijn (in video op 07:02).
Uitleg van de code
De code is ontworpen om de status van drie drukknoppen te lezen en het overeenkomstige commando naar de servomotor te sturen. Laten we de door de gebruiker configureerbare delen opsplitsen.
Pinnen en commando's configureren
Bovenaan de code vind je de definities voor de pinnen en de servobesturingswaarden. Dit is waar je het gedrag van je project kunt aanpassen.
const int servoPin = 9; // PWM-pin voor het servosignaal
const int stopPin = 3; // Pin voor de stopknop
const int cwPin = 4; // Pin voor de met de klok mee-knop
const int ccwPin = 2; // Pin voor de tegen de klok in-knop
Deze constanten definiëren welke Arduino-pinnen zijn verbonden met de knoppen en de servo. Als je andere pinnen voor je knoppen gebruikt, zou je de nummers hier wijzigen. De servoPin moet een PWM-capabele pin zijn.
const int csServoCommand[3] = {106, 52, 0}; // {CCW, STOP, CW}
const String csServoCommandText[3] = {"Tegen de klok in", "Gestopt", "Met de klok mee"};
Dit is het belangrijkste deel om te begrijpen en af te stemmen. De csServoCommand-array bevat de waarden die naar de servo worden gestuurd. Voor een continue servo vertegenwoordigen deze waarden geen hoek maar een snelheid en richting.
- 106 is de waarde voor rotatie tegen de klok in op volle snelheid.
- 52 is de waarde voor een volledige stop.
- 0 is de waarde voor rotatie met de klok mee op volle snelheid.
Deze waarden zijn niet universeel. Door fabricageverschillen moet de "stop"-waarde (52) mogelijk worden aangepast. Als je servo langzaam afdrijft wanneer je de stopknop indrukt, moet je deze waarde fijn afstellen. De video demonstreert dit proces en laat zien hoe het wijzigen van de waarde naar 54 of 51 het gedrag van de motor kan beïnvloeden (in video op 13:45).
Je kunt ook de waarden voor rotatie aanpassen om de snelheid van de motor te veranderen. Bijvoorbeeld, het instellen van de tegen de klok in-waarde op 70 zorgt ervoor dat deze langzamer draait dan bij 106 (in video op 12:23).
De csServoCommandText-array bevat de tekstreeksen die naar de Seriële Monitor worden afgedrukt om de huidige commandostatus weer te geven.
Aangepaste functie: servoCommand()
De code gebruikt een aangepaste functie om de commandologica af te handelen. Deze functie neemt een nummer (0, 1 of 2) als argument, werkt de statustekst bij en stuurt het overeenkomstige commando naar de servo.
void servoCommand(int n) {
statusText = csServoCommandText[n];
myservo.write(csServoCommand[n]);
Serial.println(csServoCommandText[n]);
Serial.println(csServoCommand[n]);
}
Deze functie wordt aangeroepen vanuit de hoofdloop wanneer een knop wordt ingedrukt. Het centraliseert de logica voor het bijwerken van de weergave en het aansturen van de servo, waardoor de code schoner en gemakkelijker aan te passen is.
Live project en demonstratie
In de video demonstreert de maker het project in actie. Het indrukken van de "Met de klok mee"-knop stuurt de waarde 0 naar de servo, waardoor deze in één richting draait. Het indrukken van de "Tegen de klok in"-knop stuurt de waarde 106, waardoor deze de andere kant op draait. De "Stop"-knop stuurt 52, wat de motor zou moeten stoppen.
De Seriële Monitor wordt gebruikt om de huidige status en de exacte waarde weer te geven die naar de servo wordt gestuurd. Dit is van onschatbare waarde voor het debuggen en voor het vinden van de perfecte "stop"-waarde voor jouw specifieke motor. Zoals in de video wordt opgemerkt, is het stopcommando mogelijk niet perfect vanwege de interne elektronica van de servo, en je kunt een langzame drift of trilling zien. Dit is een veelvoorkomend kenmerk van goedkopere continue servomotoren en kan worden geminimaliseerd door de stopwaarde in de code aan te passen (in de video op 01:15).
Hoofdstukken
- [00:05] Introductie tot de 360-graden servomotor
- [02:02] Componenten en hardware-overzicht
- [02:40] Gedetailleerd bedradingsschema en aansluitingen
- [05:07] Uitleg van de code: constanten, arrays en setup
- [09:56] Uitleg van de code: de servoCommand-functie
- [10:54] Live demonstratie en uitvoer van de Seriële Monitor
- [12:23] Aanpassen van de servosnelheid en stopwaarden
/*
*
* Demonstration of Controlling Continuous Servo (360 servo)
* This code allows you to control a 360-degree servo by a command from the Serial Monitor.
* this 350 servo motor is a just for fun. it can't be used for real application where you need exact positioning. get stepper motor or expensive servo motor.
📚⬇️ Download and resource page https://robojax.com/RJT762
*
* Modified by Ahmad Shamshiri for Robojax.com
* on Sunday, July 1, 2018, at 11:09 AM in Ajax, Ontario, Canada
* Watch a video instruction of this project: https://youtu.be/b_xvu6wWafA
* Get this code from Robojax.com
*
Original code by BARRAGAN <http://barraganstudio.com>
This example code is in the public domain.
Modified 8 Nov 2013
by Scott Fitzgerald
http://www.arduino.cc/en/Tutorial/Sweep
*/
#include <Servo.h>
Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards
int pos = 0; // variable to store the servo position
int incomingByte = 0; // for incoming serial data
void setup() {
Serial.begin(9600);
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}
void loop() {
// send data only when you receive data:
if (Serial.available() > 0) {
// read the incoming byte:
incomingByte = Serial.read();
// say what you got:
Serial.print("received: ");
Serial.print (incomingByte);
if(incomingByte == 108){
Serial.println(" sent 0 Rotating CW ");
myservo.write(0);
}else if(incomingByte == 114){
Serial.println(" sent 180 Rotating CCW ");
myservo.write(180);
}else if(incomingByte == 60){
Serial.println(" sent Stopped ");
myservo.write(60);
}else{
Serial.println(" moving Randomly");
myservo.write(incomingByte);
}
}
}
/*
*
* Demonstration of Controlling Continuous Servo (360 servo)
360 Servo -2
* This code allows you to control a 360-degree servo by a command from the Serial Monitor.
* this 350 servo motor is a just for fun. it can't be used for real application where you need exact positioning. get stepper motor or expensive servo motor.
📚⬇️ Download and resource page https://robojax.com/RJT762
*
* Modified by Ahmad Shamshiri for Robojax.com
* on Sunday, July 1, 2018, at 11:09 AM in Ajax, Ontario, Canada
* Watch a video instruction of this project: https://youtu.be/b_xvu6wWafA
* Get this code from Robojax.com
*
Original code by BARRAGAN <http://barraganstudio.com>
This example code is in the public domain.
Modified 8 Nov 2013
by Scott Fitzgerald
http://www.arduino.cc/en/Tutorial/Sweep
*/
#include <Servo.h>
Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards
int servoPin = 9;// this pin must be of those with PWM ~
int pos = 0; // variable to store the servo position
int incomingByte = 0; // for incoming serial data
int CWBS, CCWBS, SBS;
void setup() {
Serial.begin(9600);
pinMode(2,INPUT_PULLUP);// set pin for push button STOP
pinMode(3,INPUT_PULLUP);// set pin for push button CCW
pinMode(4,INPUT_PULLUP);// set pin for push button CW
myservo.attach(servoPin); // attaches the servo on pin 9 to the servo object
}
void loop() {
CCWBS = digitalRead(2);// read status of button CCW
SBS = digitalRead(3);// read status of button STOP
CWBS = digitalRead(4);// read status of button CW
if(CCWBS == LOW){
Serial.println(" sent 0 Rotaing CW ");
myservo.write(0);
}else if(CWBS == LOW){
Serial.println(" sent 180 Rotaing CCW ");
myservo.write(180);
}else if(SBS == LOW){
Serial.println(" sent Stopped ");
myservo.write(60);
}else{
Serial.println(" moving Random");
myservo.write(48);
}
}// loop
Dingen die je misschien nodig hebt
-
Amazon360 Degree Servo motor on Amazonlink.amazon
-
Amazon
-
eBay360 Degree Servo motor on eBayebay.us
-
AliExpress360 Degree Servo motor on AliExpresss.click.aliexpress.com
-
AliExpress360 Degree Servo motor on AliExpress-2s.click.aliexpress.com
Hulpmiddelen en referenties
Bestanden📁
Andere bestanden
-
SG90 Seroo motor datasheet
robojax-servo-SG90_datasheet.pdf0.12 MB