Arduino-opdrachten/Servo-slave
Servo
Leerdoelen | servo, sweep, map |
Voorkennis | variabele, IF |
Onderdelen |
Libraries en functies | Servo, map |
Inleiding
Een servo gebruik je vaak voor de mechanische besturing: het stuur van een auto, het roer van een boot, de verschillende roeren van een vliegtuig. Je zet de servo dan in een bepaalde hoek, tussen 0 en 180 graden.
- de meeste servo's kunnen niet compleet ronddraaien: je kunt alleen deze hoek instellen
- je kunt een servo ombouwen zodat deze wel compleet kan ronddraaien. Dergelijke servo's worden soms gebruikt voor de beweging van robots: je combineert dan de krachtbron en de besturing.
Voor de aansturing van de positie van de servo gebruik je een logische pin. Via deze pin stuur je een patroon van pulsen naar de servo om de gewenste positie door te geven.
De servo krijgt het vermogen voor het draaien van de motor via de voedingsspanning. De logische pin hoeft geen vermogen te leveren: je hebt geen transistor o.i.d. nodig. Als de servo niet teveel stroom vraagt, kun je de 5V van de Arduino als voeding voor de servo gebruiken.
Opbouwen van de schakeling
Het aansluiten van een servo is heel eenvoudig:
- sluit de rode (middelste) draad aan op 5V;
- sluit de bruine draad aan op 0V;
- sluit de gele (of oranje) draad aan op een digitale output-pin van de Arduino.
Voor het aansluiten van een servo kun je elke pin van de Arduino gebruiken die je kunt instellen voor digitale output. Je maakt geen gebruik van PWM.
We gebruiken ook een potmeter, om de servo te besturen.
- sluit de ene zijde van de potmeter aan op 0V;
- sluit de andere zijn op 5V;
- sluit de loper aan op pin A0 van de Arduino.
Opmerking: de servo kan zich "onrustig gedragen": dit kan komen doordat de motor veel stroom vraagt, wat invloed heeft op de voedingsspanning die weer als referentie gebruikt wordt voor de analoge ingang (potmeter). Je kunt dit probleem verminderen door een elektrolytische condensator van 470uF of meer aan te sluiten over de voedingsaansluitingen van de servo (rode en bruine/zwarte draad). Denk er om dat je deze condensator goed aansluit (+ aan 5V, - aan 0V/GND).
Schema
Programma
#include <Servo.h>
Servo myservo; // declare servo object to control a servo
int potpin = A0;
void setup() {
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}
void loop() {
int pos = analogRead(potpin);
pos = map(pos, 0, 1023, 0, 180); // re-map input to 0..180
myservo.write(pos); // set servo to position 'pos'
delay(15); // wait 15ms for the servo to stabilize
}
Uitleg van het programma
Voor het aansturen van de servo gebruik je de servo-library.
- Met
#include <Servo.h>
geef je aan dat je de servo-library gebruikt. Je "importeert" de definities van deze library in je programma. Servo myservo;
- hiermee maak je een servo-object aan (van typeServo
) om de toestand van de servo bij te houden. Je kunt meerdere servo's aansturen vanuit de Arduino: voor elke servo heb je een apart servo-object nodig.myservo.attacht(9);
- koppel het servo-object aan pin 9, en daarmee aan de servo die je via deze pin bestuurt.myservo.write(pos);
- stuur de servo naar positie "pos"; deze druk je uit in graden, tussen 0 en 180.delay(15);
- de servo heeft tijd nodig om de gewenste positie in te stellen.
De analoge inputwaarde van de potmeter moet aangepast worden aan het bereik van de servo (0..180 graden). De analoge invoer heeft een bereik van 0..1023. Met behulp van de functie map
kun je deze aanpassen:
pos = map(pos, 0, 1023, 0, 180);
- zie: https://www.arduino.cc/en/Reference/Map
Vragen en opdrachten
- beperk de beweging van de servo tussen 60 en 120 graden: potmeter links komt overeen met 60, potmeter rechts komt overeen met 120 graden.
- een dergelijke beperking heb je soms nodig bij het besturen van een voertuig zoals een boot of een vliegtuid.
- probeer de arm van de de servo (voorzichtig) te bewegen terwijl je de stand van de potmeter niet verandert: hoe gemakkelijk gaat dit?
- in de specificaties van een servo staat welke kracht deze kan uitoefenen.
- in plaats van de map-functie zou je de input-waarde ook door een getal kunnen delen. Welk getal zou je in dit geval willen gebruiken?
- suggestie: als je alleen met gehele getallen wilt rekenen, dan kun je in plaats van
x / 2.5
schrijven:x * 10 / 25
.
- suggestie: als je alleen met gehele getallen wilt rekenen, dan kun je in plaats van
- bedenk voorbeelden van toepassingen van een servo (of van een reeks servo's).