воскресенье, 22 января 2017 г.

Умная серва HerkuleX DRS-0101


HerkuleX DRS-0101 покупал в www.dfrobot.com. Цена около $40. Производитель Dongbu Robot предоставляет отличную документацию. Она настолько хороша, что нет смысла погружаться в детали, там всё есть. Этот пост просто обзор, ссылки и шпаргалка по основным командам. Пригодится при освоении.
В чём прелесть Геркулесов:
  • Общение с Геркулесом осуществляется посредством обычного последовательного интерфейса. Т.е. 2 провода питания от 7 до 12 вольт и 2 провода RX и TX последовательного интерфейса (5В – TTL). По этим двум проводам одновременно можно управлять до 254 сервами. У каждой сервы есть вход и выход, подключаются они последовательно и их контроллеры сами между собой разбираются.
  • Два режима управления: углом поворота (от 0° до 320°) за заданное время (!) и постоянное вращение с заданной скоростью. В контроллере есть конфигурируемый ПИД-регулятор, можно управлять характеристиками движения. Обязательно буду углубляться в эту тему – это моё самое захватывающее открытие в последнее время!
  • Блокировка вала. Именно так я смогу бороться с потрескиванием сервы, стремящейся вернуться в исходное положение под нагрузкой. Кстати, вибрации, свойственные обычным дешёвым аналоговым сервам, при отсутствии блокировки вала незаметны. Но щелчки слышны. После блокировки (Break On) – пропадают.
  • Обратная связь: текущее положение, датчики перегрузки и температуры, самодиагностика и, наконец, управляемый многоцветный светодиод. Можно использовать для какой-нибудь дополнительной индикации. В случае ошибки, управление этим светодиодом перехватывает контроллер и моргает особым образом.
Пару лет назад купил специально для Робота Мити третьего поколения. Час настал.

Подключение

У продавца в Wiki подробное описание подключения к Arduino UNO и MEGA, ссылки на библиотеки и примеры скетчей.
Arduino-скетч ожил не сразу. Напрочь не работал приём данных от встроенного в серву контроллера. Оказалось, что предлагаемая библиотека Herkulex.h комплектуется старой версией библиотеки SoftwareSerial. Заменил на текущую, чуть подпилил и всё заработало.
Пока искал причину проблем и подозревал контроллер сервы или его прошивку, научился подключать Геркулеса к компьютеру через USB-to-TTL конвертер. Идея описана тут и тут. Заодно постиг протокол общения с сервой.
Собственно, ниже идёт шпаргалка с важными для меня командами и описание таинства получения контрольных сумм команд. Без правильных двух контрольных сумм контроллер сервы откажется выполнять принятую команду. Да и принимаемые от контроллера сигналы тоже надо проверять.
В принципе, при наличии библиотек так глубоко погружаться не следует, но раз  уж библиотеки глючили – пришлось. Я не жалею, протокол несложный, но зато теперь у меня есть понимание всей внутренней кухни управления Геркулесами.
Для прямого общения с контроллером сервы пришлось поискать удобное терминальное приложение, для передачи и приёма бинарных данных. Остановился на CuteCom (под Linux).

Получение контрольных сумм

Самая простая команда выглядит так:
FF FF 07 FE 07 FE 00
Зелёным цветом выделены две контрольные суммы: CheckSum1 и CheckSum2. Формулы приводятся в документации. Для расчёта контрольных сумм пришлось написать скрипт.
Вызов:
$ python3 hx.py “FF FF 07 FE 07 00 00”
Идея такая: скрипт проверяет контрольные суммы этой команды, пишет угадал ли я, и если нет – указывает правильные. В примере вызова я специально указал контрольные суммы “00 00”. Вот что скрипт выведет в ответ:
Header: GOOD
Length: GOOD
Checksum1: BAD
Checksum2: GOOD


Source packet: FF FF 07 FE 07 00 00
Packet with GOOD checksums: FF FF 07 FE 07 FE 00

Важные подробности

  1. Параметры последовательного порта для подключения к серве с заводскими настройками: Data Bit : 8, Stop Bit : 1, Parity : None, Flow Control : None, Baud Rate : 115200. Где-то прочитал, что софтовая библиотека последовательного порта, используемая Arduino UNO, может не успевать. Кажется, это неправда. Но у своих серв я зачем-то снизил скорость до 57600 бод.
  2. В примерах команд ниже встречаются идентификаторы серв (ID): FD, FE, 01, 02. Поясню: FD – идентификатор сервы с завода. FE – “широковещательное” имя: команды будет выполняться всеми подключенными сервами. 01 и 02 – идентификаторы, которые я присвоил сервам Робота Мити.
  3. Для управления движением серв используются команды I_JOG и S_JOG. Но чтобы вал начал вращение, предварительно надо отключить его блокировку, устанавливаемую при включении питания. См. раздел Torque Control в документации. Если кратко, есть три режима: Break On (по умолчанию), Torque On (установить для команд движения) и Torque Free (в этом режиме вал сам крутиться не будет, но его можно повернуть руками).

Примеры команд

Легенда: жирным чёрным шрифтом выделен идентификатор сервы, зелёным шрифтом выделены контрольные суммы.

Stat

FF FF 07 FE 07 FE 00
FF FF 07 01 07 00 FE
FF FF 07 02 07 02 FC

Reboot

FF FF 07 FD 09 F2 0C
FF FF 07 01 09 0E F0
FF FF 07 02 09 0C F2

Смена BAUD RATE

BAUD RATE=57600:
FF FF 0A FD 01 D0 2E 04 01 22
FF FF 0A 01 01 2C D2 04 01 22
FF FF 0A 02 01 2E D0 04 01 22
BAUD RATE=115200:
FF FF 0A FD 01 E2 1C 04 01 10

Смена ID

ID=1:
FF FF 0A FD 01 F0 0E 06 01 01
ID=2:
FF FF 0A FD 01 F2 0C 06 01 02
ID=3:
FF FF 0A FD 01 F2 0C 06 01 03
ID=4:
FF FF 0A FD 01 F4 0A 06 01 04

Поворот на 0° (I_JOG)

0.163°=0x200
LSB=0x00
MSB=0x02
0x08 – это position control и синий светодиод
FF FF 0C FD 05 3E C0 00 02 08 FD 3C
FF FF 0C 01 05 3E C0 00 02 08 01 3C
FF FF 0C 02 05 3E C0 00 02 08 02 3C

Поворот на +10° (I_JOG)

9.937°=0x21E
LSB=0x1E
MSB=0x02
0x08 – это position control и синий светодиод
FF FF 0C FD 05 20 DE 1E 02 08 FD 3C
FF FF 0C 01 05 20 DE 1E 02 08 01 3C
FF FF 0C 02 05 20 DE 1E 02 08 02 3C

Поворот на +90° (I_JOG)

90.085°=0x314
LSB=0x14
MSB=0x03
0x04 – это position control и зелёный светодиод
FF FF 0C FD 05 26 D8 14 03 04 FD 3C
FF FF 0C 01 05 26 D8 14 03 04 01 3C
FF FF 0C 02 05 26 D8 14 03 04 02 3C

Чтение Torque Control из RAM

1 байт по адресу 0x34 (52)
FF FF 09 FD 04 C4 3A 34 01
FF FF 09 01 04 38 C6 34 01
FF FF 09 02 04 3A C4 34 01
Ответ:
FF FF 0C FD 44 C0 3E 34 01 40 00 00
“40 00 00” в конце – это Break On (40), Status Error: No Error (00) и Status Detail: (00).

Запись Torque Control в RAM

Запись одного байта со значением 0x40 (Break On) по адресу 0x34:
FF FF 0A FD 03 80 7E 34 01 40
FF FF 0A 01 03 7C 82 34 01 40
FF FF 0A 02 03 7E 80 34 01 40
Запись одного байта со значением 0x60 (Torque On) по адресу 0x34:
FF FF 0A FD 03 A0 5E 34 01 60
FF FF 0A 01 03 5C A2 34 01 60
FF FF 0A 02 03 5E A0 34 01 60
Запись одного байта со значением 0x00 (Torque Free) по адресу 0x34:
FF FF 0A FD 03 C0 3E 34 01 00
FF FF 0A 01 03 3C C2 34 01 00
FF FF 0A 02 03 3E C0 34 01 00

Чтение абсолютной позиции из RAM

2 байта по адресу 0x3C (60)
FF FF 09 FD 04 CE 30 3C 02
Ответ для 9.937°:
FF FF 0D FD 44 D4 2A 3C 02 1F 02 00 42
Если перевернуть 1F 02, получится 0x21F. По таблице “ADC Position Coversion Chart” соответствует 10.263°.
Ответ для 90.085°:
FF FF 0D FD 44 D8 26 3C 02 13 03 00 42
Если перевернуть 13 03, получится 0x313. По таблице “ADC Position Coversion Chart” соответствует 89.760°.

Чтение калиброванной позиции из RAM

2 байта по адресу 0x3A (58)
FF FF 09 FD 04 C8 36 3A 02
Ответ для 9.937°:
FF FF 0D FD 44 B2 4C 3A 02 1F 62 00 42
Если перевернуть 1F 62, получится 0x621F. В двух байтах калиброванной позиции значащими являются младшие 10 бит. Для получения правильного значения:
0x621F & 0x3FF = 0x21F. По таблице “ADC Position Coversion Chart” соответствует 10.263°.
Ответ для 90.085°:
FF FF 0D FD 44 BE 40 3A 02 13 63 00 42
Если перевернуть 13 63, получится 0x6313. В двух байтах калиброванной позиции значащими являются младшие 10 бит. Для получения правильного значения:
0x6313 & 0x3FF = 0x313. По таблице “ADC Position Coversion Chart” соответствует 89.760°.

Чтение Calibration Difference из RAM

1 байт по адресу 0x2F (47)
FF FF 09 FD 04 DE 20 2F 01
Ответ:
FF FF 0C FD 44 D8 26 2F 01 00 00 42

Светодиод

Зелёный:
FF FF 0A FD 03 C0 3E 35 01 01
FF FF 0A FE 03 C2 3C 35 01 01
FF FF 0A 01 03 3C C2 35 01 01
FF FF 0A 02 03 3E C0 35 01 01
Выключить:
FF FF 0A FD 03 C0 3E 35 01 00
FF FF 0A FE 03 C2 3C 35 01 00
FF FF 0A 01 03 3C C2 35 01 00
FF FF 0A 02 03 3E C0 35 01 00

Ключевые положения вертикального серводвигателя головы

Вдаль ≈90° (I_JOG)

90.085°=0x0314
LSB=0x14
MSB=0x03
0x04 – это position control и зелёный светодиод
FF FF 0C 02 05 26 D8 14 03 04 02 3C

Максимально вниз ≈115° (I_JOG)

114.847°=0x0360
LSB=0x60
MSB=0x03
0x04 – это position control и зелёный светодиод
FF FF 0C 02 05 52 AC 60 03 04 02 3C

Строго вверх ≈0° (I_JOG)

0.163°=0x0200
LSB=0x00
MSB=0x02
0x04 – это position control и зелёный светодиод
FF FF 0C 02 05 32 CC 00 02 04 02 3C

Максимально запрокинуть назад ≈–110° (I_JOG)

-109.960°=0x00AE
LSB=0x00
MSB=0xAE
0x04 – это position control и зелёный светодиод
FF FF 0C 02 05 9E 60 AE 00 04 02 3C

Ключевые положения горизонтального серводвигателя головы

Строго прямо ≈0° (I_JOG)

0.163°=0x0200
LSB=0x00
MSB=0x02
0x04 – это position control и зелёный светодиод
FF FF 0C 01 05 32 CC 00 02 04 01 3C

Поворот влево: +90° (I_JOG)

90.085°=0x314
LSB=0x14
MSB=0x03
0x04 – это position control и зелёный светодиод
FF FF 0C 01 05 26 D8 14 03 04 01 3C

Поворот вправо: –90° (I_JOG)

-90.085°=0x00EB
LSB=0xEB
MSB=0x00
0x04 – это position control и зелёный светодиод
FF FF 0C 01 05 DA 24 EB 00 04 01 3C

Максимальный поворот влево: +150° (I_JOG)

+150.034°=0x03CC
LSB=0xCC
MSB=0x03
0x04 – это position control и зелёный светодиод
FF FF 0C 01 05 FE 00 CC 03 04 01 3C

Максимальный поворот вправо: –150° (I_JOG)

-150.034°=0x0033
LSB=0x33
MSB=0x00
0x04 – это position control и зелёный светодиод
FF FF 0C 01 05 02 FC 33 00 04 01 3C