Съдържание:

Pan-Tilt Multi Servo Control: 11 стъпки (със снимки)
Pan-Tilt Multi Servo Control: 11 стъпки (със снимки)

Видео: Pan-Tilt Multi Servo Control: 11 стъпки (със снимки)

Видео: Pan-Tilt Multi Servo Control: 11 стъпки (със снимки)
Видео: Lesson 101: Using IR Remote to control TV, AC Bulb with Relay, DC Motor and Servo Motor 2024, Юли
Anonim
Pan-Tilt Multi Servo Control
Pan-Tilt Multi Servo Control

В този урок ще изследваме как да контролираме множество сервомотори с помощта на Python на Raspberry Pi. Нашата цел ще бъде PAN/TILT механизъм за позициониране на камера (PiCam).

Тук можете да видите как ще работи нашият окончателен проект:

Контрол Servo Тест на контролния контур:

Образ
Образ

Стъпка 1: BoM - материална сметка

Главни части:

  1. Raspberry Pi V3 - 32,00 щ.д.
  2. 5 -мегапикселов 1080p сензор OV5647 мини камерен видео модул - 13,00 щ.д.
  3. TowerPro SG90 9G 180 градуса Micro Servo (2 X)- 4,00 щ.д.
  4. Платформа за мини камера за панорама/ накланяне Антивибрационна камера с 2 сервомотора (*) - 8,00 щ.д.
  5. Резистор 1K ом (2X) - По избор
  6. Разни: метални части, ленти и т.н. (в случай, че ще конструирате своя механизъм Pan/Tilt)

(*) можете да закупите пълна платформа Pan/Tilt със сервомоторите или да създадете своя собствена.

Стъпка 2: Как работи PWM

Raspberry Pi няма аналогов изход, но можем да симулираме това, като използваме PWM (Pulse Width Modulation) подход. Това, което ще направим, е да генерираме цифров сигнал с фиксирана честота, където ще променим ширината на импулсния ход, което ще бъде "преведено" като "средно" ниво на изходното напрежение, както е показано по -долу:

Образ
Образ

Можем да използваме това "средно" ниво на напрежение, за да контролираме яркостта на LED например:

Образ
Образ

Имайте предвид, че това, което има значение тук, не е самата честота, а "Работният цикъл", това е връзката между времето, през което импулсите са "високи", разделено на периода на вълната. Да предположим например, че ще генерираме 50Hz честота на импулса на един от нашите Raspberry Pi GPIO. Периодът (p) ще бъде обратен на честотата или 20ms (1/f). Ако искаме нашият светодиод с "наполовина" ярко, трябва да имаме работен цикъл от 50%, това означава "импулс", който ще бъде "висок" за 10 ms.

Този принцип ще бъде много важен за нас, за да контролираме нашата позиция на серво, след като "Работният цикъл" ще определи позицията на серво, както е показано по -долу:

Серво

Стъпка 3: Инсталиране на Hw

Инсталиране на Hw
Инсталиране на Hw
Инсталиране на Hw
Инсталиране на Hw

Сервомоторите ще бъдат свързани към външно 5V захранване, като техният щифт за данни (в моя случай жълтото окабеляване) ще бъде свързан към Raspberry Pi GPIO, както е показано по -долу:

  • GPIO 17 ==> Наклонено серво
  • GPIO 27 ==> Pan Servo

Не забравяйте да свържете GND заедно ==> Raspberry Pi - Servos - Външно захранване)

Като опция можете да имате резистор от 1K ом между Raspberry Pi GPIO и щифта за въвеждане на данни на сървъра. Това би защитило вашия RPi в случай на проблем със серво.

Стъпка 4: Калибриране на сервомоторите

Серво калибриране
Серво калибриране
Серво калибриране
Серво калибриране
Серво калибриране
Серво калибриране

Първото нещо, което трябва да направите, е да потвърдите основните характеристики на вашите сервомотори. В моя случай използвам Power Pro SG90.

От листа с данни можем да разгледаме:

  • Обхват: 180o
  • Захранване: 4.8V (външно 5VDC като USB захранване работи добре)
  • Работна честота: 50Hz (Период: 20 ms)
  • Ширина на импулса: от 1ms до 2ms

На теория сервото ще работи

  • Начална позиция (0 градуса), когато към терминала за данни се подаде импулс от 1 ms
  • Неутрално положение (90 градуса), когато импулс от 1,5 ms се прилага към неговия терминал за данни
  • Крайна позиция (180 градуса), когато импулс от 2 ms се прилага към терминала за данни

