Search Code

Lekcija 86: Upravljanje položajem servo motora pomoću potenciometra

Lekcija 86: Upravljanje položajem servo motora pomoću potenciometra

Zamislite da okrećete jednostavnu ručicu i gledate kako mehanička ruka precizno prati svaki vaš pokret. To je magija kombinovanja potenciometra sa servo motorom. Ovaj projekat, dio Arduino Step by Step Course od Robojax-a, demonstrira fundamentalan i izuzetno koristan koncept u elektronici: pretvaranje analognog ulaza u precizno fizičko kretanje. Naučit ćete kako očitati promjenjivi napon sa potenciometra, mapirati tu vrijednost na raspon uglova i komandovati servo motoru da se rotira na tačno tu poziciju. Ovo je vaša kapija ka izgradnji intuitivnih i interaktivnih projekata gdje se ručna kontrola susreće s automatizacijom.

Primjene ove vještine su ogromne i praktične. Evo samo nekoliko ideja koje će vas inspirisati:

  • Kontrola robotske ruke: Koristite potenciometar za ručno pozicioniranje svakog zgloba robotske ruke za precizne operacije podizanja i postavljanja.
  • Sistem za pomicanje i naginjanje kamere: Izgradite daljinski upravljani nosač kamere za time-lapse ili nadzor, glatko pomičući i naginjući okretanjem dugmeta.
  • Replika analognog mjerača: Napravite fizički mjerač na instrument tabli (poput brzinomjera ili termometra) koji se pomiče na osnovu podataka sa senzora, s potenciometrom kao ručnom kontrolom ili alatom za kalibraciju.
  • Interaktivne umjetničke instalacije: Napravite kinetičke skulpture koje reaguju na unos posmatrača, gdje okretanje dugmeta mijenja položaj pokretnih dijelova.
  • Upravljanje modelom vozila: Daljinski kontrolišite ugao upravljanja modela automobila ili broda, pružajući intuitivniji i analogniji osjećaj od digitalnih dugmadi.

Ovaj vodič je zasnovan na video tutorijalu Lesson 86: Control position of a servo motor using potentiometer od Robojax-a (u videu na 00:00). Provest će vas kroz cijeli proces, od razumijevanja ožičenja do objašnjenja koda koji sve to čini mogućim. Hajde da počnemo.

Hardver i komponente

Da biste pratili ovaj projekat, trebat će vam sljedeće komponente:

  • Arduino ploča (npr. Uno, Nano)
  • Standardni servo motor (npr. SG90 ili MG996R)
  • Potenciometar (promjenjivi otpornik, obično 10kΩ)
  • Konektorske žice
  • Breadboard (opciono, za lakše povezivanje)

Razumijevanje ožičenja

Ožičenje za ovaj projekat je jednostavno. Ključ je u obezbjeđivanju ispravnih priključaka za napajanje i signal za servo i potenciometar. Servo je uređaj koji troši puno energije, pa dobija napajanje direktno sa 5V pina Arduina. Potenciometar djeluje kao djelitelj napona, a mi očitavamo napon na njegovom klizaču (srednjem pinu) kako bismo odredili njegov položaj. (u videu na 01:05)

Jedan pametan trik koji ovaj projekat koristi je stvaranje dodatnog 5V izvora na digitalnom pinu za napajanje potenciometra, jer neke Arduino ploče imaju samo jedan namjenski 5V pin. To se radi u kodu postavljanjem digitalnog pina (pin 8) na HIGH, što daje 5V izlaz. (u videu na 00:39)

Ovdje je dijagram ožičenja spomenut u videu:

Arduino ožičenje za servo motor s potenciometrom
Arduino ožičenje za servo motor s potenciometrom

Hajde da raščlanimo veze:

  • Servo motor:
    • Napajanje (crvena žica) → Arduino 5V pin
    • Uzemljenje (smeđa/crna žica) → Arduino GND pin
    • Signal (narandžasta/žuta žica) → Arduino pin 3 (pin s PWM podrškom)
  • Potenciometar:
    • Lijevi pin → Arduino GND pin
    • Srednji pin (klizač) → Arduino analogni pin A0
    • Desni pin → Arduino pin 8 (definisan kao VCC2 u kodu)

Objašnjenje koda

Kod za ovaj projekat je elegantno jednostavan. Koristi nekoliko ključnih Arduino funkcija za očitavanje potenciometra i kontrolu serva. Fokusirajmo se na korisnički podesive dijelove koje možete prilagoditi za svoje projekte. (u videu na 03:00)

Na vrhu skice definirate pinove i kreirate servo objekat. Ovo su primarne varijable koje ćete mijenjati na osnovu vašeg ožičenja:

#include <Servo.h>

Servo myservo;  // kreiraj servo objekat za kontrolu serva

int potpin = A0;  // analogni pin koji se koristi za povezivanje potenciometra
int servoPin = 3; // definiši digitalni pin (s PWM) za servo. Može se koristiti samo pin 3, 5, 6, 9, 10, 11
int VCC2 = 8;// definiši dodatni VCC za potenciometar
int val;    // varijabla za očitavanje vrijednosti s analognog pina

Evo šta svaki dio radi:

  • Servo myservo;: Ova linija kreira objekat nazvan myservo koji ćemo koristiti za kontrolu našeg specifičnog servo motora. Možete ga preimenovati, ali morate koristiti isto ime kasnije u kodu.
  • int potpin = A0;: Ovo definira koji analogni pin je povezan s klizačem potenciometra. Ako premjestite žicu na drugi analogni pin, morate ažurirati ovaj broj.
  • int servoPin = 3;: Ovo postavlja digitalni pin za signalnu žicu serva. Ključno je koristiti pin s PWM podrškom (obično označen s '~' na ploči). Komentar navodi važeće pinove za većinu Arduino ploča.
  • int VCC2 = 8;: Ovo je pin koji koristimo kao sekundarni 5V izvor za potenciometar. Ako imate ploču s više 5V pinova, možete ga spojiti direktno i ukloniti ovaj dio koda.

U setup() funkciji, kod inicijalizira servo i postavlja dodatni pin za napajanje. Funkcija myservo.attach(servoPin) je ključna jer govori Arduinu koji je pin spojen na signalnu žicu serva.

void setup() {
  Serial.begin(9600);          //  postavljanje serijske komunikacije
  myservo.attach(servoPin);  // spaja servo na pin 3 na servo objekat

  pinMode(VCC2, OUTPUT);// postavlja pin 8 kao izlaz
  digitalWrite(VCC2, HIGH);// postavlja pin 8 na HIGH tako da djeluje kao 5V pin
}

Osnovna logika je u loop() funkciji. Ona čita vrijednost potenciometra, skalira je na ugao i naređuje servu da se pomjeri. Dvije ključne funkcije ovdje su analogRead() i map(). (u videu na 04:27)

void loop() {
  val = analogRead(potpin);            // čita vrijednost potenciometra (vrijednost između 0 i 1023)
  val = map(val, 0, 1023, 0, 180);     // skalira je za upotrebu sa servom (vrijednost između 0 i 180)
  myservo.write(val);                  // postavlja poziciju serva prema skaliranoj vrijednosti
  Serial.print(val);
  Serial.println();
  delay(50);                           // čeka da servo stigne tamo
}

Evo kako to funkcionira:

  • analogRead(potpin): Ova funkcija čita napon sa klizača potenciometra i vraća vrijednost između 0 (0V) i 1023 (5V).
  • map(val, 0, 1023, 0, 180): Ovo je ključ cijelog projekta. Uzima sirovu vrijednost sa potenciometra (0 do 1023) i proporcionalno je pretvara u ugao serva (0 do 180 stepeni). Na primjer, ako potenciometar očita 511 (otprilike pola), funkcija map() će vratiti 90, pomjerajući servo u njegovu centralnu poziciju.
  • myservo.write(val): Ova funkcija uzima izračunati ugao (sada pohranjen u val) i govori servu da se rotira na tu poziciju.
  • delay(50): Ovo dodaje malu pauzu na kraju svake petlje. Kontrolira brzinu ažuriranja. Veće kašnjenje (poput 200ms) čini da se servo kreće u koracima, dok manje kašnjenje (poput 50ms) čini pokret vrlo glatkim. Možete ovo prilagoditi da promijenite odzivnost. (u videu na 07:26)

Demonstracija uživo projekta

U videu možete vidjeti projekt u akciji. Dok se dugme potenciometra okreće, ruka servo motora prati njegovu poziciju proporcionalno. Serijski monitor ispisuje trenutni ugao, potvrđujući da mapiranje radi ispravno. Kada je potenciometar na minimalnoj poziciji, servo je na 0 stepeni. Dok okrećete dugme do maksimuma, servo se glatko rotira do 180 stepeni. (u videu na 06:33)

Ova petlja povratne informacije u realnom vremenu demonstrira besprijekornu integraciju analognog senzora sa digitalnim aktuatorom, stvarajući odzivan i intuitivan kontrolni sistem.

Poglavlja

  • [00:00] Uvod i pregled projekta
  • [01:05] Šema i dijagram povezivanja
  • [02:07] Demonstracija fizičkog povezivanja
  • [03:00] Objašnjenje koda
  • [06:33] Demonstracija uživo i testiranje
  • [07:26] Podešavanje brzine odziva serva

Images

Arduino wiring or servo motor with pot
Arduino wiring or servo motor with pot
SG90_servo_motor-1
SG90_servo_motor-1
SG90_servo_motor-0
SG90_servo_motor-0
892-Lesson 86: Controlling a servo position using a potentiometer (variable resistor)
Language: C++
/*
 * Lesson 88: Controlling Servo motor a with Potentiometer
 * 📚⬇️ Download and resource page https://robojax.com/RJT763
 watch full video tutroial: https://www.youtube.com/watch?v=ntRW77mNFFk
 
 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

 Update by Ahmad Shamshiri on Jan 01, 2019  in Ajax, Ontario, Canada


*/

#include <Servo.h>

Servo myservo;  // create servo object to control a servo

int potpin = A0;  // analog pin used to connect the potentiometer
int servoPin = 3; // define a digital pin (with PWM) for servo. Can use only pin 3, 5, 6,9, 10, 11
int VCC2 = 8;// define extra VCC for potentiometer
int val;    // variable to read the value from the analog pin

void setup() {
  //
  Serial.begin(9600);          //  setup serial
  myservo.attach(servoPin);  // attaches the servo on pin 3 to the servo object

  pinMode(VCC2, OUTPUT);// set pin 8 as output
  digitalWrite(VCC2, HIGH);// set pin 8 HIGH so it acts as 5V pin
}

void loop() {
  
  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023)
  val = map(val, 0, 1023, 0, 180);     // scale it to use it with the servo (value between 0 and 180)
  myservo.write(val);                  // sets the servo position according to the scaled value
  Serial.print(val);
  Serial.println();
  delay(50);                           // waits for the servo to get there
}
 

Resources & references

Files📁

Other files