Upload-Tool für ein LED-Namensschild mit USB-HID-Schnittstelle
Akzentuierte französische Zeichen hinzugefügt
Die von diesem Projekt unterstützten Typen verfügen über eine Reihe von
44 x 11 LEDs bzw
48 x 12 LEDs.
Der Hersteller ist wahrscheinlich https://lesun-led.en.alibaba.com/
In beiden Konfigurationen identifiziert sich der Badge auf dem USB als
idVendor=0416, idProduct=5020 Mfr=1, Product=2, SerialNumber=0 LSicroelectronics LS32 Custm HID
Es gibt viele verschiedene Versionen von LED-Badges auf dem Markt. Dieses verwendet eine USB-HID-Schnittstelle, während andere USB-Seriell verwenden (siehe Referenzen unten).
Im Folgenden wird eine udev-Regel installiert, die jedem Lese-/Schreibzugriff auf den Badge über USB ermöglicht.
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
Die Verwendung eines venv ermöglicht die Verwendung von pip zum Installieren von Abhängigkeiten, ohne dass die Gefahr besteht, dass die installierten Module die im System installierten Module beeinträchtigen. Auf einigen Systemen (insbesondere denen, auf denen Python 2 und 3 installiert ist) müssen Sie Python 3 explizit ansprechen, indem Sie die Befehle python3
/ pip3
anstelle von python
/ pip
verwenden.
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!"
Wenn die udev-Regeln installiert sind, sollten Sie ohne Sudo-/Root-Rechte auf das Badge zugreifen können.
Um das Venv zu einem späteren Zeitpunkt wiederzuverwenden:
source ledtag/bin/activate python led-badge-11x44.py …
sudo dnf install hidapi python3-hidapi python3-pillow python3-pyusb
Bei einigen Distributionen gibt es eine Diskrepanz darin, wo pyhidapi nach der Bibliothek sucht und wo das Paket hidapi sie ablegt. Eine einfache Lösung besteht darin, die Bibliothek mit dem benötigten Ort zu verknüpfen, z
ln -s /usr/lib/libhidapi-hidraw.so.0 /usr/local/lib/
Auf einigen Systemen (insbesondere denen, auf denen Python 2 und 3 installiert ist) müssen Sie Python 3 explizit ansprechen, indem Sie den Befehl pip3
anstelle von pip
verwenden.
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
Für Windows müssen wir die libusb-API für das LED-Badge-Gerät einrichten. Die hier beschriebene Methode verwendet libusb-win32 auf recht niedrigem Niveau und in einer recht alten Version:
Bitte verwenden Sie Version 1.2.6.0 von „libusb-win32“. Es ist immer noch im alten Projekt-Repo auf SourceForge verfügbar
Dann
Extrahieren Sie die heruntergeladene ZIP-Datei und gehen Sie in das Verzeichnis libusb-win32-bin-1.2.6.0bin
Klicken Sie mit der rechten Maustaste auf inf-wizard.exe
und Run as Administrator
Next
-> Wählen Sie 0x0416 0x5020 LS32 Custm HID
(oder ähnlich mit den gleichen IDs)
Next
-> Next
-> Dialog „Speichern als LS32_Sustm_HID.inf
-> Save
(nur um fortzufahren, wir benötigen diese Datei nicht)
Install Now...
-> Treiberinstallation abgeschlossen -> OK
Es gibt andere – inzwischen empfohlene, aber hier nicht getestete – Möglichkeiten, neuere Versionen von libusb-win32
zu installieren und einzurichten: Verwenden Sie Zadig (es ist auch im alten libusb-win32-Repo auf dem GitHub-Repo neuerer Versionen verfügbar) oder libusbK
Natürlich wird Python benötigt:
Laden Sie die neueste Python-Version von python.org oder bestimmte Versionen hier herunter
[x]
Launcher für alle Benutzer installieren
[x]
Python XY zu PATH hinzufügen
Markieren Sie die folgenden Optionen
Klicken Sie auf die Textnachricht Install Now ...
.
Klicken Sie optional auf die Textnachricht „Pfadlängenbegrenzung deaktivieren“. Das ist immer eine gute Sache.
Installieren Sie die benötigten Python-Pakete. Auf einigen Systemen (insbesondere denen, auf denen Python 2 und 3 installiert ist) müssen Sie Python 3 explizit ansprechen, indem Sie den Befehl pip3
anstelle von pip
verwenden.
Führen Sie cmd.exe als Administrator aus und geben Sie Folgendes ein:
pip install pyusb pip install pillow
Um diese Beispiele unter Linux auszuführen, müssen Sie möglicherweise sudo
für den Zugriff auf das USB-Gerät voranstellen oder eine udev-Regel wie oben beschrieben installieren. Unter Windows müssen Sie möglicherweise cmd.exe
ausführen, in dem Sie die Befehle eingeben, mit Run as administrator
, was dem sudo
unter Linux ähnelt.
Auf einigen Systemen (insbesondere denen, auf denen Python 2 und 3 installiert ist) müssen Sie Python 3 explizit ansprechen, indem Sie python3
anstelle von python
verwenden. Führen Sie python -V
aus, um zu sehen, welche Python-Version als Standard konfiguriert ist.
python ./led-badge-11x44.py "Hello World!"
lädt den Text „Hello World!“ als erste Nachricht und scrollt von rechts nach links (Standard-Bildlaufmodus = 0) und Geschwindigkeit 4 (Standard). Nach einem Upload zeigt das Gerät einmal die erste Meldung an und kehrt zum Ladebildschirm zurück, wenn es noch an USB angeschlossen ist. Ziehen Sie entweder den Stecker oder drücken Sie den kleinen Knopf neben dem USB-Anschluss.
python ./led-badge-11x44.py -m 6 -s 8 "Hello" "World!"
lädt den Text „Hallo“ als Nachricht eins und „Welt!“ als Nachricht zwei. Vergleichen Sie den Unterschied im Zitat mit dem vorherigen Beispiel. Es können bis zu 8 Nachrichten hochgeladen werden. In diesem Beispiel wird Modus 6 verwendet, der die Wörter mit einer netten kleinen Animation vertikal in den Anzeigebereich fallen lässt. Aus Gründen der Laufruhe ist hier die Geschwindigkeit auf Maximum eingestellt.
Standardmäßig wird nur „Hallo“ angezeigt. Um alle Meldungen anzuzeigen, drücken Sie mehrmals die kleine Taste neben dem USB-Anschluss, bis kurz „M1-8“ angezeigt wird. Nun durchläuft die Anzeige alle hochgeladenen Nachrichten.
python ./led-badge-11x44.py -m 5 :gfx/fablabnbg_logo_44x11.png:
lädt ein Vollbild-Standbild. Vermeiden Sie Leerzeichen zwischen Doppelpunkten und Namen. Wenn Sie die Meldung ImportError: cannot import name '_imaging'
erhalten, versuchen Sie, das entsprechende Paket zu aktualisieren: sudo pip install -U pillow
python ./led-badge-11x44.py "I:HEART2:my:gfx/fablab_logo_16x11.png:fablab:1:"
verwendet ein integriertes und ein geladenes Bild. Das Herz ist eingebaut und das Fablab-Logo wird aus der Datei geladen. Das Fablab-Logo wird zweimal verwendet, einmal vor dem Wort „fablab“ und erneut dahinter durch die Referenz „:1:“ (die auf das erste geladene Bild verweist).
python ./led-badge-11x44.py -s7 -m0,1 :bicycle: :bicycle_r:
zeigt ein Fahrrad, das von links nach rechts und von rechts nach links über das Display fährt (als zweite Meldung). Wenn Sie den Modus „M1-8“ wählen, läuft das Fahrrad permanent auf dem Display hin und her. Sie können einer oder beiden eine kurze Nachricht hinzufügen, um den Eindruck zu erwecken, dass das Fahrrad den Text herumzieht.
python ./led-badge-11-x44.py -b0,1 -s1 -m5 " :heart2: :HEART2:" " :HEART2:"
zeigt eine einfache Animation eines langsam schlagenden Herzens in der ersten Nachricht und eines blinkenden Herzens in der zweiten Nachricht.
./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
druckt die Liste der integrierten Symbolnamen, einschließlich :happy: :happy2: ❤️ :HEART: :heart2: :HEART2: :fablab: :bicycle: : Bicycle_r: :owncloud: ::
python ./led-badge-11x44.py --help
listet alle Schreibmethoden auf. Schreibt nichts auf das Gerät.
python ./led-badge-11x44.py -M list "dummy message"
listet alle Geräte auf, die mit der Schreibmethode „hidapi“ verfügbar sind. Schreibt nichts auf das Gerät.
python ./led-badge-11x44.py -M hidapi -D list "dummy message"
Programmiert ein bestimmtes Gerät mit einer bestimmten Schreibmethode.
python ./led-badge-11x44.py -M hidapi -D "3-1:1.0" "Hello World!"
Gibt eine komprimierte Hilfe aus:
python ./led-badge-11x44.py -h
Verwendung: lednamebadge.py [-h] [-t TYPE] [-H HID] [-M METHODE] [-D GERÄTE_ID] [-s GESCHWINDIGKEIT] [-B HELLIGKEIT] [-m MODUS] [-b BLINKEN] [-a ANTS] [-l] NACHRICHT [NACHRICHT ...] Laden Sie Nachrichten oder Grafiken über USB HID auf einen 11x44 LED-Ausweis hoch. Version 0.14 von https://github.com/jnweiger/led-badge-ls32 – Weitere Beispiele und Aktualisierungen finden Sie dort. Positionsargumente: NACHRICHT Bis zu 8 Nachrichtentexte mit eingebetteten integrierten Symbolen oder geladene Bilder innerhalb von Doppelpunkten (:) – Eine Liste finden Sie unter -l Einbauten. Optionen: -h, --help zeigt diese Hilfemeldung an und beendet den Vorgang -t TYPE, --type TYPE Art der Anzeige: Unterstützte Werte sind 12x48 oder (Standard) 11x44. Benennen Sie das Programm um in led- Badge-12x48, um die Standardeinstellung zu ändern. -H HID, --hid HID Veraltet, bitte nur aus Gründen der Abwärtskompatibilität Benutze -M! Auf 1 setzen, um eine Verbindung über die HID-API sicherzustellen. Das Programm wird dann nicht auf die usb.core-Bibliothek zurückgreifen. -M-METHODE, --method-METHODE Erzwingen Sie die Verwendung der angegebenen Schreibmethode. Verwenden Sie entweder „auto“, 'Liste' oder welche Liste auch immer gedruckt wird. -D GERÄTE_ID, --device-id GERÄTE_ID Erzwingen Sie die Verwendung der angegebenen Geräte-ID, wenn diese nicht eindeutig ist. Verwenden entweder „auto“, „list“ oder welche Liste auch immer gedruckt wird. -s GESCHWINDIGKEIT, --speed GESCHWINDIGKEIT Scrollgeschwindigkeit (Bereich 1..8). Bis zu 8 durch Kommas getrennte Zeichen Werte. -B HELLIGKEIT, --brightness HELLIGKEIT Helligkeit für das Display in Prozent: 25, 50, 75, oder 100. -m MODE, --mode MODE Bis zu 8 Moduswerte: Scroll-left(0) -right(1) -up(2) -down(3); still-centered(4); Animation(5); fallen- unten(6); Vorhang(7); Laser(8); Siehe '--mode-help' für Weitere Details. -b BLINKEN, --blink BLINKEN 1: blinkend, 0: normal. Bis zu 8 durch Kommas getrennte Zeichen Werte. -a ANTS, --ants ANTS 1: animierter Rand, 0: normal. Bis zu 8 durch Kommas getrennte Zeichen Werte. -l, --list-names listet benannte Symbole auf, die in Nachrichten eingebettet werden sollen, und wird beendet. Beispiel für die Kombination von Bild und Text: sudo lednamebadge.py „I:HEART2:you“
Es gibt einige Optionen, die den Standardtyp definieren:
Verwenden Sie lednamebadge.py
direkt: Der Standardtyp ist 11x44
Benennen Sie lednamebadge.py
in etwas mit 12
um (z. B. badge12.py
) und verwenden Sie Folgendes: Der Standardtyp ist 12x48
Verwenden Sie led-badge-11x44.py
: Der Standardtyp ist 11x44
Verwenden Sie led-badge-12x48.py
: Der Standardtyp ist 12x48
Für alle diese Optionen können Sie den Standardtyp mit der Befehlszeilenoption -t
überschreiben
Es gibt zwei Möglichkeiten zu steuern, welches Gerät mit welcher Methode programmiert wird. Derzeit gibt es zwei Schreibmethoden: Eine verwendet das Python-Paket pyusb ( libusb
), die andere verwendet pyhidapi ( hidapi
).
Abhängig von Ihrer Ausführungsumgebung können beide Methoden verwendet werden, aber manchmal funktioniert eine davon nicht wie erwartet. Anschließend können Sie mit der Option -M
die zu verwendende Methode explizit auswählen. Mit -M list
können Sie eine Liste der verfügbaren Schreibmethoden ausdrucken. Wenn Sie mehrere Geräte angeschlossen haben, können Sie die IDs mit der Option -D list
auflisten oder eine der aufgelisteten Geräte-IDs angeben, um dieses bestimmte Gerät zu programmieren. Der Standardwert für beide Optionen ist auto
, wodurch nur das erste gefundene Gerät programmiert wird, vorzugsweise mit der Schreibmethode hidapi
. Die IDs für dasselbe Gerät sind je nach Schreibmethode unterschiedlich. Sie können sich auch zwischen Computerstarts oder erneuten Verbindungen ändern.
Beispiele finden Sie im Ordner gfx/starfield. Eine Animation aus N Bildern wird als Bild mit einer Breite von N*48 Pixeln für Geräte mit einer Breite von 48 und 44 Pixeln bereitgestellt.
Sie können lednamebadge.py als Modul in Ihrem eigenen Inhaltserstellungscode verwenden, um Ihre generierten Szenen auf das Gerät zu schreiben.
Erstellen Sie den Header
Fügen Sie Ihre eigenen Inhalte hinzu
Auf Gerät schreiben
Die Methode header()
benötigt eine Reihe von Parametern:
bis zu 8 Längen als Zahlentupel
Jede Länge ist die Anzahl der Byte-Spalten für die entsprechenden Bitmap-Daten, also die Anzahl der Bytes der entsprechenden Bitmap-Daten geteilt durch 11 (für die 11x44-Geräte) bzw. 12 (für die 12x48-Geräte), wobei ein Byte 8 ist Pixel breit.
Argumente vergleichbar mit den Befehlszeilenargumenten: bis zu 8 Geschwindigkeiten, Modi, Blink-Flags, Ameisen-Flags jeweils als Zahlentupel und eine (optionale) Helligkeit als Zahl.
Optional können Sie einen Zeitstempel als Datum/Uhrzeit angeben. Es wird als Teil des Headers auf das Gerät geschrieben, ist aber auf dem Display des Geräts nicht sichtbar.
Ihr eigener Inhalt muss ein Byte-Array mit den Bitmap-Daten für alle Szenen sein. Natürlich muss es zu den vorgegebenen Längen passen.
Zum besseren Verständnis sehen Sie sich die folgende Grafik an:
Bei einem 12x48-Gerät müssen natürlich 12 statt 11 Bytes für jede Byte-Spalte vorhanden sein.
Beispiel:
Nehmen wir an, Sie haben zwei Szenen, eine mit 11 x 32 Pixeln und eine mit 11 x 60 Pixeln. Die erste hat also 4 Byte-Spalten und 44 Bytes, die zweite muss mit 4 leeren Bit-Spalten in der letzten Byte-Spalte auf 11x64 Pixel aufgefüllt werden und hat somit 8 Byte-Spalten und 88 Bytes.
Wir möchten beide im Modus 4 anzeigen, der erste mit Geschwindigkeit 3 und der zweite mit Geschwindigkeit 2 und der zweite soll mit Ameisen angezeigt werden. Und wir stellen die Anfangshelligkeit gerne auf 50 % ein.
Dies würde durch diese Aufrufe erreicht:
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)
Es gibt zwei weitere Parameter für die Methode write
: die Schreibmethode und die Geräte-ID. Sie funktionieren genau wie die Befehlszeilenoptionen „-M“ und „-D“. Beide sind standardmäßig auf auto
eingestellt.
LedNameBadge.write(buf, 'libusb', '3:10:2')
Selbst mit list
erhalten Sie die jeweilige Liste der verfügbaren Auswahlmöglichkeiten auf stdout ausgegeben, was bei Verwendung als Modul weniger praktisch ist. Daher gibt es zwei Methoden zum Abrufen dieser Informationen als normale Datenobjekte:
get_available_methods()
das alle implementierten Schreibmethoden als Diktat mit den Methodennamen als Schlüsseln und jeweils einem Booleschen Wert als Werten zurückgibt. Der boolesche Wert gibt an, ob die Methode grundsätzlich verwendbar ist (bedeutet, dass der entsprechende Import erfolgreich war).
get_available_device_ids(method)
, die Informationen über alle verbundenen/verfügbaren Geräte zurückgibt, auch als Diktat mit den Geräte-IDs als Schlüssel und jeweils einer beschreibenden Zeichenfolge als Werten.
>>> 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)'}
Auf diese Weise können Sie mehrere Geräte an einen Computer anschließen und sie nacheinander mit unterschiedlichen write
programmieren.
Wenn Sie mehr als ein Gerät mit derselben Beschreibungszeichenfolge haben, ist es schwierig zu unterscheiden, welches echte Gerät zu welcher ID gehört. Insb. Nach einer erneuten Verbindung oder einem Neustart können sich die IDs ändern oder austauschen. Wenn Sie unterschiedliche USB-Busse haben, schließen Sie nur ein Gerät an einen Bus an. So können Sie anhand der Busnummer entscheiden. Oder behalten Sie eine bestimmte Verbindungsreihenfolge bei (während der Computer bereits läuft), dann können Sie anhand der Gerätenummer entscheiden. Vielleicht ist die Hidapi-Methode etwas zuverlässiger. Da muss man ein bisschen experimentieren.
Sie können auch die Text-/Symbol-/Grafikgenerierung dieses Moduls verwenden, um die entsprechenden Bytepuffer abzurufen.
Dies ist ganz einfach und ähnelt der Verwendung der Befehlszeile. Es besteht zusätzlich die Möglichkeit, eine Bitmap nur aus einer Bilddatei zu erstellen, indem der Dateiname anstelle einer Nachricht angegeben wird.
from lednamebadge import SimpleTextAndIconscreator = SimpleTextAndIcons()scene_a_bitmap = Creator.bitmap("Hallo :HEART2: World!")scene_b_bitmap = Creator.bitmap("Wie du :gfx/bicycle3.png: magst ...")scene_c_bitmap = Creator.bitmap ("gfx/starfield/starfield_020.png")
Die resultierenden Bitmaps sind Tupel mit jeweils dem Byte-Array und der Länge. Diese Längen können direkt in header() verwendet werden und die Byte-Arrays können mit dem Header verkettet werden. Beispiel:
from lednamebadge import *creator = SimpleTextAndIcons()scene_x_bitmap = Creator.bitmap("Hello :HEART2: World!")scene_y_bitmap = Creator.bitmap("Complete Beispiel voraus.")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)
Sie benötigen PlantUML und möglicherweise GraphViz dot, um die Diagramme aus den *.puml-Dateien zu generieren.
Führen Sie einfach plantuml "*.puml"
aus dem photos
aus, um alle Diagramme neu zu generieren.
Führen Sie python run_tests.py
aus dem tests
aus.
https://github.com/Caerbannog/led-mini-board
http://zunkworks.com/projects/programmablelednamebadges/ (Offline seit 2019. Ab 07.2024 ist es immer noch auf https://web.archive.org verfügbar)
https://github.com/DirkReiners/LEDBadgeProgrammer
https://bitbucket.org/bartj/led/src
http://www.daveakerman.com/?p=1440
https://github.com/stoggi/ledbadge