Cuprins:
- Pasul 1: BoM - Lista materialelor
- Pasul 2: Cum funcționează PWM
- Pasul 3: Instalarea Hw
- Pasul 4: Calibrarea Servo-urilor
- Pasul 5: Crearea unui script Python
- Pasul 6: Mecanismul Pan-Tilt
- Pasul 7: Mecanismul Pan-Tilt - Construcție mecanică
- Pasul 8: Ansamblu electric Pan / Tilt
- Pasul 9: Scriptul Python
- Pasul 10: Test de buclă al serverelor
- Pasul 11: Concluzie
2024 Autor: John Day | [email protected]. Modificat ultima dată: 2024-01-30 11:45
Î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:
Pasul 1: BoM - Lista materialelor
Părți principale:
- Raspberry Pi V3 - 32,00 USD
- 5 Megapixeli senzor 1080p OV5647 Modul video mini cameră - 13,00 USD
- TowerPro SG90 9G 180 grade Micro Servo (2 X) - 4,00 USD
- Mini Pan / Tilt Camera Platform Anti-Vibration Camera Mount w / 2 Servos (*) - 8,00 USD
- Rezistor 1K ohm (2X) - Opțional
- 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:
Putem folosi acest nivel de tensiune „mediu” pentru a controla luminozitatea LED-ului, de exemplu:
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
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
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
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
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:
Î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ă
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
Odată ce ați asamblat mecanismul Pan / Tilt, urmați fotografiile pentru o conexiune electrică completă.
- Opriți Pi.
- Efectuați toate conexiunile electrice.
- Verifică-l de două ori.
- Porniți mai întâi Pi-ul.
- 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:
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.
Codul de mai sus, servoTest.py poate fi descărcat de pe GitHub.
Pasul 11: 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:
Salude din sudul lumii!
Ne vedem în următorul meu instructabil!
Mulțumesc, Marcelo
Recomandat:
Controller Multi Light Arduino: 7 pași (cu imagini)
Arduino Multi Light Controller: Un coleg și artist Jim Hobbs plănuia să construiască o instalație independentă pentru o expoziție pe care o pregătea. Această instalație ar consta din 8 rafturi care formează o formă parabolică. Fiecare dintre cele 8 rafturi avea să aibă 10 becuri mo
Montare pe perete pentru iPad ca panou de control de automatizare la domiciliu, folosind un magnet controlat servo pentru a activa ecranul: 4 pași (cu imagini)
Montare pe perete pentru iPad Ca panou de control pentru automatizarea casei, folosind un magnet controlat servo pentru a activa ecranul: în ultimul timp am petrecut destul de mult timp automatizând lucrurile în și în jurul casei mele. Folosesc Domoticz ca aplicație de automatizare a casei, consultați www.domoticz.com pentru detalii. În căutarea unei aplicații de tablou de bord care afișează toate informațiile Domoticz
Multi-Timer cu control extern: 13 pași
Multi-Timer W / Control extern: Acest proiect instructabil este o construcție a unui Timer multifuncțional. Acest timer este capabil să funcționeze ca: o alarmă de uz general cu timpi selectabili între 1 secundă și +90 ore. Având o numărătoare inversă cu alarmă sonoră și / sau control extern
Difuzor HiFi Multi-room WiFi și Bluetooth: 10 pași (cu imagini)
Difuzor HiFi Multi-room WiFi și Bluetooth: Difuzoarele conectate la Wi-Fi sunt capabile să ofere o calitate audio semnificativ mai bună decât opțiunile Bluetooth. Nu comprimă conținutul audio înainte de al reda, ceea ce poate avea un efect negativ asupra sunetului, deoarece reduce nivelul de detaliu y
Benzi multi LED cu un singur control: 3 pași
One Control Multi LED Strips: Am 5 piese de mobilier în care am vrut să instalez benzi LED. LED-urile trebuiau controlate de la distanță cu o opțiune pentru Alexa ON / OFF. TOATE LED-urile au trebuit să pornească & schimbați culoarea sincronizată cu o singură apăsare a comenzii Romote. Și ei