Долгосрочное соединение между Arduino и компьютером

Я хочу сделать индикаторные лампы для своего компьютера, чтобы они показывали такие вещи, как загрузка системы, использование ввода-вывода и т. д., используя Arduino и NeoPixels. Я хотел бы просто подключить его к своему компьютеру и иметь какое-то пользовательское программное обеспечение, которое будет подключаться к нему и отправлять ему необходимые данные во время работы моего компьютера.

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

У меня были проблемы с переключением Arduino, какой порт /dev/ttyAMC* ему назначен, поэтому я искал варианты, отличные от последовательного порта USB. Похоже, единственный другой способ — это USB, так как это единственный распространенный порт общего назначения в наши дни.

Вот в чем моя проблема. Люди, похоже, не делают подобных вещей, или, по крайней мере, не пишут об этом.

Teensy может работать как USB HID, но функция raw HID не обновлялась почти десять лет, код на стороне хоста основан на устаревших библиотеках и, похоже, больше ориентирован на передачу данных Teensy на компьютер.

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

Я нашел V-USB, который кажется решением моих проблем, на самом деле кто-то даже использовал его, чтобы сделать в принципе то, что я хочу сделать. Однако мне все равно нужно будет изучить библиотеку.


Итак, мой вопрос: какой рекомендуемый способ взаимодействия между компьютером и Arduino в долгосрочной перспективе? Действительно ли необходима поддержка USB, или я просто все переосмыслил?

, 👍2

Обсуждение

Вам не следует использовать V-USB, если вы можете получить Arduino с собственным интерфейсом USB (в этом случае вам следует использовать LUFA)., @Ignacio Vazquez-Abrams

@IgnacioVazquez-Abrams Под Arduino с собственным USB вы имеете в виду что-то вроде Arduino Zero/Due?, @theJack

У них есть собственный USB, но они не используют LUFA. Я думал, что больше похоже на Leonardo или Pro Micro., @Ignacio Vazquez-Abrams

Вам стоит обратить внимание на chipKIT — у него лучший USB-стек в отрасли (я знаю, потому что я это написал ;) ), @Majenko

А это я использую его для чего-то похожего на то, что вы хотите: https://hackingmajenkoblog.wordpress.com/2017/05/19/adding-an-oled-to-my-computer/, @Majenko


1 ответ


Лучший ответ:

2

Я думаю, что самым простым вариантом будет сохранить USB (ACM)-соединение, так что вы не нужно ничего особенного делать на Arduino, и попытаться выяснить способ определения правильного устройства на стороне компьютера.

В Linux предоставление согласованных имен устройств для определенных периферийных устройств является обычно это работа udev. Вы можете добавить свое собственное правило udev, чтобы создать символическую ссылку для вашего Arduino каждый раз, когда вы его подключаете. Затем, ваш пользовательское программное обеспечение всегда открывало /dev/neopixel-monitor, что быть символической ссылкой на соответствующее устройство /dev/ttyACMx.

На самом деле, вам, возможно, не нужно писать свое собственное правило. Я посмотрел на Правила udev установлены по умолчанию на моем Ubuntu 16.04 и нашли файл с именем /lib/udev/rules.d/60-serial.rules, предназначенный для заполнения /dev/serial/by-path/ и /dev/serial/by-id/ каталоги. Затем я подключил свой Arduino Uno R3 и увидел символическую ссылку /dev/serial/by-id/usb-Arduino__www.arduino.cc__0043_93140364233351E00101-if00 автоматически созданный, который сейчас указывает на ../../ttyACM0. В это имя, 0043 - это идентификатор USB-устройства Uno, а следующее Буквенно-цифровая последовательность выглядит как серийный номер. if00 выглядит как номер интерфейса, и может меняться (но не будет, см. комментарий Маженко). Имя ссылки должно будет хорошим способом однозначно идентифицировать этот конкретный Arduino.

,

У меня есть файл, который делает /dev/boards/arduino/uno1 и т. д. для всех моих плат. Это довольно большой файл (у меня много плат), но он очень и очень полезен., @Majenko

Правило для этого: ATTRS{idVendor}=="2341", ATTRS{idProduct}=="0001", ATTRS{serial}=="6493832323135111C0A1", KERNEL=="ttyACM*", MODE="0666", GROUP="plugdev", SYMLINK+="board/arduino/uno1", @Majenko

О, и номер интерфейса (if00) всегда будет 0 для Arduino. Это интерфейс USB в дескрипторе конфигурации. Есть 2 интерфейса, но один из них является ведущим, а другой — ведомым (так работает CDC/ACM), а интерфейс 0 является ведущим в дескрипторе. Единственный способ изменить интерфейс — перепрограммировать ATMega16U2 с помощью другой прошивки., @Majenko

Кстати, команда udevadm info -a /dev/ttyACM0 полезна при создании правил udev., @Majenko