Проект 1: Сервопривод
Сервопривод – это исполнительный механизм, который контролирует положение в диапазоне 0-180 градусов. Он состоит из корпуса, мотора, шестерни и датчика положения. Управление сервоприводом осуществляется с помощью широтно-импульсной модуляции (PWM). Для подключения к Arduino используются три провода: коричневый (GND), красный (питание) и оранжевый (сигнал). Сервопривод поворачивается на заданный угол в зависимости от ширины импульса PWM сигнала. Используя библиотеку Servo в Arduino, можно легко управлять сервоприводом, задавая углы через серийный монитор.

Сервопривод – это вращающийся исполнительный механизм с контролем положения. Он состоит из корпуса, печатной платы, безякорного мотора, шестерни и датчика положения. Приемник или микроконтроллер (MCU) передает сигнал на сервопривод. Мотор имеет встроенную эталонную схему, которая выдает эталонный сигнал с циклом 20 мс и шириной 1,5 мс. Мотор сравнивает полученное смещение постоянного тока с напряжением потенциометра и выдает разницу напряжений. Микросхема на плате определяет направление вращения и управляет мотором. Шестерня передает усилие на вал. Датчик определяет, достигнута ли заданная позиция, согласно обратному сигналу. Сервоприводы используются в системах управления, требующих удержания разных углов. Когда скорость мотора определена, шестерня заставляет потенциометр вращаться. Когда разница напряжений уменьшается до нуля, мотор останавливается. Обычно угол вращения находится в пределах 0-180 градусов.
Сервоприводы имеют множество спецификаций, но все они имеют три провода подключения, различающихся по цвету: коричневый, красный, оранжевый (у разных брендов цвета могут отличаться). Коричневый провод – GND, красный – питание, оранжевый – сигнальная линия.

Угол поворота сервопривода контролируется путем регулирования скважности PWM (широтно-импульсной модуляции) сигнала. Стандартный цикл PWM сигнала – 20 мс (50 Гц). Теоретически ширина распределяется между 1 мс и 2 мс, но на практике она находится в диапазоне от 0,5 мс до 2,5 мс. Ширина соответствует углу поворота от 0° до 180°. Однако у разных брендов моторов один и тот же сигнал может иметь разные углы поворота.

Теперь, освоив базовые знания, давайте научимся управлять сервоприводом. В этом эксперименте вам понадобятся только сервопривод и несколько соединительных проводов.
Подключение и пример программы
Есть два способа управления сервоприводом с помощью Arduino. Один из них – использовать обычный цифровой порт Arduino для создания прямоугольной волны с разной скважностью, имитируя PWM сигнал, и затем использовать этот сигнал для управления положением мотора. Другой способ – напрямую использовать функцию Servo библиотеки Arduino для управления мотором. Этот способ проще, но он может управлять только двухконтактным мотором, так как для функции сервопривода можно использовать только цифровые пины 9 и 10. Мощность Arduino ограничена, поэтому для управления более чем одним мотором потребуется внешнее питание.
Подключение
Коричневый провод (GND) подключите к GND на Arduino.
Красный провод (VCC) подключите к 5V на Arduino.
Оранжевый провод (сигнал) подключите к цифровому пину 9 на Arduino.
Схема подключения

Пример кода
int servopin = 9; // выбрать цифровой пин 9 для сигнальной линии сервопривода
int myangle; // инициализация переменной угла
int pulsewidth; // инициализация переменной ширины импульса
int val;
void servopulse(int servopin, int myangle) { // определение функции импульса сервомотора
pulsewidth = (myangle * 11) + 500; // преобразование угла в ширину импульса от 500 до 2480
digitalWrite(servopin, HIGH); // установить уровень пина сервопривода на "высокий"
delayMicroseconds(pulsewidth); // задержка на ширину импульса
digitalWrite(servopin, LOW); // установить уровень пина сервопривода на "низкий"
delay(20 - pulsewidth / 1000);
}
void setup() {
pinMode(servopin, OUTPUT); // установить пин сервопривода как "выход"
Serial.begin(9600); // подключиться к серийному порту, установить скорость передачи данных 9600 бод
Serial.println("servo=o_seral_simple ready");
}
void loop() {
val = Serial.read(); // чтение значения из серийного порта
if (val > '0' && val <= '9') {
val = val - '0'; // преобразование численного значения в числовую переменную
val = val * (180 / 9); // преобразование числа в угол
Serial.print("moving servo to ");
Serial.print(val, DEC);
Serial.println();
for (int i = 0; i <= 50; i++) { // дать сервоприводу время на поворот к заданной позиции
servopulse(servopin, val); // использование функции импульса
}
}
}
Результат
Когда вы вводите число в серийный монитор, мотор поворачивается на угол, соответствующий введенному числу, и значение угла отображается на экране, как показано на изображении ниже.