Загрузка контроллера Teensy, подключенного к компьютеру через СОМ порт при отсутствии других Teensy, не вызывает затруднений. Однако, загрузка одновременно-подключенной группы контроллеров Teensy может оказаться проблематичной [1,2,3,4]. Варианты решения этой проблемы обсуждаются ниже.

Состояние проблемы

Контроллеры Teensy могут работать со многими протоколами, в которых отсутствует имя COM порта (например, клавиатура, мышь, джойстик, аудио, RawHID и др.), поэтому программа teensy_post_compile, выполняемая загрузку, не использует имена последовательных портов COMx. Она использует имена местоположений USB. Например, usb:0/140 000/0/8/1», в котором закодирован физический USB‑контроллер и последовательность концентраторов/портов для доступа к фактическому USB‑устройству. Этот способ точно указывает к какой USB плате нужно получить доступ, независимо от того, какой протокол она в настоящее время реализует.

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

Описание средств и параметров загрузки

В среде разработки Arduino IDE имя местоположения USB контроллеров Teensy отображается внизу справа, например, Teensy 4.1 on usb:0/140000/0/8/1. При перестыковке контроллера к другому USB порту изменяется имя его местоположения.

Программа «teensy_ports», входящая в комплект программ Teensyduino, Version 1.58 (Рисунок 1), формирует список всех подключенных контроллеров Teensy и названия их портов.

Рисунок 1. Состав пакета Teensyduino, Version 1.58 в папке c:\Users\...\AppData\Local\Arduino15\packages\teensy\tools\teensy-tools\1.58.0\ 

Пример списков параметров, подключенных к компьютеру двух контроллеров Teensy (3.2 и 4.1), сформированный программой «teensy_ports», показан на Рисунок 2.

Рисунок 2. Пример списка параметров контроллеров Teensy, сформированный программой «teensy_ports».

При нажатии кнопки на поверхности платы контроллера Teensy 4.1 вместо номера COM порта в списке Port Arduino IDE (меню > Tools > Port) появляется его label (см. Рисунок 2), например,  как показано на Рисунок 3 (слева). Label показывает уникальные идентификаторы USB устройства: VID (идентификатор производителя) и PID (идентификатор устройства). Эти данные USB устройства и его серийный номер можно прочитать специальными утилитами. Из списка COM портов диспетчера устройств исчезает порт контроллера (COM7 в этом примере) на кнопку которого нажали, см. Рисунок 3 (справа).                

Рисунок 3. Пример списков Port консоли Arduino IDE (слева) и диспетчера устройств (справа) после нажатия на кнопку контроллера. Отсутствует COM7.

После загрузки контроллера в списке диспетчера устройств появляется COM-номер контроллера, загрузившего программу (см. Рисунок 4).

Рисунок 4. Cписок COM портов диспетчера устройств.

 Образец написания команды загрузки hex кода в контроллер Teensy (без использования Arduino IDE) можно получить, выполнив следующую последовательность.

  • Подключите Teensy к USB порту компьютера

  • Загрузите Arduino IDE

  • Выберите тип платы Teensy из меню >Tools > Board >

  • Выберите СОМ порт платы из меню > Tools > Port >

  • Установите флажок upload в закладке Preferences: меню Arduino IDE > File > Preferences > Show verbose output during > upload

  • Запустите меню >Sketch > Upload или нажмите

После завершения загрузки, в окне вывода Arduino IDE консоли можно найти команду загрузки hex кода: “teensy_post_compile” (см. Рисунок 5), которая выглядит, например, так:

D:\Program Files (x86)\Arduino\hardware\teensy/../tools/teensy_post_compile -file=Blink_4_1.ino -path=C:\Users\bob_d\AppData\Local\Temp\arduino_build_280409 -tools=D:\Program Files (x86)\Arduino\hardware\teensy/../tools -board=TEENSY41 -reboot -port=usb:0/140000/0/6 -portlabel=hid#vid_16c0&pid_0478 Bootloader -portprotocol=Teensy

Рисунок 5. Местоположение команды загрузки hex кода в контроллер.  

К сожалению, программа “teensy_ports” (Рисунок 2) не показывает уникальный серийный номер контроллеров, а поскольку VID и PID контроллеров однотипных контроллеров, например, Teensy 4.1 совпадают, то в случае нескольких Teensy 4.1, подключенных к компьютеру, невозможно определить в какой именно контроллер будет загружена откомпилированная программа. Загрузчик автоматически попытается выполнить загрузку на первое устройство, которое сможет найти.

Варианты решения

Подсказкой в установлении связи между конкретным Teensy 4.1 и соответствующей консоли Arduino IDE может служить изменение вида консоли в момент нажатия кнопки контроллера как показано на Рисунок 6.

Рисунок 6. Изменение вида консоли в момент нажатия кнопки соответствующего контроллера Teensy 4.1: Начальное состояние à изменение вызванное нажатием кнопки à результат.

Для минимизации неправильных загрузок, перед нажатием кнопки контроллера следует закрыть (если он открыт) загрузчик контроллеров Teensy показанный на Рисунок 7.

Рисунок 7. Загрузчик контроллеров Teensy.

Перезагрузку контроллера Teensy 4.1 можно обеспечить и физическим отсоединением всех других Teensy 4.1от USB портов компьютера, через которые подается питание контроллеров.

Отключение от питания можно выполнить также присоединением контакта “On/Off” платы контроллера Teensy 4.1 (например, при помощи дополнительной кнопки или электронного реле) к заземлению GND [5]. Подключение контакта “On/Off” к заземлению на 4 секунды выключает питание контроллера, при этом запись номера COM порта контроллера исчезает из списка портов диспетчера устройств. Подключение на 0,5 секунды возвращает питание 3,3 В и перезагружает контроллер, запись COM порта контроллера восстанавливается.

Но как выполнить перезагрузку двух и более однотипных контроллеров, например, Teensy 4.1 находящихся в труднодоступном месте устройства и подключенных к компьютеру через сетевой концентратор (хаб)? Нажатие кнопок контроллеров в этом случае можно обеспечить при помощи соленоидов. Такой пример показан на Рисунок 8. Усилие, необходимое для нажатия кнопки контроллера Teensy 4.1, должно быть не менее 650 г.

Рисунок 8. Соленоиды макета для переключения кнопок контроллеров Teensy 4.1.

 

Литература

  1. Not Downloading to Correct COM port

  2. Problem with Multiple Teensy on Windows 10

  3. Can't compile/upload for two teensies simultaneously

  4. Обмен данными между двумя Teensy 4.0 и ПК: танцы с бубном

  5. Teensy 4.1 Development Board 

Комментарии (3)


  1. michael108
    23.08.2023 08:44

    Приятно, когда твою статью [4] кто-то цитирует ))


    Небольшое замечание: на рис. 6 не отображены изменения вида консоли (все 3 картинки одинаковые). Насколько я помню, там меняется цвет кружочка.


    1. dr_bob_davidov Автор
      23.08.2023 08:44

      И все таки они разные, ненадолго пропадает кубик.


  1. NutsUnderline
    23.08.2023 08:44

    Соленойды для нажатия кнопок, вместо того чтобы исправлять лень (ну в смысле пинать) разработчиков софта - я встал и зааплодировал