Лабораторные работы на Raspberry PI
8. Сервопривод
Задание 1. Подключение сервоприводаРезультат работы: Исправление ошибки в коде и измерение расстояния до предмета.
- коричневый - "земля"
- красный - "+5В"
- желтый - сигнальный
К GPIO 17 подключается управляющий провод сервопривода наклона, к GPIO 27 сервопривод поворота. Дополнительно для защиты выводов Raspberry Pi можно использовать резистор 1кОм.
NB! Если Вы также будете использовать
отдельные источники питания для Raspbery Pi и сервоприводов, обязательно
соедините их земли, в противном случае электроника может выйти из
строя. В данном случае земля от внешнего источника питания для
сервоприводов подключена к выводу земли (возле GPIO 17) на Raspberry Pi.
Откалибруем сервоприводы. Для этого откроем терминал на Raspberry и запустим редактор Python 3 с правами от суперпользователя (нужно для работы с GPIO):
sudo python3Python Shell:
>>>Импортируем модуль RPI.GPIO и называем его GPIO:
import RPi.GPIO as 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)Настраиваем частоту, для SG90 нужно 50 Гц:
tilt = GPIO.PWM(tiltPin, 50)Включаем генерацию сигнала ШИМ на выводе и задаём начальный коэффициент заполнения равный нулю:
tilt = start(0)Теперь мы можем устанавливать различные значения коэффициента заполнения и наблюдать за движением сервопривода. Давайте начнем с 5% и посмотрим, что происходит:
tilt.ChangeDutyCycle(5)Сервопривод перешел в "нулевое положение". Сервопривод продолжал вращаться, при задании заполнения вплоть до 3%. При задании заполнения 2% сервопривод оставался в том же положении. После чего начав задавать значения больше 2%, движение сервопривода в моём случае начало происходить при установке коэффициента заполнения более 3%. Итак, 3% - это минимальное заполнение (позиция "0 градусов") для этого сервопривода.
То же самое произошло и с максимальным коэффициентом заполнения. Для начала установлено 10%:
tilt.ChangeDutyCycle(10)Затем задавались большие значения, сервопривод продолжал проворачиваться при установке коэффициента заполнения вплоть до 13%. Таким образом максимальный коэффициент заполнения для данного сервопривода это 13%, угол, на который проворачивается вал сервопривода составил примерно 180 градусов (но это в данном случае, в зависимости от сервопривода физический угол может оказаться и больше и меньше). Итак, в результате калибровки получены следующие данные:
0 градусов ==> заполнение 3%90 градусов ==> заполнение 8%
180 градусов ==> заполнение 13%
После окончания калибровки останавливаем ШИМ и очищаем GPIO:
tilt=stop()GPIO.cleanup()
Для второго сервопривода процедура калибровки аналогична.
Создадим файл "angleServoCtrl.py" скрипта на Python для выполнения тестов:
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(servo, angle) получает в качестве аргументов номер вывода GPIO, к которому подключен сервопривод и значение угла, в который сервопривод должен провернуться.
В консоли этот скрипт запускается так:
sudo python3 angleServoCtrl.py 17 45Вышеприведенная команда установит сервопривод, подключенный к GPIO 17, под углом 45 градусов.
Истоник: ссылка