Загрузка скетча в несколько ардуино, соединенных последовательно

В настоящее время я работаю над проектом, в котором у вас, по сути, будет несколько ардуино (1 Uno, несколько Nano), подключенных последовательно, только через 2 цифровых контакта и один провод для последовательной связи (контакт RX -> контакт TX). . (Первый подключается через USB к ПК.)

Я полагал, что последовательная связь между первым Arduino и ПК также будет осуществляться через контакты RX и TX, но, похоже, это не так.

Поскольку обновлять по одному довольно утомительно, есть ли способ обновить их все сразу, используя только односторонний последовательный канал связи?

РЕДАКТИРОВАТЬ: Да, так что, как и я, просто добавьте USB-порт к каждому отдельному компоненту в цепочке для обновления отдельно, и обновите каждый из них отдельно.

, 👍2

Обсуждение

«Последовательная связь между первым arduino и ПК также будет перенаправляться через контакты RX и TX»... это произойдет только в том случае, если загрузчик отправит обратно то, что он получает от avrdude... вы можете изменить загрузчик, чтобы сделать это.. , Я думаю, что avrdude ожидает рукопожатия, хотя, @jsotola

Может быть лучше сделать программу для кормления nanos вместо модифицированного загрузчика, @Abel


2 ответа


5

Попробуйте подключить только контакты RX и Reset. Последовательное программирование выполняется загрузчиком, но сначала его необходимо переключить в режим программирования, что делается путем сброса микросхемы, а затем отправки специального кода на контакт RX в течение определенного периода времени. Когда вы программируете через последовательный порт (как вы делаете с Uno), микросхема FTDI управляет этим контактом для вас, но вам также необходимо каскадировать этот сигнал сброса на другие микросхемы. Это все еще не гарантирует работу на 100 %, поскольку это зависит и от ряда других факторов, но, по крайней мере, у вас будет шанс.

Когда я делал подобные вещи на коммерческой основе, я вместо этого программировал через разъем ICSP и делал программные установки из подпружиненных контактных разъемов, к которым просто прикреплялись целевые платы. Если вы планируете делать это с какой-либо степенью частоты, я бы порекомендовал потратить немного времени на то, чтобы сделать это самостоятельно.

ОБНОВЛЕНИЕ: хорошо, теперь я понимаю, почему это не работает. Чип USB-to-serial Nano CH340 вытягивает RX на низкий уровень, предотвращая чтение потока данных. Будет нормально работать с отдельными чипами, но явно не с Nano.

Я думаю, что лучше всего использовать ICSP. Это дополнительный контакт, но если вы используете макет, это не должно иметь никакого значения. Кроме того, это дает ряд преимуществ, включая более быстрое программирование, возможность загрузки/замены загрузчика и возможность замены предохранителей (например, для защиты прошивки или полного отключения загрузчика, чтобы дать приложению больше места во флэш-памяти и т. д.).

Если вы еще не знаете, как это сделать, макет выглядит следующим образом:

  • Подключите контакты Uno SCLK(D13)/MOSI(D11)/GND ко всем соответствующим контактам Nano.
  • Подключите Uno D10 ко всем контактам RESET Nano.
  • Подключите Uno MISO(D12) только к первому контакту MISO Nano.
  • Подключите Uno VIN ко всем Nano VIN (вы не хотите, чтобы все Nano управлялись регулятором Uno)

Должно получиться что-то вроде этого:

Подготовьте Uno к программированию:

  • Установите тип платы IDE на Uno
  • Установите тип программатора IDE на "AVR ISP"
  • Загрузить скетч IDE ArduinoISP в Uno

Теперь вы готовы программировать Nano:

  • Установите тип платы IDE на Nano
  • Установите для типа программатора IDE значение "Arduino as ISP"
  • Загрузите свой скетч Nano, используя "Загрузить с помощью Programmer"

Только что попробовал это с двумя Nano на фото, сработало нормально.

,

Что я также слышал до сих пор, так это то, что avrdude также ожидает рукопожатий / ответов от запрограммированной платы, и если серийный номер просто пересылается, во время загрузки могут возникнуть проблемы с синхронизацией, то есть проблемы с синхронизацией, но я обязательно попробую это потом!, @Mikoyan

