Arduino / Обновляем скетч по воздуху

в 18:23, , рубрики: arduino, firmware, xbee, метки: , ,

Arduino / Обновляем скетч по воздуху
В процессе разработки кода для Arduino совместимых плат, очень часто возникает необходимость обновить прошивку в контроллере, очень часто сделать это проблематично, по той причине, что устройство уже собрано и дёргать туда-сюда шилдики и кучи проводов — утомляет и начинает раздражать. Моей первой Arduino стал комплект деталей (собери сам) Freeduino Through-Hole, комплект по приезду был сразу же спаян и опробован, но в этом аналоге Arduino Diecimila не хватало одной приятной детали… а именно автоматического переключателя источника питания, в моем слечае предлагалось перетыкивать перемычку на плате, что еще больше осложняло обновления скетча для моей мечты детства модели.
В этом посте я опишу как за 5 минут работы паяльником модифицировать XBee Shield для обновления скетча через беспроводной канал связи. Спровоцировать данные изменения можно также и на другие аналоги XBee Shield без особых сложностей.
Начну с того, что у меня было два XBee Shield, различие было в том, что один из шилдиков имел разъем mini-usb и FTDI USB-Serial чип для прямого подключения XBee модуля к ПК, так что заморачиватся со сторонними USB-Serial шнурами мне не пришлось. Как оказалось работать с модулями через этот шилдик очень удобно, RTS и DTR пины были разведены куда надо, прошивка обновлялась, конфиги заливались. Внимание! Если вы попытаетесь обновить прошивку, не подключив пины, RTS и DTR то модуль брикнется, но это поправимо. Нужно лишь в настройках соединения X-CTU указать режим API работы с модулем и выполнить обновление firmware еще раз.
И так приступим:
1. Модификация передающего модуля

Начнём с железа. Передающий шилдик в моем случае подвергся незначительным и в тоже время элегантным обратимым изменениям. Я использовал модули XBee не PRO версии и на моем шилдике остались не распаяны колодки под PRO модуль (он побольше процентов на 20), шаг между отверстиями этой колодки удачно совпадал с PLS разъёмом (это контакты типа «папа» втыкаймые в arduino), штырьки от которого уже давно пылились в коробке. Я откусил пару штырьков от основной «гребенки». Согласно datasheet'у для XBee и XBee PRO выводы RTS и DIO3, располагаются на 16 и 17 пинах соответственно, что в нашей ситуации очень удобно. Впаиваем наши контакты в 16 и 17 отверстие на шилдике, а так же попутно выдёргиваем джампер (перемычку) из старого ненужно винта или материнской платы и замыкаем свежевпаянные контакты. Это позволит в случае чего оперативно удалить перемычку без последствий. На этом железная модификация передающего модуля завершена.
Переходим к настройкам самого модуля. Если вы хотя бы раз использовали XBee модули в своих поделках то скорее всего уже знакомы с программой X-CTU и её возможностями. О настройке с её помощью дальше и пойдет речь.
Первое, что нам нужно сделать, это подключить наш XBee модуль к компьютеру и проверить соединение. Если вы делаете это впервые то параметры будут следующими (COM порт разумеется следует выбрать свой):
После установки параметров нажимаем "Test / Query" и через секунду в ответ должны получить сообщение с серийным номером и моделью модуля.
Если этого не произошло — значит где то ошибка. Как вариант попробуйте поперебирать скорость порта (Baud).
Переходим во вкладку Modem Configuration и нажимаем Read для получения текущих настроек и версии прошивки модуля.
Первое значение, что мы изменим PAN ID.
PAN ID состоит из 4 цифр в формате HEX и определят ID сети в которой будет работать данный модуль. PAN ID должен быть одинаковый как на приёмнике так и на передатчике. Так же рекомендуется не настраивать больше никаких модулей на этот ID во избежание конфликтов.
Следующим пунктом в настройках следует изменить скорость работы порта. Она должна соответствовать скорости необходимой для прошивки конкретной микросхемы ( так же есть альтернативные загрузчики повышающие скорость прошивки ). Для 168 чипа это 19200, а для 328p 57600. Примите во внимание, что для работы с модулем в дальнейшем в скетч нужно внести поправки ( например если раньше вы использовали стандартную скорость 9600 ), изменить скорость работы с портом.
Packetization Timeout — таймаут определяющий сколько ждать перед отправкой в эфир. Может потребоваться значение больше чем 10 — подбирается индивидуально исходя из размеров скетча, 10=10кб скетч.
Теперь устанавливаем пин D3 (Digital Input/Output) в положение 3-DI, что подразумевает что пин будет использоваться как цифровой вход.
Устанавливаем параметр Digital IO change detect в FF. Так же можно указать вместо FF, 0x08. Тогда мы конкретно укажем что изменения DI нужно слушать на D3 пине, но и так работает нормально.
Теперь трансмиттер (передатчик) настроен на пересылку текущего статуса D3 пина на любые модемы в зоне досягаемости. Запишем изменения в наш модуль нажатием кнопки Write на верхней панели.
А так же стоит упомянуть о предсказуемых граблях пользователей Windows ( в MacOS и Linux это предусмотрено по умолчанию).
Необходимо в настройках COM порта указать опцию Set RTS on close (в русской версии возможно другое название)
Убедимся что галочка установлена и применяем настройки.
2. Модификация принимающего модуля

Модификацию по традиции начнём с железа, а именно спаяем в кучу ( пока что лучше на весу для дальнейшей отладки схемы) конденсатор, транзистор и резистор по следующей схеме:
Reset signal from XBee — ведет напрямую к D3 пину. Reset to Arduino — напрямую к Reset пину на ардуине.
Должно получится нечто похожее на это
Повторю на всякий случай, не забудьте откорректировать скорость обмена в вашем проекте.
Теперь подключаем к компьютеру ресивер ( принимающий модуль ) и открываем уже знакомую X-CTU для установки следующих параметров
PAN ID — Должен соответствовать передающему модулю
Interface Data Rate — Аналогично должен совпадать с передатчиком
Packetization Timeout — тоже как я понял аналогично передатчику
Устанавливаем пин D3 нашего приёмника 5-DO HIGH ( Digital Out Default High)
I/O Output В Disabled. Для предотвращения попадания статусных сообщений в serial порт
И в заключении устанавливаем I/O input address в FFFF — для приема I/O сообщений от всех вещающих. Можно так же указать адрес передатчика.
Теперь запишем изменения в наш модуль нажатием кнопки Write.
Рекомендую один раз настроить и сохранить профили для обоих модулей на своем компьютере во избежании путаницы в дальнейшем. Сверху Profile -> Save.
Не забываем подключить все GND вместе и подключаем передающий модуль к компьютеру ( через переходник или шилдик ) и устанавливаем принимающий на целевую Arduino. Еще раз все проверяем, вдруг я ошибся или еще какая мелочь осталась где. Проверяем быстро все взглядом еще раз и можно пробовать! :)
Грабли которые были у меня: Скетч отказывался заливаться, хотя Arduino иногда перезагружалась, это ввело меня в ступор, но вскоре стало понятно что если быстро два раза нажать на Upload в IDE Arduino скетч успешно заливался хоть и не всегда ( виню Wifi и Blutooth коих вокруг очень много было ) По видимому копать стоит в сторону конденсатора (играться с объёмом ) Ну или на крайний случай править код IDE чтоб сама два раза RTS пин дёргала :)
Прошу прощение за сумбур, начинал писать сататью почти год назад, многое уже забыл, но все что хотел сказать сказал. Предложения и пожелания приветствуются. Неточности в статье или ошибки по традиции пишите в личку, надеюсь статья оказалась вам полезной.
Мою статью можно считать переводом этой
я лишь немного дополнил и приукрасил где мог.
Мой вопрос в Q&A тут и спасибо ответившему djmorgan


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js