Search Code

Les 92: Meerdere servo's elk met potentiometer besturen | Arduino Stap voor Stap Cursus

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.

sg90_servo

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.

Two_or_more_Servo_pot_bb

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

Afbeeldingen

Multiple servo, one pot: Main setup
Multiple Servo one pot.: Main setup
Multiple servo, one pot: Main setup, top view
Multiple Servo one pot.: Main setup top view
Multiple servo one-pot: Creating extra 5V from an Arduino on a breadboard
Multiple Servo one pot.: Creating extra 5V from Arduino on breadboard
SG90 Mini Servo Motor
SG90 Mini Servo Motor
Two_or_more_Servo_pot_bb
Two_or_more_Servo_pot_bb
sg90_servo
sg90_servo
888-Lesson 92: Controlling Multiple servo motors
Taal: C++
/*
 * 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

Hulpmiddelen en referenties

Nog geen middelen.

Bestanden📁

Andere bestanden