Агуулгын хүснэгт:

Pan-Tilt Multi Servo Control: 11 алхам (зурагтай)
Pan-Tilt Multi Servo Control: 11 алхам (зурагтай)

Видео: Pan-Tilt Multi Servo Control: 11 алхам (зурагтай)

Видео: Pan-Tilt Multi Servo Control: 11 алхам (зурагтай)
Видео: POTS Research Update 2024, Долдугаар сарын
Anonim
Pan-Tilt Multi Servo Control
Pan-Tilt Multi Servo Control

Энэхүү гарын авлагад бид Raspberry Pi дээр Python ашиглан олон серво хэрхэн удирдах талаар судлах болно. Бидний зорилго бол камер (PiCam) байрлуулах PAN/TILT механизм байх болно.

Бидний эцсийн төсөл хэрхэн яаж ажиллахыг эндээс харж болно.

Хяналтын Servo Control давталтын тест:

Зураг
Зураг

Алхам 1: Монголбанк - Билл материал

Үндсэн хэсгүүд:

  1. Raspberry Pi V3 - 32.00 доллар
  2. 5 мегапиксел 1080p мэдрэгч OV5647 мини камер видео модуль - 13.00 доллар
  3. TowerPro SG90 9G 180 градусын бичил Servo (2 X)- 4.00 доллар
  4. Mini Pan/ Tilt Камерын Платформ Чичиргээний эсрэг камер суурилуулах w/ 2 servos (*) - US $ 8.00
  5. Эсэргүүцэл 1K ом (2X) - Нэмэлт
  6. Төрөл бүрийн: металл эд анги, тууз гэх мэт

(*) та servos ашиглан иж бүрэн Pan/Tilt платформ худалдаж авах эсвэл өөрөө бүтээх боломжтой.

Алхам 2: ХБХ хэрхэн ажилладаг

Raspberry Pi нь аналог гаралтгүй боловч бид үүнийг PWM (Pulse Width Modulation) аргыг ашиглан дуурайж болно. Бидний хийх зүйл бол тогтмол давтамжтай дижитал дохио үүсгэх бөгөөд энд импульсийн галт тэрэгний өргөнийг өөрчлөх бөгөөд доорх зураг дээрх шиг "дундаж" гаралтын хүчдэлийн түвшинг "орчуулах" болно.

Зураг
Зураг

Бид энэ "дундаж" хүчдэлийн түвшинг ашиглан LED гэрлийг хянах боломжтой.

Зураг
Зураг

Энд давтамж өөрөө биш, харин "үүргийн мөчлөг" чухал гэдгийг анхаарна уу. Жишээлбэл, бид Raspberry Pi GPIO -ийн нэг дээр 50 Гц импульсийн давтамж үүсгэнэ гэж бодъё. (P) үе нь давтамжийн урвуу буюу 20ms (1/f) болно. Хэрэв бид LED -ээ "хагас" гэрэлтүүлэхийг хүсч байвал бид 50%-ийн үүргийн мөчлөгтэй байх ёстой.

Энэ зарчим нь "үүргийн мөчлөг" нь servo байрлалыг доор үзүүлсэн шиг тодорхойлсны дараа бидний servo байрлалыг хянахад маш чухал байх болно.

Servo

Алхам 3: Hw -ийг суулгах

Hw -ийг суулгаж байна
Hw -ийг суулгаж байна
Hw -ийг суулгаж байна
Hw -ийг суулгаж байна

Серво нь гадаад 5V тэжээлд холбогдсон байх бөгөөд өгөгдлийн зүү (миний хувьд шар утас) нь Raspberry Pi GPIO -тай доорх байдлаар холбогдсон байна.

  • GPIO 17 ==> Servo хазайлгана уу
  • GPIO 27 ==> Pan Servo

GND -ийг хооронд нь холбохоо бүү мартаарай ==> Raspberry Pi - Servos - Гадаад цахилгаан хангамж)

