Arduino. Управление сервоприводом без библиотеки Servo.h

Для данной статье я рассматриваю схему из статьи Arduino. Управление сервоприводом, на примере SG90. И будет использоваться скетч похожий на скетч и статьи Arduino. Взаимодействие с компьютером через USB порт, по этому некоторые моменты которые я объяснял там, я буду опускать.

Мы используем:

  1. Плата Arduino. x1
    arduino uno
  2. Компьютер(для написания и загрузке кода, а так же мы будем брать с него электричество и общаться с ним). x1
  3. Провод для соединения компьютера и платы. x1
    USBwire
  4. Сервопривод.x1
    Servo
  5. Провода. x3-4
    wire
  6. Есть схемы с внешним источником питания, но можно взять питание и с платы.

Схема подключения:

 

ArduinoServo1_bbArduinoServo1_схемаArduinoServo1_foto

ArduinoServo2_bb ArduinoServo2_схема

Для чего может понадобится подключение сервопривода без библиотеки Servo.h. Дело в том, что данная библиотека была написана для большинства сервоприводов и её назначение подходить к большинству. Но подключить конкретный сервопривод бывает не просто. К тому же сервопривод может не точно работать с данной библиотекой. Приведу конкретные цифры.

Бибилиотека Servo.h расчитана на следующие параметры:

длина импульса угол
544 0$$^o$$
2400 180$$^o$$
1520 90$$^o$$

Я потестировал несколько  сервопривод SG90 вот результат:

0$$^o$$ 540 540 540
180$$^o$$ 2400 2700 2400
90$$^o$$ 1400 1520 1400

Видно, что цифры немного различаются. Даже среди одной и той же модели.

Рассмотрим скетч.

Что он делает данный код? мы вводим длину сигнала и сервопривод выставляется в позицию соответствующую его настройкам. Данный скетч иллюстрирует работу серво привода и Arduino. А так же может пригодится для решения «необъяснимых» проблем с библиотекой.

Данный скетч написан со скетча Arduino. Взаимодействие с компьютером через USB порт. поэтому упор будем делать на моментах связанных с управлением сервоприводом.

Сначало объявляем переменные:

В переменной pos мы будем хранить позицию в которую надо поставить сервопривод.

В incomingByte будет содержаться  входящие коды символов.

В servo мы будем хранить номер ножки, к которой подключен сервопривод. В нашем случае сервопривод подключён к 9 ножке.

Дальше блок setup:

Здесь мы выставляем скорость общения Arduino с компьютером:

И устанавливаем ножку с серовприводом в состоянии выхода.

Дальше идёт основной цикл программы:

 

Устанавливаем значение сигнала на ножке в состояние LOW

Если есть входящие символы, тогда выполняем код дальше:

Если символ цифра добавляем его в переменную pos. Иначе:

выводим значение позиции на компьютер.

В моём случае это можно прочитать, как много раз выполнить следующий код:

Дальше мы формируем сигнал:

 

Включаем напряжение на ножке.

Ждём заданное количество микроссекунд.

выключаем напряжение на ножке.

ждём ещё 20000-pos микросекунд.

Это у нас получился сигнал с «частотой» 50 герц говорить о частоте одиночного сигнала, как то не коректно но мы могли бы после этого закончить код и тогда бы было именно так.

Эта строчка родилась после того, как я увидел, что сервопривод двигается не 20 милесикунд(время сигнала), а !какое то! время, поэтому я не стал сильно часто давать на него сигнал, и сделал задержку в одну миллисекунду.

Видео процесса:

Другие статьи по программированию плат Arduino можно посмотреть здесь.

Комментарии:

Комментарии 4

  • Здравствуйте! поясните, пожалуйста, откуда берется for (int i=1;i<=180;i++){ ?
    Если сервопривод управляется одиночным импульсом заданной длины, то зачем повторять этот импульс 180 раз? И почему именно 180, откуда эта цифра?

    • Здравствуйте.
      Боже, это кто то читает 🙂

      Это долгая грустная история.
      > сервопривод управляется одиночным импульсом заданной длины
      Да всё так и есть.. но я потестировал несколько своих сервоприводов и у меня не один не успевал прокрутиться на 180 градусов с одного импульса.
      Не знаю с чем это связано… но угол был всегда разный….
      поэтому я решил посылать 10 раз импульс подряд, и результат был уже лучше но всё равно иногда глучил..
      Ну и я не сильно заморачиваясь начал фигачить 180 раз. Этот импульс… и всё стало со 100% гарантией вставать на нужный угол.
      Ну и этот скетч задумывался как записка мне, что бы не забыть как он работает. В жизни я бы наверно заюзал библиотеку… Или давал бы не один и тот же импульс, а двигал бы по 1 градусу с задержкой, что бы он был не таким резким.

      • Читают-читают) спасибо! Подружил этой логикой IRremote.h и Servo.h убрав нафиг из кода использование библиотеку Servo.h =) Ну никак они не хотели дружить, сколько бы не менял разных вариаций библиотек, таймингов и тому подобное.

  • Здравствуйте!
    Sg90 гудят в любом положении. Моторчик не доворачивает доли градуса.
    Что бы Вы могли посоветовать?
    Помог бы вариант, если бы после выполнения команды поворота на серву дополнительно посылать значение с чуть меньшей шириной импульса относительно этого поворота, дабы уравнять значения скважности?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *