Мазмуну:

Pan-Tilt Multi Servo Control: 11 кадам (Сүрөттөр менен)
Pan-Tilt Multi Servo Control: 11 кадам (Сүрөттөр менен)

Video: Pan-Tilt Multi Servo Control: 11 кадам (Сүрөттөр менен)

Video: Pan-Tilt Multi Servo Control: 11 кадам (Сүрөттөр менен)
Video: КАКИМ БУДЕТ PORTAL 3 2024, Ноябрь
Anonim
Pan-Tilt Multi Servo Control
Pan-Tilt Multi Servo Control

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

Бул жерде сиз биздин акыркы долбоорубуз кандай иштээрин көрө аласыз:

Control Servo Control циклинин сыноосу:

Сүрөт
Сүрөт

1 -кадам: БМ - Материалдык эсеп

Негизги бөлүктөр:

  1. Raspberry Pi V3 - 32.00 АКШ доллары
  2. 5 мегапиксел 1080p сенсор OV5647 Mini камера видео модулу - 13.00 АКШ доллары
  3. TowerPro SG90 9G 180 градус Micro Servo (2 X)- 4.00 АКШ доллары
  4. Mini Pan/ Tilt Камера Платформасы Вибрацияга каршы Камера Ма/ 2 сервос (*) - US $ 8.00
  5. Резистор 1K ом (2X) - Милдеттүү эмес
  6. Ар кандай: металл тетиктер, тилкелер ж. Б.

(*) сиз servo менен толук Pan/Tilt платформасын сатып алсаңыз же өзүңүз курсаңыз болот.

2 -кадам: PWM кантип иштейт

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

Сүрөт
Сүрөт

Биз бул "орточо" чыңалуу деңгээлин LED жарыгын контролдоо үчүн колдонсок болот:

Сүрөт
Сүрөт

Белгилей кетчү нерсе, бул жерде жыштыктын өзү эмес, "Милдет циклинин" мааниси бар, бул пульстун "бийик" болгон мезгилинин толкун мезгилине бөлүнүшү. Мисалы, биз Raspberry Pi GPIO бирибизде 50 Гц импульс жыштыгын түзөбүз дейли. (P) мезгили жыштыкка же 20msге (1/f) тескери болот. Эгерде биз LEDдин "жарым" жарык болушун кааласак, бизде 50%Милдеттүү цикл болушу керек, бул 10 мс үчүн "Жогорку" боло турган "импульсту" билдирет.

Бул принцип биз үчүн өтө маанилүү болот, биздин "servo" позициябызды көзөмөлдөө үчүн, "Duty Cycle" төмөндө көрсөтүлгөндөй servo позициясын аныктайт:

Servo

3 -кадам: Hw орнотуу

Hw орнотуу
Hw орнотуу
Hw орнотуу
Hw орнотуу

Сервалар 5V тышкы булагына туташат, алардын маалымат пини (менин учурда, алардын сары зымдары) Raspberry Pi GPIO менен төмөндөгүдөй туташат:

  • GPIO 17 ==> Tilt Servo
  • GPIO 27 ==> Pan Servo

GNDлерди бирге туташтырууну унутпаңыз ==> Raspberry Pi - Servos - Тышкы энергия менен камсыздоо)

Сиз опция катары Raspberry Pi GPIO менен Server маалымат киргизүү пининин ортосунда 1K ом резисторуна ээ боло аласыз. Бул сервопроблемада сиздин RPiңизди коргойт.

4 -кадам: Servos калибрлөө

Servos Calibration
Servos Calibration
Servos Calibration
Servos Calibration
Servos Calibration
Servos Calibration

Эң биринчи нерсе - бул сервоприводдоруңуздун негизги мүнөздөмөсүн ырастоо. Менин учурда, мен Power Pro SG90 колдонуп жатам.

Анын маалымат барагынан биз төмөнкүлөрдү карап чыга алабыз:

  • Аралыгы: 180o
  • Электр энергиясы менен камсыздоо: 4.8V (тышкы 5VDC USB кубаты менен жакшы иштейт)
  • Иштөө жыштыгы: 50 Гц (Мөөнөтү: 20 мс)
  • Pulse туурасы: 1ms тартып 2ms

Теориялык жактан алганда, серво өз алдынча болот

  • Баштапкы абал (0 градус), анын маалымат терминалына 1 мс импульс колдонулганда
  • Нейтралдуу позиция (90 градус), анын маалымат терминалына 1,5 мс импульс колдонулганда
  • Акыркы позиция (180 градус), анын маалымат терминалына 2 мс импульс колдонулганда

Python аркылуу серво позициясын программалоо үчүн жогоруда аталган кызматтар үчүн "Duty Cycle" корреспондентин билүү абдан маанилүү болот, келгиле, бир аз эсептеп көрөлү:

  • Баштапкы Позициясы ==> (0 градус) Пульс туурасы ==> 1ms ==> Милдет цикл = 1ms/20ms ==>> 2.0%
  • Нейтралдуу абал (90 градус) Pulse туурасы 1.5 мс ==> Милдет цикл = 1.5ms/20ms ==> 7.5%
  • Акыркы позициясы (180 градус) Pulse туурасы 2 ms ==> Duty Cycle = 2ms/20ms ==> 10%

Ошентип, Duty Cycle 2ден 10 %га чейин өзгөрүшү керек.

Келгиле, серволорду жекече сынап көрөлү. Бул үчүн, Raspberry терминалыңызды ачыңыз жана Python 3 shell редакторуңузду "sudo" катары иштетиңиз (анткени сиз GPIO менен иштөө үчүн "супер колдонуучу" болушуңуз керек):

sudo python3

Python Shell боюнча

>>

RPI. GPIO модулун импорттоп, аны GPIO деп атаңыз:

GPO катары RPi. GPIO импорттоо

Кайсы пин номерлөө схемаларын колдонууну каалаарыңызды аныктаңыз (BCM же BOARD). Мен бул тестти BOARD менен кылдым, ошондуктан мен колдонгон казыктар физикалык казыктар болчу (GPIO 17 = Pin 11 жана GPIO 27 Pin 13). Аларды аныктоо жана тест учурунда ката кетирбөө мага оңой болду (Акыркы программада BCM колдоном). Каалооңуздун бирин тандаңыз:

GPIO.setmode (GPIO. BOARD)

Сиз колдонгон servo пинди аныктаңыз:

tiltPin = 11

Эгерде анын ордуна, сиз BCM схемасын колдонгон болсоңуз, анда акыркы 2 буйрук төмөнкүдөй алмаштырылышы керек:

GPIO.setmode (GPIO. BCM)

tiltPin = 17

Эми, биз бул пин "чыгаруу" болорун такташыбыз керек

GPIO.setup (tiltPin, GPIO. OUT)

Жана бул пинде өндүрүлгөн жыштык кандай болот, биздин серво үчүн 50 Гц болот:

эңкейтүү = GPIO. PWM (tiltPin, 50)

Эми, пин кызматында PWM сигналын генерациялоону баштайлы (биз аны "0" бойдон калтырабыз):

эңкейтүү = баштоо (0)

Эми, сиз сервонун кыймылын байкап, ар кандай милдет циклинин маанилерин киргизе аласыз. Келгиле, 2% менен баштайлы жана эмне болорун көрөлү (сервонун "нөлдүк абалга" баратканын көрөбүз):

жантаюу. ӨзгөртүүDutyCycle (2)

Менин учурда, серво нөлгө чыкты, бирок мен кызмат циклин 3% га өзгөрткөнүмдө, сервонун 3% дан көп кызмат циклдери менен жыла баштаганы, ошол эле абалда калганын байкадым. Ошентип, 3% - бул менин баштапкы позициям (о градус). Ошол эле 10%менен болгон, менин сервом бул мааниден ашып, 13%аяктады. Ошентип, бул өзгөчө серво үчүн натыйжа мындай болду:

  • 0 даража ==> милдет цикли 3%
  • 90 градус ==> кызмат цикли 8%
  • 180 градус ==> кызмат цикли 13%

Тесттериңизди аяктагандан кийин, PWMди токтотуп, GPIOдорду тазалашыңыз керек:

эңкейтүү = токтотуу ()

GPIO.cleanup ()

Жогорудагы Терминалды басып чыгаруу экөө тең менин серволорумдун жыйынтыгын көрсөтөт (бул окшош натыйжаларга ээ). Сиздин диапазонуңуз ар кандай болушу мүмкүн.

5 -кадам: Python скриптин түзүү

Python скриптин түзүү
Python скриптин түзүү

Биздин сервого жөнөтүлө турган PWM буйруктары, биз акыркы кадамда көргөндөй "кызмат циклдеринде". Бирок, адатта, биз servo көзөмөлдөө үчүн параметр катары даражада "бурчту" колдонушубуз керек. Ошентип, биз "бурчту" конвертация кылышыбыз керек, бул биздин циклде биз түшүнгөндөй табигый өлчөө.

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

dutycycle = бурч/18 + 3

Бул формуланы сактаңыз. Биз аны кийинки коддо колдонобуз.

Тесттерди аткаруу үчүн Python скриптин түзөлү. Негизинен, биз Python Shellде мурун кылганды кайталайбыз:

Убакытты импорттоо

RPi. GPIO импорту GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) def setServoAngle (servo, angle): pwm = GPIO. PWM (servo, 50) pwm.start (8) dutyCycle = бурч / 18. + 3. pwm. ChangeDutyCycle (dutyCycle) уйку (0.3) pwm.stop () if _name_ == '_main_': импорттук sys servo = int (sys.argv [1]) GPIO.setup (servo, GPIO. OUT) setServoAngle (servo, int (sys.argv [2])) GPIO.cleanup ()

Жогорудагы коддун өзөгүн setServoAngle (servo, angle) функциясы түзөт. Бул функция аргумент катары, servo GPIO номерин жана servo жайгаштырылышы керек болгон бурчтун маанисин алат. Бул функциянын кириши "бурч" болгондон кийин, биз аны мурда иштелип чыккан формуланы колдонуу менен пайыздык циклге которушубуз керек.

Скрипт аткарылганда, сиз параметрлер, servo GPIO жана бурч катары киришиңиз керек.

Мисалы:

sudo python3 angleServoCtrl.py 17 45

Жогорудагы буйрук GPIO 17ге туташкан сервону 45 градус менен "бийиктикте" жайгаштырат. Окшош буйрук Pan Servo көзөмөлү үчүн колдонулушу мүмкүн ("азимутта" 45 градуска чейинки абал):

sudo python бурчуServoCtrl.py 27 45

AngleServoCtrl.py файлын менин GitHubдан жүктөп алса болот

6-кадам: Pan-Tilt механизми

Pan-Tilt механизми
Pan-Tilt механизми

"Пан" сервосу камерабызды "горизонталдуу" жылдырат ("азимут бурчу") жана "Tilt" сервосу аны "вертикалдуу" (бийиктик бурчу) жылдырат.

Төмөндөгү сүрөттө Pan/Tilt механизми кандай иштээри көрсөтүлгөн:

Сүрөт
Сүрөт

Өнүгүү учурунда биз "чектен" чыкпайбыз жана Pan/Tilt механизмибизди 30дан 150 градуска чейин гана колдонобуз. Бул диапазон камера менен колдонуу үчүн жетиштүү болот.

7 -кадам: Pan -Tilt механизми - Механикалык курулуш

Pan -Tilt механизми - Механикалык курулуш
Pan -Tilt механизми - Механикалык курулуш
Pan -Tilt механизми - Механикалык курулуш
Pan -Tilt механизми - Механикалык курулуш
Pan -Tilt механизми - Механикалык курулуш
Pan -Tilt механизми - Механикалык курулуш

Келгиле, Pan/Tilt механизми катары биздин 2 сервону чогулталы. Бул жерде сиз 2 нерсени жасай аласыз. Pan-Tilt платформасынын механизмин акыркы кадамда көрсөтүлгөндөй сатып алыңыз же өзүңүздүн керектөөлөрүңүзгө ылайык куруңуз.

Бир мисал, мен курган мисал боло алат, жөн гана серволорду бири -бирине байлап, жана жогорудагы сүрөттөрдө көрсөтүлгөндөй эски оюнчуктардын кичинекей металл бөлүктөрүн колдонуп.

8 -кадам: Электр Pan/Tilt жамааты

Электр пан/эңкейтүү жыйнагы
Электр пан/эңкейтүү жыйнагы
Электр пан/эңкейтүү жыйнагы
Электр пан/эңкейтүү жыйнагы
Электр пан/эңкейтүү жыйнагы
Электр пан/эңкейтүү жыйнагы
Электр пан/эңкейүү жыйнагы
Электр пан/эңкейүү жыйнагы

Сиз Pan/Tilt механизмин чогулткандан кийин, толук электрдик туташуу үчүн сүрөттөрдү ээрчиңиз.

  1. Пиңизди өчүрүңүз.
  2. Бардык электрдик туташууларды жасаңыз.
  3. Аны эки жолу текшериңиз.
  4. Биринчи Pi'ни күйгүзүңүз.
  5. Эгер баары ойдогудай болсо, серверлериңизди кубаттаңыз.

Биз бул үйрөткүчтө камераны кантип орнотууну изилдебейбиз, бул кийинки үйрөткүчтө түшүндүрүлөт.

9 -кадам: Python Script

Келгиле, эки сервону бир убакта көзөмөлдөө үчүн Python Script түзөлү:

Убакытты импорттоо

RPi. GPIO импорту GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) pan = 27 tilt = 17 GPIO.setup (tilt, GPIO. OUT) # white => TILT GPIO.setup (pan, GPIO. OUT)) # grey ==> PAN def setServoAngle (servo, angle): бурчту ырастоо> = 30 жана бурч 90 (орто чекит) ==> 150 setServoAngle (tilt, int (sys.argv [2])) # 30 ==> 90 (орто чекит) ==> 150 GPIO.cleanup ()

Сценарий аткарылганда, сиз параметрлер, Пан бурчу жана Тил бурчу катары киришиңиз керек. Мисалы:

sudo python3 servoCtrl.py 45 120

Жогорудагы буйрук Pan/Tilt механизмин 45 градус "азимутта" (Пан бурчу) жана 120 градус "бийиктикте" (Tilt Angle) жайгаштырат. Белгилей кетсек, эгер эч кандай параметрлер киргизилбесе, демейки экөө тең болот, пан жана эңкейиш бурчтары 90 градуска чейин.

Төмөндө сиз кээ бир тесттерди көрө аласыз:

Сүрөт
Сүрөт

ServoCtrl.py файлын менин GitHubдан жүктөп алса болот.

10 -кадам: Серверлердин Loop Test

Келгиле, сервистердин толук спектрин автоматтык түрдө текшерүү үчүн Python Script түзөлү:

Убакытты импорттоо

RPi. GPIO импорту GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) pan = 27 tilt = 17 GPIO.setup (tilt, GPIO. OUT) # white => TILT GPIO.setup (pan, GPIO. OUT)) # grey ==> PAN def setServoAngle (servo, angle): бурчту ырастоо> = 30 жана бурч <= 150 pwm = GPIO. PWM (servo, 50) pwm.start (8) dutyCycle = бурч / 18. + 3. pwm. ChangeDutyCycle (utyCycle) уйку (0.3) диапазон (150, 30, -15): setServoAngle (пан, мен) setServoAngle (эңкейтүү, мен) setServoAngle (көмөч, 100) setServoAngle (эңкейүү, 90) GPIO.cleanup ()

Программа автоматтык түрдө эки бурчта 30дан 150 градуска чейинки циклди аткарат.

Жыйынтыктын астында:

Мен осциллографты PWM теориясын көрсөтүү үчүн гана туташтырдым.

Сүрөт
Сүрөт

Жогорудагы кодду, servoTest.py менин GitHubдан көчүрүп алса болот.

11 -кадам: Жыйынтык

Жыйынтык
Жыйынтык

Дайыма эле, бул долбоор башкаларга электрониканын кызыктуу дүйнөсүнө жол табууга жардам берет деп ишенем!

Чоо-жайын жана акыркы кодду алуу үчүн GitHub депозитарийиме баш багыңыз: RPi-Pan-Tilt-Servo-Control

Башка долбоорлор үчүн, менин блогума баш багыңыз: MJRoBot.org

Төмөндө менин кийинки үйрөткүчүмдүн бир көрүнүшү:

Сүрөт
Сүрөт

Дүйнөнүн түштүгүнөн салам!

Кийинки көрсөтмөмдө көрүшкөнчө!

Рахмат, Marcelo

Сунушталууда: