Проект 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); // использование функции импульса
        }
    }
}

Результат

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