@Mikoyan да, это правда, хотя я ожидаю, что паузы между фрагментами программирования будут достаточно длинными, чтобы приспособиться к этому. Но если это не сработает, то написать свой собственный загрузчик очень просто, [функция Flash в Device.cs](https://github.com/Myndale/Simbuino/blob/master/src/Simbuino.Hardware/Device. cs) в моем [эмуляторе Windows Arduino ] (https://github.com/Myndale/Simbuino) есть весь код для этого, и вы можете просто добавить дополнительные задержки по мере необходимости., @Mark Feldman

Подключение только контактов RX и Reset не работает, похоже, что контакт Reset на самом деле не (не) срабатывает (хотя, возможно, это было слишком быстро, чтобы заметить, тем не менее: на нано нет программы): /, @Mikoyan

@Mikoyan дай мне день или около того, чтобы попробовать, я отвечу здесь с ответом, если смогу заставить его работать сам., @Mark Feldman

Ответ @Mikoyan обновлен., @Mark Feldman

Поскольку MISO подключен только к одному Nano, программист не может получить обратную связь от всех остальных. Я бы не решился на такую установку, но это действительно круто, что это работает! Однако обратите внимание, что на этапе «проверки» загрузки эффективно проверяется только первый Nano., @Edgar Bonet

Я чувствую себя тупым в этот момент: `avrdude: Yikes! Неверная подпись устройства. Я сделал так, как вы сказали, но да, он выдает эту ошибку. Я использовал только один нано, чтобы попробовать это, но я не думаю, что это имеет значение., @Mikoyan

@Mikoyan Первое, что нужно сделать, это проверить команду, отправляемую avrdude. Если вы делаете это через IDE, включите подробный вывод во время загрузки в настройках и посмотрите, какую команду он выводит при программировании, должно быть что-то вроде C:\arduino-1.8.19-windows\arduino-1.8.19\ hardware\tools\avr/bin/avrdude -CC:\arduino-1.8.19-windows\arduino-1.8.19\hardware\tools\avr/etc/avrdude.conf -v -patmega328p -cstk500v1 -PCOM9 -Uflash:w :C:\Users\ваше_имя_пользователя\AppData\Local\Temp\arduino_build_213021/your_sketch.ino.hex:i , @Mark Feldman

Если это проверит, то, вероятно, это просто проблема с проводкой. Начните с замены этого соединения VIN на соединение с их контактами 5 В (хорошо, если это всего лишь одна плата) и подключите напрямую к контактам Arduino (как показано на [этом изображении] (https://docs.arduino.cc/static/82f07088c74bca72141a9c92945aa827). /6aca1/Arduino_ISP_wires.jpg)) чтобы исключить любые проблемы с заголовком ICSP., @Mark Feldman


0

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

Возможно, вы могли бы соединить все провода Rx вместе и использовать провод Tx от первого (чтобы он реагировал правильно) и отбросить ответы от других устройств. Если они программируются с одинаковой скоростью и сбрасываются в один и тот же момент, это может сработать.

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

Есть также автономные устройства, например автономный программатор Crossroads, в котором используются методы, описанные в моем пост на форуме. Вы можете использовать это в полевых условиях, потому что для этого не требуется монитор или ПК. Вы просто подключаете его через порт ICSP, выбираете файл, который хотите загрузить, и нажимаете кнопку "программа" кнопка.

,

«Вероятно, вы могли бы соединить все провода Rx вместе» - На самом деле нет, как обсуждалось в другом ответе, подключение только контактов RX (и сброс, чтобы перевести его в режим программирования) не работает, как: «Чип USB-to-serial CH340 в Nano снижает уровень RX, препятствуя чтению потока данных. Он отлично работает с автономными чипами, но, очевидно, не работает с Nano»., @Mikoyan

Хмм хорошо. Вы можете создавать свои собственные платы без чипа USB-to-serial, так как в этой установке это не требуется. Или просто отпаять его от платы., @Nick Gammon