Инструмент загрузки светодиодной бейджи с интерфейсом USB-HID
Добавлены акцентированные французские символы.
Типы, поддерживаемые этим проектом, имеют массив
44 х 11 светодиодов или
48 х 12 светодиодов.
Производитель, вероятно, https://lesun-led.en.alibaba.com/
В обеих конфигурациях значок идентифицируется на USB-накопителе как
idVendor=0416, idProduct=5020 Mfr=1, Product=2, SerialNumber=0 LSicroelectronics LS32 Custm HID
На рынке представлено множество различных версий светодиодных бейджей. Этот использует интерфейс USB-HID, а другие используют USB-Serial (см. ссылки ниже).
Ниже будет установлено правило udev, позволяющее любому пользователю читать/записывать значок через USB.
sudo cp 99-led-badge-44x11.rules /etc/udev/rules.d/ sudo udevadm control --reload-rules && sudo udevadm trigger
sudo apt install python3-usb python3-pil
Использование venv позволит использовать pip для установки зависимостей без опасности того, что установленные модули будут мешать установленным в системе. В некоторых системах (особенно в тех, где установлен Python 2 и 3) вам необходимо явно обращаться к Python 3, используя команды python3
/ pip3
вместо python
/ pip
.
sudo apt install python3-venv python -m venv ledtag source ledtag/bin/activate pip install pyhidapi pyusb pillow # this should now work: # python led-badge-11x44.py -m 6 -s 8 "Hello" "World!"
если правила udev установлены, вы сможете получить доступ к значку без привилегий sudo/root.
Чтобы повторно использовать venv позже:
source ledtag/bin/activate python led-badge-11x44.py …
sudo dnf install hidapi python3-hidapi python3-pillow python3-pyusb
В некоторых дистрибутивах существует несоответствие между тем, где pyhidapi ищет библиотеку и где ее размещает пакет hidapi. Простое решение — связать библиотеку с нужным местом, например
ln -s /usr/lib/libhidapi-hidraw.so.0 /usr/local/lib/
В некоторых системах (особенно в тех, где установлены Python 2 и 3) вам необходимо явно обращаться к Python 3, используя команду pip3
вместо pip
.
sudo easy_install pip pip install pyhidapi pip install pillow ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" < /dev/null 2> /dev/null brew install hidapi
Для Windows нам нужно настроить API libusb для устройства светодиодного значка. Описанный здесь способ использует libusb-win32 на довольно низком уровне и в довольно старой версии:
Пожалуйста, используйте версию 1.2.6.0 libusb-win32. Он все еще доступен в репозитории старого проекта на SourceForge.
Затем
Распакуйте загруженный zip-файл и перейдите в каталог libusb-win32-bin-1.2.6.0bin
Щелкните правой кнопкой мыши inf-wizard.exe
и Run as Administrator
Next
-> Выберите 0x0416 0x5020 LS32 Custm HID
(или аналогичный с такими же идентификаторами)
Next
-> Next
-> Сохранить как диалог LS32_Sustm_HID.inf
-> Save
(просто для продолжения, этот файл нам не нужен)
Install Now...
-> Установка драйвера завершена -> OK
Есть и другие способы установки и настройки более новых версий libusb-win32
(пока рекомендуемые, но не проверенные здесь): используйте Zadig (он также доступен из старого репозитория libusb-win32 в репозитории новых выпусков GitHub) или libusbK.
Конечно, нужен Python:
Загрузите последнюю версию Python с сайта python.org или отдельные версии отсюда.
[x]
установить Launcher для всех пользователей
[x]
Добавить Python XY в PATH
Отметьте следующие параметры
Нажмите на текстовое сообщение Install Now ...
.
При желании нажмите на текстовое сообщение «Отключить ограничение длины пути». Это всегда хорошо.
Установите необходимые пакеты Python. В некоторых системах (особенно в тех, где установлены Python 2 и 3) вам необходимо явно обращаться к Python 3, используя команду pip3
вместо pip
.
Запустите cmd.exe от имени администратора, введите:
pip install pyusb pip install pillow
Чтобы запустить эти примеры в Linux, вам, возможно, придется добавить sudo
для доступа к USB-устройству или установить правило udev, как указано выше. В Windows, возможно, вам придется запустить cmd.exe
, где вы вводите команды, с помощью Run as administrator
, что похоже на sudo
в Linux.
В некоторых системах (особенно в тех, где установлены Python 2 и 3) вам необходимо явно обращаться к Python 3, используя python3
вместо python
. Запустите python -V
, чтобы узнать, какая версия Python настроена по умолчанию.
python ./led-badge-11x44.py "Hello World!"
загружает текст «Hello World!» в качестве первого сообщения и прокручивает его справа налево (режим прокрутки по умолчанию = 0) и скорость 4 (по умолчанию). После загрузки устройство один раз отображает первое сообщение и возвращается к экрану зарядки, если оно все еще подключено к USB. Либо вытащите вилку, либо нажмите маленькую кнопку рядом с разъемом USB.
python ./led-badge-11x44.py -m 6 -s 8 "Hello" "World!"
загружает текст «Привет» в качестве первого сообщения и «Мир!» как сообщение второе. Сравните разницу в цитировании с предыдущим примером. Можно загрузить до 8 сообщений. В этом примере используется режим 6, при котором слова с красивой небольшой анимацией размещаются вертикально в области отображения. Скорость здесь установлена на максимум, для плавности.
По умолчанию вы увидите только «Привет». Чтобы просмотреть все сообщения, несколько раз нажмите небольшую кнопку рядом с разъемом USB, пока на короткое время не появится надпись «M1-8». Теперь на дисплее отображаются все загруженные сообщения.
python ./led-badge-11x44.py -m 5 :gfx/fablabnbg_logo_44x11.png:
загружает полноэкранное неподвижное изображение. Избегайте пробелов между двоеточиями и именем. Если вы получили сообщение ImportError: cannot import name '_imaging'
, попробуйте обновить соответствующий пакет: sudo pip install -U pillow
python ./led-badge-11x44.py "I:HEART2:my:gfx/fablab_logo_16x11.png:fablab:1:"
использует одно встроенное и одно загруженное изображение. Сердце встроено, а логотип fablab загружается из файла. Логотип fablab используется дважды: один раз перед словом «fablab» и еще раз после ссылки «:1:» (которая ссылается на первое загруженное изображение).
python ./led-badge-11x44.py -s7 -m0,1 :bicycle: :bicycle_r:
показывает велосипед, пересекающий дисплей слева направо и справа налево (в качестве второго сообщения). Если вы выберете режим «M1-8», велосипед будет постоянно перемещаться вперед и назад по дисплею. Вы можете добавить короткое сообщение к одному или обоим, чтобы создать впечатление, что мотоцикл перетаскивает текст.
python ./led-badge-11-x44.py -b0,1 -s1 -m5 " :heart2: :HEART2:" " :HEART2:"
показывает простую анимацию медленно бьющегося сердца в первом сообщении и мигающего сердца во втором сообщении.
./led-badge-11x44.py -B 50 -m 0 -s 8 "Bonjour à toutes et à tous" "Bienvenu(e)s en Master 2 EEA ISHM" "Ingénierie des systèmes Humains Machines" "Bonne réussite à votre promotion 2023-2024"
python ./led-badge-11x44.py --list-names
печатает список встроенных имен значков, включая :happy: :happy2: ❤️ :HEART: :heart2: :HEART2: :fablab: :bicycle: : Bike_r: :owncloud: ::
python ./led-badge-11x44.py --help
перечисляет все методы записи. На устройство ничего не пишет.
python ./led-badge-11x44.py -M list "dummy message"
выводит список всех устройств, доступных с методом записи «hidapi». На устройство ничего не пишет.
python ./led-badge-11x44.py -M hidapi -D list "dummy message"
программирует конкретное устройство с определенным методом записи.
python ./led-badge-11x44.py -M hidapi -D "3-1:1.0" "Hello World!"
печатает краткую справку:
python ./led-badge-11x44.py -h
использование:lednamebadge.py [-h] [-t ТИП] [-H HID] [-M МЕТОД] [-D DEVICE_ID] [-s СКОРОСТЬ] [-B ЯРКОСТЬ] [-m РЕЖИМ] [-b МИГАЮЩИЙ] [-а МУРАВЬИ] [-l] СООБЩЕНИЕ [СООБЩЕНИЕ...] Загрузите сообщения или графику на светодиодный значок размером 11x44 через USB HID. Версия 0.14 с https://github.com/jnweiger/led-badge-ls32. -- см. здесь дополнительные примеры и обновления. позиционные аргументы: СООБЩЕНИЕ До 8 текстовых сообщений со встроенными значками или загруженные изображения через двоеточия (:) -- См. -l для получения списка встроенные. параметры: -h, --help показать это справочное сообщение и выйти -t TYPE, --type TYPE Тип отображения: поддерживаемые значения: 12x48 или (по умолчанию) 11x44. Переименуйте программу в Lead- значок-12x48, чтобы переключить значение по умолчанию. -H HID, --hid HID Устарело, только для обратной совместимости, пожалуйста используйте -М! Установите значение 1, чтобы обеспечить подключение через HID API. тогда программа не будет использовать библиотеку usb.core. -M МЕТОД, --method МЕТОД Принудительно использовать данный метод записи. Используйте один из «авто», «список» или любой другой список, который печатается. -D DEVICE_ID, --device-id DEVICE_ID Принудительно использовать данный идентификатор устройства, если он неоднозначен. Использовать один из «авто», «список» или любой другой список, который печатается. -s СКОРОСТЬ, --speed СКОРОСТЬ Скорость прокрутки (диапазон 1..8). До 8, разделенных запятыми ценности. -B ЯРКОСТЬ, --brightness ЯРКОСТЬ Яркость дисплея в процентах: 25, 50, 75 или 100. -m РЕЖИМ, --mode РЕЖИМ До 8 значений режима: Прокрутка влево(0) -вправо(1) -вверх(2) -вниз(3); все еще центрирован(4); анимация(5); уронить- вниз(6); занавес(7); лазер(8); См. '--mode-help' для подробнее. -b МИГАЮТ, --blink МИГАЮТ 1: мигает, 0: нормально. До 8, разделенных запятыми ценности. -a ANTS, --ants ANTS 1: анимированная рамка, 0: нормальная. До 8, разделенных запятыми ценности. -l, --list-names — список именованных значков, которые будут вставлены в сообщения и завершены. Пример объединения изображения и текста: sudolednamebadge.py "I:HEART2:ты"
Есть несколько опций, определяющих тип по умолчанию:
lednamebadge.py
напрямую: тип по умолчанию — 11x44
lednamebadge.py
во что-нибудь с 12
(например, badge12.py
) и используйте его: тип по умолчанию — 12x48.
используйтеled led-badge-11x44.py
: тип по умолчанию — 11x44.
используйтеled led-badge-12x48.py
: тип по умолчанию — 12x48.
Для всех этих параметров вы можете переопределить тип по умолчанию с помощью параметра командной строки -t
Существует два варианта управления тем, какое устройство каким методом запрограммировано. На данный момент существует два метода записи: один использует пакет Python pyusb ( libusb
), другой — pyhidapi ( hidapi
).
В зависимости от вашей среды выполнения можно использовать оба метода, но иногда один из них не работает должным образом. Затем вы можете явно выбрать метод, который будет использоваться с опцией -M
. С помощью -M list
вы можете распечатать список доступных методов записи. Если вы подключили несколько устройств, вы можете перечислить их идентификаторы с помощью опции -D list
или указать один из перечисленных идентификаторов устройств для программирования этого конкретного устройства. По умолчанию для обеих опций установлено auto
, при котором программируется только первое найденное устройство, предпочтительно с методом записи hidapi
. Идентификаторы одного и того же устройства различаются в зависимости от метода записи. Кроме того, они могут меняться при запуске компьютера или повторном подключении.
Примеры см. в папке gfx/starfield. Анимация из N кадров предоставляется в виде изображения шириной N*48 пикселей как для устройств шириной 48, так и для 44 пикселей.
Вы можете использоватьlednamebadge.py в качестве модуля в своем собственном коде создания контента для записи сгенерированных сцен на устройство.
создать заголовок
добавить свой собственный контент
написать на устройство
Метод header()
принимает ряд параметров:
до 8 длин в виде кортежа чисел
каждая длина представляет собой количество столбцов байтов для соответствующих данных растрового изображения, то есть количество байтов соответствующих данных растрового изображения, деленное на 11 (для устройств 11x44) и соответственно 12 (для устройств 12x48), где один байт равен 8. пикселей в ширину.
аргументы, сравнимые с аргументами командной строки: до 8 скоростей, режимы, мигающие флаги, муравьиные флаги, каждый в виде кортежа чисел, и (необязательно) яркость в виде числа.
При желании вы можете указать временную метку в виде даты и времени. Он записывается на устройство как часть заголовка, но не отображается на дисплее устройства.
Ваш собственный контент должен представлять собой массив байтов с растровыми данными для всех сцен. Конечно, он должен соответствовать заданной длине.
Для лучшего понимания посмотрите следующий рисунок:
Для устройства 12x48, конечно, для каждого байт-столбца должно быть 12 байт вместо 11.
Пример:
Допустим, у вас есть 2 сцены, одна 11х32 пикселей, другая 11х60 пикселей. Итак, первые имеют 4 байтовых столбца и 44 байта, второй должен быть дополнен 4 пустыми битовыми столбцами в последнем байтовом столбце до размера 11x64 пикселей и, следовательно, имеет 8 байтовых столбцов и 88 байтов.
Нам нравится отображать оба режима в режиме 4: первый со скоростью 3, второй со скоростью 2, а второй будет отображаться с муравьями. И нам нравится устанавливать начальную яркость на 50%.
Это будет достигнуто с помощью следующих вызовов:
из импортаlednamebadge LedNameBadgebuf = array('B')buf.extend(LedNameBadge.header((4, 8), (3, 2), (4,), (0,), (0, 1), 50)) buf.extend(scene_one_bytes)buf.extend(scene_two_bytes)LedNameBadge.write(buf)
В методе write
есть еще два параметра: метод записи и идентификатор устройства. Они работают точно так же, как опции командной строки «-M» и «-D». Оба по умолчанию имеют значение auto
.
LedNameBadge.write(buf, 'libusb', '3:10:2')
Даже с помощью list
вы получаете соответствующий список доступных вариантов, выводимый на стандартный вывод, что менее удобно, если использовать его в качестве модуля. Поэтому существует 2 метода получения этой информации как обычных объектов данных:
get_available_methods()
который возвращает все реализованные методы записи в виде словаря с именами методов в качестве ключей и логическими значениями в качестве значений. Логическое значение указывает, пригоден ли метод в принципе для использования (означает, что соответствующий импорт выполнен успешно).
get_available_device_ids(method)
который возвращает информацию обо всех подключенных/доступных устройствах, а также в виде словаря с идентификаторами устройств в качестве ключей и описательной строкой в качестве значений.
>>> import lednamebadge >>> lednamebadge.LedNameBadge.get_available_methods() {'hidapi': True, 'libusb': True} >>> lednamebadge.LedNameBadge.get_available_methods('hidapi') {'3-6:1.0': 'LSicroelectronics - LS32 Custm HID (if=0)', '3-7.3:1.0': 'LSicroelectronics - LS32 Custm HID (if=0)', '3-1:1.0': 'wch.cn - CH583 (if=0)'} >>> lednamebadge.LedNameBadge.get_available_methods('libusb') {'3:20:1': 'LSicroelectronics - LS32 Custm HID (bus=3 dev=20 endpoint=1)', '3:21:1': 'LSicroelectronics - LS32 Custm HID (bus=3 dev=21 endpoint=1)', '3:18:2': 'wch.cn - CH583 (bus=3 dev=18 endpoint=2)'}
Таким образом, вы можете подключить несколько устройств к одному компьютеру и запрограммировать их одно за другим с разными вызовами для write
.
Если у вас есть несколько устройств с одинаковой строкой описания, трудно отличить, какое реальное устройство к какому идентификатору принадлежит. Особенно после повторного подключения или перезапуска идентификаторы могут измениться или поменяться местами. Если у вас разные шины USB, подключайте к шине только одно устройство. Таким образом, вы можете решить по номеру автобуса. Либо сохранить конкретный порядок подключения (пока компьютер уже работает), тогда можно будет определиться по номеру устройства. Возможно, метод Хидапи немного более надежен. Вам придется немного поэкспериментировать.
Вы также можете использовать генерацию текста/значков/графики этого модуля для получения соответствующих байтовых буферов.
Это довольно просто, как и при использовании командной строки. Существует дополнительная возможность создать растровое изображение только и только из файла изображения, указав имя файла вместо сообщения.
fromlednamebadge import SimpleTextAndIconscreator = SimpleTextAndIcons()scene_a_bitmap = Creator.bitmap("Привет :HEART2: Мир!")scene_b_bitmap = Creator.bitmap("Как вам :gfx/bicycle3.png: нравится...")scene_c_bitmap = Creator.bitmap ("gfx/starfield/starfield_020.png")
Полученные растровые изображения представляют собой кортежи с массивом байтов и длиной каждого. Эти длины можно использовать непосредственно в header(), а массивы байтов можно объединить с заголовком. Пример:
fromlednamebadge import *creator = SimpleTextAndIcons()scene_x_bitmap = create.bitmap("Hello :HEART2: World!")scene_y_bitmap = Creator.bitmap("Впереди полный пример.")your_own_stuff = create_own_bitmap_data()lengths = (scene_x_bitmap[1], Scene_y_bitmap[1], your_own_stuff.len)buf = array('B')buf.extend(LedNameBadge.header(длины, (3,), (0,), (0, 1, 0), (0, 0, 1), 100))buf.extend(scene_x_bitmap[0])buf.extend(scene_y_bitmap[0])buf.extend(your_own_stuff.bytes)LedNameBadge.write(buf)
Вам понадобится PlantUML и, возможно, GraphViz dot для создания диаграмм из файлов *.puml.
Просто запустите plantuml "*.puml"
из каталога photos
чтобы восстановить все диаграммы.
Запустите python run_tests.py
из каталога tests
.
https://github.com/Caerbannog/led-mini-board
http://zunkworks.com/projects/programmablelednamebadges/ (не в сети с 2019 г. По состоянию на 7–2024 г. он все еще доступен на https://web.archive.org)
https://github.com/DirkReiners/LEDBadgeProgrammer
https://bitbucket.org/bartj/led/src
http://www.daveakerman.com/?p=1440
https://github.com/stoggi/ledbadge