Les 92: Meerdere servo's elk met potentiometer besturen | Arduino Stap voor Stap Cursus
In dit project leer je hoe je een onafhankelijke, meerkanaals servobesturing bouwt met een Arduino Uno en twee potentiometers. In plaats van één servo die één knop volgt, laat deze handleiding zien hoe je elke servo zijn eigen toegewijde analoge ingang geeft, zodat je twee—en tot zes—servomotoren onafhankelijk en gelijktijdig kunt besturen. Dit is een fundamenteel bouwblok voor elk project dat nauwkeurige, handmatige bediening van meerdere bewegende onderdelen vereist.

Deze opstelling is ongelooflijk veelzijdig. Hier zijn een paar praktische manieren waarop je het kunt gebruiken:
- Robotica: Het besturen van de pan en tilt van een cameragimbal of de basis- en armgewrichten van een kleine robot.
- Animatronica: Het creëren van levensechte bewegingen voor een pop of animatronisch personage door het hoofd en de ogen onafhankelijk te besturen.
- Modelbesturing: Het bouwen van een aangepaste controller voor RC-voertuigen of modelvliegtuigen om kleppen en rolroeren nauwkeurig af te stellen.
- Automatisering: Het creëren van een handmatige overridestation voor een zonnevolger of een meerassige positioneringsmal.
Benodigde hardware
- Arduino Uno (of een compatibel bord)
- 2x servomotoren (standaard 180-graden servo's worden hier gebruikt)
- 2x potentiometers (10kΩ is een veelvoorkomende keuze)
- Breadboard en jumperdraden
- Externe 5V-voeding (aanbevolen voor meerdere servo's)
Bekabelingshandleiding
Dit project vereist wat meer bedrading dan een opstelling met één servo, voornamelijk omdat je stroom en aarde naar meerdere componenten moet verdelen. De sleutel is om de stroomrails van het breadboard te gebruiken om een gemeenschappelijke 5V- en GND-bus te creëren. Een bedradingsschema is essentieel voor deze build.

Laten we de verbindingen opsplitsen, zoals uitgelegd in de video (in video op 02:23). Stel eerst je stroomrails in: verbind de 5V-pin van de Arduino met de positieve rail van het breadboard en de GND-pin met de negatieve rail. Dit geeft je gemakkelijke toegang tot stroom voor al je componenten.
Potentiometers: Elke potentiometer fungeert als een spanningsdeler. Verbind de rechterpin van elke pot met de 5V-rail en de linkerpin met de GND-rail. De middelste pin is de "wiper" en levert een variabele spanning. Verbind de middelste pin van de eerste potentiometer met analoge ingang A0, en de middelste pin van de tweede met A1 (in video op 03:22).
Servomotoren: Elke servo heeft drie draden. Verbind de donkergekleurde draad (meestal zwart of bruin) met de GND-rail. Verbind de middelste draad (meestal rood) met de 5V-rail. Verbind ten slotte de signaaldraad (meestal oranje of geel) met een PWM-pin op de Arduino. De signaaldraad van de eerste servo gaat naar pin 3, en de signaaldraad van de tweede servo gaat naar pin 5 (in video op 04:01). Onthoud dat je PWM-pinnen (gemarkeerd met een tilde "~" op de Uno) moet gebruiken voor servobesturing.
Code-uitleg
De code is gebaseerd op het standaard "Knob"-voorbeeld van de Arduino IDE, maar is aangepast om twee servo's te verwerken. De logica is eenvoudig: lees de analoge waarde van een potentiometer, mapt deze naar een hoek en geef de servo de opdracht om naar die hoek te bewegen. Het configuratiegedeelte bovenaan de code is waar je al je aanpassingen maakt.
Hier is het door de gebruiker configureerbare gedeelte dat de pinnen definieert en de servo-objecten creëert:
#include <Servo.h>
//**** servo 1 instellingen
Servo servo1;
const int servo1PotPin = A0;
const int servo1Pin = 3;// Moet een PWM-pin zijn
int servo1Value;
//**** servo 1 instellingen EINDE
//**** servo 2 instellingen
Servo servo2;
const int servo2PotPin = A1;
const int servo2Pin = 5;// Moet een PWM-pin zijn
int servo2Value;
//**** servo 1 instellingen EINDE
Dit is de kern van de configuratie. Om een derde servo toe te voegen, kopieer je het blok "servo 2 instellingen", verander je alle "2"-en in "3", wijs je een nieuwe analoge pin toe (bijv. A2) en een nieuwe PWM-pin (bijv. 9). De Servo-klasse is ingebouwd in de Arduino IDE, dus er zijn geen extra bibliotheken nodig.
In de setup()-functie vertelt het servo.attach(pin)-commando de Arduino welke pin is verbonden met de signaaldraad van elke servo. Je moet een regel hebben voor elke servo die je gebruikt.
void setup() {
//Robojax.com meerdere servo's
servo1.attach(servo1Pin);
servo2.attach(servo2Pin);
}
In de loop() leest de code de potentiometerwaarde, mapt deze naar een bereik van 0-180 graden en schrijft die hoek naar de servo. De delay(5) aan het einde is een afstemparameter. Zoals gedemonstreerd in de video, maakt het verlagen van deze waarde van 15 naar 5 milliseconden de servobeweging veel vloeiender en elimineert het trillingen (in video op 12:00).
Live projectdemonstratie
Zodra je het circuit hebt bedraad en de code hebt geüpload, is de demonstratie onmiddellijk. Wanneer je de Arduino van stroom voorziet, beweegt elke servo naar een positie die wordt bepaald door de huidige instelling van de bijbehorende potentiometer. Terwijl je een knop draait, volgt de servo de beweging soepel. De video demonstreert dat de twee servo's volledig onafhankelijk werken, waardoor complexe, gelijktijdige bewegingen mogelijk zijn. Als je enige schokkerigheid of trilling opmerkt, is het aanpassen van de delay()-waarde in de loop het eerste wat je moet proberen.
Hoofdstukken
- [00:00] Introductie en projectoverzicht
- [00:56] Servomotoren begrijpen
- [02:23] Bedradingsschema voor twee servo's en potentiometers
- [04:15] Gedetailleerde uitleg over bedrading
- [06:49] Code-uitleg: configuratie en instelling
- [09:15] Code-uitleg: besturingslogica en mapping
- [11:15] Live demonstratie en afstemming
/*
* Control two or more servo motors
* using potentiometers.
* Modified by Ahmad Shamshiri on Oct 17, 2019 at 20:13
* in Ajax, Ontario, Canada . www.Robojax.com
* This code on robojax https://robojax.com/RJT766
*
* Original code from Arduino IDE: File->Examples->Servo->knob
*
Controlling a servo position using a potentiometer (variable resistor)
by Michal Rinott <http://people.interaction-ivrea.it/m.rinott>
modified on 8 Nov 2013
by Scott Fitzgerald
http://www.arduino.cc/en/Tutorial/Knob
* Get this code and other Arduino codes from Robojax.com
* * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.*
* This code has been download from Robojax.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include <Servo.h>
//**** servo 1 settings
Servo servo1;
const int servo1PotPin =A0;
const int servo1Pin = 3;// Must use PWM enabled pin
int servo1Value;
//**** servo 1 settings END
//**** servo 2 settings
Servo servo2;
const int servo2PotPin =A1;
const int servo2Pin = 5;// Must use PWM enabled pin
int servo2Value;
//**** servo 1 settings END
void setup() {
//Robojax.com multiple servo
servo1.attach(servo1Pin);
servo2.attach(servo2Pin);
}
void loop() {
//Robojax.com multiple servo
servo1Value = analogRead(servo1PotPin);
servo1Value = map(servo1Value, 0, 1023, 0, 180);
servo1.write(servo1Value);
servo2Value = analogRead(servo2PotPin);
servo2Value = map(servo2Value, 0, 1023, 0, 180);
servo2.write(servo2Value);
delay(5);
//Robojax.com multiple servo
}// loop end
Dingen die je misschien nodig hebt
-
Amazon
-
Amazon
-
eBay
-
AliExpressPurchase SG90 Servo motor 180 or 360 from AliExpresss.click.aliexpress.com
Hulpmiddelen en referenties
Nog geen middelen.
Bestanden📁
Andere bestanden
-
SG90 Seroo motor datasheet
robojax-servo-SG90_datasheet.pdf0.12 MB