РадиоКот >Статьи >
Программирование ESC регулятора
Сразу хочу промяукать, что в этой работе изначально не было задачи что-то "украсть" или нарушить интеллектуальную собственность.
Все делалось только с целью разобраться как работает, изучить и повторить.
Это материал может оказаться полезным для тех, кто только начинает изучать окружающий цифровой мир и желает быть "делателем", а не только покупателем готовых коробочек.
Итак, начну.
Во времена моей кошачьей молодости (пионерское детство) каждый проводок, сигнал в самодельной схеме был известен, изучен и (я надеюсь) понят, как это работает.
Ну, или почему не работает.
Сейчас, казалось-бы, в интернете можно найти что угодно, а-н нет, очень часто "самоделкины" нарываются на отсутствие описания, протокола, схемы...
что ведет к невозможности решения технической задачи и необходимость превращаться в "покупалкина" готового устройства, даже простого.
Вот и я столкнулся с проблемой - знакомый задумал сделать устройство, электро-механическое.
Для простоты понимания (суть моего повествования не в устройстве) - похоже на автоматическое горизонтальное закрывание-открывание штор.
Электромотор медленно крутит в одну сторону (по команде),останавливается, затем медленно крутит в обратную сторону (по команде).
Скорость движения может меняться. Управляться это устройство должно по радио, работать на аккумуляторах.
Просто идеально для этого подходят детали от радиоуправляемых моделей - пульт готовый, приемник готовый, мощные двигатели от машинок есть....
Движения "стика" газа полностью подходят для управления, а возможности программирования пульта 9XR добавляют массу полезных плюшек.
Остается собрать все "кубики" в кучу.
Но, оказалось, что знакомый купил регулятор бесколлекторного двигателя HobbyKing X-CAR SENSORED 45A ESC без карты программирования.
Для тех, кто не в "теме" - карта программирования (на фото коробочка справа внизу), это устройство , которое позволяет изменять настройки параметров самого регулятора.
Этих параметров десять и не всегда дефолтные значения устраивают. Их перепрограммируют картой, и больше никогда не меняют (про "фанатов" все перестраивать 100 раз в день промолчу)
По сути эта карта- одноразовое устройство, которое больше не потребуется, после настройки.
Знакомый купил ESC регулятор без карты, хотя она как-бы должна (?) быть в комплекте.
Стали разбираться, искать альтернативы этой карты. Выяснилось, что этих карт программирования великое множество - у каждого производителя свой вариант.
Ещё и новое поколение у одного производителя уже будет не совместимо со старыми моделями. Найти эту карту отдельно оказалось трудно (провинция мы).Покупать через интернет одноразовую вещь - совсем печально.
Я кошачьим чутьем чувствовал, что не может быть там ничего сложного. Три провода - плюс, минус и сигнал - вот и весь интерфейс регулятора.
Скорее всего применен однопроводной протокол. Параметров в регуляторе, которые можно изменять, кот наплакал - всего десять.
Сканирование интернета и форумов не давало ничего - ни байта алгоритма протокола. Только ссылки на покупку.
Мне надо было изменить только один параметр - мотор едет "вперед" на 100% мощности , назад только 60% (так по умолчанию), а нужно 100% в обе стороны.
И вот, один хороший человек на модельном форуме отозвался и отправил мне эту карту программирования!
У него она давно валялась без дела. Я оказался прав про "одноразовость" сего устройства.
Ура, задача программирования может быть решена штатным способом, но радиолюбительское "а как же это устроено?" не давало покоя.
Я решил провести реверсинжениринг - это по кошачьему, а по русски - разобраться с протоколом программирования и постараться повторить его подручными средствами.
Вскрытие настоящей карты показало, что там стоит ATMega8, кнопки и индикаторы - ничего сверхестесственного.
Читать прошивку я даже и не пытался, так как она будет закрыта от считывания (всеми "любимыми" фьюзами).
Главное - карта работала и программировала этот ESC 45A.
Вооружившись логическим анализатором, я снял лог обмена карты и регулятора.
Алгоритм установления связи оказался весьма простым:
после подачи питания, через паузу 1,8с карта посылает стартовую последовательность, на которую ESC отвечает (через паузу 0.1 с) текущей конфигурацией своих параметров.
Изучая эти сигналы, удивляло большое число импульсов в ответе - "наверное, кодирование и контрольные суммы - подумал Штирлиц"
Для начала я выделил самый короткий импульс во всем пакете:
он оказался равен 0,8354ms. Причем, такой длительности были как "единичные", так и "нулевые" импульсы.
Предположил, что когда сигнал 0 - передается бит "ноль", когда 1 - передается бит "один". Оцените, какая у меня невероятно оригинальная логика! :)
Более внимательное изучение лога показало, что бывают импульсы двойной, тройной и более ширины, но, всегда кратно 0,8354ms.
Начало пакета всегда ноль.
Вот я и решил, что тактовый интервал равен 0,8354ms, и надо считывать значение бита через такой промежуток, пока не будет принят весь пакет из 118 бит.
Никаких синхронизирующих импульсов нет, поэтому сделать так:
от первого перепада на линии из 1 в 0 сделать паузу на половину ширины импульса, считать значение, и далее - через паузу ширины импульса чиать остальное
таким образом, считывание бита происходит в середине достаточно широкого импульса, и неизбежное плавание частоты не будет сказываться.
Получилось!
Пакет в памяти, но, где там скрыты параметры?
Чтобы их найти, поступил следующим образом:
Изменяя один параметр в карте и отправляя его в ESC я собрал лог обмена для разных значений, свел это в таблицу, проанализировал... и вот что получил в итоге:
Цифра означает номер параметра (десятый это 0) число цифр - число разрядов, и положение в пакете. Неизменяемые биты так и остаются 0 или 1 всегда.
Пакет данных состоит из 118 бит. Первым всегда передается бит 0, на каждый параметр зарезервировано 10 бит, в конце пакета некая последовательность бит, которая никогда не меняется.
Внутри десяти бит параметра значащие биты идут в начале, младший вперед. Остальные биты не меняются.
Стартовая последовательность является константой, посылается картой через паузу в 1,8 с после включения
000001011111000001011111001000000
передается слева на право.
Мой внутренний "Штирлиц" был приятно удивлен таким простым протоколом, и ,в тоже время, озадачен - зачем резервировать 10(!) бит для параметра,
если у него всего два, максимум четыре бита на значение?
Все можно было уместить в пять байт, а тут 118 бит...
Ну, да ладно - китайским программистам виднее. Возможно, это некий универсальный протокол и в других регуляторах он необходим, а тут как артефакт.
Мне надо только его повторить и эмулировать.
Далее, параметры надо разобрать по байтам и вывести пользователю - для этого используется COM порт, скорость 19200 и терминальная программа типа Putty.
Измененные параметры надо записать обратно в ESC.
Снова вооружаемся логическим анализатором - после передачи пакета ESC банально ждет на приеме, причем ждет бесконечно, до выключения питания.
Жму на карте кнопку "запись" и получаю 151 бит на запись !
Это просто "праздник какой-то"! Для записи каждый параметр теперь содержит уже 12 бит. Зачем? Неиспользуемые биты никогда не меняются!
Странная избыточность информации.
Одна заковырка все-таки всплыла.
Ни как не получалось понять последовательность бит для первого параметра
Долго не понимал логики, стал вспоминать код Грэя, другие подвохи....
Из регулятора параметр 1 читается значением 1,2,3,4,5,6 (в двоичном виде естественно), а писать его надо как 2*(n+2) ещё и вычитать 1 для 16, чтобы получить 1111 в пакете.
В итоге, просто "в лоб" вывел зависимость перекодирования 1,2,3,4,5,6 в то, что надо посылать в ESC.
Остальные параметры передаются без "выкрутасов" простым двоичным кодом, младший вперед.
Ну, и на закуску, сделал установку всех параметров "по умолчанию" Reset, чтобы одной кнопкой вернуть все назад.
Терминалка в среде IDE ARDUINO мне не нравится - в строке ввода набрать символ и жать кнопку отправить, мне это неудобно.
Сплошной листинг putty как-то приятнее.
Да, я кажется ещё не сказал, что делается это все на ARDUIO pro mini. Можно nano использовать - там уже и COM порт с USB будет сразу.
После "расшифровки" протокола, относительно много времени заняла работа над пользовательским интерфейсом - как сделать удобно и красиво ввод и изменение параметров.
Выводится меню и пользователь номером из меню выбирает параметр, затем его значение и выходим снова в главное меню.
Сброс в дефолные значения R.
Запись в ESC происходит только по команде записи W, поэтому перебирать параметры в меню можно сколько угодно.
Мне такой интерфейс нравится :)
Совместимость с другими регуляторами не проверял, в виду отсутствия таковых.
Код для Ардуино.
В связи с относительной простотой программы, она написана линейно "в лоб" - без процедур, без оптимизации кода и т.п.
Даже в таком виде используется чуть больше половины ОЗУ на переменные, а Flash вообще "копейки".
Одну константу пришлось подбирать экспериментально - #define tImp 820 длительность тактового импульса.
Её значение надо немного уменьшить (т.е. уменьшить задержку) так как код ардуино сам вносит задержку в выполняемые команды (за это его ругают постоянно)
И вместо предполагаемых 835ms поставил 820 - остальное "дотянул" сам код. "На ноге" получились необходимые 835ms.
Название параметров в регуляторе и их значения взял с наклейки на карте.
Схему не рисую - на 10 ногу платы ардуино подать сигнал от регулятора (значек импульса на этикетке регулятора). Не забыть соединить землю.
Сам регулятор питать от штатного аккумулятора, включать переключателем.
Питание на ардуинку "по вкусу" - или от USB или от регулятора, НО ! регулятор дает 6V поэтому дуньку питать только через её вход RAW - на плате Ардуино стабилизатор.
Разумеется, не соединять + от USB и + от регулятора одновременно.
COM порт RX TX подключать через TTL-USB переходник , или взять ардуинку с USB на борту, например Nano.
Готово!
Имеем программу в коде Arduino, позволяющую настраивать регулятор HobbyKing ESC45A через COM порт.
Последовательность действий:
Все выключено и обесточено.
Соединяем землю Ардуино и регуляора.
Подключаем Ардуино 10 нога к входу регулятора.
Подключаем Ардуино RX TX к USB-COM TTL переходнику, питание +5 на Ардуино берем от него, подключаем его в компьютер.
На определившийся в системе COM порт запускаем программу putty скорость 19200.
Жмем Reset на Ардуино - в программе putty увидим сообщение "Power ON HobbyKing X-CAR ESC", ардуино ждет включение регулятора.
Подключаем аккумулятор к ESC и включаем его питание (двигатель при этом можно не отключать, он не мешает).
Регулятор не будет пищать обмотками как при нормальном включении, так как наша программа переведет его в режим настройки.
На Ардуинке загорится и потухнет синий LED - индикатор обмена с ESC.
Через пару секунд в терминал будет выведено текущее состояние настроек регулятора, примерно так:
нажав кнопку oт 1 до 0, попадаем в следующий уровень меню - изменение параметра.
Нажатие Enter или любой недопустимой кнопки выводит меню заново.
Напрмер, выбираем 1. Нажимать Enter не нужно. Если ваша терминальная программа посылает CRCF автоматом - это надо отключить.(в терминалке IDE Ардуино, например)
символ ==> показывает текущее значение параметра. Признак [def] подсказывает значение, которое было по умолчанию.
Выбрав число 1...6 мы изменим параметр на это значение и вернемся в предыдущее меню.
Если просто нажать Enter или любой другой символ - вернемся в верхнее меню без изменений.
Кнопка R установит все параметры в [def] значения.
Кнопка W запишет текущие настройки в регулятор. На плате Ардуино мигнет синий LED.
Выключаем регулятор.
Выключаем Ардуино.
Подключаем регулятор к штатному PWM порту радиоуправления.
Все!
Теперь ESC включится уже с новыми значениями настройки, а у нас останется платка Ардуино, которую можно будет перепрограммировать во что-нибудь ещё.
Файлы:
Архив ZIP
Все вопросы в
Форум.
Как вам эта статья?
|
Заработало ли это устройство у вас?
|
|
|