За да програмирате серво позиция с помощта на Python ще бъде много важно да знаете кореспондента "Duty Cycle" за горните позиции, нека направим някои изчисления:

  • Начална позиция ==> (0 градуса) Ширина на импулса ==> 1ms ==> Работен цикъл = 1ms/20ms ==> 2.0%
  • Неутрално положение (90 градуса) Ширина на импулса 1,5 ms ==> Работен цикъл = 1,5ms/20ms ==> 7,5%
  • Крайна позиция (180 градуса) Ширина на импулса 2 ms ==> Работен цикъл = 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)

Определете серво щифта, който използвате:

tiltPin = 11

Ако Вместо това сте използвали BCM схема, последните 2 команди трябва да бъдат заменени с:

GPIO.setmode (GPIO. BCM)

tiltPin = 17

Сега трябва да уточним, че този щифт ще бъде "изход"

GPIO.setup (tiltPin, GPIO. OUT)

И каква ще бъде честотата, генерирана на този щифт, това за нашето серво ще бъде 50Hz:

наклон = GPIO. PWM (tiltPin, 50)

Сега, нека започнем да генерираме PWM сигнал на щифта с начален работен цикъл (ще го запазим "0"):

наклон = старт (0)

Сега можете да въведете различни стойности на работния цикъл, като наблюдавате движението на вашето серво. Нека започнем с 2% и да видим какво ще се случи (спекулираме, че сервото отива на "нулева позиция"):

tilt. ChangeDutyCycle (2)

В моя случай сервото отиде в нулева позиция, но когато промених работния цикъл на 3%, забелязах, че серво остава в същото положение, започвайки да се движи с цикли на работа над 3%. И така, 3% е моята първоначална позиция (o градуси). Същото се случи и с 10%, моето серво надвиши тази стойност, достигайки своя край на 13%. Така че за този конкретен серво, резултатът беше:

  • 0 степен ==> работен цикъл от 3%
  • 90 градуса ==> работен цикъл от 8%
  • 180 градуса ==> работен цикъл от 13%

След като приключите с тестовете, трябва да спрете PWM и да почистите GPIO:

наклон = стоп ()

GPIO.cleanup ()

Горният екран за печат на терминал показва резултата и за двата ми сервомотора (който има сходни резултати). Вашата гама може да бъде различна.

Стъпка 5: Създаване на скрипт на Python

Създаване на скрипт на Python
Създаване на скрипт на Python

Командите за ШИМ, които трябва да бъдат изпратени до нашето серво, са в "дежурни цикли", както видяхме на последната стъпка. Но обикновено трябва да използваме „ъгъл“в градуси като параметър за управление на серво. Така че, ние трябва да преобразуваме "ъгъл", който е по -естествено измерване за нас в работния цикъл, както е разбираемо за нашия Pi.

Как да го направим? Много просто! Знаем, че диапазонът на работния цикъл варира от 3% до 13% и че това е еквивалентно на ъгли, които ще варират от 0 до 180 градуса. Също така знаем, че тези вариации са линейни, така че можем да конструираме пропорционална схема, както е показано по -горе. така че, като се има предвид ъгъл, можем да имаме съответния работен цикъл:

работен цикъл = ъгъл/18 + 3

Запазете тази формула. Ще го използваме в следващия код.

Нека създадем скрипт на Python за изпълнение на тестовете. По принцип ще повторим това, което направихме преди в Python Shell:

от време внос сън

импортирайте RPi. GPIO като GPIO GPIO.setmode (GPIO. BCM) GPIO.setwarnings (False) def setServoAngle (servo, ъгъл): pwm = GPIO. PWM (servo, 50) pwm.start (8) dutyCycle = ъгъл / 18. + 3. pwm. ChangeDutyCycle (dutyCycle) sleep (0.3) pwm.stop () if _name_ == '_main_': import sys servo = int (sys.argv [1]) GPIO.setup (servo, GPIO. OUT) setServoAngle (серво, int (sys.argv [2])) GPIO.cleanup ()

Ядрото на горния код е функцията setServoAngle (серво, ъгъл). Тази функция получава като аргументи, серво GPIO номер и стойност на ъгъла до мястото, където трябва да бъде позиционирано серво. След като входът на тази функция е „ъгъл“, трябва да я преобразуваме в работен цикъл в проценти, като използваме формулата, разработена по -рано.

Когато скриптът се изпълнява, трябва да въведете като параметри, серво GPIO и ъгъл.

Например:

sudo python3 angleServoCtrl.py 17 45

Горната команда ще позиционира серво свързаното на GPIO 17 с 45 градуса на "кота". Подобна команда може да се използва за управление на Pan Servo (позиция до 45 градуса по "азимут"):

sudo python angleServoCtrl.py 27 45

Файлът angleServoCtrl.py може да бъде изтеглен от моя GitHub

Стъпка 6: Механизмът на накланяне

Механизмът на накланяне
Механизмът на накланяне

Серво "Pan" ще премести "хоризонтално" нашата камера ("азимутален ъгъл"), а нашето "Tilt" серво ще я премести "вертикално" (ъгъл на кота).

Снимката по -долу показва как работи механизмът Pan/Tilt:

Образ
Образ

По време на нашето развитие няма да изпадаме в "крайности" и ще използваме нашия механизъм Pan/Tilt само от 30 до 150 градуса. Този диапазон ще бъде достатъчен, за да се използва с камера.

Стъпка 7: Механизмът с наклон - механична конструкция

Механизмът Pan -Tilt - механична конструкция
Механизмът Pan -Tilt - механична конструкция
Механизмът Pan -Tilt - механична конструкция
Механизмът Pan -Tilt - механична конструкция
Механизмът с наклон - механична конструкция
Механизмът с наклон - механична конструкция

Нека сега сглобим нашите 2 сервомотора като Pan/Tilt механизъм. Тук можете да направите 2 неща. Купете механизъм на платформа Pan-Tilt като този, показан на последната стъпка, или изградете свой собствен според вашите нужди.

Един пример може да бъде този, който аз направих, само привързвайки сервомоторите един към друг и използвайки малки метални парчета от стари играчки, както е показано на снимките по -горе.

Стъпка 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 (pan, GPIO. OUT) # grey ==> PAN def setServoAngle (серво, ъгъл): утвърдете ъгъл> = 30 и ъгъл 90 (средна точка) ==> 150 setServoAngle (наклон, int (sys.argv [2])) # 30 ==> 90 (средна точка) ==> 150 GPIO.cleanup ()

Когато скриптът се изпълнява, трябва да въведете като параметри, Pan ъгъл и Ъгъл на наклон. Например:

sudo python3 servoCtrl.py 45 120

Горната команда ще позиционира механизма Pan/Tilt с 45 градуса по "азимут" (ъгъл на панорама) и 120 градуса "кота" (ъгъл на наклон). Обърнете внимание, че ако не са въведени параметри, по подразбиране ще бъдат ъглите на панорама и наклон, зададени до 90 градуса.

По -долу можете да видите някои тестове:

Образ
Образ

Файлът servoCtrl.py може да бъде изтеглен от моя GitHub.

Стъпка 10: Цикличен тест на сървъри

Нека сега създадем 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, ъгъл): утвърдете ъгъл> = 30 и ъгъл <= 150 pwm = GPIO. PWM (servo, 50) pwm.start (8) dutyCycle = ъгъл / 18. + 3. pwm. ChangeDutyCycle (dutyCycle) sleep (0.3) pwm.stop () if _name_ == '_main_': за i в обхват (30, 160, 15): setServoAngle (pan, i) setServoAngle (tilt, i) за i in range (150, 30, -15): setServoAngle (pan, i) setServoAngle (tilt, i) setServoAngle (pan, 100) setServoAngle (tilt, 90) GPIO.cleanup ()

Програмата ще изпълни автоматично цикъл от 30 до 150 градуса в двата ъгъла.

Под резултата:

Свързах осцилоскоп само за да илюстрирам теорията на ШИМ, както е обяснено по -горе.

Образ
Образ

Горният код, servoTest.py може да бъде изтеглен от моя GitHub.

Стъпка 11: Заключение

Заключение
Заключение

Както винаги, надявам се този проект да помогне на другите да намерят своя път във вълнуващия свят на електрониката!

За подробности и окончателен код, моля, посетете моето хранилище на GitHub: RPi-Pan-Tilt-Servo-Control

За повече проекти, моля, посетете моя блог: MJRoBot.org

По -долу бегъл поглед към следващия ми урок:

Образ
Образ

Поздрави от юга на света!

Ще се видим в следващата ми инструкция!

Благодаря ти, Марсело

Препоръчано: