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-シリアルを使用します (以下の参考資料を参照)。
以下は、誰でも USB 経由でバッジへの読み取り/書き込みアクセスを許可する udev ルールをインストールします。
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 がインストールされているシステム) では、 python
/ pip
の代わりにコマンドpython3
/ pip3
を使用して、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 がインストールされているシステム) では、 pip
の代わりにコマンドpip3
使用して 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 を python.org からダウンロードするか、特定のバージョンをここからダウンロードします
[x]
すべてのユーザーにランチャーをインストールします
[x]
Python XYをPATHに追加します
次のオプションにチェックマークを付けます
Install Now ...
テキストメッセージをクリックします。
必要に応じて、「パスの長さ制限を無効にする」テキスト メッセージをクリックします。これは常に良いことです。
必要な Python パッケージをインストールします。一部のシステム (特に Python 2および3 がインストールされているシステム) では、 pip
の代わりにコマンドpip3
使用して Python 3 を明示的に指定する必要があります。
cmd.exe を管理者として実行し、次のように入力します。
pip install pyusb pip install pillow
これらの例を Linux で実行するには、USB デバイスにアクセスするためにsudo
先頭に追加するか、上記のように udev ルールをインストールする必要がある場合があります。 Windows では、コマンドを入力するcmd.exe
Run as administrator
で実行する必要がある場合があります。これは、Linux のsudo
に似ています。
一部のシステム (特に Python 2および3 がインストールされているシステム) では、 python
の代わりにpython3
使用して Python 3 を明示的に指定する必要があります。 python -V
を実行して、どのバージョンの Python がデフォルトとして構成されているかを確認します。
python ./led-badge-11x44.py "Hello World!"
「Hello World!」というテキストを読み込みます。最初のメッセージとして右から左にスクロールし (デフォルトのスクロール モード = 0)、速度 4 (デフォルト) でスクロールします。アップロード後、デバイスは最初のメッセージを 1 回表示し、まだ USB に接続されている場合は充電画面に戻ります。プラグを抜くか、USB コネクタの横にある小さなボタンを押します。
python ./led-badge-11x44.py -m 6 -s 8 "Hello" "World!"
テキスト「Hello」をメッセージ 1 としてロードし、「World!」をロードします。メッセージ 2 として。引用符の違いを前の例と比較してください。最大 8 件のメッセージをアップロードできます。この例ではモード 6 を使用しており、ちょっとしたアニメーション付きで単語が表示領域に垂直にドロップされます。スムーズにするために、ここでは速度を最大に設定します。
デフォルトでは、「Hello」のみが表示されます。すべてのメッセージを表示するには、「M1-8」が一瞬表示されるまで、USB コネクタの横にある小さなボタンを複数回押します。これで、アップロードされたすべてのメッセージがループ表示されます。
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:"
1 つの組み込みイメージと 1 つのロードされたイメージを使用します。ハートは内蔵されており、fablab ロゴはファイルから読み込まれます。 fablab ロゴは 2 回使用されています。1 回目は「fablab」という単語の前で、もう 1 回は参照「:1:」 (最初に読み込まれた画像を参照します) の後ろで使用されます。
python ./led-badge-11x44.py -s7 -m0,1 :bicycle: :bicycle_r:
は、(2 番目のメッセージとして) ディスプレイを左から右、右から左に横切る自転車を示しています。 「M1-8」モードを選択すると、バイクはディスプレイを常に前後に走行します。一方または両方に短いメッセージを追加して、自転車がテキストを引っ張っているように見せることができます。
python ./led-badge-11-x44.py -b0,1 -s1 -m5 " :heart2: :HEART2:" " :HEART2:"
は、最初のメッセージではゆっくりと鼓動するハート、2 番目のメッセージでは点滅するハートの単純なアニメーションを示しています。
./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を使用してください! HID API 経由で確実に接続するには 1 に設定します。 プログラムは usb.core ライブラリにフォールバックしません。 -M メソッド、--メソッド メソッド 指定された書き込みメソッドの使用を強制します。 「自動」のいずれかを使用します。 'list' または印刷されるリスト。 -D デバイス ID、--デバイス ID デバイス ID あいまいな場合は、指定されたデバイス ID を強制的に使用します。使用 「auto」、「list」、または印刷中のリストのいずれか。 -s 速度、--speed 速度 スクロール速度 (範囲 1 ~ 8)。最大 8 文字のカンマ区切り 価値観。 -B 明るさ、--明るさ 明るさ ディスプレイの明るさ (パーセント): 25、50、75、または 100。 -m MODE、--mode MODE 最大 8 つのモード値: Scroll-left(0) -right(1) -up(2) -ダウン(3);まだ中心(4);アニメーション(5);落とす- ダウン(6);カーテン(7);レーザー(8); 「--mode-help」を参照してください。 さらに詳しく。 -b 点滅、--blink 点滅 1: 点滅、0: 通常。最大 8 文字のカンマ区切り 価値観。 -a ANTS、--ants ANTS 1: アニメーション化された境界線、0: 通常。最大 8 文字のカンマ区切り 価値観。 -l、--list-names メッセージに埋め込まれる名前付きアイコンをリストし、終了します。 画像とテキストを組み合わせた例: sudo lednamebadge.py "I:HEART2:you"
デフォルトのタイプを定義するオプションがいくつかあります。
lednamebadge.py
を直接使用します: デフォルトのタイプは 11x44 です
lednamebadge.py
を12
の付くもの (例、 badge12.py
) に変更し、それを使用します: デフォルトのタイプは 12x48 です
led-badge-11x44.py
を使用します: デフォルトのタイプは 11x44 です
led-badge-12x48.py
を使用します: デフォルトのタイプは 12x48 です
これらすべてのオプションについては、コマンド ライン オプション-t
を使用してデフォルトのタイプをオーバーライドできます。
どのデバイスをどの方法でプログラムするかを制御するには 2 つのオプションがあります。現時点では 2 つの書き込み方法があります。1 つは Python パッケージ pyusb ( libusb
) を使用する方法、もう 1 つは pyhidapi ( hidapi
) を使用する方法です。
実行環境によっては両方の方法を使用できますが、場合によってはどちらかが期待どおりに動作しないことがあります。次に、オプション-M
を使用して、使用するメソッドを明示的に選択できます。 -M list
使用すると、利用可能な書き込みメソッドのリストを出力できます。複数のデバイスを接続している場合は、オプション-D list
を使用して ID をリストアップするか、リストされたデバイス ID の 1 つを指定して、その特定のデバイスをプログラムすることができます。両方のオプションのデフォルトはauto
、できれば書き込みメソッドhidapi
で見つかった最初のデバイスのみをプログラムします。同じデバイスでも書き込み方法によってIDが異なります。また、コンピュータの起動時や再接続時にも変更される可能性があります。
例については、gfx/starfield フォルダーを参照してください。 N フレームのアニメーションは、幅 48 ピクセルと 44 ピクセルの両方のデバイスに対して、幅 N*48 ピクセルの画像として提供されます。
生成されたシーンをデバイスに書き込むための独自のコンテンツ作成コードのモジュールとして、lednamebadge.py を使用できます。
ヘッダーを作成する
独自のコンテンツを追加する
デバイスに書き込む
header()
メソッドはいくつかのパラメータを取ります。
数値のタプルとして最大 8 つの長さ
各長さは、対応するビットマップ データのバイト列の数です。つまり、対応するビットマップ データのバイト数を 11 (11x44 デバイスの場合)、それぞれ 12 (12x48 デバイスの場合) で割った値です。ここで、1 バイトは 8 です。ピクセル幅。
コマンド ライン引数に相当する引数: 最大 8 つの速度、モード、点滅フラグ、アリ フラグをそれぞれ数値のタプルとして、(オプションの) 明るさを数値として指定します。
オプションで、タイムスタンプを日時として指定できます。これはヘッダーの一部としてデバイスに書き込まれますが、デバイスのディスプレイには表示されません。
独自のコンテンツは、すべてのシーンのビットマップ データを含むバイト配列である必要があります。もちろん、指定された長さに適合する必要があります。
理解を深めるために、次の図を参照してください。
12x48 デバイスの場合は、各バイト列に 11 バイトではなく、12 バイトが必要です。
例:
シーンが 2 つあり、1 つは 11x32 ピクセル、もう 1 つは 11x60 ピクセルだとします。したがって、最初のものは 4 バイト列と 44 バイトを持ち、2 つ目は最後のバイト列に 4 つの空のビット列を 11x64 ピクセルまで埋め込む必要があるため、8 バイト列と 88 バイトになります。
両方ともモード 4 で表示することを好みます。最初のものは速度 3、2 番目のものは速度 2 で表示されます。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
メソッドにはさらに 2 つのパラメータがあります: write メソッドとデバイス ID です。これらは、コマンド ライン オプション '-M' および '-D' とまったく同じように機能します。どちらもデフォルトはauto
です。
LedNameBadge.write(buf, 'libusb', '3:10:2')
list
使用しても、利用可能な選択肢のそれぞれのリストが標準出力に出力されますが、モジュールとして使用するとあまり便利ではありません。したがって、この情報を通常のデータ オブジェクトとして取得するには 2 つの方法があります。
get_available_methods()
は、実装されたすべての書き込みメソッドを、メソッド名をキーとして、ブール値を値として持つ辞書として返します。ブール値は、メソッドが基本的に使用可能かどうかを示します (対応するインポートが成功したことを意味します)。
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)'}
このようにして、複数のデバイスを 1 台のコンピュータに接続し、異なるwrite
呼び出しで 1 つずつプログラムすることができます。
同じ説明文字列を持つデバイスが複数ある場合、どの実デバイスがどの ID に属するかを区別することが困難になります。特に。再接続または再起動後、ID が変更または交換される可能性があります。異なる USB バスがある場合は、1 つのデバイスのみをバスに接続してください。したがって、バスの番号で決めることができます。または、(コンピュータがすでに実行されている間) 特定の接続順序を維持し、デバイス番号によって決定することもできます。おそらく、hidapi メソッドの方がもう少し信頼性があります。少し実験してみる必要があります。
このモジュールのテキスト/アイコン/グラフィック生成を使用して、対応するバイト バッファーを取得することもできます。
これは非常に簡単で、コマンドラインの使用法と同じです。メッセージの代わりにファイル名を指定することで、画像ファイルからのみビットマップを作成する追加オプションがあります。
from lednamebadge import SimpleTextAndIconscreator = SimpleTextAndIcons()scene_a_bitmap = Creator.bitmap("Hello :HEART2: World!")scene_b_bitmap = Creator.bitmap("As you :gfx/bicycle3.png: like...")scene_c_bitmap = Creator.bitmap ("gfx/スターフィールド/スターフィールド_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],シーン_y_ビットマップ[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)
*.puml ファイルから図を生成するには、PlantUML と、場合によっては GraphViz ドットが必要になります。
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