Ferramenta de upload para um crachá de LED com interface USB-HID
Adicionados caracteres franceses acentuados
Os tipos suportados por este projeto possuem uma variedade de
44 x 11 LEDs ou
48 x 12 LEDs.
O fabricante é provavelmente https://lesun-led.en.alibaba.com/
Em ambas as configurações, o crachá se identifica no USB como
idVendor=0416, idProduct=5020 Mfr=1, Product=2, SerialNumber=0 LSicroelectronics LS32 Custm HID
Existem muitas versões diferentes de emblemas de LED no mercado. Este usa uma interface USB-HID, enquanto outros usam USB-Serial (veja as referências abaixo).
A seguir será instalada uma regra do udev que permitirá a qualquer pessoa acesso de leitura/gravação ao crachá via 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
Usar um venv permitirá usar pip para instalar dependências sem o perigo de os módulos instalados interferirem nos módulos instalados no sistema. Em alguns sistemas (especialmente aqueles com Python 2 e 3 instalados), você deve abordar o Python 3 explicitamente usando os comandos python3
/ pip3
em vez 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!"
se as regras do udev estiverem instaladas, você poderá acessar o crachá sem privilégios sudo/root.
Para reutilizar o venv novamente posteriormente:
source ledtag/bin/activate python led-badge-11x44.py …
sudo dnf install hidapi python3-hidapi python3-pillow python3-pyusb
Para algumas distribuições há uma discrepância entre onde o pyhidapi procura a lib e onde o pacote hidapi a coloca. Uma solução simples é ligar a biblioteca ao local necessário, por exemplo
ln -s /usr/lib/libhidapi-hidraw.so.0 /usr/local/lib/
Em alguns sistemas (especialmente aqueles com Python 2 e 3 instalados), você deve abordar o Python 3 explicitamente usando o comando pip3
em vez 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, precisamos configurar a API libusb para o dispositivo de crachá LED. A forma descrita aqui usa libusb-win32 de forma bastante baixa e em uma versão bastante antiga:
Por favor, use a versão 1.2.6.0 de 'libusb-win32`. Ainda está disponível no antigo repositório do projeto no SourceForge
Então
Extraia o arquivo zip baixado e vá para o diretório libusb-win32-bin-1.2.6.0bin
Clique com o botão direito em inf-wizard.exe
e Run as Administrator
Next
-> Selecione 0x0416 0x5020 LS32 Custm HID
(ou similar com os mesmos IDs)
Next
-> Next
-> Salvar como caixa de diálogo LS32_Sustm_HID.inf
-> Save
(só para prosseguir, não precisamos desse arquivo)
Install Now...
-> Instalação do driver concluída -> OK
Existem outras maneiras - entretanto recomendadas, mas não testadas aqui - de instalar e configurar versões mais recentes do libusb-win32
: use Zadig (também está disponível no antigo repositório libusb-win32 no repositório GitHub de versões mais recentes) ou libusbK
Claro, Python é necessário:
Baixe o python mais recente em python.org ou versões específicas aqui
[x]
instalar o Launcher para todos os usuários
[x]
Adicionar Python XY ao PATH
Marque as seguintes opções
Clique na mensagem de texto Install Now ...
Opcionalmente, clique na mensagem de texto ‘Desativar limite de comprimento do caminho’. Isso é sempre uma boa coisa a fazer.
Instale os pacotes Python necessários. Em alguns sistemas (especialmente aqueles com Python 2 e 3 instalados), você deve abordar o Python 3 explicitamente usando o comando pip3
em vez de pip
.
Execute cmd.exe como administrador, digite:
pip install pyusb pip install pillow
Para executar esses exemplos no Linux, talvez seja necessário acrescentar sudo
para acessar o dispositivo USB ou instalar uma regra do udev conforme indicado acima. No Windows, talvez você tenha que executar o cmd.exe
, onde você insere os comandos, com Run as administrator
, que é semelhante ao sudo
no linux.
Em alguns sistemas (especialmente aqueles com Python 2 e 3 instalados), você deve abordar explicitamente o Python 3 usando python3
em vez de python
. Execute python -V
para ver qual versão do python está configurada como padrão.
python ./led-badge-11x44.py "Hello World!"
carrega o texto 'Olá, mundo!' como a primeira mensagem e rola da direita para a esquerda (modo de rolagem padrão = 0) e velocidade 4 (padrão). Após um upload, o dispositivo mostra a primeira mensagem uma vez e retorna à tela de carregamento se ainda estiver conectado ao USB. Puxe o plugue ou pressione o pequeno botão próximo ao conector USB.
python ./led-badge-11x44.py -m 6 -s 8 "Hello" "World!"
carrega o texto 'Hello' como mensagem um e 'World!' como mensagem dois. Compare a diferença na citação com o exemplo anterior. Até 8 mensagens podem ser carregadas. Este exemplo usa o modo 6, que coloca as palavras com uma pequena animação verticalmente na área de exibição. A velocidade é definida no máximo aqui, para suavidade.
Por padrão, você verá apenas 'Olá'. Para ver todas as mensagens, pressione o pequeno botão próximo ao conector USB várias vezes, até ver brevemente 'M1-8'. Agora a exibição percorre todas as mensagens carregadas.
python ./led-badge-11x44.py -m 5 :gfx/fablabnbg_logo_44x11.png:
carrega uma imagem estática em tela cheia. Evite espaços em branco entre dois pontos e o nome. Se você receber uma mensagem ImportError: cannot import name '_imaging'
, tente atualizar o pacote correspondente: sudo pip install -U pillow
python ./led-badge-11x44.py "I:HEART2:my:gfx/fablab_logo_16x11.png:fablab:1:"
usa uma imagem interna e uma imagem carregada. O coração está integrado e o logotipo do fablab é carregado do arquivo. O logotipo do fablab é usado duas vezes, uma antes da palavra 'fablab' e novamente atrás da referência ':1:' (que faz referência à primeira imagem carregada).
python ./led-badge-11x44.py -s7 -m0,1 :bicycle: :bicycle_r:
mostra uma bicicleta atravessando o display da esquerda para a direita e da direita para a esquerda (como segunda mensagem). Se você selecionar o modo 'M1-8', a bicicleta rodará permanentemente para frente e para trás no display. Você pode adicionar uma mensagem curta a um ou a ambos, para fazer parecer que a bicicleta está puxando o texto.
python ./led-badge-11-x44.py -b0,1 -s1 -m5 " :heart2: :HEART2:" " :HEART2:"
mostra uma animação simples de um coração batendo lentamente na primeira mensagem e um coração piscando na segunda mensagem.
./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 a lista de nomes de ícones integrados, incluindo :happy: :happy2: ❤️ :HEART: :heart2: :HEART2: :fablab: :bicycle: : bike_r: :owncloud: ::
python ./led-badge-11x44.py --help
lista todos os métodos de gravação. Não grava nada no dispositivo.
python ./led-badge-11x44.py -M list "dummy message"
lista todos os dispositivos disponíveis com o método de gravação 'hidapi'. Não grava nada no dispositivo.
python ./led-badge-11x44.py -M hidapi -D list "dummy message"
programa um dispositivo específico com um método de gravação específico.
python ./led-badge-11x44.py -M hidapi -D "3-1:1.0" "Hello World!"
imprime alguma ajuda condensada:
python ./led-badge-11x44.py -h
uso: lednamebadge.py [-h] [-t TIPO] [-H HID] [-M MÉTODO] [-D DEVICE_ID] [-s VELOCIDADE] [-B BRILHO] [-m MODO] [-b PISCAR] [-a FORMIGAS] [-l] MENSAGEM [MENSAGEM...] Carregue mensagens ou gráficos para um crachá LED 11x44 via USB HID. Versão 0.14 de https://github.com/jnweiger/led-badge-ls32 - veja lá para mais exemplos e atualizações. argumentos posicionais: MENSAGEM Até 8 textos de mensagens com ícones integrados ou imagens carregadas entre dois pontos (:) - Veja -l para obter uma lista de embutidos. opções: -h, --help mostra esta mensagem de ajuda e sai -t TYPE, --type TYPE Tipo de exibição: os valores suportados são 12x48 ou (padrão) 11x44. Renomeie o programa para led- badge-12x48, para mudar o padrão. -H HID, --hid HID Obsoleto, apenas para compatibilidade com versões anteriores, por favor use -M! Defina como 1 para garantir a conexão via API HID, o programa não retornará à biblioteca usb.core. -M MÉTODO, --método MÉTODO Forçar usando o método de gravação fornecido. Use um de 'auto', 'lista' ou qualquer lista que esteja sendo impressa. -D DEVICE_ID, --device-id DEVICE_ID Forçar o uso do ID do dispositivo fornecido, se for ambíguo. Usar um de 'auto', 'lista' ou qualquer outra lista que esteja sendo impressa. -s VELOCIDADE, --velocidade VELOCIDADE Velocidade de rolagem (faixa 1 a 8). Até 8 separados por vírgula valores. -B BRILHO, --brilho BRILHO Brilho da tela em porcentagem: 25, 50, 75 ou 100. -m MODE, --mode MODE Até 8 valores de modo: Scroll-left(0) -right(1) -up(2) -baixo(3); ainda centrado(4); animação(5); derrubar- para baixo(6); cortina(7); laser(8); Veja '--mode-help' para mais detalhes. -b PISCAR, --blink PISCAR 1: piscando, 0: normal. Até 8 separados por vírgula valores. -a ANTS, --ants ANTS 1: borda animada, 0: normal. Até 8 separados por vírgula valores. -l, --list-names lista ícones nomeados a serem incorporados em mensagens e saída. Exemplo combinando imagem e texto: sudo lednamebadge.py "I:HEART2:você"
Existem algumas opções que definem o tipo padrão:
use lednamebadge.py
diretamente: o tipo padrão é 11x44
renomeie lednamebadge.py
para algo com 12
(por exemplo, badge12.py
) e use isso: o tipo padrão é 12x48
use led-badge-11x44.py
: o tipo padrão é 11x44
use led-badge-12x48.py
: o tipo padrão é 12x48
Para todas essas opções você pode substituir o tipo padrão com a opção de linha de comando -t
Existem duas opções para controlar qual dispositivo é programado com qual método. No momento, existem dois métodos de gravação: um está usando o pacote python pyusb ( libusb
), o outro está usando pyhidapi ( hidapi
).
Dependendo do seu ambiente de execução, ambos os métodos podem ser usados, mas às vezes um deles não funciona conforme o esperado. Então você pode escolher o método a ser usado explicitamente com a opção -M
. Com -M list
você pode imprimir uma lista de métodos de gravação disponíveis. Se você conectou vários dispositivos, você pode listar os IDs com a opção -D list
ou fornecer um dos IDs de dispositivos listados para programar esse dispositivo específico. O padrão para ambas as opções é auto
, que programa apenas o primeiro dispositivo encontrado preferencialmente com o método de gravação hidapi
. Os IDs do mesmo dispositivo são diferentes dependendo do método de gravação. Além disso, eles podem alternar entre inicializações ou reconexões do computador.
Veja a pasta gfx/starfield para exemplos. Uma animação de N quadros é fornecida como uma imagem de N*48 pixels de largura, para dispositivos de 48 e 44 pixels de largura.
Você pode usar lednamebadge.py como um módulo em seu próprio código de criação de conteúdo para gravar as cenas geradas no dispositivo.
crie o cabeçalho
anexe seu próprio conteúdo
escrever no dispositivo
O método header()
leva vários parâmetros:
até 8 comprimentos como uma tupla de números
cada comprimento é o número de colunas de bytes para os dados de bitmap correspondentes, ou seja, o número de bytes dos dados de bitmap correspondentes dividido por 11 (para os dispositivos 11x44) respectivos 12 (para os dispositivos 12x48), onde um byte é 8 pixels de largura.
argumentos comparáveis aos argumentos da linha de comando: até 8 velocidades, modos, sinalizadores intermitentes, sinalizadores de formigas, cada um como tupla de números e um brilho (opcional) como número.
Opcionalmente, você pode fornecer um carimbo de data/hora como data e hora. Ele é gravado no dispositivo como parte do cabeçalho, mas não é visível na tela do dispositivo.
Seu próprio conteúdo deve ser uma matriz de bytes com os dados bitmap de todas as cenas. Claro, tem que se ajustar aos comprimentos fornecidos.
Veja o gráfico a seguir para melhor compreensão:
Para um dispositivo 12x48 deve haver 12 bytes para cada coluna de bytes em vez de 11, é claro.
Exemplo:
Digamos que você tenha 2 cenas, uma com 11x32 pixels e a outra com 11x60 pixels. Portanto, o primeiro tem 4 colunas de bytes e 44 bytes, o segundo deve ser preenchido com 4 colunas de bits vazias na última coluna de bytes para 11x64 pixels e tem, portanto, 8 colunas de bytes e 88 bytes.
Gostamos de exibir ambos no modo 4, o primeiro com velocidade 3 e o segundo com velocidade 2 e o segundo será exibido com formigas. E gostamos de definir o brilho inicial para 50%.
Isso seria alcançado por estas chamadas:
de lednamebadge importar 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)
Existem mais dois parâmetros no método write
: o método write e o ID do dispositivo. Eles funcionam exatamente como as opções de linha de comando '-M' e '-D'. Ambos são padronizados como auto
.
LedNameBadge.write(buf, 'libusb', '3:10:2')
Mesmo com list
você obtém a respectiva lista das opções disponíveis impressas em stdout, o que é menos útil se usado como um módulo. Portanto, existem 2 métodos para recuperar essas informações como objetos de dados normais:
get_available_methods()
que retorna todos os métodos de gravação implementados como um ditado com os nomes dos métodos como as chaves e um booleano cada como os valores. O booleano indica se o método é basicamente utilizável (significa que a importação correspondente foi bem-sucedida)
get_available_device_ids(method)
que retorna informações sobre todos os dispositivos conectados/disponíveis, também como um ditado com os ids dos dispositivos como chaves e uma string descritiva cada um como valores.
>>> 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)'}
Desta forma você pode conectar vários dispositivos a um computador e programá-los um por outro com diferentes chamadas para write
.
Se você tiver mais de um com a mesma string de descrição, será difícil distinguir qual dispositivo real pertence a qual ID. Esp. após uma reconexão ou reinicialização, os IDs podem mudar ou trocar. Se você tiver barramentos USB diferentes, conecte apenas um dispositivo a cada barramento. Então você pode decidir pelo número do ônibus. Ou mantenha uma ordem de conexão específica (enquanto o computador já estiver funcionando), então você pode decidir pelo número do dispositivo. Talvez o método hidapi seja um pouco mais confiável. Você tem que experimentar um pouco.
Você também pode usar a geração de texto/ícone/gráfico deste módulo para obter os buffers de bytes correspondentes.
Isso é bastante simples e semelhante ao uso da linha de comando. Existe a opção adicional de criar um bitmap apenas e somente a partir de um arquivo de imagem, fornecendo o nome do arquivo em vez de uma mensagem.
from lednamebadge import SimpleTextAndIconscreator = SimpleTextAndIcons()scene_a_bitmap = creator.bitmap("Olá:HEART2: World!")scene_b_bitmap = creator.bitmap("As you :gfx/bicycle3.png: like...")scene_c_bitmap = creator.bitmap ("gfx/starfield/starfield_020.png")
Os bitmaps resultantes são tuplas com a matriz de bytes e o comprimento de cada uma. Esses comprimentos podem ser usados diretamente em header() e as matrizes de bytes podem ser concatenadas ao cabeçalho. Exemplo:
from lednamebadge import *creator = SimpleTextAndIcons()scene_x_bitmap = creator.bitmap("Olá:HEART2: World!")scene_y_bitmap = creator.bitmap("Exemplo completo à frente.")your_own_stuff = create_own_bitmap_data()lengths = (scene_x_bitmap[1], cena_y_bitmap[1], suas_coisas_próprias.len)buf = array('B')buf.extend(LedNameBadge.header(comprimentos, (3,), (0,), (0, 1, 0), (0, 0, 1), 100))buf.extend(scene_x_bitmap [0])buf.extend(scene_y_bitmap[0])buf.extend(suas_coisas.bytes)LedNameBadge.write(buf)
Você precisará do PlantUML e potencialmente do GraphViz para gerar os diagramas a partir dos arquivos *.puml.
Basta executar plantuml "*.puml"
no diretório photos
para regenerar todos os diagramas.
Execute python run_tests.py
no diretório tests
.
https://github.com/Caerbannog/led-mini-board
http://zunkworks.com/projects/programmablelednamebadges/ (off-line desde 2019. Em 07-2024, ainda está disponível em 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