Оглавление:

Мульти сервоуправление панорамированием и наклоном: 11 шагов (с изображениями)
Мульти сервоуправление панорамированием и наклоном: 11 шагов (с изображениями)

Видео: Мульти сервоуправление панорамированием и наклоном: 11 шагов (с изображениями)

Видео: Мульти сервоуправление панорамированием и наклоном: 11 шагов (с изображениями)
Видео: Уроки Arduino - управление сервомашинкой 2024, Июль
Anonim
Мульти-сервоуправление панорамированием и наклоном
Мульти-сервоуправление панорамированием и наклоном

В этом руководстве мы рассмотрим, как управлять несколькими сервоприводами с помощью Python на Raspberry Pi. Нашей целью будет механизм PAN / TILT для позиционирования камеры (PiCam).

Здесь вы можете увидеть, как будет работать наш финальный проект:

Проверка контура управления сервоуправлением:

Изображение
Изображение

Шаг 1: BoM - Спецификация материалов

Основные части:

  1. Raspberry Pi V3 - 32 доллара США.
  2. 5-мегапиксельный сенсор 1080p OV5647 Mini Camera Video Module - US $ 13.00
  3. TowerPro SG90 9G 180 градусов Micro Servo (2 X) - 4 доллара США
  4. Антивибрационное крепление для камеры с миниатюрной платформой для панорамирования / наклона с 2 сервоприводами (*) - US $ 8,00
  5. Резистор 1 кОм (2X) - опционально
  6. Разное: металлические детали, ленты и т. Д. (На случай, если вы создадите свой механизм панорамирования / наклона).

(*) вы можете купить полную платформу панорамирования / наклона с сервоприводами или построить свою собственную.

Шаг 2: Как работает ШИМ

Raspberry Pi не имеет аналогового выхода, но мы можем смоделировать это, используя метод ШИМ (широтно-импульсной модуляции). Что мы сделаем, так это сгенерируем цифровой сигнал с фиксированной частотой, где мы изменим ширину последовательности импульсов, что будет «переведено» как «средний» уровень выходного напряжения, как показано ниже:

Изображение
Изображение

Мы можем использовать этот «средний» уровень напряжения для управления яркостью светодиода, например:

Изображение
Изображение

Обратите внимание, что здесь важна не сама частота, а «рабочий цикл», то есть отношение между временем, когда пульс «высокий», деленным на период волны. Например, предположим, что мы будем генерировать частоту импульсов 50 Гц на одном из наших Raspberry Pi GPIO. Период (p) будет инверсией частоты или 20 мс (1 / f). Если мы хотим, чтобы наш светодиод был ярким «наполовину», у нас должен быть рабочий цикл 50%, что означает «импульс», который будет «High» в течение 10 мс.

Этот принцип будет очень важен для нас, чтобы контролировать положение сервопривода, как только «Рабочий цикл» определит положение сервопривода, как показано ниже:

Сервопривод

Шаг 3: Установка Hw

Установка Hw
Установка Hw
Установка Hw
Установка Hw

Сервоприводы будут подключены к внешнему источнику питания 5 В, а их вывод данных (в моем случае их желтая проводка) будет подключен к Raspberry Pi GPIO, как показано ниже:

  • GPIO 17 ==> Сервопривод наклона
  • GPIO 27 ==> Сервопривод панорамирования

Не забудьте соединить GND вместе ==> Raspberry Pi - Servos - External Power Supply)

Вы можете иметь в качестве опции резистор 1 кОм между Raspberry Pi GPIO и входным контактом данных сервера. Это защитит ваш RPi в случае неисправности сервопривода.

Шаг 4: Калибровка сервоприводов

Калибровка сервоприводов
Калибровка сервоприводов
Калибровка сервоприводов
Калибровка сервоприводов
Калибровка сервоприводов
Калибровка сервоприводов

Первое, что нужно сделать, это подтвердить основные характеристики ваших сервоприводов. В моем случае я использую Power Pro SG90.

Из его таблицы мы можем рассмотреть:

  • Диапазон: 180o
  • Источник питания: 4,8 В (внешние 5 В постоянного тока в качестве источника питания USB работают нормально)
  • Рабочая частота: 50 Гц (период: 20 мс)
  • Ширина импульса: от 1 мс до 2 мс

Теоретически сервопривод будет на своем

  • Исходное положение (0 градусов), когда на его терминал данных подается импульс длительностью 1 мс
  • Нейтральное положение (90 градусов), когда на его терминал данных подается импульс длительностью 1,5 мс.
  • Конечное положение (180 градусов), когда на его терминал данных подается импульс длительностью 2 мс.

Чтобы запрограммировать положение сервопривода с использованием Python, очень важно знать соответствующий «рабочий цикл» для указанных выше положений, давайте сделаем некоторые вычисления:

  • Исходное положение ==> (0 градусов) Ширина импульса ==> 1 мс ==> Рабочий цикл = 1 мс / 20 мс ==> 2,0%
  • Нейтральное положение (90 градусов) Ширина импульса 1,5 мс ==> Рабочий цикл = 1,5 мс / 20 мс ==> 7,5%
  • Конечное положение (180 градусов) Ширина импульса 2 мс ==> Рабочий цикл = 2 мс / 20 мс ==> 10%

Таким образом, рабочий цикл должен варьироваться в диапазоне от 2 до 10%.

Давайте протестируем сервоприводы индивидуально. Для этого откройте терминал Raspberry и запустите редактор оболочки Python 3 как «sudo» (потому что вы должны быть «суперпользователем» для работы с GPIO):

sudo python3

В оболочке Python

>>

Импортируйте модуль RPI. GPIO и назовите его GPIO:

импортировать RPi. GPIO как GPIO

Определите, какие схемы нумерации контактов вы хотите использовать (BCM или BOARD). Я провел этот тест с BOARD, поэтому контакты, которые я использовал, были физическими контактами (GPIO 17 = контакт 11 и GPIO 27 контакт 13). Мне было легко их идентифицировать и не допускать ошибок во время теста (в финальной программе я буду использовать BCM). Выберите один из ваших предпочтений:

GPIO.setmode (GPIO. BOARD)

Определите серво-штифт, который вы используете:

tiltPin = 11

Если вместо этого вы использовали схему BCM, последние 2 команды следует заменить на:

GPIO.setmode (GPIO. BCM)

tiltPin = 17

Теперь мы должны указать, что этот вывод будет «выходом».

GPIO.setup (tiltPin, GPIO. OUT)

И какая частота будет генерироваться на этом выводе, что для нашего сервопривода будет 50 Гц:

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

Теперь давайте начнем генерировать сигнал ШИМ на выводе с начальным рабочим циклом (мы оставим его равным «0»):

наклон = начало (0)

Теперь вы можете вводить различные значения рабочего цикла, наблюдая за движением сервопривода. Давайте начнем с 2% и посмотрим, что произойдет (мы видим, что сервопривод переходит в "нулевое положение"):

tilt. ChangeDutyCycle (2)

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

  • 0 градусов ==> рабочий цикл 3%
  • 90 градусов ==> рабочий цикл 8%
  • 180 градусов ==> рабочий цикл 13%

После того, как вы закончите свои тесты, вы должны остановить ШИМ и очистить GPIO:

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

GPIO.cleanup ()

На приведенном выше экране печати терминала показан результат для обоих моих сервоприводов (с аналогичными результатами). Ваш ассортимент может быть разным.

Шаг 5: Создание скрипта Python

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

Команды PWM, которые должны быть отправлены на наш сервопривод, находятся в «рабочих циклах», как мы видели на последнем этапе. Но обычно мы должны использовать «угол» в градусах в качестве параметра для управления сервоприводом. Итак, мы должны преобразовать «угол», который является для нас более естественным измерением, в рабочий цикл, понятный нашему Пи.

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

рабочий цикл = угол / 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 = angle / 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 градусов по высоте. Аналогичную команду можно использовать для управления сервоприводом панорамирования (положение до 45 градусов по «азимуту»):

sudo python angleServoCtrl.py 27 45

Файл angleServoCtrl.py можно загрузить с моего GitHub.

Шаг 6: механизм панорамирования-наклона

Механизм панорамирования и наклона
Механизм панорамирования и наклона

Сервопривод «Панорама» будет перемещать нашу камеру «горизонтально» («азимутальный угол»), а сервопривод «Наклона» будет перемещать ее «вертикально» (угол возвышения).

На рисунке ниже показано, как работает механизм панорамирования / наклона:

Изображение
Изображение

В процессе разработки мы не будем впадать в «крайности» и будем использовать наш механизм панорамирования / наклона только от 30 до 150 градусов. Этого диапазона будет достаточно для использования с фотоаппаратом.

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

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

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

Одним из примеров может быть тот, который я построил, только привязав сервоприводы друг к другу и используя небольшие металлические детали от старых игрушек, как показано на фотографиях выше.

Шаг 8: Сборка электрического устройства панорамирования / наклона

Электрический блок панорамирования / наклона
Электрический блок панорамирования / наклона
Электрический блок панорамирования / наклона
Электрический блок панорамирования / наклона
Электрический блок панорамирования / наклона
Электрический блок панорамирования / наклона
Электрический блок панорамирования / наклона
Электрический блок панорамирования / наклона

После сборки механизма поворота / наклона следуйте фотографиям для полного электрического подключения.

  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)) # серый ==> PAN def setServoAngle (servo, angle): установить угол> = 30 и угол 90 (средняя точка) ==> 150 setServoAngle (tilt, int (sys.argv [2])) # 30 ==> 90 (средняя точка) ==> 150 GPIO.cleanup ()

При выполнении сценария вы должны ввести в качестве параметров угол панорамирования и угол наклона. Например:

sudo python3 servoCtrl.py 45120

Вышеупомянутая команда установит механизм панорамирования / наклона на 45 градусов по «азимуту» (углу панорамирования) и 120 градусов по «возвышению» (угол наклона). Обратите внимание, что если параметры не введены, по умолчанию будут установлены углы панорамирования и наклона до 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 (pan, GPIO. OUT)) # серый ==> PAN def setServoAngle (servo, angle): установить угол> = 30 и угол <= 150 pwm = GPIO. PWM (servo, 50) pwm.start (8) dutyCycle = angle / 18. + 3. pwm. ChangeDutyCycle (dutyCycle) sleep (0.3) pwm.stop () if _name_ == '_main_': for i in range (30, 160, 15): setServoAngle (pan, i) setServoAngle (tilt, i) for i in диапазон (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

Ниже представлен краткий обзор моего следующего урока:

Изображение
Изображение

Салудо с юга мира!

Увидимся в моем следующем инструктаже!

Спасибо, Марсело

Рекомендуемые: