Mündəricat:

Pan-Tilt Çox Servo İdarəetmə: 11 Addım (Şəkillərlə birlikdə)
Pan-Tilt Çox Servo İdarəetmə: 11 Addım (Şəkillərlə birlikdə)

Video: Pan-Tilt Çox Servo İdarəetmə: 11 Addım (Şəkillərlə birlikdə)

Video: Pan-Tilt Çox Servo İdarəetmə: 11 Addım (Şəkillərlə birlikdə)
Video: Yeni Stabilizator üçün Qutusuz və İnceleme Sirui Swift M1 Gimbals 2024, Noyabr
Anonim
Pan-Tilt Çox Servo İdarəetmə
Pan-Tilt Çox Servo İdarəetmə

Bu təlimatda, bir Raspberry Pi üzərində Python istifadə edərək birdən çox servonun necə idarə olunacağını araşdıracağıq. Məqsədimiz, bir kamera (PiCam) yerləşdirmək üçün PAN/TILT mexanizmi olacaq.

Burada son layihəmizin necə işləyəcəyini görə bilərsiniz:

Control Servo Control loop testi:

Şəkil
Şəkil

Addım 1: BoM - Material Bill

Əsas hissələr:

  1. Raspberry Pi V3 - 32.00 ABŞ dolları
  2. 5 Megapiksel 1080p Sensor OV5647 Mini Kamera Video Modulu - 13.00 ABŞ dolları
  3. TowerPro SG90 9G 180 dərəcə Mikro Servo (2 X)- 4.00 ABŞ dolları
  4. Mini Pan/ Tilt Kamera Platforması Titrəmə Əleyhinə Kamera Dəstəyi 2 Servosla (*) - 8.00 ABŞ dolları
  5. Rezistor 1K ohm (2X) - İsteğe bağlıdır
  6. Müxtəlif: metal hissələr, bantlar və s. (Pan/Tilt mexanizminizi quracağınız halda)

(*) servolarla birlikdə tam bir Pan/Tilt platforması ala bilərsiniz və ya özünüz qura bilərsiniz.

Addım 2: PWM necə işləyir

Raspberry Pi -nin analoq çıxışı yoxdur, lakin bunu PWM (Pulse Width Modulation) yanaşması istifadə edərək simulyasiya edə bilərik. Aşağıda göstərildiyi kimi "orta" bir çıxış gərginliyi səviyyəsi olaraq "tərcümə ediləcək" nəbz qatarının genişliyini dəyişdirəcəyimiz sabit bir tezliyə malik rəqəmsal bir siqnal yaratmaqdır.

Şəkil
Şəkil

Bir LED parlaqlığını idarə etmək üçün bu "orta" gərginlik səviyyəsindən istifadə edə bilərik:

Şəkil
Şəkil

Diqqət yetirin ki, burada vacib olan tezliyin özü deyil, "vəzifə dövrü" dir, yəni pulsların "yüksək" olması ilə dalğa müddətinə bölünməsidir. Məsələn, Raspberry Pi GPIO -dan birində 50Hz nəbz tezliyi yaradacağımızı düşünək. Dövr (p) tezliyin tərsinə və ya 20 ms (1/f) olacaq. LEDimizin "yarı" parlaq olmasını istəyiriksə, 50%-lik bir vəzifə dövrünə sahib olmalıyıq, bu 10 ms üçün "Yüksək" olacaq "nəbz" deməkdir.

"Vəzifə Dövrü" servo mövqeyini aşağıda göstərildiyi kimi təyin etdikdən sonra bu prinsip bizim servo mövqeyimizi idarə etmək üçün çox əhəmiyyətli olacaq:

Servo

Addım 3: Hw qurmaq

Hw -nin quraşdırılması
Hw -nin quraşdırılması
Hw -nin quraşdırılması
Hw -nin quraşdırılması

Servolar, məlumat pinini (mənim vəziyyətimdə, sarı telləri) aşağıdakı kimi Raspberry Pi GPIO -ya bağlayaraq, xarici 5V -luq bir şəbəkəyə qoşulacaq:

  • GPIO 17 ==> Servo əymək
  • GPIO 27 ==> Pan Servo

GND -ləri bir -birinə bağlamağı unutmayın ==> Raspberry Pi - Servos - Xarici Enerji Təchizatı)

Bir seçim olaraq, Raspberry Pi GPIO və Server məlumat giriş pinləri arasında 1K ohm müqavimətçi ola bilərsiniz. Bu, servo problemi halında RPi -nizi qoruyacaq.

Addım 4: Servos Kalibrasyonu

Servoların kalibrlənməsi
Servoların kalibrlənməsi
Servoların kalibrlənməsi
Servoların kalibrlənməsi
Servoların kalibrlənməsi
Servoların kalibrlənməsi

Ediləcək ilk şey servolarınızın əsas xüsusiyyətlərini təsdiq etməkdir. Mənim vəziyyətimdə Power Pro SG90 istifadə edirəm.

Məlumat cədvəlindən nəzərdən keçirə bilərik:

  • Aralığı: 180o
  • Güc Təchizatı: 4.8V (USB enerji təchizatı olaraq xarici 5VDC yaxşı işləyir)
  • İşləmə tezliyi: 50Hz (Dövr: 20 ms)
  • Pulse genişliyi: 1ms -dən 2ms -ə qədər

Teorik olaraq, servo öz üzərində olacaq

  • Məlumat terminalına 1 ms nəbz tətbiq edildikdə Başlanğıc Mövqe (0 dərəcə)
  • Nötral mövqe (90 dərəcə), məlumat terminalına 1,5 ms nəbz tətbiq edildikdə
  • Məlumat terminalına 2 ms -lik bir nəbz tətbiq edildikdə son mövqe (180 dərəcə)

Python istifadə edərək bir servo mövqeyi proqramlaşdırmaq üçün yuxarıdakı vəzifələr üçün "Duty Cycle" müxbirini bilmək çox vacib olacaq, bəzi hesablamalar edək:

  • Başlanğıc Vəzifəsi ==> (0 dərəcə) Pulse genişliyi ==> 1 ms ==> Vəzifə Dövrü = 1 ms/20 ms ==> 2.0%
  • Neytral mövqe (90 dərəcə) Nəbz genişliyi 1,5 ms ==> İş dövrü = 1,5 ms/20 ms ==> 7,5%
  • Növbəti mövqe (180 dərəcə) Pulse genişliyi 2 ms ==> İş dövrü = 2ms/20ms ==> 10%

Beləliklə, Duty Cycle 2 ilə 10 %arasında dəyişməlidir.

Servoları fərdi olaraq sınayaq. Bunun üçün Raspberry terminalınızı açın və Python 3 shell redaktorunuzu "sudo" olaraq işə salın (çünki GPIO -larla işləmək üçün "super istifadəçi" olmalısınız):

sudo python3

Python Shell haqqında

>>

RPI. GPIO modulunu idxal edin və GPIO adlandırın:

GPO olaraq RPi. GPIO idxal edin

İstifadə etmək istədiyiniz pin nömrələmə sxemlərini müəyyənləşdirin (BCM və ya BOARD). Bu testi BOARD ilə etdim, buna görə istifadə etdiyim sancaqlar fiziki sancaqlar idi (GPIO 17 = Pin 11 və GPIO 27 Pin 13). Onları müəyyən etmək və test zamanı səhv etməmək mənim üçün asan idi (Son proqramda BCM istifadə edəcəyəm). Tercih etdiyiniz birini seçin:

GPIO.setmode (GPIO. BOARD)

İstifadə etdiyiniz servo pini təyin edin:

tiltPin = 11

Bunun əvəzinə BCM sxemindən istifadə etmisinizsə, son 2 əmr aşağıdakılarla əvəz olunmalıdır:

GPIO.setmode (GPIO. BCM)

tiltPin = 17

İndi bu pinin "çıxış" olacağını təyin etməliyik

GPIO. quraşdırma (tiltPin, GPIO. OUT)

Və bu pin üzərində yaradılan tezlik nə olacaq, servomuz üçün 50Hz olacaq:

əymək = GPIO. PWM (tiltPin, 50)

İndi, başlanğıc iş dövrü ilə pin üzərində bir PWM siqnalı yaratmağa başlayaq ("0" olaraq saxlayacağıq):

əymək = başlanğıc (0)

İndi servonun hərəkətini müşahidə edərək fərqli iş dövrü dəyərlərini daxil edə bilərsiniz. 2% ilə başlayaq və nə olacağını görək (servonun "sıfır mövqeyinə" getdiyini görürük):

əymək. ChangeDutyCycle (2)

Mənim vəziyyətimdə, servo sıfır mövqeyinə getdi, amma vəzifə dövrünü 3% -ə dəyişəndə servonun eyni vəziyyətdə qaldığını və 3% -dən çox vəzifə dövrü ilə hərəkət etməyə başladığını müşahidə etdim. Beləliklə, 3% mənim ilk mövqeyimdir (o dərəcə). Eyni şey 10%ilə baş verdi, mənim servomuz bu dəyərin üstünə çıxdı və sonunu 13%üstələdi. Bu xüsusi servo üçün nəticə belə oldu:

  • 0 dərəcə ==> 3% vəzifə dövrü
  • 90 dərəcə ==> 8% vəzifə dövrü
  • 180 dərəcə ==> vəzifə dövrü 13%

Testlərinizi bitirdikdən sonra PWM -i dayandırmalı və GPIO -ları təmizləməlisiniz:

əymək = dayan ()

GPIO.cleanup ()

Yuxarıdakı Terminal çap ekranı hər iki servomun nəticəsini göstərir (oxşar nəticələrə malikdir). Aralığınız fərqli ola bilər.

Addım 5: Python Skriptinin Yaradılması

Python Script Yaratmaq
Python Script Yaratmaq

Servoğumuza göndəriləcək PWM əmrləri, son addımda gördüyümüz kimi "vəzifə dövrlərindədir". Ancaq ümumiyyətlə bir servoya nəzarət etmək üçün bir parametr olaraq dərəcə olaraq "açı" dan istifadə etməliyik. Beləliklə, Pi dövrümüzdə Pi üçün başa düşülən daha təbii bir ölçü olan "bucağı" çevirməliyik.

Bunu necə etmək olar? Çox sadə! Vəzifə dövrü aralığının 3% -dən 13% -ə qədər getdiyini və bunun 0 ilə 180 dərəcə arasında dəyişəcək açılara bərabər olduğunu bilirik. Ayrıca, bu dəyişikliklərin xətti olduğunu bilirik, buna görə yuxarıda göstərildiyi kimi nisbi bir sxem qura bilərik. Beləliklə, bir açı verilsə, müxbir vəzifə dövrünə sahib ola bilərik:

vəzifə dövrü = bucaq/18 + 3

Bu formulu saxlayın. Növbəti kodda istifadə edəcəyik.

Testləri yerinə yetirmək üçün bir Python skripti yaradaq. Əsasən, Python Shell -də əvvəllər etdiklərimizi təkrarlayacağıq:

vaxtdan idxal yuxu

GPO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) def setServoAngle (servo, bucaq) olaraq RPi. GPIO idxal edin: pwm = GPIO. PWM (servo, 50) pwm.start (8) dutyCycle = bucaq / 18. + 3. pwm. ChangeDutyCycle (dutyCycle) yuxu (0.3) pwm.stop () əgər _name_ == '_main_' olarsa: idxal sys servo = int (sys.argv [1]) GPIO.setup (servo, GPIO. OUT) setServoAngle (servo, int (sys.argv [2])) GPIO.cleanup ()

Yuxarıdakı kodun əsasını setServoAngle (servo, bucaq) funksiyası təşkil edir. Bu funksiya arqumentlər, bir servo GPIO nömrəsi və servonun yerləşdirilməli olduğu bir açı dəyəri olaraq alır. Bu funksiyanın girişi "açı" olduqda, əvvəllər hazırlanmış düsturdan istifadə edərək onu faizlə iş dövrünə çevirməliyik.

Skript icra edildikdə parametrlər, servo GPIO və bucaq kimi daxil etməlisiniz.

Misal üçün:

sudo python3 açısıServoCtrl.py 17 45

Yuxarıdakı əmr, GPIO 17 -də 45 dərəcə olan servo "yüksəklikdə" yerləşdirəcək. Bənzər bir əmr Pan Servo idarəetmə üçün istifadə edilə bilər ("azimut" da 45 dərəcəyə qədər mövqe):

sudo python açısıServoCtrl.py 27 45

AngleServoCtrl.py faylını GitHub -dan yükləyə bilərsiniz

Addım 6: Pan-Tilt Mexanizmi

Pan-Tilt Mexanizmi
Pan-Tilt Mexanizmi

"Pan" servo kameramız "üfüqi" hərəkət edəcək ("azimut açısı") və "Tilt" servomuz "şaquli" (yüksəliş bucağı) ilə hərəkət edəcək.

Aşağıdakı şəkil, Pan/Tilt mexanizminin necə işlədiyini göstərir:

Şəkil
Şəkil

İnkişaf etdiyimiz müddətdə "ifrata" getməyəcəyik və Pan/Tilt mexanizmimizi yalnız 30 ilə 150 dərəcə arasında istifadə edəcəyik. Bu sıra bir kamera ilə istifadə üçün kifayət edəcək.

Addım 7: Pan -Tilt Mexanizmi - Mexaniki Tikinti

Pan -Tilt Mexanizmi - Mexaniki Tikinti
Pan -Tilt Mexanizmi - Mexaniki Tikinti
Pan -Tilt Mexanizmi - Mexaniki Tikinti
Pan -Tilt Mexanizmi - Mexaniki Tikinti
Pan -Tilt Mexanizmi - Mexaniki Tikinti
Pan -Tilt Mexanizmi - Mexaniki Tikinti

Gəlin, 2 servomuzu Pan/Tilt mexanizmi olaraq yığaq. Burada 2 şey edə bilərsiniz. Pan-Tilt platforma mexanizmini son addımda göstərildiyi kimi alın və ya ehtiyaclarınıza uyğun olaraq özünüz qurun.

Yuxarıdakı fotoşəkillərdə göstərildiyi kimi, köhnə oyuncaqlardan kiçik metal parçaları istifadə edərək, servoları bir -birinə bağlayaraq hazırladığım bir nümunə ola bilər.

Addım 8: Elektrik Pan/Tilt Montajı

Elektrik Pan/Tilt Məclisi
Elektrik Pan/Tilt Məclisi
Elektrik Pan/Tilt Məclisi
Elektrik Pan/Tilt Məclisi
Elektrik Pan/Tilt Məclisi
Elektrik Pan/Tilt Məclisi
Elektrik Pan/Tilt Məclisi
Elektrik Pan/Tilt Məclisi

Pan/Tilt mexanizminizi yığdıqdan sonra tam elektrik bağlantısı üçün fotoşəkilləri izləyin.

  1. Pi -ni söndürün.
  2. Bütün elektrik əlaqələrini edin.
  3. İki dəfə yoxlayın.
  4. Əvvəlcə Pi -ni işə salın.
  5. Hər şey qaydasındadırsa, servolarınızı işə salın.

Bu təlimatda kameranın necə qurulacağını araşdırmayacağıq, bu növbəti dərsdə izah ediləcəkdir.

Addım 9: Python Script

Hər iki servosu eyni anda idarə etmək üçün bir Python Script yaradaq:

vaxtdan idxal yuxu

GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) pan = 27 tilt = 17 GPIO.setup (tilt, GPIO. OUT) # white => TILT GPIO.setup (pan, GPIO. OUT) kimi RPi. GPIO -nu idxal edin.) # boz ==> PAN def setServoAngle (servo, bucaq): bucağı təsdiq edin = = 30 və bucağı 90 (orta nöqtə) ==> 150 setServoAngle (tilt, int (sys.argv [2])) # 30 ==> 90 (orta nöqtə) ==> 150 GPIO.cleanup ()

Skript icra edildikdə parametrlər, Pan bucağı və Tilt bucağı kimi daxil etməlisiniz. Misal üçün:

sudo python3 servoCtrl.py 45 120

Yuxarıdakı əmr, Pan/Tilt mexanizmini 45 dərəcə "azimut" (Pan açısı) və 120 dərəcə "yüksəklik" (Tilt Angle) ilə yerləşdirəcək. Diqqət yetirin ki, heç bir parametr daxil edilmədikdə, standart olaraq hər ikisi 90 ° -ə qədər sürüşmə və əyilmə bucaqları olacaq.

Aşağıda bəzi testləri görə bilərsiniz:

Şəkil
Şəkil

ServoCtrl.py faylını GitHub -dan yükləyə bilərsiniz.

Addım 10: Serverlərin Döngə Testi

İndi bütün servoları avtomatik olaraq sınamaq üçün bir Python Script yaradaq:

vaxtdan idxal yuxu

GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) pan = 27 tilt = 17 GPIO.setup (tilt, GPIO. OUT) # white => TILT GPIO.setup (pan, GPIO. OUT) kimi RPi. GPIO -nu idxal edin.) # boz ==> PAN def setServoAngle (servo, bucaq): bucağı təsdiq edin> = 30 və bucaq <= 150 pwm = GPIO. PWM (servo, 50) pwm.start (8) dutyCycle = bucaq / 18. + 3. pwm. ChangeDutyCycle (utyCycle) yuxu (0.3) diapazon (150, 30, -15): setServoAngle (pan, i) setServoAngle (tilt, i) setServoAngle (pan, 100) setServoAngle (tilt, 90) GPIO.cleanup ()

Proqram avtomatik olaraq hər iki bucaqda 30 ilə 150 dərəcə arasında bir döngə icra edəcək.

Nəticənin altında:

Bir osiloskopu yalnız əvvəl izah edildiyi kimi PWM nəzəriyyəsini göstərmək üçün bağladım.

Şəkil
Şəkil

Yuxarıdakı kod, servoTest.py GitHub -dan yüklənə bilər.

Addım 11: Nəticə

Nəticə
Nəticə

Həmişə olduğu kimi, ümid edirəm ki, bu layihə başqalarına maraqlı elektronika dünyasına yol tapmağa kömək edə bilər!

Detallar və son kod üçün GitHub depozitarımı ziyarət edin: RPi-Pan-Tilt-Servo-Control

Daha çox layihə üçün blogumu ziyarət edin: MJRoBot.org

Növbəti dərsimə bir baxış aşağıda:

Şəkil
Şəkil

Dünyanın cənubundan salamlar!

Növbəti təlimatımda görüşənədək!

Çox sağ ol, Marcelo

Tövsiyə: