LUM ディスプレイで電光表示器をつくる
昔の秋月お楽しみ袋に入っていたマトリックス LED で電光表示器をつくる
LUM ディスプレイについて
基板のマーキングによると Rohm の製品のようです。 電車やバスなどの LED 表示器によく使われているようです。 こちらのページに解析結果がありましたので、参考にさせていただきました。
マイコンについて
WiFi で Yahoo! ヘッドラインニュースなどを取得して、表示するものを作ります。 (以前 HUB75 LED パネルで作ったものと同様) WiFi を使いますので、ESP-32 系マイコンとなりますが、制御ピンが多いので ESP-32C3 では不足で、ノーマル ESP-32 を使います。 今回は、手抜きのため秋月の ESP-32E マイコンボードを使用します。
回路
特に複雑なことはしていません。上記の LUM の解析結果通りに配線しているだけです。 電源はいつものように USB から取得します。 マイコンボード上に LDO が載っているので、その分手抜きできます。
とりあえずなんか表示はできました。 左右の LED については、HIGH にしても消灯してくれません。 ここだけ 5V じゃないとダメっぽいです。 とりあえず Floaing で消えるっぽいので、未接続として常時消灯とします。
日本語フォント
このディスプレイは 56 x 11 pixel という変態サイズなので、どのフォントを使うのか悩みます。 美咲フォントの派生のk8x12が、ちょうど 7 x 11 pixel のフォントなのでこれを使います。 BDF版が Unicode 並びなので、そのまま使いたいのですが、BBX でサイズを指定していて真面目にパースしないと描画できないっぽい。 なので JIS 並びの PNG 版を切り出して、ビットマップデータとします。
データ変換には Python の Pillow を使います。
from PIL import Image
im = Image.open('k8x12L_jisx0208.png')
for y in range(0,83):
for x in range(0,94):
for yy in range(0,11): # 12th line is always blank
val=0
for xx in range(0,8):
val=val*2
if im.getpixel(( x * 8 + xx, y * 12 + yy)) == 0:
val=val+1
if xx == 7:
print('0x{:02X},'.format(val),end="")
print(' ')
日本語処理
Yahoo! ヘッドラインニュースをはじめ、元のデータは UTF8 で書かれているので、何らかの方法で JIS に変換しないといけません。
UTF8 から UTF16 へは機械的に変換できます。(ここは efont のコードを流用) この時に、k8x12 の半角文字(というか JIS X 0201)は横 4 pixel しかなく見にくいので使用せず、該当する全角(JIS X 0208)文字に変換することとします。
Unicode(UTF16) → JIS は変換テーブルがあるので、これを Unicode をキーとした配列に変換します。
LUM の制御
LUMに表示するデータを VRAM みたいに準備して、定期的に割り込みで出力させます。 esp32 の timer を使っておよそ 1ms で一行づつ更新します。 これで表示部分を切り離してメイン部を記述できます。
ニュースデータの取得
Yahoo! ヘッドラインニュースを 10分間隔で入手します。 以前 HUB75 ディスプレイの時に使ったmgo-tec さんの ESP32_WebGETを一部改変して使っています。
最終的なコードはこうなりました。 サイズは 1.1MB 程になりました。 結果的には 4MB の ESP32 でも十分収まりました。
入れ物
適当に 3D プリンタで出力します。 白なので後ろから透過させたのですが、微妙なにじみ方をする…
製作記は以上になります。 ぁぁ、いろいろ弄っていたらなんかドッド掛けが…。