Obsah:

Pan-Tilt Multi Servo Control: 11 krokov (s obrázkami)
Pan-Tilt Multi Servo Control: 11 krokov (s obrázkami)

Video: Pan-Tilt Multi Servo Control: 11 krokov (s obrázkami)

Video: Pan-Tilt Multi Servo Control: 11 krokov (s obrázkami)
Video: Part 6 - Lord Jim Audiobook by Joseph Conrad (Chs 37-45) 2024, Júl
Anonim
Pan-Tilt Multi Servo Control
Pan-Tilt Multi Servo Control

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:

Obrázok
Obrázok

Krok 1: BoM - kusovník

Hlavné časti:

  1. Raspberry Pi V3 - 32,00 USD
  2. 5 -megapixelový snímač 1080p video modul mini kamery OV5647 - 13,00 USD
  3. Micro Servo TowerPro SG90 9G 180 stupňov (2 X)- 4,00 USD
  4. Mini otočná/ naklápacia platforma kamery, antivibračný držiak kamery s 2 servami (*) - 8,00 USD
  5. Rezistor 1K ohm (2X) - voliteľný
  6. 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:

Obrázok
Obrázok

Túto „priemernú“úroveň napätia môžeme použiť na ovládanie jasu LED napríklad:

Obrázok
Obrázok

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

Inštalácia Hw
Inštalácia Hw
Inštalácia Hw
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

Kalibrácia serva
Kalibrácia serva
Kalibrácia serva
Kalibrácia serva
Kalibrácia serva
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

Vytvorenie skriptu Python
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

Mechanizmus naklápania
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:

Obrázok
Obrázok

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

Mechanizmus naklápania - mechanická konštrukcia
Mechanizmus naklápania - mechanická konštrukcia
Mechanizmus naklápania - mechanická konštrukcia
Mechanizmus naklápania - mechanická konštrukcia
Mechanizmus naklápania - mechanická konštrukcia
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

Elektrická zostava otáčania/nakláňania
Elektrická zostava otáčania/nakláňania
Elektrická zostava otáčania/nakláňania
Elektrická zostava otáčania/nakláňania
Elektrická zostava otáčania/nakláňania
Elektrická zostava otáčania/nakláňania
Elektrická zostava otáčania/nakláňania
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.

  1. Vypnite Pi.
  2. Vykonajte všetky elektrické pripojenia.
  3. Dvakrát skontrolujte.
  4. Najprv zapnite Pi.
  5. 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:

Obrázok
Obrázok

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.

Obrázok
Obrázok

Vyššie uvedený kód, servoTest.py, je možné stiahnuť z môjho GitHubu.

Krok 11: Záver

Záver
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:

Obrázok
Obrázok

Saludos z juhu sveta!

Uvidíme sa pri mojom ďalšom pokyne!

Ďakujem, Marcelo

Odporúča: