Herramienta de carga para una etiqueta de nombre LED con interfaz USB-HID
Se agregaron caracteres franceses acentuados.
Los tipos soportados por este proyecto tienen una variedad de
44 x 11 LED o
48 x 12 LED.
El fabricante probablemente sea https://lesun-led.en.alibaba.com/
En ambas configuraciones, la insignia se identifica en el USB como
idVendor=0416, idProduct=5020 Mfr=1, Product=2, SerialNumber=0 LSicroelectronics LS32 Custm HID
Hay muchas versiones diferentes de insignias LED en el mercado. Este usa una interfaz USB-HID, mientras que otros usan USB-Serial (consulte las referencias a continuación).
Lo siguiente instalará una regla udev que permitirá a cualquiera acceder de lectura/escritura a la credencial a través de 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
El uso de un venv permitirá usar pip para instalar dependencias sin el peligro de que los módulos instalados interfieran con los instalados en el sistema. En algunos sistemas (especialmente aquellos con Python 2 y 3 instalado), debe abordar Python 3 explícitamente usando los comandos python3
/ pip3
en lugar de 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!"
Si las reglas de udev están instaladas, debería poder acceder a la insignia sin privilegios sudo/root.
Para reutilizar el venv nuevamente en un momento posterior:
source ledtag/bin/activate python led-badge-11x44.py …
sudo dnf install hidapi python3-hidapi python3-pillow python3-pyusb
Para algunas distribuciones existe una discrepancia entre dónde pyhidapi busca la biblioteca y dónde la coloca el paquete hidapi. Una solución sencilla es vincular la biblioteca al lugar necesario, por ejemplo
ln -s /usr/lib/libhidapi-hidraw.so.0 /usr/local/lib/
En algunos sistemas (especialmente aquellos con Python 2 y 3 instalado), debe abordar Python 3 explícitamente usando el comando pip3
en lugar de 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
Para Windows, necesitamos configurar la API libusb para el dispositivo de placa LED. La forma descrita aquí utiliza libusb-win32 en un nivel bastante bajo y en una versión bastante antigua:
Utilice la versión 1.2.6.0 de 'libusb-win32`. Todavía está disponible en el antiguo repositorio del proyecto en SourceForge.
Entonces
Extraiga el archivo zip descargado y vaya al directorio libusb-win32-bin-1.2.6.0bin
Haga clic derecho en inf-wizard.exe
y Run as Administrator
Next
-> Seleccione 0x0416 0x5020 LS32 Custm HID
(o similar con los mismos ID)
Next
-> Next
-> Guardar como cuadro de diálogo LS32_Sustm_HID.inf
-> Save
(solo para continuar, no necesitamos ese archivo)
Install Now...
-> Instalación del controlador completa -> OK
Hay otras formas (mientras tanto recomendadas, pero no probadas aquí) de instalar y configurar versiones más nuevas de libusb-win32
: use Zadig (también está disponible en el antiguo repositorio de libusb-win32 en el repositorio de GitHub de versiones más recientes) o libusbK
Por supuesto, se necesita Python:
Descargue la última versión de Python desde python.org o versiones específicas desde aquí
[x]
instalar Launcher para todos los usuarios
[x]
Agregar Python XY a la RUTA
Marque las siguientes opciones
Haga clic en el mensaje de texto Install Now ...
Opcionalmente, haga clic en el mensaje de texto "Desactivar límite de longitud de ruta". Siempre es bueno hacer esto.
Instale los paquetes de Python necesarios. En algunos sistemas (especialmente aquellos con Python 2 y 3 instalado), debe abordar Python 3 explícitamente usando el comando pip3
en lugar de pip
.
Ejecute cmd.exe como administrador, ingrese:
pip install pyusb pip install pillow
Para ejecutar estos ejemplos en Linux, es posible que deba anteponer sudo
para acceder al dispositivo USB o instalar una regla udev como se indicó anteriormente. En Windows, tal vez tengas que ejecutar cmd.exe
, donde ingresas los comandos, con Run as administrator
, que es similar al sudo
en Linux.
En algunos sistemas (especialmente aquellos con Python 2 y 3 instalado), debe abordar Python 3 explícitamente usando python3
en lugar de python
. Ejecute python -V
para ver qué versión de Python está configurada como predeterminada.
python ./led-badge-11x44.py "Hello World!"
carga el texto '¡Hola mundo!' como primer mensaje y lo desplaza de derecha a izquierda (modo de desplazamiento predeterminado=0) y velocidad 4 (predeterminado). Después de una carga, el dispositivo muestra el primer mensaje una vez y regresa a la pantalla de carga si aún está conectado al USB. Desconecte el enchufe o presione el botón pequeño al lado del conector USB.
python ./led-badge-11x44.py -m 6 -s 8 "Hello" "World!"
carga el texto 'Hola' como mensaje uno y '¡Mundo!' como mensaje dos. Compare la diferencia al citar con el ejemplo anterior. Se pueden cargar hasta 8 mensajes. Este ejemplo utiliza el modo 6, que coloca las palabras con una pequeña animación vertical en el área de visualización. Aquí la velocidad se establece al máximo para mayor suavidad.
De forma predeterminada, sólo verá "Hola". Para ver todos los mensajes, presione el botón pequeño al lado del conector USB varias veces, hasta que vea brevemente 'M1-8'. Ahora la pantalla recorre todos los mensajes cargados.
python ./led-badge-11x44.py -m 5 :gfx/fablabnbg_logo_44x11.png:
carga una imagen fija en pantalla completa. Evite los espacios en blanco entre los dos puntos y el nombre. Si recibe un mensaje ImportError: cannot import name '_imaging'
, intente actualizar el paquete correspondiente: sudo pip install -U pillow
python ./led-badge-11x44.py "I:HEART2:my:gfx/fablab_logo_16x11.png:fablab:1:"
utiliza una imagen incorporada y una cargada. El corazón está integrado y el logotipo de fablab se carga desde un archivo. El logotipo de fablab se usa dos veces, una antes de la palabra 'fablab' y otra detrás a través de la referencia ':1:' (que hace referencia a la primera imagen cargada).
python ./led-badge-11x44.py -s7 -m0,1 :bicycle: :bicycle_r:
muestra una bicicleta cruzando la pantalla de izquierda a derecha y de derecha a izquierda (como segundo mensaje). Si selecciona el modo 'M1-8', la bicicleta avanza y retrocede permanentemente en la pantalla. Puedes agregar un mensaje corto a uno o a ambos, para que parezca que la bicicleta está moviendo el texto.
python ./led-badge-11-x44.py -b0,1 -s1 -m5 " :heart2: :HEART2:" " :HEART2:"
muestra una animación simple de un corazón que late lentamente en el primer mensaje y un corazón que parpadea en el segundo mensaje.
./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
imprime la lista de nombres de iconos integrados, incluyendo :happy: :happy2: ❤️ :HEART: :heart2: :HEART2: :fablab: :bicycle: : bike_r: :owncloud: ::
python ./led-badge-11x44.py --help
enumera todos los métodos de escritura. No escribe nada en el dispositivo.
python ./led-badge-11x44.py -M list "dummy message"
enumera todos los dispositivos disponibles con el método de escritura 'hidapi'. No escribe nada en el dispositivo.
python ./led-badge-11x44.py -M hidapi -D list "dummy message"
programa un dispositivo específico con un método de escritura específico.
python ./led-badge-11x44.py -M hidapi -D "3-1:1.0" "Hello World!"
imprime alguna ayuda condensada:
python ./led-badge-11x44.py -h
uso: lednamebadge.py [-h] [-t TIPO] [-H HID] [-M MÉTODO] [-D DEVICE_ID] [-s VELOCIDAD] [-B BRILLO] [-m MODO] [-b PARPADEO] [-a HORMIGAS] [-l] MENSAJE [MENSAJE...] Cargue mensajes o gráficos a una placa LED de 11x44 a través de USB HID. Versión 0.14 de https://github.com/jnweiger/led-badge-ls32 - consulte allí para obtener más ejemplos y actualizaciones. argumentos posicionales: MENSAJE Hasta 8 mensajes de texto con íconos integrados incorporados o imágenes cargadas entre dos puntos (:) - Consulte -l para obtener una lista de incorporados. opciones: -h, --help muestra este mensaje de ayuda y sale -t TYPE, --type TYPE Tipo de visualización: los valores admitidos son 12x48 o (predeterminado) 11x44. Cambie el nombre del programa a led- Badge-12x48, para cambiar el valor predeterminado. -H HID, --hid HID En desuso, solo por compatibilidad con versiones anteriores, por favor utilizar -M! Establezca en 1 para garantizar la conexión a través de la API HID. El programa entonces no recurrirá a la biblioteca usb.core. -M MÉTODO, --método MÉTODO Fuerza usando el método de escritura dado. Utilice uno de 'auto', 'lista' o cualquier lista que se esté imprimiendo. -D ID_DISPOSITIVO, --id-dispositivo ID_DISPOSITIVO Fuerce el uso de la identificación del dispositivo proporcionada, si es ambigua. Usar uno de 'auto', 'lista' o cualquier lista que se esté imprimiendo. -s VELOCIDAD, --velocidad VELOCIDAD Velocidad de desplazamiento (rango 1...8). Hasta 8 separados por comas valores. -B BRILLO, --brillo BRILLO Brillo de la pantalla en porcentaje: 25, 50, 75 o 100. -m MODE, --mode MODE Hasta 8 valores de modo: Desplazamiento-izquierda(0) -derecha(1) -arriba(2) -abajo(3); todavía centrado (4); animación(5); gota- abajo(6); cortina(7); láser(8); Consulte '--mode-help' para más detalles. -b PARPADEA, --parpadea PARPADEA 1: parpadeante, 0: normal. Hasta 8 separados por comas valores. -a ANTS, --ants ANTS 1: borde animado, 0: normal. Hasta 8 separados por comas valores. -l, --list-names enumera los iconos con nombre que se incrustarán en los mensajes y saldrán. Ejemplo combinando imagen y texto: sudo lednamebadge.py "I:CORAZÓN2:tú"
Hay algunas opciones que definen el tipo predeterminado:
use lednamebadge.py
directamente: el tipo predeterminado es 11x44
cambie el nombre lednamebadge.py
a algo con 12
(por ejemplo, badge12.py
) y utilícelo: el tipo predeterminado es 12x48
use led-badge-11x44.py
: el tipo predeterminado es 11x44
use led-badge-12x48.py
: el tipo predeterminado es 12x48
Para todas estas opciones, puede anular el tipo predeterminado con la opción de línea de comando -t
Hay dos opciones para controlar qué dispositivo está programado con qué método. En este momento hay dos métodos de escritura: uno usa el paquete de Python pyusb ( libusb
), el otro usa pyhidapi ( hidapi
).
Dependiendo de su entorno de ejecución, se pueden utilizar ambos métodos, pero en ocasiones uno no funciona como se esperaba. Luego puede elegir el método que se utilizará explícitamente con la opción -M
. Con -M list
puede imprimir una lista de métodos de escritura disponibles. Si ha conectado varios dispositivos, puede enumerar los identificadores con la opción -D list
o proporcionar uno de los identificadores de dispositivo enumerados para programar ese dispositivo específico. El valor predeterminado para ambas opciones es auto
, que programa solo el primer dispositivo encontrado preferiblemente con el método de escritura hidapi
. Los ID para el mismo dispositivo son diferentes según el método de escritura. Además, pueden cambiar entre inicios o reconexiones de la computadora.
Consulte la carpeta gfx/starfield para ver ejemplos. Se proporciona una animación de N fotogramas como una imagen de N*48 píxeles de ancho, tanto para dispositivos de 48 como de 44 píxeles de ancho.
Puede utilizar lednamebadge.py como módulo en su propio código de creación de contenido para escribir las escenas generadas en el dispositivo.
crear el encabezado
añade tu propio contenido
escribir al dispositivo
El método header()
toma varios parámetros:
hasta 8 longitudes como una tupla de números
cada longitud es el número de columnas de bytes para los datos de mapa de bits correspondientes, es decir, el número de bytes de los datos de mapa de bits correspondientes dividido por 11 (para los dispositivos de 11x44) y 12 respectivos (para los dispositivos de 12x48), donde un byte es 8 píxeles de ancho.
argumentos comparables a los argumentos de la línea de comando: hasta 8 velocidades, modos, banderas de parpadeo, banderas de hormigas, cada una como tupla de números y un brillo (opcional) como número.
Opcionalmente, puede proporcionar una marca de tiempo como fecha y hora. Está escrito en el dispositivo como parte del encabezado, pero no es visible en la pantalla del dispositivo.
Su propio contenido debe ser una matriz de bytes con los datos del mapa de bits para todas las escenas. Por supuesto, tiene que ajustarse a las longitudes indicadas.
Consulte el siguiente gráfico para una mejor comprensión:
Para un dispositivo de 12x48, tiene que haber 12 bytes por cada columna de bytes en lugar de 11, por supuesto.
Ejemplo:
Digamos que tienes 2 escenas, una de 11x32 píxeles y la otra de 11x60 píxeles. Entonces, el primero tiene 4 columnas de bytes y 44 bytes, el segundo debe rellenarse con 4 columnas de bits vacías en la última columna de bytes a 11x64 píxeles y, por lo tanto, tiene 8 columnas de bytes y 88 bytes.
Nos gusta mostrar ambos en modo 4, el primero con velocidad 3 y el segundo con velocidad 2 y el segundo se mostrará con hormigas. Y nos gusta establecer el brillo inicial al 50%.
Esto se conseguiría mediante estas convocatorias:
de lednamebadge importar LedNameBadgebuf = array('B')buf.extend(LedNameBadge.header((4, 8), (3, 2), (4,), (0,), (0, 1), 50)) buf.extend(escena_un_bytes)buf.extend(escena_dos_bytes)LedNameBadge.write(buf)
Hay dos parámetros más en el método write
: el método de escritura y la identificación del dispositivo. Funcionan exactamente igual que la opción de línea de comando '-M' y '-D'. Ambos están predeterminados en auto
.
LedNameBadge.write(buf, 'libusb', '3:10:2')
Incluso con list
obtiene la lista respectiva de las opciones disponibles impresas en la salida estándar, lo cual es menos útil si se usa como módulo. Por lo tanto, existen 2 métodos para recuperar esta información como objetos de datos normales:
get_available_methods()
que devuelve todos los métodos de escritura implementados como un dict con los nombres de los métodos como claves y un valor booleano cada uno como valor. El booleano indica si el método es básicamente utilizable (significa que la importación correspondiente se realizó correctamente)
get_available_device_ids(method)
que devuelve información sobre todos los dispositivos conectados/disponibles, también como un dictado con los ID del dispositivo como claves y una cadena descriptiva cada uno como valor.
>>> 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)'}
De esta forma podrás conectar varios dispositivos a un ordenador y programarlos uno por otro con diferentes llamadas a write
.
Si tiene más de uno con la misma cadena de descripción, es difícil distinguir qué dispositivo real pertenece a qué identificación. Esp. Después de una reconexión o reinicio, los identificadores pueden cambiar o intercambiarse. Si tiene diferentes buses USB, conecte solo un dispositivo a un bus. Para que puedas decidir por el número de autobús. O mantenga un orden de conexión específico (mientras la computadora ya está funcionando), luego podrá decidir por número de dispositivo. Quizás el método hidapi sea un poco más confiable. Tienes que experimentar un poco.
También puede utilizar la generación de texto/icono/gráfico de este módulo para obtener los buffers de bytes correspondientes.
Esto es bastante simple y similar al uso de la línea de comandos. Existe la opción adicional de crear un mapa de bits sólo a partir de un archivo de imagen proporcionando el nombre del archivo en lugar de un mensaje.
de lednamebadge import SimpleTextAndIconscreator = SimpleTextAndIcons()scene_a_bitmap = creador.bitmap("¡Hola: HEART2: Mundo!")scene_b_bitmap = creador.bitmap("Como tú :gfx/bicycle3.png: me gusta...")scene_c_bitmap = creador.bitmap ("gfx/starfield/starfield_020.png")
Los mapas de bits resultantes son tuplas con la matriz de bytes y la longitud de cada una. Estas longitudes se pueden usar directamente en header() y las matrices de bytes se pueden concatenar al encabezado. Ejemplo:
de lednamebadge import *creator = SimpleTextAndIcons()scene_x_bitmap = Creator.bitmap("¡Hola: HEART2: Mundo!")scene_y_bitmap = Creator.bitmap("Ejemplo completo a continuación.")your_own_stuff = create_own_bitmap_data()lengths = (scene_x_bitmap[1], scene_y_bitmap[1], your_own_stuff.len)buf = matriz('B')buf.extend(LedNameBadge.header(longitudes, (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)
Necesitará PlantUML y potencialmente GraphViz dot para generar los diagramas a partir de los archivos *.puml.
Simplemente ejecute plantuml "*.puml"
desde el directorio photos
para regenerar todos los diagramas.
Ejecute python run_tests.py
desde el directorio tests
.
https://github.com/Caerbannog/led-mini-board
http://zunkworks.com/projects/programmablelednamebadges/ (Sin conexión desde 2019. A partir del 07-2024, todavía está disponible en 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