Та Raspberry Pi GPIO болон Server өгөгдөл оруулах зүү хооронд 1K ом эсэргүүцэлтэй байж болно. Энэ нь servo -ийн асуудал гарсан тохиолдолд таны RPi -ийг хамгаалах болно.

Алхам 4: Servos шалгалт тохируулга

Servos шалгалт тохируулга
Servos шалгалт тохируулга
Servos шалгалт тохируулга
Servos шалгалт тохируулга
Servos шалгалт тохируулга
Servos шалгалт тохируулга

Хамгийн эхний хийх зүйл бол servo -ийн үндсэн шинж чанарыг баталгаажуулах явдал юм. Миний хувьд би Power Pro SG90 ашиглаж байна.

Түүний мэдээллийн хуудаснаас бид дараахь зүйлийг авч үзэж болно.

  • Хүрээ: 180o
  • Цахилгаан хангамж: 4.8V (USB тэжээлийн эх үүсвэрийн хувьд гадаад 5VDC сайн ажилладаг)
  • Ажлын давтамж: 50 Гц (Хугацаа: 20 ms)
  • Импульсийн өргөн: 1 -ээс 2 мс хүртэл

Онолын хувьд servo өөрийнхөөрөө байх болно

  • Мэдээллийн терминал дээр 1 мс -ийн импульс дарагдах анхны байрлал (0 градус)
  • Мэдээллийн терминалд 1.5 мс -ийн импульс оруулах үед төвийг сахисан байрлал (90 градус)
  • Мэдээллийн терминал дээр 2 мс -ийн импульс дарагдах үед эцсийн байрлал (180 градус)

Python ашиглан servo байрлалыг програмчлахын тулд дээр дурдсан албан тушаалтнуудын "Duty Cycle" корреспондентийг мэдэх нь маш чухал байх болно.

  • Анхны байрлал ==> (0 градус) Импульсийн өргөн ==> 1ms ==> Ажлын мөчлөг = 1ms/20ms ==>> 2.0%
  • Төвийг сахисан байрлал (90 градус) Импульсийн өргөн 1.5 ms ==> Ажлын мөчлөг = 1.5ms/20ms ==>> 7.5%
  • Эцсийн байрлал (180 градус) Импульсийн өргөн 2 мс ==> Ажлын мөчлөг = 2ms/20ms ==> 10%

Тиймээс үүргийн мөчлөг нь 2-10 %хооронд хэлбэлздэг байх ёстой.

Сервүүдийг тус тусад нь туршиж үзье. Үүний тулд Raspberry терминалаа нээгээд Python 3 бүрхүүлийн засварлагчаа "sudo" болгон ажиллуулна уу (учир нь та GPIO -тэй ажиллах "супер хэрэглэгч" байх ёстой):

sudo python3

Python Shell дээр

>>

RPI. GPIO модулийг импортолж GPIO гэж нэрлэнэ үү.

RPi. GPIO -г GPIO болгон импортлох

Пин дугаарлах ямар схемийг ашиглахыг хүсч байгаагаа тодорхойл (BCM эсвэл BOARD). Би энэ туршилтыг BOARD -тэй хийсэн тул миний ашигладаг зүү нь физик тээглүүр байсан (GPIO 17 = Pin 11 ба GPIO 27 Pin 13). Тэднийг таних, туршилтын явцад алдаа гаргахгүй байх нь надад хялбар байсан (Эцсийн хөтөлбөрт би BCM -ийг ашиглах болно). Өөрийн дуртай зүйлээ сонгоно уу:

GPIO.setmode (GPIO. BOARD)

Таны ашиглаж буй servo pin -ийг тодорхойлно уу.

tiltPin = 11

Хэрэв та BCM схемийг ашигласан бол сүүлийн 2 командыг дараах байдлаар солино.

GPIO.setmode (GPIO. BCM)

tiltPin = 17

Одоо бид энэ зүү нь "гаралт" болохыг зааж өгөх ёстой.

GPIO. тохиргоо (tiltPin, GPIO. OUT)

Мөн энэ зүү дээр үүсгэсэн давтамж нь юу байх вэ, бидний servo -ийн хувьд 50Hz байх болно:

хазайлт = GPIO. PWM (tiltPin, 50)

Одоо, үүргийн эхний мөчлөг бүхий PWM дохиог үүсгэж эхэлье (бид үүнийг "0" хэвээр хадгалах болно):

хазайлт = эхлэх (0)

Одоо та servo -ийн хөдөлгөөнийг ажиглаж, ажлын мөчлөгийн өөр өөр утгыг оруулж болно. 2% -аас эхэлж юу болохыг харцгаая (servo нь "тэг байрлал" руу шилжиж байгааг бид харж байна):

хазайлт. ChangeDutyCycle (2)

Миний хувьд, servo нь тэг байрлалд очсон боловч би ажлын мөчлөгийг 3% болгож өөрчлөхөд 3% -иас дээш үүргийн мөчлөгийн дагуу хөдөлж эхлэхэд servo ижил байрлалд байсныг би ажигласан. Тиймээс 3% нь миний анхны байрлал (o градус) юм. Үүнтэй ижил зүйл 10%-д тохиолдсон бөгөөд миний servo энэ утгаас давж, 13%-ийг дуусгасан. Энэ тусгай servo -ийн хувьд үр дүн нь:

  • 0 градус ==> үүргийн мөчлөг 3%
  • 90 градус ==> үүргийн мөчлөг 8%
  • 180 градус ==> ажлын мөчлөг 13%

Туршилтаа дуусгасны дараа та ХОУХ -ийг зогсоож, GPIO -г цэвэрлэх ёстой.

хазайх = зогсоох ()

GPIO.cleanup ()

Дээрх Терминал хэвлэх дэлгэц нь миний хоёр servo -ийн үр дүнг харуулдаг (ижил төстэй үр дүнтэй байдаг). Таны хүрээ өөр байж болно.

Алхам 5: Python скрипт үүсгэх

Python скрипт үүсгэх
Python скрипт үүсгэх

Манай servo руу илгээгдэх ХБХ -ийн командууд нь бидний сүүлчийн алхам дээр харсан шиг "үүргийн мөчлөгт" байна. Гэхдээ ихэвчлэн бид servo -ийг хянах параметр болгон "өнцөг" -ийг градусаар ашиглах ёстой. Тиймээс бид үүргийн мөчлөгийн хувьд бидний хувьд илүү ойлгомжтой хэмжигдэхүүн болох "өнцгийг" хөрвүүлэх ёстой.

Үүнийг хэрхэн хийх вэ? Маш энгийн! Ашиглалтын мөчлөгийн хүрээ 3% -иас 13% хүртэл байдаг бөгөөд энэ нь 0 -ээс 180 градусын өнцөгтэй тэнцүү гэдгийг бид мэднэ. Түүнчлэн, эдгээр өөрчлөлтүүд нь шугаман гэдгийг бид мэднэ, тиймээс бид дээр харуулсан пропорциональ схемийг бий болгож чадна. Тиймээс, өнцөг өгвөл бид харгалзах үүргийн мөчлөгтэй байж болно.

үүргийн дугуй = өнцөг/18 + 3

Энэ томъёог хадгална уу. Бид үүнийг дараагийн код дээр ашиглах болно.

Тестүүдийг гүйцэтгэхийн тулд Python скрипт үүсгэцгээе. Үндсэндээ бид Python Shell дээр өмнө нь хийж байсан зүйлээ давтах болно.

цагаас эхлэн унтах

RPi. GPIO -г GPIO GPIO.setmode (GPIO. BCM) хэлбэрээр оруулах GPIO.setwarnings (Худал) defServoAngle (servo, өнцөг): pwm = GPIO. PWM (servo, 50) pwm.start (8) dutyCycle = өнцөг / 18. + 3. pwm. ChangeDutyCycle (utyCycle) унтах (0.3) (servo, int (sys.argv [2])) GPIO.cleanup ()

