Lekcia 86: Ovládanie polohy servomotora pomocou potenciometra
Predstavte si, že otočíte jednoduchým gombíkom a sledujete, ako mechanické rameno presne nasleduje každý váš pohyb. To je mágia kombinácie potenciometra so servomotorom. Tento projekt, súčasť kurzu Arduino Step by Step od Robojax, demonštruje základný a neuveriteľne užitočný koncept v elektronike: prevod analógového vstupu na presný fyzický pohyb. Naučíte sa, ako čítať premenlivé napätie z potenciometra, mapovať túto hodnotu na rozsah uhlov a ovládať servomotor, aby sa otočil do presnej polohy. Toto je vaša brána k vytváraniu intuitívnych a interaktívnych projektov, kde sa manuálne ovládanie stretáva s automatizáciou.

Aplikácie tejto zručnosti sú rozsiahle a praktické. Tu je len niekoľko nápadov, ktoré vás môžu inšpirovať:
- Ovládanie robotického ramena: Použite potenciometer na manuálne nastavenie každej osi robotického ramena pre presné operácie uchopenia a umiestnenia.
- Systém naklápania a otáčania kamery: Zostavte diaľkovo ovládaný držiak kamery pre časozbery alebo sledovanie, plynulo nakláňajte a otáčajte otočením gombíka.
- Replika analógového meradla: Vytvorte fyzický prístrojový panel (napríklad rýchlomer alebo teplomer), ktorý sa pohybuje na základe údajov zo senzorov, pričom potenciometer slúži ako manuálne prepísanie alebo kalibračný nástroj.
- Interaktívne umelecké inštalácie: Vytvorte kinetické sochy, ktoré reagujú na vstup diváka, kde otočenie gombíka mení polohu pohyblivých častí.
- Riadenie modelového vozidla: Diaľkovo ovládajte uhol natočenia kolies modelového auta alebo lode, čo poskytuje intuitívnejší a analógovejší pocit ako digitálne tlačidlá.
Táto príručka je založená na video tutoriáli Lesson 86: Control position of a servo motor using potentiometer od Robojax (vo videu o 00:00). Prevedie vás celým procesom, od pochopenia zapojenia až po vysvetlenie kódu, ktorý to všetko umožňuje. Poďme na to.
Hardvér a komponenty
Na realizáciu tohto projektu budete potrebovať nasledujúce komponenty:
- Dosku Arduino (napr. Uno, Nano)
- Štandardný servomotor (napr. SG90 alebo MG996R)
- Potenciometer (premenlivý odpor, zvyčajne 10kΩ)
- Prepojovacie vodiče
- Nepájivé pole (voliteľné, pre jednoduchšie zapojenie)
Pochopenie zapojenia
Zapojenie pre tento projekt je jednoduché. Kľúčom je zabezpečiť správne napájanie a signálové pripojenia pre servomotor aj potenciometer. Servomotor je zariadenie s vysokou spotrebou energie, preto je napájaný priamo z 5V pinu Arduina. Potenciometer funguje ako napäťový delič a my čítame napätie na jeho bežci (prostrednom pine), aby sme určili jeho polohu. (vo videu o 01:05)
Jedným šikovným trikom tohto projektu je vytvorenie dodatočného 5V zdroja na digitálnom pine na napájanie potenciometra, pretože niektoré dosky Arduino majú iba jeden vyhradený 5V pin. To sa v kóde dosiahne nastavením digitálneho pinu (pin 8) na HIGH, čím sa na výstupe objaví 5V. (vo videu o 00:39)
Tu je schéma zapojenia spomínaná vo videu:
Poďme si rozobrať jednotlivé pripojenia:
- Servomotor:
- Napájanie (červený vodič) → 5V pin Arduina
- Uzemnenie (hnedý/čierny vodič) → GND pin Arduina
- Signál (oranžový/žltý vodič) → pin 3 Arduina (pin s podporou PWM)
- Potenciometer:
- Ľavý pin → GND pin Arduina
- Prostredný pin (bežec) → analógový pin A0 Arduina
- Pravý pin → pin 8 Arduina (definovaný ako VCC2 v kóde)
Vysvetlenie kódu
Kód pre tento projekt je elegantne jednoduchý. Využíva niekoľko kľúčových funkcií Arduina na čítanie potenciometra a ovládanie servomotora. Zamerajme sa na používateľsky konfigurovateľné časti, ktoré môžete upraviť pre svoje vlastné projekty. (vo videu o 03:00)
Na začiatku náčrtu definujete piny a vytvoríte objekt serva. Toto sú hlavné premenné, ktoré zmeníte podľa svojho zapojenia:
#include <Servo.h>
Servo myservo; // vytvorenie objektu serva na ovládanie servomotora
int potpin = A0; // analógový pin použitý na pripojenie potenciometra
int servoPin = 3; // definícia digitálneho pinu (s PWM) pre servo. Možno použiť iba piny 3, 5, 6, 9, 10, 11
int VCC2 = 8;// definícia dodatočného VCC pre potenciometer
int val; // premenná na čítanie hodnoty z analógového pinu
Tu je vysvetlenie, čo robí každá časť:
- Servo myservo;: Tento riadok vytvára objekt s názvom
myservo, ktorý použijeme na ovládanie nášho konkrétneho servomotora. Môžete ho premenovať, ale musíte použiť rovnaký názov neskôr v kóde. - int potpin = A0;: Toto definuje, na ktorý analógový pin je pripojený bežec potenciometra. Ak presuniete vodič na iný analógový pin, musíte aktualizovať toto číslo.
- int servoPin = 3;: Toto nastavuje digitálny pin pre signálový vodič serva. Je dôležité použiť pin s podporou PWM (zvyčajne označený symbolom '~' na doske). Komentár uvádza platné piny pre väčšinu dosiek Arduino.
- int VCC2 = 8;: Toto je pin, ktorý používame ako sekundárny 5V zdroj pre potenciometer. Ak máte dosku s viacerými 5V pinmi, môžete ho pripojiť priamo a odstrániť túto časť kódu.
Vo funkcii setup() kód inicializuje servomotor a nastaví prídavný napájací pin. Funkcia myservo.attach(servoPin) je nevyhnutná, pretože hovorí Arduinu, ktorý pin je pripojený k signálnemu vodiču serva.
void setup() {
Serial.begin(9600); // nastavenie sériovej komunikácie
myservo.attach(servoPin); // pripojí servo na pin 3 k objektu serva
pinMode(VCC2, OUTPUT);// nastaví pin 8 ako výstup
digitalWrite(VCC2, HIGH);// nastaví pin 8 na HIGH, aby fungoval ako 5V pin
}
Jadro logiky je vo funkcii loop(). Číta hodnotu potenciometra, škáluje ju na uhol a prikazuje servu pohyb. Dve kritické funkcie sú analogRead() a map(). (vo videu o 04:27)
void loop() {
val = analogRead(potpin); // číta hodnotu potenciometra (hodnota medzi 0 a 1023)
val = map(val, 0, 1023, 0, 180); // škáluje ju na použitie so servom (hodnota medzi 0 a 180)
myservo.write(val); // nastaví polohu serva podľa škálovanej hodnoty
Serial.print(val);
Serial.println();
delay(50); // čaká, kým sa servo dostane do polohy
}
Takto to funguje:
- analogRead(potpin): Táto funkcia číta napätie z bežca potenciometra a vracia hodnotu medzi 0 (0V) a 1023 (5V).
- map(val, 0, 1023, 0, 180): Toto je kľúč k celému projektu. Berie surovú hodnotu z potenciometra (0 až 1023) a proporcionálne ju prevádza na uhol serva (0 až 180 stupňov). Napríklad, ak potenciometer číta 511 (približne polovicu), funkcia
map()vráti 90, čím posunie servo do stredovej polohy. - myservo.write(val): Táto funkcia berie vypočítaný uhol (teraz uložený v
val) a prikazuje servu otočiť sa do tejto polohy. - delay(50): Toto pridáva malú pauzu na konci každého cyklu. Riadi rýchlosť aktualizácie. Väčšie oneskorenie (napr. 200 ms) spôsobuje, že sa servo pohybuje v krokoch, zatiaľ čo menšie oneskorenie (napr. 50 ms) robí pohyb veľmi plynulým. Môžete to upraviť na zmenu odozvy. (vo videu o 07:26)
Živá demonštrácia projektu
Vo videu môžete vidieť projekt v akcii. Keď sa otáča gombíkom potenciometra, rameno servomotora sleduje jeho polohu proporcionálne. Sériový monitor vypisuje aktuálny uhol, čo potvrdzuje, že mapovanie funguje správne. Keď je potenciometer na minimálnej polohe, servo je na 0 stupňoch. Keď otočíte gombíkom na maximum, servo sa plynulo otočí na 180 stupňov. (vo videu o 06:33)
Táto spätná väzba v reálnom čase demonštruje bezproblémovú integráciu analógového senzora s digitálnym aktuátorom, čím vytvára citlivý a intuitívny riadiaci systém.
Kapitoly
- [00:00] Úvod a prehľad projektu
- [01:05] Schéma a schéma zapojenia
- [02:07] Fyzická demonštrácia zapojenia
- [03:00] Vysvetlenie kódu
- [06:33] Živá demonštrácia a testovanie
- [07:26] Úprava rýchlosti odozvy serva
/*
* 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
}
Veci, ktoré by ste mohli potrebovať
-
Amazon
-
Amazon
-
eBay
-
AliExpressPurchase SG90 servo motor 180 or 360 from AliExpresss.click.aliexpress.com
Zdroje a referencie
Súbory📁
Iné súbory
-
SG90 Servo motor datasheet
robojax-servo-SG90_datasheet.pdf0.12 MB