LEDネームプレートにMacから書き込む

LEDネームプレートという、バッテリー内蔵で小さくカワイイな電光掲示板を見つけた。
こういうの。NET-PL2303とか、LED Name Badge B1248とかの型番のやつ。

充電と表示内容の書き込みはPCからUSB接続でやるんだけれど、付属の書き込みソフトはWindows用のみ。そこで、Macからも書き込みができるアプリを作ってみた。(ただし書き込めるのは英数字のみ。バグで書き込み失敗してぶっ壊れても責任は負えませんのでごちゅういください)
http://www.rnatori.net/downloads/LEDBadgeWriter001.dmg

必要ドライバ

PL2303というUSB-シリアル変換チップのドライバをインストールする必要があります。
http://www.prolific.com.tw/us/showproduct.aspx?p_id=229&pcid=41

参考にした情報

Hacking a PL2303 LED Badge in Mac OS (Code Mania attendee badge)
紹介されているC#のコード(送信内容の解説付き)とPythonのコードを参考にした。
Led Mini Board communication Agreement
上記C#のコードと一緒に置いてある、メーカーのものらしき文書。英語がブロークンで分かりづらいが、青字で入れてあるのが直したもののようだ。

ORSSerialPort
Cocoaからお手軽にシリアルポートを扱うなんか。MIT License。

書き込みプロトコル

上記を読んでもわかるけど簡単にメモしておく。
シリアルポートは38400ボー、8-N-1。最初のパケットの前に0x00を送るらしい。ビッグエンディアン

パケットのフォーマット

通信は通常69バイトのパケットを送信することで行う。69バイトのうち、

  • 先頭1バイト:常に0x02
  • 1バイトのコマンド:ASCII文字で'1' '2' '3'のどれか。パケットを連続して送る場合、最初のパケットはコマンドを'1'、中間の複数パケットは'2'、後述の終止パケットは'3'
  • 2バイトのアドレス:内蔵EEPROMのアドレスを直接指定する。このLEDネームプレートは6つのテキストを持つことができ、それぞれのアドレスは0x0600から始まり256バイト毎に並んでいる。パケットは64バイトのペイロードを持つので、一つのテキストは最長4つのパケットで、64バイトずつアドレスを増やしながら送信することになる。0x0600以前のアドレスには内蔵フォントが書き込まれているらしい。0x0e00以降のアドレスには日本語等を表示する際の一時ビットマップフォント。これはまだ書き込み方法を調べてない。
  • 64バイトのペイロード:後述のテキストなどを格納する。
  • 1バイトのチェックサム:先頭の0x02以外のバイトのチェックサム
ペイロードのフォーマット

ペイロードには以下の内容を分割して入れていく。

  • 1バイトのスピード:ASCII文字の'1'〜'5'で表示スピードを指定する。大きいと速い。
  • 1バイトのファイル名:よくわからないけど6つのテキストの最初から1-6を指定している。
  • 1バイトの表示パターン:ASCII文字の'A'〜'E'で表示パターンを指定する。'A'はHOLD、静止表示、'B'はROTATE、いわゆる電光掲示板の流れる表示、など。
  • 1バイトの文字数:後続のテキストの長さ。
  • 250バイトのテキスト:0x80以下のASCII英数字。日本語を表示する場合は…まだ調べてない。一時ビットマップフォントのコードを指定しなきゃならないのだろう。
  • 1バイトのチェックサム…と書いてあるんだけど0x00でいい。
  • 1バイトの0x00

合わせて256バイト。C#のコードでは常に256バイト送ってるみたいなんだけど、テキストが短い場合少なくとも64バイト区切りで必要ないパケットは送らなくていいみたい。

終止パケット

上記69バイトのパケットを送り終わったら、4バイトの終止パケットを送る。

  • 先頭1バイト:常に0x02
  • 1バイトのコマンド:終止パケットは'3'
  • 1バイトの送信したテキストを表すビットフィールド:送信したテキストが1番と3番のみ、とかだったら0b00000101、のようにして指定するみたい。
  • 1バイトのチェックサム:先頭の0x02以外のバイトのチェックサム
他いろいろ
  • 69バイトのパケットを送ると即EEPROMに書き込むのでちょっと待ってね、最初の送信時は他にもいろいろ処理があるのでさらに待ってね、とか書いてあるので適当にウェイトを入れました。パケットの間に0x00を入れたりはしなくていいみたい。
  • 日本語を表示させたい場合は上記のように、12x12の一時的ビットマップフォントを生成して書き込まなきゃならないらしいけど、情報不足。

なんでLEDネームプレート買ったの

いや…「ニンジャスレイヤー」に「サイバーサングラス」ってガジェットが出てきてね?


このウキヨエのページで言うと「大事件デスヨ」って表示してるのがそれよ。あれよ、作中では内部にもディスプレイがあってARめいた風景が見られるらしいんだけど、カワイイなのはこの外部表示よ。
で、バッテリー内蔵の小型LED表示板があればこういうふうにそれっぽいの作れるじゃない?

日本語表示できなきゃ上記の用途にあまり意味がないのでは

ハイ