Среда, 21 марта 2018 21:06

Поворотно-наклонная платформа на Raspberry Pi и Python

Оцените материал
(5 голосов)

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

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

Тестирование контура управления Сервоприводов:

giphy

Шаг 1: Список деталей проекта

Raspberry Pi V3 - US$ 32.00 / Raspberry Pi V3 - US$ 36.99

5 Megapixels 1080p Sensor OV5647 Mini Camera Video Module - US$ 13.00 / 5 Megapixels 1080p Sensor OV5647 Mini Camera Video Module - US$ 6.40

TowerPro SG90 9G 180 degrees Micro Servo (2 X)- US$ 4.00 / TowerPro SG90 9G 180 degrees Micro Servo (2 X)- US$ 2.45

Mini Pan/Tilt Camera Platform Anti-Vibration Camera Mount w/ 2 Servos (*) - US$ 8.00 / Mini Pan/Tilt Camera Platform Anti-Vibration Camera Mount w/ 2 Servos (*) - US$ 5.89

Резистор 1 кОм

Прочее: металлические детали, ленты и т. Д. (В случае, если вы создадите механизм Поворота / Наклона

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

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

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

PWMan

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

0 LPC1768 PWM

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

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

PWM

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

FUEWELTJD4UKPJK.LARGE

FNIA41PJDF24UHT.LARGE

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

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

Не забудьте подключить GNDs together ==> Raspberry Pi - Servos - External Power Supply)

У вас может быть вариант, резистор 1K Ом между Raspberry Pi GPIO и входным гнездом сервера. Это защитит ваш RPi в случае проблемы с сервомеханизмом.

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

FFXO5MOJD4UL101.LARGE

FAZEXCZJD4UKXUT.LARGE

FDYVQQIJD4UKXQL.LARGE

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

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

  • Диапазон: 180o
  • Электропитание: 4.8V (внешний 5VDC как блок питания USB работает отлично)
  • Рабочая частота: 50 Гц (период: 20 мс)
  • Ширина импульса: от 1 мс до 2 мс

Теоретически серво будет:

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

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

  • Начальная позиция ==> (0 градусов) Ширина импульса ==> 1ms ==> Рабочий цикл = 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 Shell

>>>

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

import RPi.GPIO as GPIO

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

GPIO.setmode(GPIO.BOARD)

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

tiltPin = 11

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

GPIO.setmode(GPIO.BCM) 
tiltPin = 17

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

GPIO.setup(tiltPin, GPIO.OUT)

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

tilt = GPIO.PWM(tiltPin, 50)

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

tilt = start(0)

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

tilt.ChangeDutyCycle(2)

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

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

После завершения тестов вы должны остановить ШИМ и очистить GPIO:

tilt= stop() GPIO.cleanup()

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

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

FXOEDGXJD4UL8SL.LARGE

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

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

dutycycle = angle/18 + 3

Сохраните эту формулу. Мы будем использовать его в следующем коде.

Давайте создадим скрипт Python для выполнения тестов. В основном, мы повторим то, что мы делали раньше в Python Shell:

from time import sleep
import RPi.GPIO as 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(servo, 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: Механизм наклона-поворота

FF8XOHCJD4UKY55.LARGE

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

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

614VTuvOsEL. SL1100

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

FOVEZFBJD4UKN3Q.LARGEF4PYRBJJD4UKN3P.LARGEFWK8PX5JD4UKN3O.LARGEFDXPCYCJD4UKN3M.LARGEF1PNJNQJD4UKN1X.LARGEFI29FXQJD4UKMYK.LARGEFSLE1JPJD4UKMXL.LARGEFDCRKUCJD4UKPUK.LARGEFKT2MPXJD4UKNBQ.LARGE

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

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

Шаг 8: Механизм наклона-поворота – Электрика

2018 03 21 22 27 34FDCRKUCJD4UKPUK.LARGEF6NV03XJD4UKPLI.LARGE2018 03 21 22 26 46

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

  1. Выключите свой Pi.
  2. Все электрические соединения.
  3. Двойная проверка.
  4. Сначала включите питание.
  5. Если все в порядке, включите сервоприводы.

Мы не будем изучать этот учебник, как настроить камеру, это будет объяснено в следующем уроке.

Шаг 9: Скрипт Python

Давайте создадим скрипт Python для одновременного управления обоими сервомоторами:

from time import sleep
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

pan = 27
tilt = 17

GPIO.setup(tilt, GPIO.OUT) # white => TILT
GPIO.setup(pan, GPIO.OUT) # gray ==> PAN

def setServoAngle(servo, angle):
	assert angle >=30 and angle <= 150
	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
	if len(sys.argv) == 1:
		setServoAngle(pan, 90)
		setServoAngle(tilt, 90)
	else:
		setServoAngle(pan, int(sys.argv[1])) # 30 ==> 90 (middle point) ==> 150
		setServoAngle(tilt, int(sys.argv[2])) # 30 ==> 90 (middle point) ==> 150
	GPIO.cleanup()

Когда скрипт выполняется, Вы должны ввести параметры, угол поворота и угол наклона. Например:

sudo python3 servoCtrl.py 45 120

Вышеуказанная команда будет позиционировать механизм поворота / наклона с 45 градусами по «азимуту» (угол поворота) и 120 градусов «высота» (угол наклона). Обратите внимание, что, если параметры не введены, по умолчанию будут установлены оба угла поворота и наклона до 90 градусов.

Ниже вы можете увидеть некоторые тесты:

giphy (1)

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

Шаг 10: Зацикленный тест приводов

Давайте теперь создадим скрипт Python для автоматической проверки всего спектра сервоприводов:

from time import sleep
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

pan = 27
tilt = 17

GPIO.setup(tilt, GPIO.OUT) # white => TILT
GPIO.setup(pan, GPIO.OUT) # gray ==> PAN

def setServoAngle(servo, angle):
	assert angle >=30 and angle <= 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 range (150, 30, -15):
        setServoAngle(pan, i)
        setServoAngle(tilt, i)
        
    setServoAngle(pan, 100)
    setServoAngle(tilt, 90)    
    GPIO.cleanup()

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

Ниже результата:

Я подключил осциллограф только для иллюстрации теории ШИМ, как объяснялось ранее.

giphy

Вышеприведенный код, servoTest.py можно загрузить с GitHub.

Шаг 11: Конструкция

Как всегда, я надеюсь, что этот проект поможет другим найти свой путь в захватывающий мир электроники!

Подробнее и окончательный код, пожалуйста, посетите депозитарий GitHub: RPi-Pan-Tilt-Servo-Control

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

giphy (3)

Источник

Author

Bender

Я поделюсь с тобой всеми знаниями, которые доступны мне.

Комментарии (0)

There are no comments posted here yet

Оставьте свой комментарий

  1. Posting comment as a guest. Sign up or login to your account.
Вложения (0 / 3)
Share Your Location

О нас

Основой деятельностью портала является показ и объяснение что представляет собой выражени "Робот", "Робототехника", "Законы робототехники", "Мехатроника", "Искусственный интеллект(ИИ)". 

 Если у Вас есть интересная информация по тематике сайта и Вы готовы ей поделиться, - обращайтесь на емайл через форму обратной связи. И мы опубликуем Вашу статью