Беспроводная заливка скетча
- Войдите на сайт для отправки комментариев
Пнд, 20/01/2020 - 18:02
Подскажите пожалуйста, если я возьму, к примеру два модуля JDY-40 один подключу к преобразователю USB UART TTL, а второй к ардуино, смогу ли я залить скетч "по воздуху". Ведь теоретически все ок - просто заменяем провода на приемопередатчик и все. Но вдруг есть подводные камни?
Это означает, что дуда (avrdude из Arduino IDE) пытается достучаться до клиента, а в ответ тишина. С помощью проводов и конвертера грузим в ардуину тестовый скетч, имитирующий запрос/ответ, например:
спасибо, попробую применить, у мня в даче много JDY в разных местах торчат и снимать их оттуда для апдейта обычно лень. А тут всё почти просто. Блаадарю, налью при случае.
а 19200 не интересней будет?
дополню. Ногу изначально настраивать на вход, а когда нада сделать ресет, ногу делаем выходом и потом в LOW, иначе будет всегда ресет ещё на setup е
а вообще sadman предлагал через собаку ресетится, может приведёт пример.
На 19200 не синхронизируются загрузчик и дуда. Видимо костыль нарушает тайминги.
Тут нужно глубоко ковыряться в исходниках, я так далеко в этом не шарю.
Насчет ноги:
Ноги после сброса и так на входе.
В сетапе
Пишем сначала digitalWrite(PIN_RESET, HIGH);
Потом pinMode(PIN_RESET, OUTPUT);
На ноге будет сразу высокий уровень, ногу можно подключить к выводу DTR, соединенному
с RST через кондер.
Собакой ресетится нельзя, чтобы заработал загрузчик нужен только внешний ресет.
тоже самое будет работать и как я написал.
я тоже так думаю, вот и интересно как это садман хотел сделать. Регистр MCUSR перед собакой прописать по нужному?
Видимо нужно все же бутлоадер править, чтоб не обращал внимание на причину ресета. Тут обсуждалось
Еще пара ссылок на тему "Wireless reprogramming of Arduino" или "Over-the-Air uploading":
Для специфических задач и тех, у кого "цена не имеет значения":
Для тех, кого еще не выбесили китайские nRF24L01:
Подпишусь
Попробовал не софт-железный сброс, а переход на адрес загрузчика - работает (по примеру).
разве строка 13 работает? Имхо в MCUSR можно только сбрасывать биты. после 13 строки если вставить Serial.print (MCUSR), покажет 0 .
ХЗ -). Кода MCUSR = 0; Загрузчик запускался, но либо входил в какой-то ступор либо бесконечный луп (лампочка моргала непереставая), на старт приложения (скетча)не выходил. Я глянул в шитодате MCUSR - R/W (чтение/запись) и рискнул подсунуть лодырю этот костыль MCUSR = (_BV(EXTRF)); пусть думает, что его запустили после внешнего сброса. Помогло.
чето у меня не помогло. Короче замучал я проминьку, она почему то на оптибуте перестала работать. Вроде ори оптибут уже заливаю и все одно. На родном лодыре робит, ХЗ вообще
Что конкретно не работает? Не заливает по UART? Оптибут самодельный или готовый? Нужны подробности. Фьюзы?
После заливки в очередной раз оптибута перестала прошиваться по уарт, возвращаю родной загрузчик - работает. Шью загрузчик уной (arduino isp). Фьюзы в боардс от уны поставил, да и как уну пробовал - нифига. Нашёл тут тему, у народа было точь в точь. Вроде как usb ttl виноват был. У меня пролифик, где то ещё фтди валялся. Попробую позже его.
Hу не знаю, штук 15 оптибутов всяких заливал в последнее время, в том числе самодельных ( сам компилил). Ни каких проблем. Для экспериментов использую связку Promini - FT232R. Хочешь по SPI заливай, хочешь по UART.
О дак у меня такая же плата фтди. Ок попробую по spi тоже, только какой прогер выбирать в иде?
Если кратко, то нужна специально пропатченная дуда, которой заменяют штатную. Если программировать из IDE то программатор нужно прописать в programmers.txt
короче дело было в программаторе arduino as ISP , скачал версию 1.8.8 и залил заново в уну скетч arduino ISP, теперь уна стала нормально в промини оптибут записывать . Продолжаем эксперименты.
Я пробую без радиоканала, просто через usb tll прошивку залить. с проводком DTR все нормально заливается. убираю провод, никак , нет ответа от МК после компиляции, но ресет пациента идет норм (по методу #11), видимо синхронизации IDE и бутлоадера нет . проводал и костыль из #2 ставить и таймаут оптибута увеличивать. Мне кажется при компиляции оптибута у меня таймаут не увеличивается . Как это проверить? компилю такой строкой my atmega328 BAUD_RATE=57600 LED=B5 RS485=C3 TIMEOUT=8
Ваш оптибут из какой-то версии ардуины IDE. Там таймаут задан фиксированный 1с. Нужно править исходник. Я использую оптибут по ссылке #2.
спустя пару дней мучений я все же смог это победить. Короче я застрял на том что пробовал все попытки на работе. Там толи ноут дерьмовый толи IDE корявая, но ее я вроде переставлял. В общем ниче толком не работало. Даже на скорости 9600 оптибут не хотел работать, на 57600 работал. start led не мигал, хотя я настраивал его. меняя что-нибудь в optiboot.c и последующей компиляции лоадера изменения я не видел в работе. В общем целый день промучился.
Пришел домой, на домашнем компе все стало лучше. Все изменения в optiboot.c сразу стали работать, спустя 4 часа все таки прошилась минька без проводка DTR.
Для прошивки по проводам (просто по уарт ттл) костыль _delay_ms(10) из пост #2 не потребовался. Также не потребовалось и увеличение таймаута бутлоадера (по умолчанию 1 секунда - работает. пробовал и на 9600 и на 57600).
стандартный файл optiboot.c , скачанный с гитхаба по ссылке поста #2
вот что я добавил, 7 строк , начиная с 626
ну и в каждый скетч добавлять это, чтобы работал процесс прошивки без сигнала DTR (скорость ставим ту, на которую настраивали загрузчик):
Через переход на адрес памяти загрузчика (как в посте #11) у меня не получилось реализовать. Сделал через вотчдог. Смысл такой - при получении команды на прошивку от IDE, ардуина пишет 0 в еепром в ячейку 254 , в бутлодыре читается эта ячейка, если 0, то подменяем показания MCUSR, как будто был вшений сброс от ноги reset. и пишем обратно ячейку в 0xFF. и далее лодырь действует по стандартной схеме, как будто дернули ресет.
долго бился. Основное что не получалось, как только что-нибудь добавлял в файл optiboot.c сразу ругался компилятор типа размер загрузчика превышен, пробовал такую команду BIGBOOT=1 (при этом размер по идее удваивается), все в этом случае компилировалось, но нихрена не работало. Единственным получившимся решением стало у меня убирание мигания 3 раза встроенным LED, часть кода освободилось и мои строчки влезли, поэтому я компилировал такой строкой omake atmega328 LED_START_FLASHES=0 BAUD_RATE=57600. В общем основная цель то у меня была по RS485 прошивать, следующий этап , тот оптибут мучить, который поддерживает rs485. продолжение следует короче
Ну, блин! RS485 какое имеет отношение к теме "Беспроводная заливка скетча"?
Ну проблема то такая же была на пути. Ок дальше не пишу про rs485.
Проблема одна и та же - нет DTR.
Вот тут есть кое что по вашей теме.
Почему проблема? Для радиоканала с JDY-40 способ из #10 работает.
Тема интересная. У Дмитрия Осипова на канале Youtube есть вариант попроще - несколько обучающих видеоуроков на данную тему (ссылки на ресурсы ниже).
https://www.youtube.com/watch?v=wOyRgg8vE6I
https://www.youtube.com/watch?v=UW46NwTVDUo
Попробовал на своей конструкции робота ради интереса - 5 метров без преград, 12 Кб скетч. Но hc-05 дороже, хотелось бы на jdy-31. Как в них менять скорость - использовать АТ команды не нашёл. Может вы знаете?
На HC-05 заливка давно известна, пробовал лет 5 назад. К сожалению с JDY-31 не имел дела, даже не знал, что такие есть.
Модуль такой купил, пробовал в разных поделках, пока на ТХ не подал 5 В ). Сейчас, в продолжение темы, хотел повесить на один JDY-31 несколько про мини и управлять-заливать параллельно, но установка скорости притормозила желания.
Jaeger, а вы пробовали по методу #10 , заливать просто через USB_TTL без сигнала DTR? у меня почему то не работает. Я пробовал даже переход к определённому месту памяти загрузчика (листинг в файле optiboot_atmega328.lst) все равно никак. Рестарт идет, таймаут тоже, но скетч не льётся. Причём к разным местам памяти пробовал . Эх ну не хватает мне скилла и все тут.
Просто мой рабочий метод с еепром ну никак не влезает в оптибут RS485 (превышение размера загрузчика). Может чтение еепром в виде ассемблерных вставок сделать , чтоб влезло? кто знает подскажите как это будет выглядеть
Вам принципиально нужно уместить загрузчик в 512 байт? Он может быть 1кБ или 2кБ. Заливку по проводам без DTR попробую.
нет не принципиально. Я не знаю как увеличить размер загрузчика. Командой BIGBOOT=1 ? так у меня не работает. А в обычном варианте компилятор не дает собрать бутлоадер более 512.
Загрузка по проводу без DTR с переходом на адрес загрузчика работает (#10). Повторяю, что у меня оптибут из исходников по ссылке из поста #1. Этот загрузчик поддерживает EEPROM и соответственно "длинный" оптибут, но не поддерживает RS485. Загрузчик от https://github.com/SodaqMoja/optiboot наоборот не поддерживает EEPROM. Вероятно Вам нужно как-то соединить их. При длинном загрузчике нужно установить еще соотв-е фьюзы.
А вот почему не работало на длинном загрузчике, пасиб!про фьюзы погуглю как их поправить . Ну и потестю ещё почему переход по адресу не срабатывает.
Посмотрел калькулятор фьюзов. Действительно там настраивается размер секции загрузчика и начальный адрес указан. А вы меняли фьюзы в файле boards, когда оптибут использовали с примером #10? Ведь если не меняли, тогда у вас переход по адресу 0х3800 правильный (как для старого загрузчика 2кб) и это объясняет почему у меня не работало, я то правил фьюзы от уны, а там тож оптибут. Мне нужен адрес 0x3F00 (256words что есть 512bytes) Домой приеду проверю эту теорию.
Спасибо за наводку! Все заработало на оптибут RS485 по моей схеме с еепром (см #21). Чтобы заработал увеличенный загрузчик 1кб (командой BIGBOOT=1 при компиляции в командной строке), нужно естественно было ещё поправить фьюз HIGH в файле boards.txt на значение DC вместо DE (в моём случае) .
По вашей схеме с переходом по адресу так и не заработало, почему - загадка.
и кстати это я неправильный вывод сделал:
это адрес начала самого большего из возможных загрузчика вообще в 4кб. а у вас 512b Т.е. если вы скетч большой загрузите, то по адресу 0x3800 вообще , я так понимаю, уже основной скетч будет находится . Так что применяйте правильный адрес
Мой лодырь укладывается в 512 байт, поэтому его стартовый адрес 0х3F00. Этот адрес я и указываю в приложении. В boards я указываю только скорость заливки по uart, остальное меня не волнует, поскольку лодырь и фьюзы к нему я заливаю через сторонний гуй (GUI AVRDUDESS).
понятно, ну тогда поправьте #10 , а то меня ввело в заблуждение 0x3800
капец, я нашел приничу, все было в том что, я не точно ваш скетч использовал и написал ждать символа STK_GET_SYNC (0x30), а у вас ждёт STK_CRC_EOP (0x20) и из-за этого и не работало!!! теперь мои танцы с еепром как бы и не актуальны получается. И кстати даже без MCUSR = (_BV(EXTRF)) перед переходом на загрузчик тоже работает (все таки я думаю что в этом регистре можно только сбрасывать биты - это же тоже write, что и указано в шитодате). Все встало на свои места.
Оно и с адресом 0х3800 стартует, поскольку до адреса загрузчика все пока пусто. Я тоже так думал, что запись 1 в MCUSR только аппаратно, но практика показывает что при MCUSR = (_BV(EXTRF)) приложение запускается, а при MCUSR = 0 загрузчик сидит в каком-то лупе и приложение не стартует, хотя загрузку может производить. И еще, без MCUSR = (_BV(EXTRF)) после передергивания питания загрузчик не грузит приложение, только после кнопочного ресета. Блин, "сам в шоке!"
Дак может MCUSR вообще не трогать перед переходом. Т.е не надо ни =0, ни установки EXTRF
Судя по
все-таки пишет в этот регистр.
Хм, странно, я так пробовал, было ноль. Ладно, хорошо если так
У меня алгоритм такой, что перед обновлением прошивки на МК поступает соответствующая команда. И только после этого ардуина ждёт CRC_EOP. При этом в эфире естественно делается тихое окно .
все-таки пишет в этот регистр.
а вы попробуйте распечатать MCUSR до записи единицы и поймете, что она там уже была. Последние версии оптибут вроде не сбрасывают MCUSR. (ну кроме бита WDRF, его сбрасывает лодырь)
Вы правы, я лажанулся! -(
Выходит что ни мой способ с еепром ни ваш с переходом по адресу нормально не работает, если хотя бы раз после включения питания не был произведён внешний ресет по пину reset
Да, совершенно верно. Хочу попробовать еще аппаратный способ (не трогая загрузчик) - уменьшить таймаут при включении пердохранителями (фьюзами) и замкнуть DTR на массу. Типа сначала сработает ресет по включению, потом внешний ресет. Если наоборот то ресет при включении стирает все биты (кроме своего) в MCUSR.