带 USB-HID 接口的 LED 名牌上传工具
添加了强调的法语字符
该项目支持的类型有一系列
44 x 11 LED 或
48 x 12 LED。
制造商可能是 https://lesun-led.en.alibaba.com/
在这两种配置中,徽章在 USB 上将自身标识为
idVendor=0416, idProduct=5020 Mfr=1, Product=2, SerialNumber=0 LSicroelectronics LS32 Custm HID
市场上有许多不同版本的 LED 徽章。该接口使用 USB-HID 接口,而其他接口则使用 USB 串行接口(请参阅下面的参考资料)。
下面将安装一个 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 的系统),您必须使用命令python3
/ pip3
而不是python
/ pip
来显式解决 Python 3 问题。
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 的系统),您必须使用命令pip3
而不是pip
来显式解决 Python 3 问题。
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,我们需要为 LED 徽章设备设置 libusb API。这里描述的方式,以相当低级别的方式和相当旧的版本使用 libusb-win32:
请使用“libusb-win32”版本 1.2.6.0。它仍然可以在 SourceForge 上的旧项目存储库中找到
然后
解压下载的zip文件并进入目录libusb-win32-bin-1.2.6.0bin
右键单击inf-wizard.exe
并Run as Administrator
Next
-> 选择0x0416 0x5020 LS32 Custm HID
(或具有相同 ID 的类似项)
Next
-> Next
-> 另存为对话框LS32_Sustm_HID.inf
-> Save
(只是为了继续,我们不需要该文件)
Install Now...
-> 驱动程序安装完成 -> OK
还有其他 - 同时推荐,但未经测试 - 安装和设置较新版本的libusb-win32
的方法:使用 Zadig (也可以从较新版本的 GitHub 存储库上的旧 libusb-win32 存储库中获得)或 libusbK
当然需要Python:
从 python.org 下载最新的 python,或从这里下载特定版本
[x]
为所有用户安装启动器
[x]
将 Python XY 添加到 PATH
勾选以下选项
单击Install Now ...
文本消息。
(可选)单击“禁用路径长度限制”文本消息。这总是一件好事。
安装所需的 Python 包。在某些系统上(尤其是安装了 Python 2和3 的系统),您必须使用命令pip3
而不是pip
来显式解决 Python 3 问题。
以管理员身份运行cmd.exe,输入:
pip install pyusb pip install pillow
要在 Linux 上运行这些示例,您可能必须在前面添加sudo
以访问 USB 设备或安装如上所述的 udev 规则。在 Windows 上,也许您必须运行cmd.exe
,在其中输入命令,并Run as administrator
,这类似于 Linux 上的sudo
。
在某些系统上(尤其是安装了 Python 2和3 的系统),您必须使用python3
而不是python
来显式解决 Python 3 问题。运行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!"
加载文本“Hello”作为消息一和“World!”作为消息二。比较引用与前面示例的差异。最多可以上传 8 条消息。此示例使用模式 6,它将带有漂亮小动画的单词垂直放入显示区域。为了流畅,速度在这里设置为最大。
默认情况下,您只会看到“Hello”。要查看所有消息,请多次按 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-logo 是从文件中加载的。 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 TYPE] [-H HID] [-M METHOD] [-D DEVICE_ID] [-s 速度] [-B 亮度] [-m 模式] [-b 闪烁] [-a 蚂蚁] [-l] 留言[留言...] 通过 USB HID 将消息或图形上传到 11x44 led 徽章。 版本 0.14 来自 https://github.com/jnweiger/led-badge-ls32 -- 请参阅此处以获取更多示例和更新。 位置参数: 消息 最多 8 条消息文本,带有嵌入的内置图标或 冒号内加载的图像(:) -- 请参阅 -l 以获取列表 内置函数。 选项: -h, --help 显示此帮助消息并退出 -t TYPE, --type TYPE 显示类型:支持的值为 12x48 或 (默认)11x44。将程序重命名为 led- badge-12x48,切换默认值。 -H HID, --hid HID 已弃用,仅用于向后兼容,请 使用-M!设置为 1 以确保通过 HID API 连接, 然后程序将不会回退到 usb.core 库。 -M方法,--方法方法 强制使用给定的写入方法。使用“自动”之一, “列表”或任何正在打印的列表。 -D DEVICE_ID, --device-id DEVICE_ID 如果不明确,则强制使用给定的设备 ID。使用 “auto”、“list”或任何正在打印的列表之一。 -s 速度, --速度 速度 滚动速度(范围 1..8)。最多 8 个逗号分隔 价值观。 -B 亮度, --亮度 亮度 显示屏亮度百分比:25、50、75 或 100. -m MODE, --mode MODE 最多 8 个模式值:向左滚动(0) -向右滚动(1) -向上滚动(2) -向下(3);仍然居中(4);动画(5);降低- 向下(6);窗帘(7);激光(8);请参阅“--mode-help” 更多细节。 -b 闪烁, --闪烁 闪烁 1:闪烁,0:正常。最多 8 个逗号分隔 价值观。 -a ANTS, --ants ANTS 1:动画边框,0:正常。最多 8 个逗号分隔 价值观。 -l, --list-names 列出要嵌入消息中的命名图标并退出。 结合图像和文本的示例: sudo lednamebadge.py“我:HEART2:你”
有一些定义默认类型的选项:
直接使用lednamebadge.py
:默认类型为11x44
将lednamebadge.py
重命名为12
(例如badge12.py
)并使用它:默认类型为 12x48
使用led-badge-11x44.py
:默认类型为 11x44
使用led-badge-12x48.py
:默认类型为 12x48
对于所有这些选项,您可以使用命令行选项-t
覆盖默认类型
有两个选项可以控制使用哪种方法对哪个设备进行编程。此时有两种写入方法:一种是使用python包pyusb( libusb
),另一种是使用pyhidapi( hidapi
)。
根据您的执行环境,这两种方法都可以使用,但有时其中一种方法无法按预期工作。然后您可以使用选项-M
选择要显式使用的方法。使用-M list
您可以打印可用写入方法的列表。如果您连接了多个设备,您可以使用选项-D list
列出 id,或者给出列出的设备 id 之一来对该特定设备进行编程。这两个选项的默认值都是auto
,它仅对找到的第一个设备进行编程,最好使用 write 方法hidapi
。同一设备的ID根据写入方式的不同而不同。此外,它们还可以在计算机启动或重新连接之间进行更改。
有关示例,请参阅 gfx/starfield 文件夹。对于 48 和 44 像素宽的设备,N 帧的动画作为 N*48 像素宽的图像提供。
您可以使用 lednamebadge.py 作为您自己的内容创建代码中的模块,以将生成的场景写入设备。
创建标题
附加您自己的内容
写入设备
header()
方法采用多个参数:
最多 8 个长度的数字元组
每个长度是对应位图数据的字节列数,即对应位图数据的字节数除以 11(对于 11x44 设备)或 12(对于 12x48 设备),其中一个字节为 8像素宽。
与命令行参数相当的参数:最多 8 个速度、模式、闪烁标志、蚂蚁标志,每个都是数字元组,以及(可选)亮度作为数字。
或者,您可以将时间戳指定为日期时间。它作为标头的一部分写入设备,但在设备显示屏上不可见。
您自己的内容必须是一个字节数组,其中包含所有场景的位图数据。当然,它必须符合给定的长度。
请参阅下图以更好地理解:
当然,对于 12x48 设备,每个字节列必须有 12 个字节,而不是 11 个。
例子:
假设您有 2 个场景,一个是 11x32 像素,一个是 11x60 像素。因此,第一个具有 4 个字节列和 44 个字节,第二个必须在最后一个字节列中用 4 个空位列填充到 11x64 像素,因此具有 8 个字节列和 88 个字节。
我们喜欢在模式 4 下显示,第一个速度为 3,第二个速度为 2,第二个将显示蚂蚁。我们喜欢将初始亮度设置为 50%。
这可以通过以下调用来实现:
from lednamebadge import 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
方法还有两个参数:写入方法和设备 ID。它们的工作方式与命令行选项“-M”和“-D”完全相同。两者都默认为auto
。
LedNameBadge.write(buf, 'libusb', '3:10:2')
即使使用list
您也可以将可用选项的相应列表打印到标准输出,如果用作模块,则不太方便。因此,有两种方法可以将此信息作为普通数据对象检索:
get_available_methods()
它将所有实现的写入方法作为字典返回,其中方法名称作为键,每个布尔值作为值。 boolean表示该方法是否基本可用(表示对应导入成功)
get_available_device_ids(method)
返回有关所有已连接/可用设备的信息,也作为一个字典,其中设备 id 作为键,描述性字符串作为值。
>>> 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
调用逐个对它们进行编程。
如果有多个具有相同描述字符串的设备,则很难区分哪个真实设备属于哪个 id。特别是。重新连接或重新启动后,ID 可能会更改或交换。如果您有不同的 USB 总线,请仅将一个设备连接到总线。所以你可以根据巴士号码来决定。或者保留特定的连接顺序(当计算机已经运行时),然后您可以通过设备编号来决定。也许hidapi方法更可靠一点。你必须尝试一下。
您还可以使用该模块的文本/图标/图形生成来获取相应的字节缓冲区。
这非常简单,就像命令行用法一样。还有一个附加选项可以通过提供文件名而不是消息来仅从图像文件创建位图。
from lednamebadge import SimpleTextAndIconscreator = SimpleTextAndIcons()scene_a_bitmap = Creator.bitmap("Hello :HEART2: World!")scene_b_bitmap = Creator.bitmap("正如你:gfx/bicycle3.png: 就像...")scene_c_bitmap = Creator.bitmap (“gfx/starfield/starfield_020.png”)
生成的位图是带有字节数组和长度的元组。这些长度可以直接在 header() 中使用,并且字节数组可以连接到标头。例子:
from lednamebadge import *creator = SimpleTextAndIcons()scene_x_bitmap = Creator.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 文件生成图表。
只需从photos
目录运行plantuml "*.puml"
即可重新生成所有图表。
从tests
目录运行python run_tests.py
。
https://github.com/Caerbannog/led-mini-board
http://zunkworks.com/projects/programmablelednamebadges/(自 2019 年起离线。截至 2024 年 7 月,仍可在 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