Outil de téléchargement pour une étiquette nominative LED avec interface USB-HID
Ajout de caractères français accentués
Les types pris en charge par ce projet ont un éventail de
44 x 11 LED ou
48x12 LED.
Le fabricant est probablement https://lesun-led.en.alibaba.com/
Dans les deux configurations, le badge s'identifie sur la clé USB comme
idVendor=0416, idProduct=5020 Mfr=1, Product=2, SerialNumber=0 LSicroelectronics LS32 Custm HID
Il existe de nombreuses versions différentes de badges LED sur le marché. Celui-ci utilise une interface USB-HID, tandis que d'autres utilisent USB-Série (voir références ci-dessous).
Ce qui suit installera une règle udev permettant à quiconque d'accéder en lecture/écriture au badge 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
L'utilisation d'un venv permettra d'utiliser pip pour installer des dépendances sans risquer que les modules installés interfèrent avec ceux installés sur le système. Sur certains systèmes (en particulier ceux sur lesquels Python 2 et 3 sont installés), vous devez aborder Python 3 explicitement en utilisant les commandes python3
/ pip3
au lieu 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 les règles udev sont installées, vous devriez pouvoir accéder au badge sans les privilèges sudo/root.
Pour réutiliser le venv ultérieurement :
source ledtag/bin/activate python led-badge-11x44.py …
sudo dnf install hidapi python3-hidapi python3-pillow python3-pyusb
Pour certaines distributions, il existe une différence entre l'endroit où pyhidapi recherche la bibliothèque et l'endroit où le package hidapi la place. Une solution simple consiste à relier la bibliothèque à l'endroit souhaité, par exemple
ln -s /usr/lib/libhidapi-hidraw.so.0 /usr/local/lib/
Sur certains systèmes (en particulier ceux sur lesquels Python 2 et 3 sont installés), vous devez adresser explicitement Python 3 en utilisant la commande pip3
au lieu 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
Pour Windows, nous devons configurer l'API libusb pour le périphérique de badge LED. La méthode décrite ici utilise libusb-win32 de manière assez bas et dans une version assez ancienne :
Veuillez utiliser la version 1.2.6.0 de « libusb-win32 ». Il est toujours disponible sur l'ancien dépôt de projet sur SourceForge
Alors
Extrayez le fichier zip téléchargé et accédez au répertoire libusb-win32-bin-1.2.6.0bin
Faites un clic droit sur inf-wizard.exe
et Run as Administrator
Next
-> Sélectionnez 0x0416 0x5020 LS32 Custm HID
(ou similaire avec les mêmes identifiants)
Next
-> Next
-> Boîte de dialogue Enregistrer sous LS32_Sustm_HID.inf
-> Save
(juste pour continuer, nous n'avons pas besoin de ce fichier)
Install Now...
-> Installation du pilote terminée -> OK
Il existe d'autres façons - entre-temps recommandées, mais non testées ici - d'installer et de configurer des versions plus récentes de libusb-win32
: utilisez Zadig (il est également disponible à partir de l'ancien dépôt libusb-win32 sur le dépôt GitHub des versions plus récentes) ou libusbK
Bien sûr, Python est nécessaire :
Téléchargez le dernier python depuis python.org ou des versions spécifiques à partir d'ici
[x]
installer le lanceur pour tous les utilisateurs
[x]
Ajouter Python XY au CHEMIN
Cochez les options suivantes
Cliquez sur le message texte Install Now ...
Cliquez éventuellement sur le message texte « Désactiver la limite de longueur du chemin ». C'est toujours une bonne chose à faire.
L'installation nécessitait les packages Python. Sur certains systèmes (en particulier ceux sur lesquels Python 2 et 3 sont installés), vous devez adresser explicitement Python 3 en utilisant la commande pip3
au lieu de pip
.
Exécutez cmd.exe en tant qu'administrateur, saisissez :
pip install pyusb pip install pillow
Pour exécuter ces exemples sous Linux, vous devrez peut-être ajouter sudo
pour accéder au périphérique USB ou installer une règle udev comme indiqué ci-dessus. Sous Windows, vous devrez peut-être exécuter le cmd.exe
, où vous entrez les commandes, avec Run as administrator
, qui est similaire au sudo
sous Linux.
Sur certains systèmes (en particulier ceux sur lesquels Python 2 et 3 sont installés), vous devez aborder Python 3 explicitement en utilisant python3
au lieu de python
. Exécutez python -V
pour voir quelle version de python est configurée par défaut.
python ./led-badge-11x44.py "Hello World!"
charge le texte « Hello World ! » comme premier message, et le fait défiler de droite à gauche (mode de défilement par défaut = 0) et vitesse 4 (par défaut). Après un téléchargement, l'appareil affiche une fois le premier message et revient à l'écran de chargement s'il est toujours connecté au port USB. Retirez la fiche ou appuyez sur le petit bouton à côté du connecteur USB.
python ./led-badge-11x44.py -m 6 -s 8 "Hello" "World!"
charge le texte « Bonjour » comme premier message et « Monde ! » comme message deux. Comparez la différence entre les citations et l’exemple précédent. Jusqu'à 8 messages peuvent être téléchargés. Cet exemple utilise le mode 6, qui dépose les mots avec une jolie petite animation verticalement dans la zone d'affichage. La vitesse est ici réglée au maximum, pour plus de douceur.
Par défaut, vous ne verrez que « Bonjour ». Pour voir tous les messages, appuyez plusieurs fois sur le petit bouton à côté du connecteur USB, jusqu'à ce que vous voyiez brièvement « M1-8 ». L'affichage parcourt désormais tous les messages téléchargés.
python ./led-badge-11x44.py -m 5 :gfx/fablabnbg_logo_44x11.png:
charge une image fixe en plein écran. Évitez les espaces entre les deux-points et le nom. Si vous recevez un message ImportError: cannot import name '_imaging'
, essayez de mettre à jour le package correspondant : sudo pip install -U pillow
python ./led-badge-11x44.py "I:HEART2:my:gfx/fablab_logo_16x11.png:fablab:1:"
utilise une image intégrée et une image chargée. Le cœur est intégré et le logo du fablab est chargé à partir d'un fichier. Le logo du fablab est utilisé deux fois, une fois avant le mot « fablab » et une autre fois derrière la référence « : 1 : » (qui fait référence à la première image chargée).
python ./led-badge-11x44.py -s7 -m0,1 :bicycle: :bicycle_r:
montre un vélo traversant l'écran de gauche à droite et de droite à gauche (comme deuxième message). Si vous sélectionnez le mode « M1-8 », le vélo parcourt en permanence l'écran. Vous pouvez ajouter un court message à l'un ou aux deux, pour donner l'impression que le vélo tire le texte.
python ./led-badge-11-x44.py -b0,1 -s1 -m5 " :heart2: :HEART2:" " :HEART2:"
montre une animation simple d'un cœur battant lentement sur le premier message et d'un cœur clignotant sur le deuxième message.
./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 liste des noms d'icônes intégrées, y compris :happy: :happy2: ❤️ :HEART: :heart2: :HEART2: :fablab: :bicycle: : cycling_r: :owncloud: ::
python ./led-badge-11x44.py --help
répertorie toutes les méthodes d’écriture. N'écrit rien sur l'appareil.
python ./led-badge-11x44.py -M list "dummy message"
répertorie tous les appareils disponibles avec la méthode d'écriture 'hidapi'. N'écrit rien sur l'appareil.
python ./led-badge-11x44.py -M hidapi -D list "dummy message"
programme un périphérique spécifique avec une méthode d'écriture spécifique.
python ./led-badge-11x44.py -M hidapi -D "3-1:1.0" "Hello World!"
affiche une aide condensée :
python ./led-badge-11x44.py -h
utilisation : lednamebadge.py [-h] [-t TYPE] [-H HID] [-M METHOD] [-D DEVICE_ID] [-s VITESSE] [-B LUMINOSITÉ] [-m MODE] [-b CLIGNOTEMENT] [-a FOURMIS] [-l] MESSAGES [MESSAGES...] Téléchargez des messages ou des graphiques sur un badge LED 11x44 via USB HID. Version 0.14 de https://github.com/jnweiger/led-badge-ls32 -- voir ici pour plus d'exemples et pour des mises à jour. arguments de position : MESSAGE Jusqu'à 8 textes de message avec icônes intégrées intégrées ou images chargées entre deux points (:) -- Voir -l pour une liste de intégrés. choix : -h, --help afficher ce message d'aide et quitter -t TYPE, --type TYPE Type d'affichage : les valeurs prises en charge sont 12x48 ou (par défaut) 11x44. Renommez le programme en led- badge-12x48, pour changer la valeur par défaut. -H HID, --hid HID Obsolète, uniquement pour des raisons de compatibilité ascendante, veuillez utilisez -M ! Réglé sur 1 pour garantir la connexion via l'API HID, le programme ne reviendra alors pas à la bibliothèque usb.core. -M MÉTHODE, --méthode MÉTHODE Forcer en utilisant la méthode d'écriture donnée. Utilisez l'un des "auto", 'liste' ou quelle que soit la liste en cours d'impression. -D DEVICE_ID, --device-id DEVICE_ID Forcer l'utilisation de l'identifiant de périphérique donné, s'il est ambigu. Utiliser l'un des éléments suivants : "auto", "liste" ou toute autre liste en cours d'impression. -s VITESSE, --speed VITESSE Vitesse de défilement (plage 1..8). Jusqu'à 8 séparés par des virgules valeurs. -B LUMINOSITÉ, --luminosité LUMINOSITÉ Luminosité de l'écran en pourcentage : 25, 50, 75 ou 100. -m MODE, --mode MODE Jusqu'à 8 valeurs de mode : Défilement-gauche(0) -droite(1) -haut(2) -vers le bas(3); toujours centré(4); animations(5); baisse- vers le bas(6); rideau(7); laser(8); Voir '--mode-help' pour plus de détails. -b CLIGNOTANT, --blink CLIGNOTEMENT 1 : clignotant, 0 : normal. Jusqu'à 8 séparés par des virgules valeurs. -a FOURMIS, --ants FOURMIS 1 : bordure animée, 0 : normale. Jusqu'à 8 séparés par des virgules valeurs. -l, --list-names liste les icônes nommées à intégrer dans les messages et quitte. Exemple combinant image et texte : sudo lednamebadge.py "I: HEART2: vous"
Il existe quelques options définissant le type par défaut :
utilisez directement lednamebadge.py
: le type par défaut est 11x44
renommez lednamebadge.py
en quelque chose avec 12
(par exemple badge12.py
) et utilisez-le : le type par défaut est 12x48
utilisez led-badge-11x44.py
: le type par défaut est 11x44
utilisez led-badge-12x48.py
: le type par défaut est 12x48
Pour toutes ces options, vous pouvez remplacer le type par défaut avec l'option de ligne de commande -t
Il existe deux options pour contrôler quel appareil est programmé avec quelle méthode. À l'heure actuelle, il existe deux méthodes d'écriture : l'une utilise le package python pyusb ( libusb
), l'autre utilise pyhidapi ( hidapi
).
En fonction de votre environnement d'exécution, les deux méthodes peuvent être utilisées, mais parfois l'une d'entre elles ne fonctionne pas comme prévu. Ensuite, vous pouvez choisir la méthode à utiliser explicitement avec l'option -M
. Avec -M list
vous pouvez imprimer une liste des méthodes d'écriture disponibles. Si vous avez connecté plusieurs appareils, vous pouvez répertorier les identifiants avec l'option -D list
ou donner l'un des identifiants d'appareil répertoriés pour programmer cet appareil spécifique. La valeur par défaut pour les deux options est auto
, qui programme uniquement le premier périphérique trouvé avec de préférence la méthode d'écriture hidapi
. Les ID d'un même périphérique sont différents selon la méthode d'écriture. En outre, ils peuvent changer entre les démarrages ou les reconnexions de l'ordinateur.
Voir le dossier gfx/starfield pour des exemples. Une animation de N images est fournie sous la forme d'une image de largeur N*48 pixels, pour les appareils de 48 et 44 pixels de largeur.
Vous pouvez utiliser lednamebadge.py comme module dans votre propre code de création de contenu pour écrire vos scènes générées sur l'appareil.
créer l'en-tête
ajouter votre propre contenu
écrire sur l'appareil
La méthode header()
prend un certain nombre de paramètres :
jusqu'à 8 longueurs sous forme de tuple de nombres
chaque longueur est le nombre de colonnes d'octets pour les données bitmap correspondantes, c'est-à-dire le nombre d'octets des données bitmap correspondantes divisé par 11 (pour les appareils 11x44) respectivement 12 (pour les appareils 12x48), où un octet vaut 8 pixels de large.
arguments comparables aux arguments de la ligne de commande : jusqu'à 8 vitesses, modes, drapeaux clignotants, drapeaux de fourmis chacun sous forme de tuple de nombres et une luminosité (facultatif) sous forme de nombre.
En option, vous pouvez donner un horodatage comme datetime. Il est écrit sur l'appareil dans le cadre de l'en-tête, mais n'est pas visible sur l'écran de l'appareil.
Votre propre contenu doit être un tableau d'octets contenant les données bitmap de toutes les scènes. Bien entendu, il doit correspondre aux longueurs données.
Consultez le graphique suivant pour une meilleure compréhension :
Pour un périphérique 12x48, il doit y avoir 12 octets pour chaque colonne d'octets au lieu de 11, bien sûr.
Exemple:
Disons que vous avez 2 scènes, l'une de 11 x 32 pixels, l'autre de 11 x 60 pixels. Ainsi, le premier a 4 colonnes d'octets et 44 octets, le second doit être complété par 4 colonnes de bits vides dans la dernière colonne d'octets à 11x64 pixels et a donc 8 colonnes d'octets et 88 octets.
Nous aimons afficher les deux en mode 4, le premier avec la vitesse 3 et le second avec la vitesse 2 et le second sera affiché avec des fourmis. Et nous aimons régler la luminosité initiale à 50 %.
Cet objectif serait atteint grâce à ces appels :
à partir de 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)
Il y a deux autres paramètres sur la méthode write
: la méthode d'écriture et l'identifiant du périphérique. Ils fonctionnent exactement comme les options de ligne de commande « -M » et « -D ». Les deux sont par défaut auto
.
LedNameBadge.write(buf, 'libusb', '3:10:2')
Même avec list
vous obtenez la liste respective des choix disponibles imprimée sur la sortie standard, ce qui est moins pratique si elle est utilisée comme module. Par conséquent, il existe 2 méthodes pour récupérer ces informations sous forme d’objets de données normaux :
get_available_methods()
qui renvoie toutes les méthodes d'écriture implémentées sous forme de dict avec les noms de méthodes comme clés et un booléen chacune comme valeurs. Le booléen indique si la méthode est fondamentalement utilisable (signifie que l'import correspondant a réussi)
get_available_device_ids(method)
qui renvoie des informations sur tous les appareils connectés/disponibles, également sous forme de dict avec les identifiants des appareils comme clés et une chaîne descriptive chacun comme valeurs.
>>> 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 cette façon, vous pouvez connecter plusieurs appareils à un ordinateur et les programmer les uns par les autres avec différents appels à write
.
Si vous en avez plusieurs avec la même chaîne de description, il est difficile de distinguer quel appareil réel appartient à quel identifiant. Esp. après une reconnexion ou un redémarrage, les identifiants peuvent changer ou échanger. Si vous disposez de différents bus USB, connectez un seul appareil à un bus. Vous pouvez donc décider par numéro de bus. Ou conservez un ordre de connexion spécifique (pendant que l'ordinateur est déjà en cours d'exécution), vous pourrez alors décider par numéro de périphérique. Peut-être que la méthode hidapi est un peu plus fiable. Il faut expérimenter un peu.
Vous pouvez également utiliser la génération texte/icône/graphique de ce module pour obtenir les tampons d'octets correspondants.
C'est assez simple et tout comme pour l'utilisation de la ligne de commande. Il existe une option supplémentaire permettant de créer un bitmap uniquement à partir d'un fichier image en donnant le nom du fichier au lieu d'un message.
from lednamebadge import SimpleTextAndIconscreator = SimpleTextAndIcons()scene_a_bitmap = Creator.bitmap("Bonjour :HEART2: World!")scene_b_bitmap = Creator.bitmap("Comme vous :gfx/bicycle3.png: like...")scene_c_bitmap = Creator.bitmap ("gfx/starfield/starfield_020.png")
Les bitmaps résultants sont des tuples avec le tableau d'octets et la longueur chacun. Ces longueurs peuvent être utilisées directement dans header() et les tableaux d'octets peuvent être concaténés à l'en-tête. Exemple:
depuis l'importation de lednamebadge *creator = SimpleTextAndIcons()scene_x_bitmap = Creator.bitmap("Bonjour :HEART2: World!")scene_y_bitmap = Creator.bitmap("Exemple complet à venir.")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(lengths, (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)
Vous aurez besoin de PlantUML et potentiellement de GraphViz dot pour générer les diagrammes à partir des fichiers *.puml.
Exécutez simplement plantuml "*.puml"
depuis le répertoire photos
pour régénérer tous les diagrammes.
Exécutez python run_tests.py
à partir du répertoire tests
.
https://github.com/Caerbannog/led-mini-board
http://zunkworks.com/projects/programmablelednamebadges/ (Hors ligne depuis 2019. Depuis 07-2024, il est toujours disponible sur 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