Search Code

Lekcija 92: Upravljanje više servo motora svakim s potenciometrom | Arduino Kurs Korak po Korak

Lekcija 92: Upravljanje više servo motora svakim s potenciometrom | Arduino Kurs Korak po Korak

U ovom projektu naučit ćete kako izgraditi nezavisni, višekanalni servo kontroler koristeći Arduino Uno i dva potenciometra. Umjesto jednog serva koji prati jednu dugmad, ovaj vodič pokazuje kako svakom servu dati vlastiti namjenski analogni ulaz, omogućavajući vam da kontrolišete dva—pa čak i do šest—servo motora nezavisno i istovremeno. Ovo je temeljni gradivni blok za svaki projekat koji zahtijeva preciznu, ručnu kontrolu više pokretnih dijelova.

sg90_servo

Ova postavka je nevjerovatno svestrana. Evo nekoliko praktičnih načina na koje je možete koristiti:

  • Robotika: Kontrola nagiba i okretanja kamerinog gimbala ili baze i zglobova ruke malog robota.
  • Animatronika: Stvaranje životnih pokreta za lutku ili animatronički lik nezavisnom kontrolom glave i očiju.
  • Kontrola modela: Izgradnja prilagođenog kontrolera za RC vozila ili modele aviona za precizno podešavanje zakrilaca i krilaca.
  • Automatizacija: Stvaranje stanice za ručno upravljanje za solarni tracker ili višeosni pozicionirajući pribor.

Potreban hardver

  • Arduino Uno (ili bilo koja kompatibilna ploča)
  • 2x servo motora (ovdje se koriste standardni servo motori od 180 stepeni)
  • 2x potenciometra (10kΩ je uobičajen izbor)
  • Breadboard i žice za spajanje
  • Eksterno 5V napajanje (preporučljivo za više serva)

 

Vodič za povezivanje

Ovaj projekat zahtijeva malo više povezivanja nego postavka s jednim servom, uglavnom zato što trebate distribuirati napajanje i uzemljenje na više komponenti. Ključ je korištenje naponskih šina na breadboardu za stvaranje zajedničke 5V i GND magistrale. Dijagram povezivanja je neophodan za ovu izgradnju.

Two_or_more_Servo_pot_bb

Razdvojimo veze, kao što je objašnjeno u videu (u videu na 02:23). Prvo, postavite naponske šine: spojite 5V pin Arduina na pozitivnu šinu breadboarda i GND pin na negativnu šinu. Ovo vam daje lak pristup napajanju za sve vaše komponente.

Potenciometri: Svaki potenciometar djeluje kao razdjelnik napona. Spojite desni pin svakog potenciometra na 5V šinu i lijevi pin na GND šinu. Srednji pin je "klizač" i pruža promjenjivi napon. Spojite srednji pin prvog potenciometra na analogni ulaz A0, a srednji pin drugog na A1 (u videu na 03:22).

Servo motori: Svaki servo ima tri žice. Spojite tamnu žicu (obično crnu ili smeđu) na GND šinu. Spojite srednju žicu (obično crvenu) na 5V šinu. Na kraju, spojite signalnu žicu (obično narandžastu ili žutu) na pin s PWM podrškom na Arduinu. Signalna žica prvog serva ide na pin 3, a signalna žica drugog serva ide na pin 5 (u videu na 04:01). Zapamtite, morate koristiti pinove s PWM podrškom (označene tildom "~" na Unu) za kontrolu serva.

Objašnjenje koda

Kod se zasniva na standardnom primjeru "Knob" iz Arduino IDE-a, ali je modificiran za upravljanje s dva serva. Logika je jednostavna: pročitajte analognu vrijednost s potenciometra, mapirajte je u ugao i naredite servu da se pomakne na taj ugao. Konfiguracijski dio na vrhu koda je mjesto gdje ćete izvršiti sva podešavanja.

Ovdje je korisnički konfigurabilni dio koji definira pinove i kreira servo objekte:


#include <Servo.h>

//**** postavke serva 1
Servo servo1; 
const int servo1PotPin = A0;
const int servo1Pin = 3;// Mora se koristiti pin s PWM podrškom
int servo1Value;
//**** kraj postavki serva 1

//**** postavke serva 2
Servo servo2; 
const int servo2PotPin = A1;
const int servo2Pin = 5;// Mora se koristiti pin s PWM podrškom
int servo2Value;
//**** kraj postavki serva 2

Ovo je srž konfiguracije. Da biste dodali treći servo, kopirali biste blok "postavke serva 2", promijenili sve "2" u "3", dodijelili novi analogni pin (npr. A2) i novi PWM pin (npr. 9). Klasa Servo je ugrađena u Arduino IDE, tako da nisu potrebne dodatne biblioteke.

U funkciji setup(), naredba servo.attach(pin) govori Arduinu koji je pin spojen na signalnu žicu svakog serva. Morate imati liniju za svaki servo koji koristite.


void setup() {
  //Robojax.com višestruki servo
  servo1.attach(servo1Pin); 
  servo2.attach(servo2Pin);   
}

U loop(), kod čita vrijednost potenciometra, mapira je u raspon od 0-180 stepeni i zapisuje taj ugao na servo. delay(5) na kraju je parametar za podešavanje. Kao što je demonstrirano u videu, smanjenje ove vrijednosti s 15 na 5 milisekundi čini pokret serva mnogo glatkijim i eliminira vibracije (u videu na 12:00).

Demonstracija uživo projekta

Jednom kada spojite krug i prenesete kod, demonstracija je trenutna. Kada uključite Arduino, svaki servo će se pomaknuti na poziciju određenu trenutnom postavkom njegovog odgovarajućeg potenciometra. Dok okrećete dugme, njegov servo će glatko pratiti pokret. Video demonstrira da dva serva rade potpuno nezavisno, omogućavajući složene, istovremene pokrete. Ako primijetite bilo kakvo podrhtavanje ili vibracije, podešavanje vrijednosti delay() u petlji je prva stvar koju treba pokušati.

Poglavlja

  • [00:00] Uvod i pregled projekta
  • [00:56] Razumijevanje servo motora
  • [02:23] Šema povezivanja za dva servoa i potenciometra
  • [04:15] Detaljno objašnjenje povezivanja
  • [06:49] Objašnjenje koda: Konfiguracija i podešavanje
  • [09:15] Objašnjenje koda: Logika upravljanja i mapiranje
  • [11:15] Živa demonstracija i podešavanje

Images

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
Language: 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

Resources & references

No resources yet.

Files📁

Other files