Дээрх кодын цөм нь setServoAngle (servo, angle) функц юм. Энэ функц нь аргумент, servo GPIO дугаар болон servo -ийн байрлуулах ёстой өнцгийн утгыг хүлээн авдаг. Энэ функцын оролт "өнцөг" болсны дараа бид өмнө нь боловсруулсан томъёог ашиглан үүнийг ажлын мөчлөгт хувиар хуваах ёстой.

Скриптийг гүйцэтгэх үед та параметр, servo GPIO, өнцөг болгон оруулах ёстой.

Жишээлбэл:

sudo python3 өнцөгServoCtrl.py 17 45

Дээрх тушаал нь GPIO 17 дээр холбогдсон servo -ийг 45 градусаар "өндөрт" байрлуулах болно. Үүнтэй төстэй командыг Pan Servo удирдлагад ашиглаж болно ("azimuth" хэсэгт 45 градус хүртэл байрлуулах):

sudo python өнцөгServoCtrl.py 27 45

AngleServoCtrl.py файлыг миний GitHub дээрээс татаж авах боломжтой

Алхам 6: Пан-хазайлтын механизм

Пан-хазайлтын механизм
Пан-хазайлтын механизм

"Pan" servo нь манай камерыг "хэвтээ" хөдөлгөж ("азимут өнцөг"), "Tilt" servo нь "босоо" (өндрийн өнцөг) хөдөлгөнө.

Доорх зурган дээр Pan/Tilt механизм хэрхэн ажилладагийг харуулав.

Зураг
Зураг

Хөгжлийн явцад бид "хэт туйлшрал" руу орохгүй бөгөөд Pan/Tilt механизмаа зөвхөн 30 -аас 150 градус хүртэл ашиглах болно. Энэ хүрээ нь камер ашиглахад хангалттай байх болно.

Алхам 7: Пан -хазайлтын механизм - Механик барилга

Пан -хазайлтын механизм - Механик барилга
Пан -хазайлтын механизм - Механик барилга
Пан -хазайлтын механизм - Механик барилга
Пан -хазайлтын механизм - Механик барилга
Пан -хазайлтын механизм - Механик барилга
Пан -хазайлтын механизм - Механик барилга

Одоо 2 servo -ийг Pan/Tilt механизм болгон угсарцгаая. Та энд 2 зүйлийг хийж болно. Pan-Tilt платформ механизмыг сүүлчийн алхам дээр үзүүлсэн шиг худалдаж авах эсвэл өөрийн хэрэгцээнд нийцүүлэн өөрөө бүтээх.

Үүний нэг жишээ бол миний барьсан загвар байж болно, зөвхөн servos -ийг нэг нэгээр нь холбож, дээр дурдсан зургуудад үзүүлсэн шиг хуучин тоглоомноос жижиг металл хэсгүүдийг ашигласан болно.

Алхам 8: Цахилгаан хавтан/хазайлтын угсралт

Цахилгаан тогоо/хазайлтын угсралт
Цахилгаан тогоо/хазайлтын угсралт
Цахилгаан тогоо/хазайлтын угсралт
Цахилгаан тогоо/хазайлтын угсралт
Цахилгаан тогоо/хазайлтын угсралт
Цахилгаан тогоо/хазайлтын угсралт
Цахилгаан тогоо/хазайлтын угсралт
Цахилгаан тогоо/хазайлтын угсралт

Pan/Tilt механизмаа угсарсны дараа зургийг бүрэн дагаж цахилгаан холболт хийнэ үү.

  1. Pi -гээ унтраа.
  2. Бүх цахилгаан холболтыг хий.
  3. Үүнийг давхар шалгаарай.
  4. Эхлээд Pi -ээ асаагаарай.
  5. Хэрэв бүх зүйл хэвийн байгаа бол сервисээ асаагаарай.

Камерыг хэрхэн яаж тохируулах талаар бид энэ хичээл дээр судлахгүй бөгөөд үүнийг дараагийн хичээл дээр тайлбарлах болно.

Алхам 9: Python скрипт

Хоёр сервог нэгэн зэрэг удирдахын тулд Python скрипт үүсгэцгээе.

цагаас эхлэн унтах

RPi. GPIO -г GPIO GPIO.setmode (GPIO. BCM) болгон оруулах GPIO.setwarnings (False) pan = 27 tilt = 17 GPIO.setup (tilt, GPIO. OUT) # white => TILT GPIO.setup (тогоо, GPIO. OUT)) # саарал ==> PAN def setServoAngle (servo, өнцөг): баталгаажуулах өнцөг> = 30 ба өнцөг 90 (дунд цэг) ==> 150 setServoAngle (tilt, int (sys.argv [2])) # 30 ==> 90 (дунд цэг) ==> 150 GPIO.cleanup ()

Скриптийг гүйцэтгэх үед та параметр, Pan өнцөг ба Tilt өнцөг болгон оруулах ёстой. Жишээлбэл:

sudo python3 servoCtrl.py 45 120

Дээрх тушаал нь Pan/Tilt механизмыг 45 градусын "azimuth" (Пан өнцөг) ба 120 градус "өндрийн" (Tilt Angle) байрлалд байрлуулах болно. Хэрэв ямар ч параметр оруулаагүй бол 90 градус хүртэл эргүүлэх ба хазайлтын өнцөг нь анхдагч байх болно гэдгийг анхаарна уу.

Доор та зарим тестийг харж болно.

Зураг
Зураг

ServoCtrl.py файлыг миний GitHub дээрээс татаж авах боломжтой.

Алхам 10: Серверүүдийн давталтын тест

Python скриптийг бүтээж, бүх төрлийн сервосуудыг автоматаар туршиж үзье.

цагаас эхлэн унтах

RPi. GPIO -г GPIO GPIO.setmode (GPIO. BCM) болгон оруулах GPIO.setwarnings (False) pan = 27 tilt = 17 GPIO.setup (tilt, GPIO. OUT) # white => TILT GPIO.setup (тогоо, GPIO. OUT)) # gray ==> PAN def setServoAngle (servo, angle): assert өнцөг> = 30 ба өнцөг <= 150 pwm = GPIO. PWM (servo, 50) pwm.start (8) dutyCycle = өнцөг / 18. + 3. pwm. ChangeDutyCycle (dutyCycle) унтах (0.3) хүрээ (150, 30, -15): setServoAngle (тогоо, i) setServoAngle (хазайлт, i) setServoAngle (тогоо, 100) setServoAngle (хазайлт, 90) GPIO.cleanup ()

Хөтөлбөр нь хоёр өнцгөөс 30 -аас 150 градус хүртэл давталтыг автоматаар гүйцэтгэх болно.

Үр дүнгийн доор:

Би өмнө нь тайлбарласанчлан ХОУХ -ны онолыг харуулахын тулд осциллографыг холбосон.

Зураг
Зураг

Дээрх кодыг servoTest.py -ийг миний GitHub дээрээс татаж авах боломжтой.

Алхам 11: Дүгнэлт

Дүгнэлт
Дүгнэлт

Урьдын адил энэ төсөл нь бусад хүмүүст электроникийн ертөнцөд аялахад нь тусална гэж найдаж байна!

Дэлгэрэнгүй мэдээлэл, эцсийн кодыг авахын тулд миний GitHub хадгаламж руу зочилно уу: RPi-Pan-Tilt-Servo-Control

Бусад төслүүдийн талаар MJRoBot.org миний блогоос үзнэ үү

Дараагийн гарын авлагаас минь доор харуулав.

Зураг
Зураг

Дэлхийн өмнөд хэсгээс мэндчилгээ дэвшүүлье!

Дараагийн зааварчилгаагаараа уулзацгаая!

Баярлалаа, Марсело

Зөвлөмж болгож буй: