Obsah:
- Krok 1: BoM - kusovník
- Krok 2: Ako funguje PWM
- Krok 3: Inštalácia Hw
- Krok 4: Kalibrácia serva
- Krok 5: Vytvorenie skriptu Python
- Krok 6: Mechanizmus naklápania
- Krok 7: Mechanizmus naklápania - mechanická konštrukcia
- Krok 8: Elektrická zostava otáčania/nakláňania
- Krok 9: Skript Python
- Krok 10: Smyčkový test serverov
- Krok 11: Záver
Video: Pan-Tilt Multi Servo Control: 11 krokov (s obrázkami)
2025 Autor: John Day | [email protected]. Naposledy zmenené: 2025-01-13 06:58
V tomto návode sa pozrieme na to, ako ovládať viac serv pomocou Pythonu na Raspberry Pi. Našim cieľom bude mechanizmus PAN/TILT na umiestnenie kamery (PiCam).
Tu môžete vidieť, ako bude náš konečný projekt fungovať:
Skúška riadiacej slučky Control Servo:
Krok 1: BoM - kusovník
Hlavné časti:
- Raspberry Pi V3 - 32,00 USD
- 5 -megapixelový snímač 1080p video modul mini kamery OV5647 - 13,00 USD
- Micro Servo TowerPro SG90 9G 180 stupňov (2 X)- 4,00 USD
- Mini otočná/ naklápacia platforma kamery, antivibračný držiak kamery s 2 servami (*) - 8,00 USD
- Rezistor 1K ohm (2X) - voliteľný
- Rôzne: kovové časti, pásy atď. (V prípade, že zostrojíte mechanizmus otáčania/nakláňania)
(*) môžete si kúpiť kompletnú platformu Pan/Tilt so servom alebo si postaviť vlastnú.
Krok 2: Ako funguje PWM
Raspberry Pi nemá analógový výstup, ale môžeme to simulovať pomocou prístupu PWM (Pulse Width Modulation). Čo budeme robiť, je generovať digitálny signál s pevnou frekvenciou, kde zmeníme šírku sledu impulzov, čo bude „preložené“ako „priemernú“úroveň výstupného napätia, ako je uvedené nižšie:
Túto „priemernú“úroveň napätia môžeme použiť na ovládanie jasu LED napríklad:
Všimnite si toho, že tu nie je dôležitá frekvencia, ale „pracovný cyklus“, to je vzťah medzi časom, kedy sú impulzy „vysoké“, vydelený vlnovou periódou. Predpokladajme napríklad, že na jednom z našich Raspberry Pi GPIO budeme generovať pulzovú frekvenciu 50 Hz. Perióda (p) bude inverznou frekvenciou alebo 20 ms (1/f). Ak chceme, aby naše LED diódy s „polovičným“svetlom svietili, musíme mať pracovný cyklus 50%, to znamená „pulz“, ktorý bude „vysoký“po dobu 10 ms.
Tento princíp bude pre nás veľmi dôležitý pre ovládanie polohy serva, keď „pracovný cyklus“definuje polohu serva, ako je uvedené nižšie:
Servo
Krok 3: Inštalácia Hw
Serva budú pripojené k externému zdroju 5 V, pričom ich dátový kolík (v mojom prípade ich žlté vedenie) sa pripojí k Raspberry Pi GPIO nasledovne:
- GPIO 17 ==> Naklápacie servo
- GPIO 27 ==> Pan Servo
Nezabudnite spojiť GND dohromady ==> Raspberry Pi - serva - externý napájací zdroj)
Medzi vstupným pinom Raspberry Pi GPIO a Server môžete mať voliteľne odpor 1 K ohm. To by chránilo vaše RPi v prípade problému so servom.
Krok 4: Kalibrácia serva
Prvá vec, ktorú musíte urobiť, je potvrdiť hlavné charakteristiky vašich serv. V mojom prípade používam Power Pro SG90.
Z jeho technického listu môžeme zvážiť:
- Rozsah: 180o
- Napájanie: 4,8 V (externý 5 V DC ako USB zdroj funguje dobre)
- Pracovná frekvencia: 50 Hz (Obdobie: 20 ms)
- Šírka impulzu: od 1 ms do 2 ms
Servo bude teoreticky zapnuté
- Počiatočná poloha (0 stupňov), keď je na jeho dátový terminál aplikovaný impulz 1 ms
- Neutrálna poloha (90 stupňov), keď je na jeho dátový terminál aplikovaný impulz 1,5 ms
- Konečná poloha (180 stupňov), keď je na jeho dátový terminál aplikovaný impulz 2 ms
Na programovanie polohy serva pomocou Pythonu bude veľmi dôležité poznať zodpovedajúci „pracovný cyklus“pre vyššie uvedené polohy, urobme malý výpočet:
- Počiatočná poloha ==> (0 stupňov) Šírka impulzu ==> 1ms ==> Pracovný cyklus = 1ms/20ms ==> 2,0%
- Neutrálna poloha (90 stupňov) Šírka impulzu 1,5 ms ==> Pracovný cyklus = 1,5 ms/20 ms ==> 7,5%
- Konečná poloha (180 stupňov) Šírka impulzu 2 ms ==> Pracovný cyklus = 2ms/20ms ==> 10%
Pracovný cyklus by sa teda mal pohybovať v rozmedzí 2 až 10 %.
Poďme otestovať servá jednotlivo. Za týmto účelom otvorte svoj terminál Raspberry a spustite editor shellu Python 3 ako „sudo“(pretože by ste mali byť „super používateľom“, s ktorým sa dá pracovať s GPIO):
sudo python3
Na Python Shell
>>
Importujte modul RPI. GPIO a nazvite ho GPIO:
importujte RPi. GPIO ako GPIO
Definujte, ktoré schémy číslovania pinov chcete používať (BCM alebo BOARD). Tento test som urobil s BOARD, takže piny, ktoré som použil, boli fyzické piny (GPIO 17 = Pin 11 a GPIO 27 Pin 13). Bolo pre mňa ľahké ich identifikovať a nerobiť chyby počas testu (V záverečnom programe použijem BCM). Vyberte si podľa svojich preferencií:
GPIO.setmode (GPIO. BOARD)
Definujte kolík serva, ktorý používate:
tiltPin = 11
Ak ste namiesto toho použili schému BCM, posledné 2 príkazy by mali byť nahradené týmto:
GPIO.setmode (GPIO. BCM)
tiltPin = 17
Teraz musíme špecifikovať, že tento pin bude „výstupom“
GPIO.setup (tiltPin, GPIO. OUT)
A aká bude frekvencia generovaná na tomto pine, že pre naše servo bude 50 Hz:
tilt = GPIO. PWM (tiltPin, 50)
Teraz začneme generovať signál PWM na pine s počiatočným pracovným cyklom (ponecháme ho „0“):
náklon = začiatok (0)
Teraz môžete zadávať rôzne hodnoty pracovného cyklu a sledovať pohyb svojho serva. Začnime s 2% a uvidíme, čo sa stane (vidíme, že servo prejde do „nulovej polohy“):
tilt. ChangeDutyCycle (2)
V mojom prípade sa servo dostalo do nulovej polohy, ale keď som zmenil pracovný cyklus na 3%, zistil som, že servo zostalo v rovnakej polohe a začalo sa pohybovať s pracovnými cyklami väčšími ako 3%. 3% je teda moja počiatočná poloha (o stupne). To isté sa stalo s 10%, moje servo prekročilo túto hodnotu a skončilo na 13%. Takže pre toto konkrétne servo bol výsledok:
- 0 stupeň ==> pracovný cyklus 3%
- 90 stupňov ==> pracovný cyklus 8%
- 180 stupňov ==> pracovný cyklus 13%
Po dokončení testov musíte zastaviť PWM a vyčistiť GPIO:
nakloniť = zastaviť ()
GPIO.cleanup ()
Vyššie uvedená obrazovka Terminálu zobrazuje výsledok pre obe moje servá (ktoré majú podobné výsledky). Váš dosah môže byť odlišný.
Krok 5: Vytvorenie skriptu Python
Príkazy PWM, ktoré sa majú odoslať na naše servo, sú v „pracovných cykloch“, ako sme videli na poslednom kroku. Obvykle však musíme ako parameter na ovládanie serva použiť „uhol“v stupňoch. Musíme teda previesť „uhol“, ktorý je pre nás v pracovnom cykle prirodzenejším meraním, ako ho chápe náš Pi.
Ako to spraviť? Veľmi jednoduché! Vieme, že rozsah pracovného cyklu sa pohybuje od 3% do 13% a že je to ekvivalentné uhlom, ktoré sa budú pohybovať od 0 do 180 stupňov. Tiež vieme, že tieto variácie sú lineárne, takže môžeme vytvoriť proporcionálnu schému, ako je uvedené vyššie. vzhľadom na uhol teda môžeme mať zodpovedajúci pracovný cyklus:
pracovný cyklus = uhol/18 + 3
Dodržujte tento vzorec. Použijeme to v nasledujúcom kóde.
Vytvorme skript Pythonu na vykonanie testov. V zásade zopakujeme to, čo sme urobili predtým v Python Shell:
z času importu spánku
importujte RPi. GPIO ako GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) def setServoAngle (servo, uhol): pwm = GPIO. PWM (servo, 50) pwm.start (8) dutyCycle = uhol / 18. + 3. pwm. ChangeDutyCycle (dutyCycle) spánok (0,3) pwm.stop () if _name_ == '_main_': import sys servo = int (sys.argv [1]) GPIO.setup (servo, GPIO. OUT) setServoAngle (servo, int (sys.argv [2])) GPIO.cleanup ()
Jadrom vyššie uvedeného kódu je funkcia setServoAngle (servo, uhol). Táto funkcia prijíma ako argumenty, číslo GPIO serva a hodnotu uhla, na ktoré musí byť servo umiestnené. Akonáhle je zadaním tejto funkcie „uhol“, musíme ju previesť na pracovný cyklus v percentách podľa vzorca vyvinutého predtým.
Po spustení skriptu musíte zadať parametre, servo GPIO a uhol.
Napríklad:
sudo python3 angleServoCtrl.py 17 45
Vyššie uvedený príkaz umiestni servo pripojené k GPIO 17 o 45 stupňov v „nadmorskej výške“. Podobný príkaz by bolo možné použiť aj na ovládanie Pan Servo (poloha do 45 stupňov v „azimute“):
sudo python uholServoCtrl.py 27 45
Súbor AngleServoCtrl.py je možné stiahnuť z môjho GitHubu
Krok 6: Mechanizmus naklápania
Servo „Pan“sa bude „horizontálne“pohybovať s našou kamerou („azimutový uhol“) a naše „Tilt“servo s ním bude „vertikálne“(výškový uhol).
Nasledujúci obrázok ukazuje, ako funguje mechanizmus Pan/Tilt:
Počas nášho vývoja nepôjdeme do „extrémov“a budeme používať náš mechanizmus Pan/Tilt iba od 30 do 150 stupňov. Tento rozsah bude stačiť na použitie s fotoaparátom.
Krok 7: Mechanizmus naklápania - mechanická konštrukcia
Poďme teraz zostaviť naše 2 servá ako mechanizmus Pan/Tilt. Môžete tu robiť 2 veci. Kúpte si platformový mechanizmus Pan-Tilt ako na poslednom kroku alebo si vytvorte vlastný podľa svojich potrieb.
Jedným z príkladov môže byť ten, ktorý som postavil, pričom som navzájom spájal iba servá a používal malé kovové kúsky zo starých hračiek, ako je to znázornené na fotografiách vyššie.
Krok 8: Elektrická zostava otáčania/nakláňania
Akonáhle budete mať svoj mechanizmus otáčania/naklápania zostavený, postupujte podľa fotografií a získajte úplné elektrické pripojenie.
- Vypnite Pi.
- Vykonajte všetky elektrické pripojenia.
- Dvakrát skontrolujte.
- Najprv zapnite Pi.
- Ak je všetko v poriadku, napájajte serva.
V tomto návode nebudeme skúmať, ako nastaviť fotoaparát, to bude vysvetlené v nasledujúcom návode.
Krok 9: Skript Python
Vytvorme skript Python na ovládanie oboch serv súčasne:
z času importu spánku
import RPi. GPIO ako GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) pan = 27 tilt = 17 GPIO.setup (tilt, GPIO. OUT) # white => TILT GPIO.setup (pan, GPIO. OUT) # grey ==> PAN def setServoAngle (servo, angle): assert angle> = 30 and angle 90 (middle point) ==> 150 setServoAngle (tilt, int (sys.argv [2])) # 30 ==> 90 (stredný bod) ==> 150 GPIO.cleanup ()
Keď je skript spustený, musíte zadať ako parametre uhol posuvu a uhol náklonu. Napríklad:
sudo python3 servoCtrl.py 45 120
Vyššie uvedený príkaz umiestni mechanizmus otáčania/nakláňania o 45 stupňov v „azimute“(uhol posúvania) a 120 stupňoch „nadmorskej výšky“(uhol náklonu). Upozorňujeme, že ak nie sú zadané žiadne parametre, predvolené hodnoty budú uhly posuvu a náklonu nastavené na 90 stupňov.
Nasleduje niekoľko testov:
Súbor servoCtrl.py je možné stiahnuť z môjho GitHubu.
Krok 10: Smyčkový test serverov
Teraz vytvoríme skript Python na automatické testovanie celého radu serv:
z času importu spánku
import RPi. GPIO ako GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) pan = 27 tilt = 17 GPIO.setup (tilt, GPIO. OUT) # white => TILT GPIO.setup (pan, GPIO. OUT) # grey ==> PAN def setServoAngle (servo, angle): assert angle> = 30 and angle <= 150 pwm = GPIO. PWM (servo, 50) pwm.start (8) dutyCycle = angle / 18. + 3. pwm. ChangeDutyCycle (dutyCycle) spánok (0,3) pwm.stop () ak _name_ == '_main_': pre i v rozsahu (30, 160, 15): setServoAngle (pan, i) setServoAngle (tilt, i) for i in rozsah (150, 30, -15): setServoAngle (pan, i) setServoAngle (tilt, i) setServoAngle (pan, 100) setServoAngle (tilt, 90) GPIO.cleanup ()
Program automaticky vykoná slučku od 30 do 150 stupňov v oboch uhloch.
Pod výsledkom:
Pripojil som osciloskop iba na ilustráciu teórie PWM, ako bolo vysvetlené vyššie.
Vyššie uvedený kód, servoTest.py, je možné stiahnuť z môjho GitHubu.
Krok 11: Záver
Ako vždy, dúfam, že tento projekt pomôže iným nájsť si cestu do vzrušujúceho sveta elektroniky!
Podrobnosti a konečný kód nájdete v mojom depozitári GitHub: RPi-Pan-Tilt-Servo-Control
Viac projektov nájdete na mojom blogu: MJRoBot.org
Krátky pohľad na môj ďalší tutoriál:
Saludos z juhu sveta!
Uvidíme sa pri mojom ďalšom pokyne!
Ďakujem, Marcelo