Mündəricat:
- Addım 1: BoM - Material Bill
- Addım 2: PWM necə işləyir
- Addım 3: Hw qurmaq
- Addım 4: Servos Kalibrasyonu
- Addım 5: Python Skriptinin Yaradılması
- Addım 6: Pan-Tilt Mexanizmi
- Addım 7: Pan -Tilt Mexanizmi - Mexaniki Tikinti
- Addım 8: Elektrik Pan/Tilt Montajı
- Addım 9: Python Script
- Addım 10: Serverlərin Döngə Testi
- Addım 11: Nəticə
Video: Pan-Tilt Çox Servo İdarəetmə: 11 Addım (Şəkillərlə birlikdə)
2024 Müəllif: John Day | [email protected]. Son dəyişdirildi: 2024-01-30 07:48
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:
Addım 1: BoM - Material Bill
Əsas hissələr:
- Raspberry Pi V3 - 32.00 ABŞ dolları
- 5 Megapiksel 1080p Sensor OV5647 Mini Kamera Video Modulu - 13.00 ABŞ dolları
- TowerPro SG90 9G 180 dərəcə Mikro Servo (2 X)- 4.00 ABŞ dolları
- Mini Pan/ Tilt Kamera Platforması Titrəmə Əleyhinə Kamera Dəstəyi 2 Servosla (*) - 8.00 ABŞ dolları
- Rezistor 1K ohm (2X) - İsteğe bağlıdır
- 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.
Bir LED parlaqlığını idarə etmək üçün bu "orta" gərginlik səviyyəsindən istifadə edə bilərik:
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
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
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ı
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" 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:
İ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
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ı
Pan/Tilt mexanizminizi yığdıqdan sonra tam elektrik bağlantısı üçün fotoşəkilləri izləyin.
- Pi -ni söndürün.
- Bütün elektrik əlaqələrini edin.
- İki dəfə yoxlayın.
- Əvvəlcə Pi -ni işə salın.
- 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:
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.
Yuxarıdakı kod, servoTest.py GitHub -dan yüklənə bilər.
Addım 11: 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:
Dünyanın cənubundan salamlar!
Növbəti təlimatımda görüşənədək!
Çox sağ ol, Marcelo
Tövsiyə:
I2C: 9 Adım (Şəkillərlə) Bir çox Nixie Borularına Nəzarət Etmək üçün Çox Yönlü G/Ç Genişləndirici PCB
I2C ilə Bir çox Nixie Borularına Nəzarət Etmək üçün Çox Yönlü I/O Extender PCB: Hal -hazırda vintage nixie borularını canlandırmaq üçün çox maraq var. Bazarda çoxlu nixie borulu saat dəstləri mövcuddur. Köhnə rus nixie borular stokunda hətta canlı bir ticarət olduğu ortaya çıxdı. Həm də burada Instructables -da
4 -dən çox mühərrikdən istifadə - Birdən çox mühərrikin yığılması: 3 addım
4 -dən çox mühərrikdən istifadə etmək - Birdən çox mühərrik qalaqlamaq: Təlim olunan Vibrotaktil Həssas Dəyişdirmə və Artırma Cihazı (https: //www.instructables.com/id/Vibrotactile-Sens …), həssaslığı tərcümə edən bir qurğunun necə qurulacağını göstərir. vibrasiya stimullarına giriş. Bu titrəmə stimulları p
HT12D HT12E istifadə edərək RF 433MHZ Radio İdarəetmə - 433mhz ilə HT12E və HT12D istifadə edərək Rf Uzaqdan İdarəetmə edilməsi: 5 addım
HT12D HT12E istifadə edərək RF 433MHZ Radio İdarəetmə | HT12E və HT12D -dən 433mhz istifadə edərək Rf Uzaqdan İdarəetmə edilməsi: Bu təlimatda sizə HT12E kodlu 433mhz ötürücü qəbuledici modulu istifadə edərək RADIO uzaqdan idarə etməyi göstərəcəyəm. HT12D kod deşifratoru IC. Bu təlimatda çox ucuz komponentləri istifadə edərək məlumat göndərə və ala bilərsiniz: HT
CheapGeek- Daha çox və ya daha çox çirkin bir monitor etmək : 5 addım
CheapGeek- Daha çox və ya daha çox çirkin bir monitor düzəlt … (necə baxdığınızdan asılı olaraq) evdə PC işi üçün istifadə etdiyim ehtiyat monitorum var idi. Monitorun qara olması lazım idi. Üstəlik əlimdəki hər şey qara rəngdədir
Çox Sadə Yenə də Çox Etkili Prank (Kompüter Prank): 3 Addım
Çox Sadə … Hələ Çox Etibarlı Prank (Kompüter Prank): Bu Təlimat ÇOX sadədir, amma çox təsirlidir! Nə olacaq: Qurbanın masaüstündəki bütün nişanları gizlədirsən. Siz oyun qurduqdan sonra qurbanı kompüteri görəndə çıldıracaq. Bu kompüterə heç bir şəkildə zərər verə bilməz