Сервомоторы HiWonder LX

Как правило, под сервомотором (серводвигателем, сервоприводом) в любительской среде понимается мотор, который может поворачиваться на заданный угол и удерживать его. В действительности, понятие сервомотора гораздо шире, но в данном уроке мы будем отталкиваться именно от такой популярной концепции.

В одном из уроков мы уже разбирались как управлять аналоговыми сервомоторами SG90 при помощи Arduino. Для работы с каждым таким мотором требуется занять один вывод микроконтроллера, на котором допускается генерировать ШИМ (аппаратный или программный). Например, к Arduino Uno с помощью стандартной библиотеки Servo можно подключить 12 сервомоторов, а к Mega 2560 — целых 48 штук.

Кроме управления с помощью ШИМ сигнала, существуют сервомоторы с шинным цифровым интерфейсом. С шинами мы уже неоднократно встречались в разных уроках: про I2C и QIIC, про RS-485. Такой вариант гораздо удобнее и эффективнее, ведь с помощью шины можно всего по одному-двум проводам контролировать десятки и сотни устройств!

В этом уроке мы будем работать с сервомоторами малоизвестной Китайской компанией HiWonder (она же Lobot в прошлом). Это одна из немногих компаний в Китае, которая делает высококачественные приводы для DIY.

Сервомоторы LX-1501, LX-16A, LX-246

Каждый мотор из линейки LX имеет два или три разъёма для подключения к последовательной шине. Всего по одной шине можно управлять 253 сервомоторами.

Из преимуществ LX:

  • шинный интерфейс;
  • высокая точность позиционирования;
  • высококачественный металлический редуктор;
  • возможность работы в режиме серво и в режиме мотора постоянного вращения;
  • возможность настройки диапазона допустимых углов и смещения центрального положения;
  • индикатор состояния (на некоторых моделях).

Для подключения к микроконтроллеру потребуется специальная плата BusLinker. На плате есть разъём для подключения к шине, разъём питания, разъём UART и разъём USB для подключения к компьютеру. Последнее позволяет управлять сервомоторами с персонального компьютера, например, с помощью программы на python (ссылка в конце урока).

HiWonder BusLinker

На плате BusLinker из важного есть только преобразователь USB-UART CH340C и микросхема буфера 74HC126D. При работе напрямую по интерфейсу UART используется только микросхема буфера. Такую плату легко изготовить самостоятельно, при желании.

Эти сервомоторы всегда можно приобрести у нас в интернет-магазине:

В корзину
В корзину
В корзину
В корзину

Программа

Итак, мы выяснили, что управлять моторами будем по последовательному UART интерфейсу. В Arduini IDE за это отвечает библиотека Serial, запомним это.

При написании тестовой программы используем библиотеку RobotClass_LX16. В программе заставим сервомотор с идентификатором №1 поворачиваться из стороны в сторону.

#include "RobotClass_LX16.h"

RobotClass_LX16 servo;
byte id = 1;

void setup() {
    servo.begin(&Serial);
    delay(1000);
}

void loop() {
    servo.move(id, 100, 500);
    delay(1000);
    servo.move(id, 500, 500);
    delay(1000);
    servo.move(id, 900, 500);
    delay(1000);
    servo.move(id, 500, 500);
    delay(1000);
}

Функция инициализация шины begin имеет всего один аргумент, в качестве которого мы передаём тот самый Serial. Важно поставить перед ним знак & (словами ООП — мы передаём указатель).

В переменной id хранится номер нужного нам мотора. Функция move имеет три аргумента:

  • первый — номер мотора;
  • второй — целевой угол;
  • третий — время за который нужно достигнуть целевого угла.

Загружаем программу на Arduino и наблюдаем за поведением сервомотора. В принципе, этой команды вполне достаточно, чтобы описать любое сложно поведение нашего робота. Однако, моторы LX позволяют делать с собой еще несколько интересных вещей.

Изменение номера мотора

Как уже стало понятно, для обращения к конкретному мотору на шине — этот мотор должен иметь уникальный номер. Все сервомоторы по-умолчанию имеют номер 1. Изменить его можно с помощью функции setID.

#include "RobotClass_LX16.h"

RobotClass_LX16 servo;

void setup() {
    servo.begin(&Serial);
    delay(1000);

    // old ID - 1
    // new ID - 2
    servo.setID(1, 2);
}

void loop() {
}

Загружаем программу на контроллер. Подключаем сервомотор, затем жмём кнопку сброса на контроллере. Светодиод TX на Arduino должен мигнуть один раз и погаснуть (на самом деле он мигнет много раз, но очень быстро, почти незаметно глазу). Готово, теперь мотор имеет номер 2. Этот номер сохранится, даже если мы отключим от мотора питание.

Функции библиотеки RobotClass_LX16

begin(HardwareSerial * port) — инициализация последовательного порта. Пример:

begin( &Serial );

move(uint8_t id, int16_t position, uint16_t time) — вращение сервомотора с номером id на угол position (от 0 до 1000) за время time. Пример:

mode( 1, 500, 500 );

stop(uint8_t id) — остановка мотора с номером id. Пример:

stop( 1 );

setID(uint8_t oldID, uint8_t newID) — смена номера у мотора с номером oldID на новый номер newID. Пример:

setID( 1, 2 );

setMode(uint8_t id, uint8_t Mode, int16_t Speed) — установка мотору с номером id режима Mode и скорости Speed (Mode=0 — режим серво, Mode=1 — режим мотора постоянного вращения, Speed — от -1000 до +1000). Пример:

setMode( 1, 1, -500 );

load(uint8_t id) — включить мотор с номером id.

unload(uint8_t id) — отключить мотор с номером id. Пример:

load( 1 );
unload( 2 );

int readPosition(uint8_t id) — считывание текущего угла у мотора с номером id.

int readVin(uint8_t id) — считывание текущего напряжения на моторе с номером id. Пример:

int pos = readPosition( 1 );
int voltage = readVin( 1 );

Программа Bus Servo Terminal

Как уже говорилось ранее, плата Bus Linker позволяет подключать сервомоторы LX к персональному компьютеру по USB. Операционная система видит эту плату как виртуальный COM-порт, такой же как и при подключении Arduino.

Для удобства, производитель моторов предоставляет небольшую программу для тестирования и настройки моторов — Bus Servo Terminal. Скачать её можно по ссылке внизу урока.

Программа имеет два основных экрана. Первый — для тестирования.

Выбираем нужный COM-порт в левом блоке. Скорость оставляем как есть. Жмём кнопку Open port.

В блоке ID модно выбрать номер мотора, которым будем управлять. В блоке Servo Test выбираем один из режимов: Serv — серво или Motor — мотор постоянного вращения. Затем двигаем ползунки и смотрим на поведение мотора.

В блоке Current Status отображаются показания встроенных в мотор датчиков: температура, текущее положение вала и напряжение.

Переходим на вкладку настроек.

Жмём кнопку Read и получаем все текущие настройки.

В блоке ID можно задать новый номер мотора. Блок Deviation отвечает за настройку центрального положения вала. В блоке Angle — допустимый диапазон углов поворота от 0 до 1000 (где 1000 соответствует 240 градусам).

В правой части формы находятся настройки индикатора, который может предупреждать пользователя о выходе мотора за критичные параметры. Такой индикатор есть не на всех моторах.

Over Heat — перегрев, Over Voltage — выход за диапазон допустимого напряжения, Locked Rotor — вал заблокирован. Настройки допустимых диапазонов температуры и напряжения находятся чуть ниже.

По окончании настроек жмём кнопку Apply.

Полезные ссылки

Библиотека RobotClass_LX16

Пример на языке Python

Программа Bus Servo Terminal


Изменено:

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

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.