Cuprins:

Pan-Tilt Multi Servo Control: 11 pași (cu imagini)
Pan-Tilt Multi Servo Control: 11 pași (cu imagini)
Anonim
Pan-Tilt Multi Servo Control
Pan-Tilt Multi Servo Control

În acest tutorial, vom explora cum să controlați mai multe servos folosind Python pe un Raspberry Pi. Scopul nostru va fi un mecanism PAN / TILT pentru a poziționa o cameră (o PiCam).

Aici puteți vedea cum va funcționa proiectul nostru final:

Test de control buclă Servo Control:

Imagine
Imagine

Pasul 1: BoM - Lista materialelor

Părți principale:

  1. Raspberry Pi V3 - 32,00 USD
  2. 5 Megapixeli senzor 1080p OV5647 Modul video mini cameră - 13,00 USD
  3. TowerPro SG90 9G 180 grade Micro Servo (2 X) - 4,00 USD
  4. Mini Pan / Tilt Camera Platform Anti-Vibration Camera Mount w / 2 Servos (*) - 8,00 USD
  5. Rezistor 1K ohm (2X) - Opțional
  6. Diverse: piese metalice, benzi etc. (în cazul în care vă veți construi mecanismul Pan / Tilt)

(*) puteți cumpăra o platformă completă Pan / Tilt cu servomotoarele sau vă puteți construi propria.

Pasul 2: Cum funcționează PWM

Raspberry Pi nu are ieșire analogică, dar putem simula acest lucru, utilizând o abordare PWM (Pulse Width Modulation). Ceea ce vom face este să generăm un semnal digital cu o frecvență fixă, unde vom schimba lățimea trenului de impulsuri, ceea ce va fi „tradus” ca un nivel de tensiune de ieșire „mediu” așa cum se arată mai jos:

Imagine
Imagine

Putem folosi acest nivel de tensiune „mediu” pentru a controla luminozitatea LED-ului, de exemplu:

Imagine
Imagine

Rețineți că ceea ce contează aici nu este frecvența în sine, ci „ciclul de funcționare”, adică relația dintre timpul în care pulsul este „ridicat” împărțit la perioada de undă. De exemplu, să presupunem că vom genera o frecvență de impuls de 50Hz pe unul dintre Raspberry Pi GPIO. Perioada (p) va inversa frecvenței sau 20ms (1 / f). Dacă dorim ca LED-ul nostru să aibă un „jumătate” luminos, trebuie să avem un ciclu de funcționare de 50%, ceea ce înseamnă un „impuls” care va fi „ridicat” timp de 10 ms.

Acest principiu va fi foarte important pentru noi, pentru a ne controla poziția servo, odată ce „Duty Cycle” va defini poziția servo așa cum se arată mai jos:

Servo

Pasul 3: Instalarea Hw

Instalarea Hw
Instalarea Hw
Instalarea Hw
Instalarea Hw

Servo-urile vor fi conectate la o sursă externă de 5V, având pinul de date (în cazul meu, cablajul lor galben) conectat la Raspberry Pi GPIO după cum urmează:

  • GPIO 17 ==> Tilt Servo
  • GPIO 27 ==> Pan Servo

Nu uitați să conectați GND-urile împreună ==> Raspberry Pi - Servo - Alimentare externă)

Puteți avea ca opțiune, un rezistor de 1K ohm între Raspberry Pi GPIO și pinul de intrare de date Server. Acest lucru vă va proteja RPi în caz de problemă servo.

Pasul 4: Calibrarea Servo-urilor

Calibrarea Servo-urilor
Calibrarea Servo-urilor
Calibrarea Servo-urilor
Calibrarea Servo-urilor
Calibrarea Servo-urilor
Calibrarea Servo-urilor

Primul lucru pe care trebuie să-l faceți este să confirmați principalele caracteristici ale servo-urilor dvs. În cazul meu, folosesc un Power Pro SG90.

Din foaia sa tehnică, putem lua în considerare:

  • Interval: 180o
  • Alimentare: 4,8 V (5VDC extern ca sursă de alimentare USB funcționează bine)
  • Frecvența de lucru: 50Hz (Perioada: 20 ms)
  • Lățimea impulsului: de la 1 ms la 2 ms

În teorie, servo-ul va fi în funcțiune

  • Poziția inițială (0 grade) atunci când un impuls de 1 ms este aplicat terminalului său de date
  • Poziție neutră (90 de grade) atunci când se aplică un impuls de 1,5 ms la terminalul său de date
  • Poziția finală (180 de grade) când se aplică un impuls de 2 ms la terminalul său de date

Pentru a programa o poziție servo folosind Python va fi foarte important să cunoaștem corespondentul „Duty Cycle” pentru pozițiile de mai sus, să facem câteva calcule:

  • Poziția inițială ==> (0 grade) Lățimea impulsului ==> 1ms ==> Ciclul de funcționare = 1ms / 20ms ==> 2.0%
  • Poziție neutră (90 de grade) Lățimea impulsului de 1,5 ms ==> Ciclul de funcționare = 1,5ms / 20ms ==> 7,5%
  • Poziția finală (180 de grade) Lățimea impulsului de 2 ms ==> Ciclul de funcționare = 2ms / 20ms ==> 10%

Deci, ciclul de funcționare ar trebui să varieze între 2 și 10%.

Să testăm servo-urile individual. Pentru aceasta, deschideți terminalul Raspberry și lansați editorul de shell Python 3 ca „sudo” (din cauza dvs. ar trebui să fiți un „super utilizator” de gestionat cu GPIO-uri):

sudo python3

Pe Python Shell

>>

Importați modulul RPI. GPIO și numiți-l GPIO:

importați RPi. GPIO ca GPIO

Definiți schemele de numerotare a pinilor pe care doriți să le utilizați (BCM sau BOARD). Am făcut acest test cu BOARD, astfel încât pinii pe care i-am folosit au fost pinii fizici (GPIO 17 = Pin 11 și GPIO 27 Pin 13). Mi-a fost ușor să le identific și să nu fac greșeli în timpul testului (în programul final voi folosi BCM). Alegeți cea preferată:

GPIO.setmode (GPIO. BOARD)

Definiți pinul servo pe care îl utilizați:

tiltPin = 11

Dacă, în schimb, ați folosit schema BCM, ultimele 2 comenzi ar trebui înlocuite cu:

GPIO.setmode (GPIO. BCM)

tiltPin = 17

Acum, trebuie să specificăm că acest pin va fi o „ieșire”

GPIO.setup (tiltPin, GPIO. OUT)

Și, care va fi frecvența generată pe acest pin, care pentru servo-ul nostru va fi de 50Hz:

tilt = GPIO. PWM (tiltPin, 50)

Acum, să începem să generăm un semnal PWM pe pin cu un ciclu de funcționare inițial (îl vom păstra „0”):

tilt = start (0)

Acum, puteți introduce diferite valori ale ciclului de funcționare, observând mișcarea servo-ului dvs. Să începem cu 2% și să vedem ce se întâmplă (observăm că servo-ul merge în "poziția zero"):

tilt. ChangeDutyCycle (2)

În cazul meu, servo-ul a intrat în poziția zero, dar când am schimbat ciclul de funcționare la 3%, am observat că servo-ul a rămas în aceeași poziție, începând să se deplaseze cu cicluri de funcționare mai mari de 3%. Deci, 3% este poziția mea inițială (o grade). La fel s-a întâmplat cu 10%, servo-ul meu a depășit această valoare, ajungând la 13%. Deci, pentru acest servo special, rezultatul a fost:

  • 0 grad ==> ciclu de funcționare de 3%
  • 90 de grade ==> ciclu de funcționare de 8%
  • 180 grade ==> ciclu de funcționare de 13%

După ce terminați testele, trebuie să opriți PWM și să curățați GPIO-urile:

tilt = stop ()

GPIO.cleanup ()

Ecranul de imprimare terminal de mai sus arată rezultatul pentru ambele servere (care au rezultate similare). Gama dvs. poate fi diferită.

Pasul 5: Crearea unui script Python

Crearea unui script Python
Crearea unui script Python

Comenzile PWM care trebuie trimise către servo sunt în „cicluri de funcționare” așa cum am văzut la ultimul pas. Dar, de obicei, trebuie să folosim „unghiul” în grade ca parametru pentru a controla un servo. Deci, trebuie să convertim „unghiul” care este o măsurare mai naturală pentru noi în ciclul de funcționare, așa cum este de înțeles de Pi-ul nostru.

Cum să o facă? Foarte simplu! Știm că ciclul de funcționare variază de la 3% la 13% și că acest lucru este echivalent cu unghiurile care vor varia de la 0 la 180 de grade. De asemenea, știm că aceste variații sunt liniare, deci putem construi o schemă proporțională așa cum se arată mai sus. deci, având în vedere un unghi, putem avea un ciclu de funcționare corespondent:

dutycycle = angle / 18 + 3

Păstrați această formulă. Îl vom folosi în următorul cod.

Să creăm un script Python pentru a executa testele. Practic, vom repeta ceea ce am făcut înainte pe Python Shell:

din timp import somn

import RPi. GPIO ca GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) def setServoAngle (servo, angle): pwm = GPIO. PWM (servo, 50) pwm.start (8) dutyCycle = angle / 18. + 3. pwm. ChangeDutyCycle (dutyCycle) sleep (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 ()

Nucleul codului de mai sus este setul de funcții ServoAngle (servo, unghi). Această funcție primește ca argumente, un număr servo GPIO și o valoare a unghiului față de locul în care servo trebuie poziționat. Odată ce intrarea acestei funcții este „unghi”, trebuie să o convertim în ciclu de funcționare în procente, folosind formula dezvoltată anterior.

Când scriptul este executat, trebuie să introduceți ca parametri, servo GPIO și unghi.

De exemplu:

sudo python3 angleServoCtrl.py 17 45

Comanda de mai sus va poziționa servo conectat pe GPIO 17 cu 45 de grade în "cota". O comandă similară ar putea fi utilizată pentru controlul Pan Servo (poziție la 45 de grade în "azimut"):

sudo python angleServoCtrl.py 27 45

Fișierul angleServoCtrl.py poate fi descărcat de pe GitHub

Pasul 6: Mecanismul Pan-Tilt

Mecanismul Pan-Tilt
Mecanismul Pan-Tilt

Servo-ul „Pan” va mișca „orizontal” camera noastră („unghiul azimutului”) și servo-ul „Tilt” îl va deplasa „vertical” (unghiul de înălțime).

Imaginea de mai jos arată cum funcționează mecanismul Pan / Tilt:

Imagine
Imagine

În timpul dezvoltării noastre nu vom merge la „extreme” și vom folosi mecanismul nostru Pan / Tilt numai de la 30 la 150 de grade. Această gamă va fi suficientă pentru a fi utilizată cu o cameră.

Pasul 7: Mecanismul Pan-Tilt - Construcție mecanică

Mecanismul Pan-Tilt - Construcție mecanică
Mecanismul Pan-Tilt - Construcție mecanică
Mecanismul Pan-Tilt - Construcție mecanică
Mecanismul Pan-Tilt - Construcție mecanică
Mecanismul Pan-Tilt - Construcție mecanică
Mecanismul Pan-Tilt - Construcție mecanică

Să acum, asamblăm cele 2 servo-uri ca un mecanism Pan / Tilt. Puteți face 2 lucruri aici. Cumpărați un mecanism de platformă Pan-Tilt ca cel prezentat în ultimul pas sau construiți-vă propriul dvs. în funcție de necesități.

Un exemplu poate fi cel pe care l-am construit, legând numai servourile unul de altul și folosind piese mici de metal din jucării vechi, așa cum se arată în fotografiile de mai sus.

Pasul 8: Ansamblu electric Pan / Tilt

Ansamblu electric Pan / Tilt
Ansamblu electric Pan / Tilt
Ansamblu electric Pan / Tilt
Ansamblu electric Pan / Tilt
Ansamblu electric Pan / Tilt
Ansamblu electric Pan / Tilt
Ansamblu electric Pan / Tilt
Ansamblu electric Pan / Tilt

Odată ce ați asamblat mecanismul Pan / Tilt, urmați fotografiile pentru o conexiune electrică completă.

  1. Opriți Pi.
  2. Efectuați toate conexiunile electrice.
  3. Verifică-l de două ori.
  4. Porniți mai întâi Pi-ul.
  5. Dacă totul este în regulă, alimentează-ți servo-urile.

Nu vom explora în acest tutorial cum să configurați camera, acest lucru va fi explicat în următorul tutorial.

Pasul 9: Scriptul Python

Să creăm un script Python pentru a controla ambele servere simultan:

din timp import somn

import RPi. GPIO ca GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) pan = 27 tilt = 17 GPIO.setup (tilt, GPIO. OUT) # white => TILT GPIO.setup (pan, GPIO. OUT) # gri ==> PAN def setServoAngle (servo, angle): asert angle> = 30 and angle 90 (middle point) ==> 150 setServoAngle (tilt, int (sys.argv [2])) # 30 ==> 90 (punct de mijloc) ==> 150 GPIO.cleanup ()

Când scriptul este executat, trebuie să introduceți ca parametri, unghiul de panoramare și unghiul de înclinare. De exemplu:

sudo python3 servoCtrl.py 45 120

Comanda de mai sus va poziționa mecanismul Pan / Tilt cu 45 de grade în "azimut" (unghi Pan) și 120 de grade de "elevație" (Tilt Angle). Rețineți că, dacă nu sunt introduși parametri, valoarea implicită va fi ambele, unghiurile de panoramare și înclinare setate la 90 de grade.

Mai jos puteți vedea câteva teste:

Imagine
Imagine

Fișierul servoCtrl.py poate fi descărcat de pe GitHub.

Pasul 10: Test de buclă al serverelor

Să creăm acum un script Python pentru a testa automat întreaga gamă de servouri:

din timp import somn

import RPi. GPIO ca GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) pan = 27 tilt = 17 GPIO.setup (tilt, GPIO. OUT) # white => TILT GPIO.setup (pan, GPIO. OUT) # gri ==> PAN def setServoAngle (servo, angle): asert angle> = 30 și angle <= 150 pwm = GPIO. PWM (servo, 50) pwm.start (8) dutyCycle = angle / 18. + 3. pwm. ChangeDutyCycle (dutyCycle) sleep (0.3) pwm.stop () if _name_ == '_main_': for i in range (30, 160, 15): setServoAngle (pan, i) setServoAngle (tilt, i) for i in interval (150, 30, -15): setServoAngle (pan, i) setServoAngle (tilt, i) setServoAngle (pan, 100) setServoAngle (tilt, 90) GPIO.cleanup ()

Programul va executa automat o buclă de la 30 la 150 de grade în ambele unghiuri.

Sub rezultat:

Am conectat un osciloscop doar pentru a ilustra teoria PWM așa cum am explicat mai înainte.

Imagine
Imagine

Codul de mai sus, servoTest.py poate fi descărcat de pe GitHub.

Pasul 11: Concluzie

Concluzie
Concluzie

Ca întotdeauna, sper că acest proiect îi poate ajuta pe ceilalți să își găsească drumul în lumea interesantă a electronicii!

Pentru detalii și cod final, vă rugăm să vizitați depozitul meu GitHub: RPi-Pan-Tilt-Servo-Control

Pentru mai multe proiecte, vă rugăm să vizitați blogul meu: MJRoBot.org

Mai jos o privire asupra următorului meu tutorial:

Imagine
Imagine

Salude din sudul lumii!

Ne vedem în următorul meu instructabil!

Mulțumesc, Marcelo

Recomandat: