Mundarija:
- 1 -qadam: BoM - Materiallar hisobi
- 2 -qadam: PWM qanday ishlaydi
- 3 -qadam: Hw -ni o'rnatish
- 4 -qadam: Servoslarni kalibrlash
- 5 -qadam: Python skriptini yaratish
- 6-qadam: Pan-Tilt mexanizmi
- 7 -qadam: Panjara mexanizmi - mexanik qurilish
- 8 -qadam: Elektr panjara/burilish moslamasi
- 9 -qadam: Python skript
- 10 -qadam: Serverlarning aylanish sinovi
- 11 -qadam: Xulosa
Video: Pan-Tilt ko'p servo boshqaruv: 11 qadam (rasmlar bilan)
2024 Muallif: John Day | [email protected]. Oxirgi o'zgartirilgan: 2024-01-30 13:28
Ushbu qo'llanmada biz Raspberry Pi -da Python yordamida bir nechta servolarni qanday boshqarishni o'rganamiz. Bizning maqsadimiz kamerani joylashtirish uchun PAN/TILT mexanizmi bo'ladi (PiCam).
Bu erda bizning yakuniy loyihamiz qanday ishlashini ko'rishingiz mumkin:
Tekshirish Servo nazorati:
1 -qadam: BoM - Materiallar hisobi
Asosiy qismlar:
- Raspberry Pi V3 - 32,00 AQSh dollari
- 5 megapikselli 1080p sensorli OV5647 mini kamera video moduli - 13,00 AQSh dollari
- TowerPro SG90 9G 180 gradusli mikro servo (2 X)- 4,00 AQSh dollari
- Mini Pan/ Tilt Kamera Platformasi Vibratsiyaga qarshi kamera o'rnatgichi, 2 servo (*) - 8.00 AQSh dollari
- Rezistor 1K ohm (2X) - ixtiyoriy
- Har xil: metall qismlar, tasmalar va boshqalar (agar siz Pan/Tilt mexanizmini qursangiz)
(*) siz to'liq Pan/Tilt platformasini servo bilan sotib olishingiz yoki o'zingiz qurishingiz mumkin.
2 -qadam: PWM qanday ishlaydi
Raspberry Pi -ning analog chiqishi yo'q, lekin biz buni PWM (Pulse Width Modulation) usuli yordamida taqlid qilishimiz mumkin. Biz nima qilsak, biz aniqlangan chastotali raqamli signalni ishlab chiqarishimiz kerak, bu erda biz impulsli poezd kengligini o'zgartiramiz, bu esa "o'rtacha" chiqish kuchlanish darajasi sifatida "tarjima qilinadi".
Biz "o'rtacha" kuchlanish darajasini LED yorqinligini boshqarish uchun ishlatishimiz mumkin, masalan:
E'tibor bering, bu erda chastotaning o'zi emas, balki "vazifa aylanishi" muhim, ya'ni puls "yuqori" bo'lgan vaqt o'rtasidagi to'lqin davriga bo'linadi. Masalan, biz Raspberry Pi GPIO -dan birida 50Hz chastotali puls chastotasini ishlab chiqaramiz deb faraz qilaylik. (P) davri teskari chastota yoki 20ms (1/f) bo'ladi. Agar biz LEDni "yarim" yorug 'bo'lishini xohlasak, bizda 50%xizmat tsikli bo'lishi kerak, bu "zarba" degan ma'noni anglatadi, u 10 ms uchun "yuqori" bo'ladi.
"Duty Cycle" servo holatini quyida ko'rsatilgandek aniqlaganidan so'ng, bu tamoyil servo holatimizni nazorat qilish uchun biz uchun juda muhim bo'ladi.
Servo
3 -qadam: Hw -ni o'rnatish
Servo 5V tashqi quvvat manbaiga ulanadi, bunda ma'lumotlar pinini (mening holatimda sariq simlar) Raspberry Pi GPIO -ga quyidagicha ulanadi:
- GPIO 17 ==> Servo egish
- GPIO 27 ==> Paneli Servo
GNDlarni bir -biriga ulashni unutmang ==> Raspberry Pi - Servos - Tashqi quvvat manbai)
Siz Raspberry Pi GPIO va Server ma'lumotlarini kiritish pimi o'rtasida 1K ohmli qarshilikka ega bo'lishingiz mumkin. Bu servo muammosi yuz berganda sizning RPi -ni himoya qiladi.
4 -qadam: Servoslarni kalibrlash
Birinchi narsa, servolarning asosiy xususiyatlarini tasdiqlashdir. Menimcha, men Power Pro SG90 dan foydalanmoqdaman.
Uning ma'lumotlar jadvalidan biz quyidagilarni ko'rib chiqishimiz mumkin.
- Raqam: 180o
- Quvvat manbai: 4.8V (tashqi 5VDC USB quvvat manbai sifatida yaxshi ishlaydi)
- Ish chastotasi: 50Hz (Davr: 20 ms)
- Puls kengligi: 1 m dan 2 m gacha
Nazariy jihatdan, servo o'z -o'zidan bo'ladi
- Boshlang'ich pozitsiyasi (0 daraja), uning ma'lumot terminaliga 1ms puls ishlatilganda
- Neytral pozitsiya (90 daraja), uning ma'lumot terminaliga 1,5 ms tezlikdagi impuls qo'llanilganda
- Oxirgi pozitsiya (180 daraja), uning ma'lumot terminaliga 2 ms tezlikdagi impuls qo'llanilganda
Python yordamida servo pozitsiyasini dasturlash uchun yuqoridagi pozitsiyalar uchun "Duty Cycle" muxbirini bilish juda muhim bo'ladi, keling, hisob -kitob qilaylik:
- Boshlang'ich pozitsiyasi ==> (0 daraja) Puls kengligi ==> 1ms ==> Ish tsikli = 1ms/20ms ==>> 2,0%
- Neytral pozitsiya (90 daraja) Pulsning kengligi 1,5 ms ==> Ish tsikli = 1,5ms/20ms ==> 7,5%
- Yakuniy pozitsiya (180 daraja) Pulsning kengligi 2 ms ==> Ish tsikli = 2ms/20ms ==> 10%
Shunday qilib, xizmat muddati 2 %dan 10 %gacha o'zgarishi kerak.
Keling, servolarni alohida sinovdan o'tkazaylik. Buning uchun Raspberry terminalini oching va Python 3 qobiq muharririni "sudo" sifatida ishga tushiring (chunki siz GPIO bilan ishlash uchun "super foydalanuvchi" bo'lishingiz kerak):
sudo python3
Python Shell haqida
>>
RPI. GPIO modulini import qiling va uni GPIO deb nomlang:
RPi. GPIO -ni GPIO sifatida import qilish
Qaysi pin-raqamlash sxemasidan foydalanishni aniqlang (BCM yoki BOARD). Men bu testni BOARD bilan o'tkazdim, shuning uchun men ishlatgan pinlar jismoniy pinlar edi (GPIO 17 = Pin 11 va GPIO 27 Pin 13). Menga ularni aniqlash va test paytida xato qilmaslik oson edi (Yakuniy dasturda BCMdan foydalanaman). O'zingiz yoqtirgan birini tanlang:
GPIO.setmode (GPIO. BOARD)
Siz foydalanadigan servo pinni aniqlang:
tiltPin = 11
Agar siz uning o'rniga BCM sxemasidan foydalansangiz, oxirgi 2 buyruqlar quyidagilar bilan almashtirilishi kerak:
GPIO.setmode (GPIO. BCM)
tiltPin = 17
Endi biz bu pin "chiqish" bo'lishini aniqlashimiz kerak.
GPIO. sozlash (tiltPin, GPIO. OUT)
Va bu pimdagi chastota qanday bo'ladi, bizning servo uchun 50 Gts bo'ladi:
qiyalik = GPIO. PWM (tiltPin, 50)
Keling, pin ustida PWM signalini ishlab chiqarishning boshlang'ich tsikli bilan boshlaylik (biz uni "0" da saqlaymiz):
burilish = boshlash (0)
Endi siz servo harakatini kuzatib, turli xil aylanish davrining qiymatlarini kiritishingiz mumkin. Keling, 2% dan boshlaymiz va nima bo'lishini ko'ramiz (biz servo "nol holatiga" o'tishini ko'ramiz):
burish. O'zgartirishDutyCycle (2)
Mening holatimda, servo nol holatiga o'tdi, lekin men ish aylanishini 3% ga o'zgartirganimda, servo bir xil holatda qolganini ko'rdim va 3% dan yuqori ish tsikli bilan harakat qila boshladim. Shunday qilib, 3% - bu mening boshlang'ich pozitsiyam (o daraja). Xuddi shu narsa 10%bilan sodir bo'ldi, mening servoim bu qiymatdan oshib, 13%tugadi. Shunday qilib, bu maxsus servo uchun natija shunday bo'ldi:
- 0 daraja ==> ish aylanishi 3%
- 90 daraja ==> ish aylanishi 8%
- 180 daraja ==> ish aylanishi 13%
Sinovlarni tugatgandan so'ng, siz PWMni to'xtatishingiz va GPIO -ni tozalashingiz kerak:
qiyalik = to'xtash ()
GPIO.cleanup ()
Yuqoridagi Terminal bosib chiqarish ekrani mening ikkita servoim uchun natijani ko'rsatadi (natijalari o'xshash). Sizning diapazoningiz boshqacha bo'lishi mumkin.
5 -qadam: Python skriptini yaratish
Bizning servoga yuboriladigan PWM buyruqlari, oxirgi qadamda ko'rganimizdek, "xizmat davrlarida". Ammo, odatda, biz servoni boshqarish uchun parametr sifatida "burchak" ni daraja sifatida ishlatishimiz kerak. Shunday qilib, biz "burchagini" burchimiz aylanishi kerak, bu biz uchun tushunarli bo'lgan vazifa tsiklida.
Buni qanday qilish kerak? Juda oddiy! Biz bilamizki, ish tsiklining diapazoni 3% dan 13% gacha va bu 0 dan 180 gradusgacha bo'lgan burchaklarga teng. Bundan tashqari, biz bu o'zgarishlarning chiziqli ekanligini bilamiz, shuning uchun biz yuqorida ko'rsatilgan proportsional sxemani tuzishimiz mumkin. Shunday qilib, burchakka qarab, bizda korrespondentlik vazifasi bo'lishi mumkin:
vazifa aylanishi = burchak/18 + 3
Ushbu formulani saqlang. Biz uni keyingi kodda ishlatamiz.
Sinovlarni bajarish uchun Python skriptini yarataylik. Asosan, biz Python Shell -da qilgan ishlarimizni takrorlaymiz:
vaqtdan boshlab uyqu
RPi. GPIO ni GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) def setServoAngle (servo, burchak) sifatida import qilish: pwm = GPIO. PWM (servo, 50) pwm.start (8) dutyCycle = burchak / 18. + 3. pwm. ChangeDutyCycle (dutyCycle) uyqu (0,3) (servo, int (sys.argv [2])) GPIO.cleanup ()
Yuqoridagi kodning yadrosi setServoAngle (servo, burchak) funktsiyasidir. Bu funktsiya argumentlar, servo GPIO raqami va servo joylashtirilishi kerak bo'lgan burchak qiymatini oladi. Ushbu funktsiyani kiritish "burchak" bo'lgandan so'ng, biz uni ilgari ishlab chiqilgan formuladan foydalanib, foizlar bo'yicha ish aylanishiga aylantirishimiz kerak.
Skript bajarilganda siz parametr, servo GPIO va burchak sifatida kiritishingiz kerak.
Masalan:
sudo python3 burchagiServoCtrl.py 17 45
Yuqoridagi buyruq GPIO 17 ga ulangan servo 45 daraja "balandlikda" joylashadi. Xuddi shunday buyruq ham Pan Servo boshqaruvi uchun ishlatilishi mumkin ("azimut" da 45 gradusgacha):
sudo python burchagiServoCtrl.py 27 45
AngleServoCtrl.py faylini mening GitHub -dan yuklab olish mumkin
6-qadam: Pan-Tilt mexanizmi
"Pan" servo kameramiz "gorizontal" harakat qiladi ("azimut burchagi") va "Tilt" servoimiz "vertikal" (balandlik burchagi).
Quyidagi rasm Pan/Tilt mexanizmi qanday ishlashini ko'rsatadi:
Rivojlanish jarayonida biz "haddan oshmaymiz" va Pan/Tilt mexanizmidan faqat 30 dan 150 darajagacha foydalanamiz. Bu diapazon kamera bilan ishlash uchun etarli bo'ladi.
7 -qadam: Panjara mexanizmi - mexanik qurilish
Keling, 2 ta servomizni Pan/Tilt mexanizmi sifatida yig'amiz. Bu erda siz 2 narsani qilishingiz mumkin. Pan-Tilt platformasi mexanizmini oxirgi bosqichda ko'rsatilgandek sotib oling yoki o'zingizning ehtiyojlaringizga ko'ra qurib oling.
Bir misol, men qurgan misol bo'lishi mumkin, faqat servolarni bir -biriga bog'lab qo'yaman va eski o'yinchoqlardagi kichik metall buyumlar yordamida yuqoridagi rasmlarda ko'rsatilgandek.
8 -qadam: Elektr panjara/burilish moslamasi
Pan/Tilt mexanizmi yig'ilgandan so'ng, to'liq elektr aloqasi uchun rasmlarga rioya qiling.
- Pi -ni o'chiring.
- Barcha elektr ulanishlarini bajaring.
- Ikki marta tekshiring.
- Avval Pi -ni yoqing.
- Agar hamma narsa tartibda bo'lsa, servolarni yoqing.
Biz bu qo'llanmada kamerani qanday o'rnatish kerakligini o'rganmaymiz, bu keyingi darsda tushuntiriladi.
9 -qadam: Python skript
Keling, ikkala servolarni bir vaqtning o'zida boshqarish uchun Python skriptini yarataylik:
vaqtdan boshlab uyqu
RPi. GPIO -ni GPIO GPIO.setmode (GPIO. BCM) sifatida GPIO.setwarnings (False) pan = 27 tilt = 17 GPIO.setup (tilt, GPIO. OUT) # white => TILT GPIO.setup (pan, GPIO. OUT)) # kulrang ==> PAN def setServoAngle (servo, burchak): tasdiqlash burchagi> = 30 va burchak 90 (o'rta nuqta) ==> 150 setServoAngle (tilt, int (sys.argv [2])) # 30 ==> 90 (o'rta nuqta) ==> 150 GPIO.cleanup ()
Skript bajarilgach, siz parametr sifatida, Pan burchagi va Tilt burchagi sifatida kiritishingiz kerak. Masalan:
sudo python3 servoCtrl.py 45 120
Yuqoridagi buyruq Pan/Tilt mexanizmini 45 daraja "azimut" (Pan burchagi) va 120 daraja "balandlik" (Tilt burchagi) bilan joylashtiradi. E'tibor bering, agar hech qanday parametr kiritilmasa, sukut bo'yicha ikkala burchak ham, burilish burchagi ham 90 gradusgacha o'rnatiladi.
Quyida siz ba'zi testlarni ko'rishingiz mumkin:
ServoCtrl.py faylini mening GitHub -dan yuklab olish mumkin.
10 -qadam: Serverlarning aylanish sinovi
Keling, servolarning to'liq assortimentini avtomatik ravishda sinab ko'rish uchun Python skriptini yarataylik:
vaqtdan boshlab uyqu
RPi. GPIO -ni GPIO GPIO.setmode (GPIO. BCM) sifatida GPIO.setwarnings (False) pan = 27 tilt = 17 GPIO.setup (tilt, GPIO. OUT) # white => TILT GPIO.setup (pan, GPIO. OUT)) # grey ==> PAN def setServoAngle (servo, burchak): burchak = = 30 va burchak <= 150 pwm = GPIO. PWM (servo, 50) pwm.start (8) dutyCycle = burchak / 18. + 3. pwm. ChangeDutyCycle (dutyCycle) uyqu (0,3) diapazon (150, 30, -15): setServoAngle (pan, i) setServoAngle (egish, i) setServoAngle (pan, 100) setServoAngle (qiyalik, 90) GPIO.cleanup ()
Dastur avtomatik ravishda har ikki burchakda 30 dan 150 gradusgacha bo'lgan pastadirni bajaradi.
Natija ostida:
Men osiloskopni faqat PWM nazariyasini tasvirlash uchun uladim.
Yuqoridagi kod, servoTest.py -ni mening GitHub -dan yuklab olish mumkin.
11 -qadam: Xulosa
Har doimgidek, men umid qilamanki, bu loyiha boshqalarga ajoyib elektronika olamiga yo'l topishga yordam beradi!
Tafsilotlar va yakuniy kod uchun GitHub depozitariyamga tashrif buyuring: RPi-Pan-Tilt-Servo-Control
Boshqa loyihalar uchun mening blogimga tashrif buyuring: MJRoBot.org
Keyingi darsligimga bir ko'z quyida:
Dunyoning janubidan salomlar!
Keyingi ko'rsatuvlarimda ko'rishguncha!
Rahmat, Marselo
Tavsiya:
Bolalar uchun Nasa boshqaruv paneli: 10 qadam (rasmlar bilan)
Bolalar uchun Nasa boshqaruv paneli: Men buni kunduzgi parvarishlash bilan shug'ullanadigan singlim uchun qurdim. U qariyb uch yil oldin men ishlab chiqargan qurbonni ko'rdi va menga juda yoqdi, shuning uchun men uni Rojdestvo sovg'asi uchun qurdim. Mening boshqa loyihamga havola qiling: https: //www.
Analog joystik yordamida 2 ta servo boshqaruv: 5 qadam (rasmlar bilan)
Analog Joystick yordamida 2 ta servolarni boshqarish: Salom bolalar, bu mening birinchi ko'rsatmam va men bu maqolada Arduino UNO yordamida servolarni boshqarish uchun Analog Joystikdan qanday foydalanishni aytib beraman. Men buni iloji boricha sodda tushuntirishga harakat qilaman. u
NodeMCU sensorlar boshqaruv rölesi yordamida IoT -ga asoslangan uy avtomatizatsiyasini qanday qilish kerak: 14 qadam (rasmlar bilan)
NodeMCU datchiklarini boshqarish rölesi yordamida IoT-ga asoslangan uy avtomatizatsiyasini qanday qilish kerak: IoT-ga asoslangan ushbu loyihada men Blynk va NodeMCU boshqaruv rölesi bilan uy avtomatizatsiyasini real vaqtda qaytarib berdim. Qo'lda rejimda ushbu o'rni modulini mobil yoki smartfon va qo'lda o'zgartirish orqali boshqarish mumkin. Avtomatik rejimda bu aqlli
NodeMCU va Blynk bilan servo boshqaruv - IOT platformasida: 3 qadam
NodeMCU va Blynk bilan servo boshqaruv | IOT platformasida: Ushbu qo'llanmada siz IOT platformasidagi Blynk ilovasi yordamida servoingizni boshqarishingiz mumkin
PSP -ni kompyuter boshqaruv paneli sifatida ishlatish va keyin kompyuterni PSP bilan boshqarish: 5 qadam (rasmlar bilan)
PSP -ni kompyuterni joystik sifatida ishlatish va keyin PSP yordamida kompyuterni boshqarish: Siz PSP homebrew -dan foydalanib juda ko'p ajoyib ishlarni bajarishingiz mumkin va men sizga bu PSP -ni o'yin o'ynash uchun joystik sifatida ishlatishni o'rgataman. sichqoncha sifatida joystikdan foydalanish imkonini beruvchi dastur. Mana, ona