Hľadať kód

Lekcia 86: Ovládanie polohy servomotora pomocou potenciometra

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:

Zapojenie Arduina pre servomotor s potenciometrom
Zapojenie Arduina pre servomotor s potenciometrom

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

Obrázky

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)
Jazyk: 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
}
 

Zdroje a referencie

Súbory📁

Iné súbory