Загрузка контроллеров без использования консоли Arduino IDE

    Введение

    При работе с контроллерами распределенной системы довольно часто приходится перезагружать контроллеры. Использование консоли Arduino IDE для перезагрузки заказчиком не очень удобно, поскольку для каждого типа контроллеров необходимо настраивать (или проверять) тип платы и номера СОМ портов, эту работу должен выполнять персонал, знакомый с IDE, да и не каждый заказчик желает знать, что система построена на контроллерах Arduino.

    В этой работе рассматриваются варианты загрузки контроллеров (Arduino на Atmega328 и Atmega32u4 и совместимого контроллера Teensy) отдельными командами и через командный файл, без использования среды IDE.

    Организация USB СОМ связи плат Arduino

    По организации канала последовательной связи платы Arduino можно разделить на платы с преобразователем USB — UART и платы с микроконтроллерами, которые поддерживают USB связь без внешних преобразователей. К первым относятся платы Arduino UNO, Arduino NANO, Arduino Mini, Arduino UNO Ethernet, Arduino UNO WiFi на базе микроконтроллеров Atmega328. Ко вторым – платы Arduino Leonardo, Arduino Micro, Arduino Yun Mini, Arduino Industrial 101, Arduino Leonardo Ethernet с контроллерами Atmega32u4 [1].

    Загрузка контроллера Arduino (Atmega328) программой avrdude.exe

    Загрузку hex файла в контроллер Arduino можно выполнить программой avrdude.exe. Эта программа входит в состав пакета консоли IDE, например, версии Arduino 1.8.5. Загрузчик avrdude.exe запускается утилитой cmd или Command Prompt, которые запускаются как показано на Рисунок 1.


    Рисунок 1. Пример запуска утилиты Command Prompt.

    Чтобы получить образец написания команды загрузки hex кода в контроллер Arduino на вашем компьютере выполните следующую последовательность.

    • Подключите Arduino
    • Загрузите Arduino IDE
    • Выберите тип платы Arduino из меню >Tools > Board >
    • Выберите СОМ порт платы из меню > Tools > Port >
    • Установите флажок upload в закладке Preferences: меню Arduino IDE > File > Preferences > Show verbose output during > upload
    • Запустите меню >Sketch > Upload
    • После завершения загрузки, в окне вывода Arduino IDE консоли найдите команду с avrdude, она выглядит, например, так:

    C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avrdude -CC:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf -v -patmega328p -carduino -PCOM3 -b115200 -D -Uflash:w:C:\Users\user-2\AppData\Local\Temp\arduino_build_628118/Blink.ino.hex:i 

    Для выполнения команды avrdude утилитой Command Prompt в команду необходимо ввести двойные кавычки, как показано ниже.

    "C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/<b>avrdude</b>" -"CC:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf" -v -patmega328p -carduino -PCOM3 -b115200 -D -Uflash:w:C:\Users\user-2\AppData\Local\Temp\arduino_build_628118/Blink.ino.hex:i 

    Приведенная команда может использоваться для загрузки hex программ в контроллер Arduino с чипом Atmega328 и отдельным преобразователем USB – UART. Для контроллеров с Atmega32u4, поддерживающим USB связь без аппаратного преобразователя, для выполнения команды нужны дополнительные действия, которые описаны ниже в соответствующем разделе.

    Поскольку откомпилированная программа — hex файл хранится в папке временных файлов пока открыта консоль IDE (..\AppData\Local\Temp\..), то hex файл лучше скопировать в отдельную папку, туда же скопировать загрузчик avrdude.exe и файл avrdude.conf.

    После перемещения файлов (Рисунок 2), например, в папку C:\ArdIDE команда загрузки с обновленными путями доступа к файлам принимает вид, как показано на Рисунок 3.

    image
    Рисунок 2. Размещение файлов загрузчика и hex файла в отдельной папке.

    image
    Рисунок 3. Запуск загрузчика avrdude утилитой Command Prompt.

    Загрузка контроллера Teensy загрузчиком teensy_post_compile.exe
    После установки программного обеспечения Teensyduino контроллеров Teensy, в списке устройств консоли Arduino IDE появляются соответствующие контроллеры (см. Рисунок 4).

    image
    Рисунок 4. Список контроллеров Teensy в консоли Arduino IDE.

    Образец написания команды загрузки hex кода в контроллер Teensy можно получить, выполнив последовательность, показанную выше для контроллеров Arduino. В окне вывода необходимо найти образец загрузчика — команду teensy_post_compile. Для автономной загрузки нужные файлы можно скопировать в отдельную папку, например, как показано ниже. Файлы teensy_post_compile, teensy_post_compile.exe и teensy.exe можно взять из пакета Arduino дополненного приложением Teensy.

    image

    Ниже показаны примеры команд загрузки hex файлов Blink_1.ino и Blink_2.ino в два контроллера Teensy, подключенных к компьютеру через USB хаб.

    "C:\TnsIDE/teensy_post_compile" -file=Blink_2.ino "-path=C:\TnsIDE" "-tools=C:\TnsIDE" -board=TEENSY31 -reboot -port=usb:0/1A0000/0/1/1/1 -portlabel=COM19 (Teensy 3.2) Serial -portprotocol=Teensy

    "C:\TnsIDE/teensy_post_compile" -file=Blink_1.ino "-path=C:\TnsIDE" "-tools=C:\TnsIDE" -board=TEENSY31 -reboot -port=usb:0/1A0000/0/1/1/2 -portlabel=COM23 (Teensy 3.2) Serial -portprotocol=Teensy

    В этих записях порты хаба обозначены как usb:0/1A0000/0/1/1/1 и usb:0/1A0000/0/1/1/2.

    Загрузка контроллера Arduino (Atmega32U4) программой avrdude.exe

    Платы Arduino UNO, Leonardo, Micro и др. построены на базе микроконтроллера ATmega32U4. Этот микроконтроллер имеет встроенный USB-канал (full speed USB 2.0), поэтому загрузка программ в него отличается от рассмотренной загрузки в микроконтроллеры ATmega328 через дополнительный USB — UART преобразователь.

    Номер СОМ порта контроллера Arduino указан в списке диспетчера устройств, например.

    image

    При открытии виртуального СОМ порта контроллера Arduino pro Micro (с любой частотой передачи 1200, …, 9600, … 115200 бод) происходит сброс контроллера и запуск программы пользователя. В среде МАТЛАБ программа создания виртуального порта выглядит следующим образом.

    % create port. 
    s=serial('COM15','Baudrate',9600); % 115200
    fopen(s);

    После закрытия виртуального СОМ порта с частотой не равной 1200 бод, например, как показано ниже

    fclose(s);
    delete(s);
    clear s 

    происходит выполнение пользовательской программы контроллера.

    Сброс контроллера и запуск загрузчика контроллера выполняется после открытия и закрытия СОМ порта с частотой 12000 бод внешней средой, например, МАТЛАБ, как показано ниже.

    % create port. 
    s=serial('COM15','Baudrate',1200); % 115200
    fopen(s);
    pause(1.5); 
    fclose(s);
    delete(s);
    clear s 
    

    Эту же операцию можно выполнить командой mode, как показано на Рисунок 5.

    image
    Рисунок 5. Выполнение команды mode в Command Prompt. Команда устанавливает для порта СОМ15 частоту передачи 1200 бод, что вызывает сброс контроллера и запуск загрузчика, а также временно изменяет номера виртуального порта контроллера в списке устройств.

    После закрытия порта (команда fclose(s)) загрузчик контроллера создает свой виртуальный (CDC) порт, который отображается в списке диспетчера устройств с новым номером примерно на 8 секунд.

    image

    По прошествии времени существования нового виртуального порта (8 сек.), в список диспетчера устройств возвращается СОМ порт с исходным номером.

    image

    Во время существования нового СОМ порта, через него в контроллер можно самостоятельно загрузить программу пользователя, используя образец команды avrdude консоли Arduino IDE. Получение образца команды загрузчика avrdude в среде Arduino IDE аналогично варианту, приведенному выше для микроконтроллеров Atmega328. Созданный виртуальный порт исчезает из списка устройств после перезагрузки платы и в список возвращается СОМ порт с исходным номером.

    Загрузчик также можно запустить, подключением контакта RST платы Arduino на землю GND.
    Если автоматический сброс контроллера (через создание и отключение СОМ порта на частоте 1200 бод) не работает, загрузку устройств (Arduino Leonardo, Arduino Pro Micro) на базе на микроконтроллера ATmega32U4 можно выполнить через консоль Arduino IDE в следующей последовательности.

    1. Нажмите и удерживайте кнопку «Reset» (или замкните контакт RST на землю). Последовательное USB соединение разрывается. Из списка диспетчера устройств исчезает СОМ порт контроллера.

    2. Нажмите кнопку image Upload (Ctrl+U) Arduino IDE. На Рисунок 6 показано начальное состояние диспетчера устройств (слева) и Arduino IDE (справа) на этом этапе
    image
    Рисунок 6. Номер СОМ порта в диспетчере устройств и индикация процесса компиляции программы в консоли Arduino IDE.

    3. Дождитесь когда индикатор статуса закончит компиляцию «Compiling» и перейдет на загрузку «Uploading», как показано на Рисунок 7.

    image
    Рисунок 7. Номер нового временного СОМ порта в диспетчере устройств и индикация процесса загрузки программы в консоли Arduino IDE.

    4. Отпустите кнопку «Reset» (разомкните контакт RST). USB соединение восстанавливается. Выполняется загрузка. Окончание загрузки индикатор обозначает фразой Done uploading (см. Рисунок 8)

    image
    Рисунок 8. Номер СОМ порта в диспетчере устройств и индикация завершения загрузки программы в консоли Arduino IDE.

    Загрузка контроллеров через пакетный (командный) bat файл

    Автономную загрузку (без использования консоли Arduino IDE) можно выполнить при помощи пакетного (командного) файла. Пример пакетного файла (с расширением bat) для загрузки HEX файлов в два контроллера Arduino Pro Micro (Atmega32u4), подключенных к компьютеру через первый хаб, в два контроллера Teensy, подключенных к компьютеру через второй хаб, и в контроллер Arduino UNO (Atmega328) приведен ниже. Загружаемые HEX файлы и все необходимые для этого программы были предварительно помещены в общую папку, показанную на Рисунок 9.

    image
    Рисунок 9. Пример содержимого папки для автономной загрузки 5 контроллеров: Arduino Pro Micro (Atmega32u4), Teensy и Arduino UNO (Atmega328)

    Пакетный файл mcLoad.bat для автономной загрузки пяти контроллеров показан ниже. Задержки по одной секунде (TIMEOUT /T 1 /NOBREAK) добавлены перед загрузкой контроллеров Arduino Pro Micro. Задержка 2 секунды введена перед загрузкой второго контроллера Teensy. После окончания загрузки всех контроллеров закрывается окно программы Teensy.exe.

    echo OFF
    echo UPLOAD: Arduino Pro Micro 1 
    mode COM42 BAUD=12000
    TIMEOUT /T 1 /NOBREAK
    avrdude -Cavrdude.conf -v -patmega32u4 -cavr109 -PCOM45 -b57600 -D -Uflash:w:micro.ino.hex:i
    
    echo UPLOAD: Arduino Pro Micro 2 
    mode COM43 BAUD=12000
    TIMEOUT /T 1 /NOBREAK
    avrdude -Cavrdude.conf -v -patmega32u4 -cavr109 -PCOM44 -b57600 -D -Uflash:w:micro.ino.hex:i
    
    echo UPLOAD: Arduino UNO 
    avrdude -Cavrdude.conf -v -patmega328p -carduino -PCOM3 -b115200 -D -Uflash:w: BlinkUNO.ino.hex:i
    
    echo UPLOAD: Teensy 1
    "C:\mcLOAD/teensy_post_compile" -file=Blink_1_Teensy.ino "-path=C:\mcLOAD" "-tools=C:\mcLOAD" -board=TEENSY31 -reboot -port=usb:0/1A0000/0/1/1/2 -portlabel=COM23 (Teensy 3.2) Serial -portprotocol=Teensy
    
    REM Delay 2 seconds:
    TIMEOUT /T 2 /NOBREAK
    
    echo UPLOAD: Teensy 2
    "C:\mcLOAD/teensy_post_compile" -file=Blink_2_Teensy.ino "-path=C:\mcLOAD" "-tools=C:\mcLOAD" -board=TEENSY31 -reboot -port=usb:0/1A0000/0/1/1/1 -portlabel=COM19 (Teensy 3.2) Serial -portprotocol=Teensy
    
    REM Close Teensy.exe
    taskkill /f /IM Teensy.exe

    Отсоединение контроллера от USB линии не влияет на загрузку остальных контроллеров.

    Для исключения имени Arduino из списка диспетчера устройств, например, “Arduino UNO (COMX)”, можно использовать программы, например, RegOwnersahipEx, или аппаратные клоны контроллеров Arduino, например, WAVGAT, который обозначается в списке устройств как “USB-SERIAL CH340 (COMX)”.

    Библиографический список

    1. Сравнение плат Arduino (таблица) digitrode.ru/arduino-comparison.html
    2. Arduino Micro, shop.pimoroni.com/products/arduino-micro
    3. Dr. Bob Davidov. Компьютерные технологии управления в технических системах portalnp.ru/author/bobdavidov.
    • +13
    • 5,2k
    • 8
    Поделиться публикацией

    Похожие публикации

    Комментарии 8

      +4
      Ардуинщики познают мир вне Arduino IDE)
        0
        Если бы познавали — купили бы программатор — они в системе не нумеруются :)
          0
          Это уже познавание мира вне платформы Ардуино)
            0
            Они разные бывают. Некоторые всё-таки как COM-порт видны. STK500, например.
          0
          Поскольку откомпилированная программа — hex файл хранится в папке временных файлов пока открыта консоль IDE

          меню/скетч/экспорт бинарного файла и тогда бинарник будет создан рядом с *.ino
            0
            А в Makefile все настроить и запускать make вместе с загрузкой?
            Ох уж эти пользователи Windows! )))
              +1
              Сообщение для заказчиков: «Если подрядчик использует Arduino IDE для загрузки проверьте рекомендации подрядчика у предыдущих заказчиков» :)
                0
                Как ни крути, без Arduino IDE никуда, ну по крайней мере на начальном этапе. Вот например в Mac OS может меняться название порта, от раза к разу, хотя вставляешь один и тот же преобразователь. Постоянно приходится переписывать makefile. И я вот недавно задумался, если в этой IDE можно спокойно компилировать код на Си, то зачем эти костыли? Хоть мне VS code очень нравится, но она наверно более удобна для многофайловых проектов, а для однофайловых, я все-таки склоняюсь к IDE.

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                Самое читаемое