Mundarija:

Pan-Tilt ko'p servo boshqaruv: 11 qadam (rasmlar bilan)
Pan-Tilt ko'p servo boshqaruv: 11 qadam (rasmlar bilan)

Video: Pan-Tilt ko'p servo boshqaruv: 11 qadam (rasmlar bilan)

Video: Pan-Tilt ko'p servo boshqaruv: 11 qadam (rasmlar bilan)
Video: Скептик [25 ноября 2021 г.] 2024, Iyul
Anonim
Pan-Tilt ko'p servo boshqaruv
Pan-Tilt ko'p servo boshqaruv

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:

Rasm
Rasm

1 -qadam: BoM - Materiallar hisobi

Asosiy qismlar:

  1. Raspberry Pi V3 - 32,00 AQSh dollari
  2. 5 megapikselli 1080p sensorli OV5647 mini kamera video moduli - 13,00 AQSh dollari
  3. TowerPro SG90 9G 180 gradusli mikro servo (2 X)- 4,00 AQSh dollari
  4. Mini Pan/ Tilt Kamera Platformasi Vibratsiyaga qarshi kamera o'rnatgichi, 2 servo (*) - 8.00 AQSh dollari
  5. Rezistor 1K ohm (2X) - ixtiyoriy
  6. 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".

Rasm
Rasm

Biz "o'rtacha" kuchlanish darajasini LED yorqinligini boshqarish uchun ishlatishimiz mumkin, masalan:

Rasm
Rasm

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

Hw -ni o'rnatish
Hw -ni o'rnatish
Hw -ni o'rnatish
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

Servo kalibrlash
Servo kalibrlash
Servo kalibrlash
Servo kalibrlash
Servo kalibrlash
Servo 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

Python skriptini yaratish
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-Tilt mexanizmi
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:

Rasm
Rasm

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

Pan -Tilt mexanizmi - mexanik qurilish
Pan -Tilt mexanizmi - mexanik qurilish
Pan -Tilt mexanizmi - mexanik qurilish
Pan -Tilt mexanizmi - mexanik qurilish
Pan -Tilt mexanizmi - mexanik qurilish
Pan -Tilt 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

Elektr panjara/burilish moslamasi
Elektr panjara/burilish moslamasi
Elektr panjara/burilish moslamasi
Elektr panjara/burilish moslamasi
Elektr panjara/burilish moslamasi
Elektr panjara/burilish moslamasi
Elektr panjara/burilish moslamasi
Elektr panjara/burilish moslamasi

Pan/Tilt mexanizmi yig'ilgandan so'ng, to'liq elektr aloqasi uchun rasmlarga rioya qiling.

  1. Pi -ni o'chiring.
  2. Barcha elektr ulanishlarini bajaring.
  3. Ikki marta tekshiring.
  4. Avval Pi -ni yoqing.
  5. 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:

Rasm
Rasm

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.

Rasm
Rasm

Yuqoridagi kod, servoTest.py -ni mening GitHub -dan yuklab olish mumkin.

11 -qadam: Xulosa

Xulosa
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:

Rasm
Rasm

Dunyoning janubidan salomlar!

Keyingi ko'rsatuvlarimda ko'rishguncha!

Rahmat, Marselo

Tavsiya: