Arduino – Servo aansturen (SGXX)
Hardware
Deze mini servo’s kunnen 180 graden draaien (als je de beveiliging eruit haalt 360 graden), de servo wordt veelal gebruikt in vliegtuig modelbouw, andere toepassingen zijn uiteraard ook mogelijk.
Specificaties:
- Modulatie: Analoog
- Krachtkoppel: 1.80 kg-cm (op 4.8 volt)
- Snelheid: 0.10 sec/60° (op 4.8 volt)
- Motor Type: 3-polig
- Tandwiel Type: Plastic
- Maximale draairichting: 180°
- Pulse breedte: 500-2400 µs
Pinout
Draadkleur: | Functie: |
---|---|
Rood | +5v |
Bruin | GND |
Oranje | Data (stuur signaal) |
Hoe werkt het?
Deze mini servo werkt met PWM (Pulse Width Modulation), volgens de documentatie:
– ca. 2.5 ms puls voor positie naar rechts.
– 1.5 ms puls voor het midden.
– ca. 0.5 ms puls voor positie naar links.
Als je PWM gebruikt, kun je deze op 50 Hz zetten, dan heb je pulsjes van 1 sec / 50 Hz = 20 ms
Veelal is de duty-cycle in te stellen van 0% t/m 100%, dat geeft voor:
– rechts (2.5 ms) > duty-cycle = 100 / (20ms / 2.5 ms) = 12.5%
– midden (1.5 ms) > duty-cycle = 100 / (20ms / 1.5 ms) = 7.5%
– links (0.5 ms) > duty-cycle = 100 / (20ms / 0.5 ms) = 2.5%
Let op: De waarden hierboven zijn theoretisch, voor mij werken deze waarden:
– rechts = duty-cycle van 11%
– midden = duty-cycle van 6%
– links = duty-cycle van 2.5%
Wat heb je nodig?
Voor het aansturen heb je de SERVO bibliotheek nodig, deze wordt standaard met de Arduino software geïnstalleerd!
Het aantal graden wat de servo moet draaien is eenvoudig in te stellen zoals: myservo.write(pos); ,waar pos een getal tussen 0 en 180.
Aansluiten op de Arduino
Sluit de SG-90 servo aan zoals aangegeven op onderstaand schema:
Arduino pin: | Draadkleur SG-90: |
---|---|
+5v | Rood |
GND | Bruin |
D9 | Oranje |
Script – Servo testen (automatisch draaien)
Onderstaand script laat de servo 180 graden draaien met de klok mee en tegen de klok in, een mooie manier om eenvoudig de servo te testen!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
// Laad de servo biblitheek. #include <Servo.h> Servo myservo; // Een variabele om de servo positie in te bewaren. int pos = 0; void setup() { // Configureer de DATA pin (stuur signaal) myservo.attach(9); } void loop() { // Ga van 0 graden naar 180 graden in stapjes van 1 graad. for(pos = 0; pos < 180; pos += 1) { // Draai naar de opgegeven positie. myservo.write(pos); // Wacht 15 milliseconden zodat de servo kan draaien naar de positie. delay(15); } // Ga van 180 graden naar 0 graden in stapjes van 1 graad for(pos = 180; pos>=1; pos-=1) { // Draai naar de opgegeven positie. myservo.write(pos); // Wacht 15 milliseconden zodat de servo kan draaien naar de positie. delay(15); } } |
Script – Servo testen (hoek in seriële monitor)
Met onderstaand script kun je via de seriële motor een hoek opgeven (0-180 graden)
1) Open de seriële monitor.
2) Tik een getal in tussen de 0 en 180.
3) Druk op enter, de servo zal zich instellen op het aantal graden.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
#include <Servo.h> String readString; // Creeer een servo object om de servo aan te sturen. Servo mijnservo; void setup() { // Start de seriel poort op 9600 baud. Serial.begin(9600); // Configureer de arduino pin voor de datakabel van de servo. mijnservo.attach(9); } void loop() { while (Serial.available()) { // Even wachten zodat de buffer zich kan vullen. delay(3); // Kijk of er seriele gegevens binnenkomen. if (Serial.available() >0) { // Lees 1 byte van de seriele buffer. char c = Serial.read(); // Plaats de ingelezen byte achter de rest (om een string te maken). readString += c; } } if (readString.length() >0) { // Lees de positie in van de seriele poort, maak er een getal van (toInt). int positie = readString.toInt(); // Zet de servo in de opgegeven positie. mijnservo.write(positie); // Maak de buffer weer leeg. readString = ""; } } |
Script – Servo bedienen met een potmeter
Sluit een potmeter en een servo aan zoals aangegeven in het volgende schema:
Dit is de code om de servo te bedienen met de potmeter:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <Servo.h> // Laad de servo biblitheek. Servo myservo; int potmeter = A0; // Pin configuratie potmeter. void setup() { myservo.attach(9); // Configureer de DATA pin servo (stuur signaal). Serial.begin(9600); // zet seriele poort aan op 9600 baud. } void loop() { int pot = analogRead(potmeter); int pos = map(pot, 0, 1023, 0, 180); // Map de sensorwaarde van 0 t/m 180. Serial.print(pot); Serial.print("(POT) / "); // print potmeter waarde via seriele monitor. Serial.print(pos); Serial.println("(SERVO)"); // print servo waarde via seriele monitor. myservo.write(pos); // stuur de positie door naar de servo. delay(5); // even wachten voor een nieuwe loop. } |
Dit is de console output via de seriële monitor: