Обратный инжиниринг асинхронного последовательного протокола для безрезервуарного водонагревателя EcoSmart

Я пытаюсь реконструировать протокол дистанционного управления для моего безрезервуарного водонагревателя EcoSmart .

К сожалению, устройство дистанционного управления больше не продается, а производитель не располагает информацией об используемом протоколе. Я хочу попробовать подключить нагреватель напрямую к Arduino, чтобы я мог контролировать/управлять им через Ethernet.

Обогреватель имеет 4-контактный разъем для дистанционного управления и подключается к MCU, как показано здесь:

схематический

смоделируйте эту схему - схема, созданная с помощью CircuitLab

Устройство отправляет данные в следующих случаях:

  • Изменение температуры поворотом ручки управления
  • Устройство включается/выключается нажатием ручки управления
  • Нагреватель включен/выключен (запуск/останов подачи воды)

Мой осциллограф имеет встроенное декодирование RS-232, и, похоже, он декодирует некоторые данные со скоростью 1200 бит/с, но я не уверен, что на самом деле имею здесь дело с данными RS-232/UART. Мой вопрос к вам: на какой тип данных это похоже для вас?

Вот часть вывода операции «ВКЛ» (т.е. нажмите кнопку, чтобы включить обогреватель): http://is.am/fx

Для меня это выглядит как слишком много переходов между высоким и низким уровнем для UART... Я склоняюсь к импульсу переменной длительности, чтобы указать 0/1. На приведенной выше временной диаграмме вы видите мою интерпретацию как RS-232, так и «Другого», что указывает на неизвестный протокол, который будет иметь цифровой «0» как высокий импульс 720 мкс и цифровую «1» как высокий импульс 24 мс. .

Я был бы признателен за любое понимание протокола, используемого здесь. Если вам нужны разъяснения, я сделаю все возможное.

Ссылка RS-232/UART: https://electronics.stackexchange.com/a/227414/16378

Обновление: после записи и расшифровки множества сигналов различных событий я разобрался с частью протокола.

  1. В начале каждой последовательности есть команда «Старт». Он состоит из логического низкого уровня в течение не менее 4 мс, затем высокого уровня в течение 7 мс, затем низкого уровня в течение 4 мс.

  2. После команды «Пуск» короткие импульсы (720 мкс) представляют логический ноль, а длинные импульсы (2,4 мс) представляют логическую единицу. Промежутки между импульсами составляют примерно 840 мкс.

  3. Все последовательности имеют длину 5 байт и передаются 6 раз.

  4. Первые 2 байта всегда одинаковы: 00:FF:0F:F0

  5. Третий байт является идентификатором команды/события:

    • Событие изменения настройки температуры (колесо повернуто): 00:70
    • Команда ВКЛ (кнопка нажата): 00:00
    • Команда ВЫКЛ (кнопка нажата): 00:70 (аналогично настройке температуры)
    • Событие начала потока: 02:70
    • Событие остановки потока: 00:70 (такое же, как настройка температуры и команда выключения)
  6. Четвертый байт — это температура в градусах Фаренгейта, от MSB до LSB (от 80 до 140).

  7. Пятый байт — это температура в градусах Цельсия, от MSB до LSB (от 26 до 60).

Итак, теперь мне нужно определить, могу ли я отправить те же самые последовательности в линию RX для изменения температуры и удаленного включения/выключения нагревателя. Интересно, используется ли другой адрес

ОБНОВЛЕНИЕ №2: Успех! Оказывается, посылая одни и те же последовательности на вывод RX, можно использовать для регулировки температуры и включения и выключения устройства! Было довольно легко изменить протокол с помощью Arduino Uno, и нагреватель реагирует на настройки температуры, напрямую изменяя выходную температуру (нет необходимости увеличивать/уменьшать по одному градусу за раз). Я планирую опубликовать полное руководство по интерфейсу вместе с исходным кодом для ввода и вывода по завершении.

Спасибо всем, кто предлагал предложения!

ОБНОВЛЕНИЕ № 3: создан репозиторий Github: https://github.com/ryangriggs/EcoSmartLib

ОБНОВЛЕНИЕ № 4: Дополнительную информацию см. в репозитории Фила на github: https://github.com/PhilRW/ecosmart-remote .

Вы уверены, что на MCU нет этикеток? По ссылке, которую вы предоставили, есть изображение платы управления, это то, что у вас есть?
@DmitryGrigoryev Да, это именно та плата управления. Однако основной MCU вообще не имеет травления. Я очистил его, использовал лупу и т. д., но на нем ничего не напечатано. Это 28-контактный корпус SOP28.
Было бы более узнаваемо, если бы ваш временной сигнал имел постоянную ось времени. Как бы то ни было, трудно почувствовать относительное время, просто взглянув на него.
Не подскажете, какого года этот аппарат? Может дата на другом чипе или на печатной плате? ЕСЛИ он больше не производится и устарел, это ограничивает доступные интерфейсы для проверки.
@Wojciech Я предполагаю, что это устройство было произведено примерно в 2014 году, и эта модель все еще активно производится / продается. К сожалению, я уже собрал его обратно и не хочу разбирать все, чтобы проверить код даты. :)
sbprojects.com/knowledge/ir/index.php — еще один хороший ресурс по инфракрасным протоколам.
@dwelch после просмотра этих протоколов я думаю, что этот больше всего похож на протокол JVC ... за исключением того, что здесь 5 байтов данных вместо типичных 2. Звучит ли это разумно? Я предполагаю, что нагреватель отправляет текущую заданную температуру, чтобы синхронизировать пульты дистанционного управления, которые также имели светодиодные дисплеи.
Как будет кодироваться температура в вашем предыдущем опыте? Как значение Цельсия? Я попытаюсь захватить больше сигналов при разных температурах, чтобы посмотреть, что изменится.
Райан, ты закончил это? Вы планировали опубликовать полное руководство по интерфейсу вместе с исходным кодом для ввода и вывода после завершения. Я хотел попробовать подключиться к своему безрезервуарному водонагревателю EcoSmart.
@Ben Я создал репозиторий GitHub для этого проекта. Я еще не написал функции «чтения», но функция записи должна быть полностью функциональной. github.com/ryangriggs/EcoSmartLib

Ответы (1)

Протокол данных, который вы показали в связанном документе, выглядит как форма волны модуляции, характерная для некоторых ИК-пультов дистанционного управления. Возможно, что проводная установка, которую вы описываете, может быть разработана таким образом, чтобы связь дистанционного управления также работала, если модуль ИК-приемника был подключен к удаленному разъему. (Общение было бы одним из способов, хотя).

В этом документе описываются несколько распространенных IR-протоколов .

Рискну предположить, что два больших значения времени (7 мс/4 мс) являются начальной синхронизацией передачи. После времени синхронизации данные выглядят закодированными в битовых ячейках шириной 1440 мкс, закодированных как манчестерская модуляция. Один уровень данных имеет 720 мкс высокого уровня в начале ячейки и 720 мкс низкого уровня во второй половине ячейки. Противоположный уровень данных представлен линией данных с низким уровнем для 720 мкс в начале ячейки и высоким уровнем во второй половине битовой ячейки.

Это определенно не асинхронный формат, используемый типичным протоколом UART.

ВАУ, это был быстрый ответ! Спасибо, Майкл, сейчас я изучаю кодировку модуляции Манчестера. Я очень ценю ваш вклад!
В манчестерском кодировании более длинный образец должен быть в два раза длиннее короткого. Здесь я вижу периоды 24 мс, 7 мс, 4 мс и 720 мкс, ни один из них не удовлетворяет этому условию. Где вы видели 1440us?
два раза по 720 мкс, показанные рядом с передней частью сигнала «данных».
это выглядит как ИК-сигнал, не имеет значения, с каким протоколом он соответствует, у вас есть по крайней мере несколько элементов управления, и у вас есть осциллограф или что-то еще, с чем вы уже зафиксировали это. Длинный/сортированный фронт выглядит как шаблон синхронизации, и после этого рассмотрите шорты того же размера, что и минимумы, как нули, а более длинные максимумы, как единицы.
в идеале вам нужны правильно подобранные светодиод и несущая частота, но вы можете пожертвовать расстоянием и использовать 40K или 38K. Что я бы сделал в первую очередь, так это наблюдая за этим интерфейсом, возьмите любой имеющийся у вас ИК-пульт дистанционного управления и направьте его на эту штуку, если он генерирует сигналы на этом интерфейсе, тогда все готово, он просто тупой и пропускает их, и " все, что вам нужно сделать», — это сгенерировать правильный ИК-сигнал.
если вы хотите подключиться напрямую, то это самый простой способ — просто сгенерируйте те сигналы, которые вы записали.
@dwelch Спасибо за понимание! Я также думал, что короткий паттерн H/L выглядит как «0», а длинный максимум/короткий минимум — как «1». (или, может быть, они перевернуты) Я перевел их и получил 00 FF 0F F0 00 00 18 01 02 10. Очевидно, все сообщения имеют длину 5 байт, если это правильная кодировка. Также похоже, что сообщения повторяются по крайней мере один раз.
Что касается захвата сигнала, я использовал свой осциллограф, но у меня нет хорошего способа сохранить весь сигнал и опубликовать его. Я попытался сохранить файл CSV, но он слишком велик (200+ МБ) при дампе всей памяти и слишком неточен при дампе только экрана. (Это прицел Rigol 1054z). Так что я просто пошел по «старой школе» и прокручивал осциллограммы по одному экрану за раз, записывая результаты на листе бумаги азбукой Морзе. Это также устраняет весь сигнальный шум, облегчая позднее воспроизведение фактических данных. :) Я определенно открыт для предложений по более легкому захвату!
осторожно подключите Arduino или другой вход к этому сигналу (при условии, что это 5 В или 3,3) и напишите небольшое количество программного обеспечения для поиска шаблона и декодирования битов, а затем распечатайте их на микроконтроллерах uart в шестнадцатеричном формате или что-то еще...
точно так же, как при декодировании ИК от модуля приемника...
тот, который вы указали выше, выглядит для меня как 0x0F3C006124, и этот последний импульс немного странный, так что, возможно, это стоп-импульс или что-то в этом роде, или повторение.
если вы не хотите полностью декодировать с помощью микроконтроллера, тогда найдите начальный импульс и измерьте время между изменениями состояния (используя таймер в микроконтроллере) и распечатайте эти временные дельты, когда вы нажмете время, которое больше, чем начальный импульс , затем вернитесь к ожиданию стартового импульса.
нет правила, согласно которому он должен соответствовать ИК-протоколу, если это произойдет, отлично, в любом случае, поскольку вы можете вызывать эти сигналы и иметь Arduino, тогда вы сможете использовать Arduino с помощью нескольких (дюжин) строк кода для подсчета длительности импульсов. а затем, в конце концов, расшифровать.