
Съдържание:
- Стъпка 1: BoM - материална сметка
- Стъпка 2: Как работи PWM
- Стъпка 3: Инсталиране на Hw
- Стъпка 4: Калибриране на сервомоторите
- Стъпка 5: Създаване на скрипт на Python
- Стъпка 6: Механизмът на накланяне
- Стъпка 7: Механизмът с наклон - механична конструкция
- Стъпка 8: Електрически панел/наклон
- Стъпка 9: Скриптът на Python
- Стъпка 10: Цикличен тест на сървъри
- Стъпка 11: Заключение
2025 Автор: John Day | [email protected]. Последно модифициран: 2025-01-23 14:36

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

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


Сервомоторите ще бъдат свързани към външно 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

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



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




След като сте сглобили механизма си Pan/Tilt, следвайте снимките за пълна електрическа връзка.
- Изключете Pi.
- Направете всички електрически връзки.
- Проверете го още веднъж.
- Включете първо вашия Pi.
- Ако всичко е наред, захранвайте сервомоторите си.
В този урок няма да изследваме как да настроим камерата, това ще бъде обяснено в следващия урок.
Стъпка 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
По -долу бегъл поглед към следващия ми урок:

Поздрави от юга на света!
Ще се видим в следващата ми инструкция!
Благодаря ти, Марсело
Препоръчано:
LED светлина (и) със захранване от батерията със слънчево зареждане: 11 стъпки (със снимки)

LED светлини (и), захранвани от батерии, със слънчево зареждане: Жена ми учи хората как да правят сапун, повечето от часовете й бяха вечер и тук през зимата се стъмва около 16:30 ч. Някои от нейните ученици имаха проблеми с намирането на нашите къща. Имахме табела отпред, но дори и с улично осветление
Лек хак за стая със зрителни увреждания със слухови увреждания: 7 стъпки (със снимки)

Лек хак на стаята със слухови увреждания на вратата: Проблем: баща ми е регистриран като глух, а майка ми е с увреден слух и поради това често им е трудно да чуят звънеца на вратата. Това би могло да бъде проблем, претърпян и от много други.Купиха мигащ светлинен звънец на вратата, за да им помогнат с
Arduino Multi Light Controller: 7 стъпки (със снимки)

Arduino Multi Light Controller: Колегата и художникът Джим Хобс планираше да построи самостоятелна инсталация за изложба, която сглобяваше. Тази инсталация ще се състои от 8 рафта, образуващи параболична форма. Всеки от 8 -те рафта трябваше да има 10 крушки
Док станция за зареждане на Lego Multi Device, таблет за телефон: 15 стъпки (със снимки)

Док -станция за зареждане на Lego Multi Device, таблет за телефон: изградете свой собствен док за зареждане на lego
Персонализиран часовник със стрелки за снимки: 5 стъпки (със снимки)

Персонализиран часовник със стрелки за снимки: Някои хора наблюдават часовника. Сега всеки може да бъде часовник. Други проекти персонализират лицето на часовника. Този персонализира стрелките на часовника. Изглежда скъп, но е по -малко от 5 долара и около 30 минути на часовник. Перфектен за Chr