В этом эксперименте мы с помощью сначала Arduino, а затем и Raspberry Pi на-учимся поворачивать выходной вал серводвигателя на заданный угол.
Для платы Arduino существует библиотека управления серводвигателями, которая способна генерировать импульсы на любом из ее контактов, так что вам не придется задействовать специальный контакт, помеченный как ШИМ-выход. Управление сервоприводом производится через окно монитора последовательного интерфейса (минитора порта), откуда на плату посылается значение угла, на который нужно повернуть вал двигателя.
Генерация точных по длительности импульсов на Raspberry Pi осуществляется гораздо сложнее, чем на Arduino. Плата Arduino оснащена аппаратными таймерами, которые генерируют нужные импульсы, а Raspberry Pi приходится генерировать импульсы программным способом. При этом, поскольку Raspberry Pi имеет операционную систему, которая позволяет выполняться множеству процессов, конкурирующих за время процессора, длительность ШИМ-импульсов иногда получается большей, чем нужно, что может приводить к небольшому дрожанию выходного вала серводвигателя. Несмотря на то, что Raspberry Pi можно использовать как есть, в случаях, когда необходима большая точность, следует задействовать внешние устройства ШИМ (разд. «Проект: танцующая кукла Пепе на Raspberry Pi»).
Оборудование
Замечательной особенностью сервоприводов является то, что управляющая электроника их двигателей заключена внутри корпуса привода, так что нет никакой необходимости в специальных отдельных Н-мостах или транзисторных блоках управления двигателями. Все, что нужно, это подключить питание 5 или 6 В к контактам питания двигателя и подать слаботочные импульсы управления с цифрового выхода платы Arduino или Raspberry Pi.
На рисунке ниже показано подключение сервопривода к Raspberry Pi. При этом к сервоприводу уже присоединена одна из качалок (они поставляются вместе с сервоприводом в маленьком пакетике), так что теперь можно увидеть, в каком положении находится вал сервопривода.
Комплектующие
В этом эксперименте для работы с Arduino и Raspberry Pi понадобятся следующие комплектующие:
Серводвигатель 9g
Перемычки "папа-папа"
Перемычки мама-папа» (только для Рі)
- Схема для управления сервоприводом с Raspberry Pi в сборе
Небольшой серводвигатель 9В должен работать просто отлично, получая питание 5 В непосредственно от платы Рі или Arduino. Однако если вы соберетесь управлять более мощным серводвигателем, то вам потребуется внешний источник питания, например, отсек с батарейками на 6 В, который применялся в предыдущих экспериментах.
Подключение Arduino
Для подключения 3-контактного разъема серводвигателя к Arduino используются перемычки «папа-папа»
- Подключение серводвигателя к Arduino
Подключение СЕРВОДВИГАТЕЛЕЙ
На рисунке ниже крупным планом показан серводвигатель и его разъем. Как и во многих других случаях с серводвигателями, такой разъем является практически стандартом для всех производителей серводвигателей. Назначение проводов, подключаемых к серводвигателю, определяют по их цвету
Провода почти всегда следуют в таком порядке:
• коричневый (иногда черный) - заземление (GND);
• красный - положительное напряжение источника питания;
• оранжевый (иногда желтый) - управляющий сигнал (Control)
- Серводвигатель и его разъем
Программа для Arduino
Библиотека servo для Arduino входит в комплект Arduino IDE и берет на себя всю тяжелую работу по работе с серводвигателями.
Скетч Arduino для этого эксперимента:
Код: Выделить всё
#include <Servo.h>
const int servoPin = 9; // (1)
Servo servo; // (2)
void setup() {
servo.attach(servoPin); // (3)
servo.write(90);
Serial.begin(9600); // (4)
Serial.println("Enter angle in degrees");
}
void loop() { // (5)
if (Serial.available()) {
int angle = Serial.parseInt();
servo.write(angle); // (6)
}
}
ПРИМЕЧАНИЕ
Вы, разумеется, можете задействовать ШИМ и команду analogWritе, чтобы сгенерировать для управления серводвигателем импульс нужной длительности, однако такой подход повлечет за собой изменение частоты ШИМ и ограничит варианты контактов для управления серводвигателем только теми выходами платы Arduino, которые могут работать в режиме ШИМ. Это метод описан далее, в разд. «Программа для Raspberry Рі», но на Arduinо проще и лучше использовать библиотеку sегvo.
Уточним некоторые моменты скетча по пунктам, воспользовавшись разметкой строк, сделанной в комментариях:
1. После подключения библиотеки константа
servoPin определена как вывод, на который будет выдаваться сигнал управления серводвигателем.
2. Объявляется переменная
servo типа
Servo. Затем эта переменная используется всякий раз, когда положение серводвигателя необходимо изменить.
3. Устанавливается соответствие выходов, которые будут использоваться для генерации импульсов с использованием
servo.attach.
4. Задается угол поворота вала серводвигателя в 90° (среднее положение).
5. Запускается последовательный интерфейс, так что теперь можно задать угол поворота вала серводвигателя с помощью окна монитора порта.
6. В цикле основной программы ожидается приход значения угла поворота серво- двигателя, после чего оно с помощью
parseInt преобразуется в целое число.
7. Задается новый угол поворота с помощью
servo.write.
Загружаем и выполняем программу
Загрузите скетч в Arduino качалка на валу серводвигателя немедленно займет среднее положение (90°). Откройте окно монитора порта и попробуйте ввести несколько значений угла поворота между 0° и 180°. Серводвигатель будет перемещаться в новую позицию всякий раз, как только будет введено новое значение угла.
- Управление положением серводвигателя с использованием монитора порта
Подключение Raspberry Pi
Подключение контактов серводвигателя к GPIO-контактам Raspberry Pi осуществляется с помощью перемычек «мама-папа».
- Подключение серводвигателя к Raspberry Pi
Программа для Raspberry Pi
Программа на языке Python использует ШИМ-функции библиотеки
RPi. GPIO для генерации импульсов управления серводвигателем.
Генерация импульса корректной длительности в библиотеке осуществляется с использованием большого количества вычислений. Если у вас нет желания в этом подробно разбираться, но программа нужна для каких-либо ваших проектов, просто скопируйте ее код и вызывайте
set_angle, чтобы задать угол положения качалки серводвигателя.
Код: Выделить всё
import RPi.GPIO as GPIO
import time
servo_pin = 18
# Tweak these values to get full range of servo movement
deg_0_pulse = 0.5 # ms (1)
deg_180_pulse = 2.5 # ms
f = 50.0 #50Hz = 20ms between pulses (2)
# Do some calculations on the pulse width parameters
period = 1000 / f # 20ms (3)
k = 100 / period # duty 0..100 over 20ms (4)
deg_0_duty = deg_0_pulse * k # (5)
pulse_range = deg_180_pulse - deg_0_pulse
duty_range = pulse_range * k # (6)
# Initialize the GPIO pin
GPIO.setmode(GPIO.BCM)
GPIO.setup(servo_pin, GPIO.OUT) # (7)
pwm = GPIO.PWM(servo_pin, f)
pwm.start(0)
def set_angle(angle): # (8)
duty = deg_0_duty + (angle / 180.0) * duty_range
pwm.ChangeDutyCycle(duty)
try:
while True: # (9)
angle = input("Enter angle (0 to 180): ")
set_angle(angle)
finally:
print("Cleaning up")
GPIO.cleanup()
ПРИМЕЧАНИЕ
Каждому серводвигателю нужны немного разные длительности импульсов управления, чтобы обеспечить работу с максимальным диапазоном углов. Для установки импульсов управления на углах поворота 0° и 180° используются две константы:
deg_0_pulse и
deg_180_pulse соответственно. Чтобы получить максимальный диапазон движения, эти константы следует подстроить по месту.
Уточним некоторые моменты программы по пунктам, воспользовавшись разметкой строк, сделанной в комментариях:
1. Следующий фрагмент программы производит некоторые вычисления, связанные с длительностью импульса.
2. Подача импульса каждые 20 мс означает, что необходимо установить частоту ШИМ (f) равную 50 импульсам в секунду.
3. Период (20 мс) равен 1000, деленной на f. Если нужно использовать другую частоту импульсов, следует просто изменить значение. Остальные расчеты будут сделаны автоматически.
4. При изменении цикла ШИМ-сигнала необходимо устанавливать его значения в диапазоне от 0 до 100. Константа к изначально определена как 100 за период и может быть использована для масштабирования величины угла до рабочих значений.
5. Чтобы преобразовать величину длительности импульса, соответствующего нулевому углу, к рабочему диапазону от 0 до 100, длительность импульса умножают на
k.
6. Аналогичным образом, диапазон рабочих значений также вычисляется путем умножения периода следования импульсов
pulse_range на
k
7. Настраиваются выводы GPIO, и ШИМ начинает работать.
8. Функция set_angle преобразует величину угла в значение рабочего цикла, а затем вызывает ChangebutyCycle для задания новой длины импульса.
9. Главный цикл очень похож на версию аналогичной программы для Arduino: значение угла сначала запрашивается, а затем пересчитывается и выдается.
Загружаем и выполняем программу
Запустите программу следующей командой:
$ sudo python servo.py
Используйте окно монитора порта для управления серводвигателем так же, как это было в случае с Arduino, вводите углы и наблюдайте, как серводвигатель уверенно занимает заданную позицию:
Код: Выделить всё
$ sudo python servo.py
Enter angle (0 to 180) : 90
Enter angle (0 to 180) : 0
Enter angle (0 to 180) : 180
Enter angle (0 to 180) : 90
Enter angle (0 to 180) : 0
По большей части серводвигатель будет реагировать на команды плавно, но если проследить за ним внимательно некоторое время, то можно заметить небольшую дрожь, особенно если Raspberry Pi в это время выполняет множество каких-либо других задач. Этого следовало ожидать, т. к. чем длиннее импульс, генерируемый Raspberry Pi, тем чаще процессор будет отвлекаться на выполнение чего-нибудь еще.
Если дрожание серводвигателя окажется слишком велико, то альтернативой программной генерации импульса на Raspberry Pi может стать использование аппаратных модулей, таких как 16-канальная плата-драйвер PWM/Servo компании Adafruit (код товара 815). Этот модуль задействует только два сигнальных контакта Raspberry Pi для взаимодействия с ним и при использовании библиотеки Python также поставляемой Adafruit, позволяет управлять 16-ю серводвигателями.