2020年12月12日土曜日

マトリクスLEDに東雲フォントを表示

WS2812Bを使った16x16マトリクスLEDシートに、フリーの東雲(しののめ)フォント16x16を表示させることができました。クリスマスツリー表示の途中で電光掲示板のように文字がスクロール表示されます。



ネットで先人の皆様の記事を色々と読ませていただき、参考になりました。感謝です。


ESP32でのタイミング問題

当初、WS2812BへのRGBデータの送出はライブラリを使わずに自分でコードを書いてました。一度、NeoPixelテープ用のライブラリを使ったのですが、16x16=256個のLEDは表示できず(100個くらいまでしか表示できなかった)、以下を参考にさせていただいて書いてました。


しかし、ESP32でやると光らせるつもりのないLEDが点灯するのです。0/1のパルスの幅を色々と調整したら、発症が少なくなりましたが、それでも時々光ります。ググりまくったら、Githubで以下の議論が行われていました。


ESP32は、1ms毎に割り込みが入り、5μs程度の空白が発生するようです。これにより、WS2812Bへの0/1信号パルス(1.25us)のタイミングがズレる。16x16=256個のLEDにRGBデータ3バイトを送ると8ms近くかかるので途中で必ず割り込みが入ります。

また、WiFiを使うと全くダメというようなことも書いてあり、WiFiで制御しようとしていた目論見は外れました。確かに他の処理を行っていたら、1us程度のシビアなタイミング調整は無理ですね。表示用と通信用で2個のESP32を使えばなんとかなるか? でもその2個間の通信によるタイミングのずれも起こるからやっぱりダメか。

上記Githubスレッドで、ESP32で大丈夫な関数を書いたという人がいて(今年の10月なのでまだホヤホヤ)、最新のライブラリに入っていることが分かりました。感謝。そこで以下の最新ライブラリをインストールして、表示部分のスケッチを書き直したら、指定外のLEDが光ることもなくなり無事に動作したようです。

・Adafruit_NeoPixel ライブラリ(ArduinoIDEのライブラリ管理からインストール可)


東雲フォント

16x16東雲フォントは1MB以上あるのでESP32のSPIFFS領域(プログラムなどを書き込むフラッシュメモリをストレージに使う)にアップロードしました。SDカードでも使えるようですが、SPIFFSならESP32だけで済むので。

SPIFFS領域のパーティションを変更して、2GB使えるようにします。以前はcsvファイルを直接いじっていたようですが、今はArduinoIDEからできました。


ファイルのアップロードは、ESP32 Sketch Data Upload という アドインtool を組み込んで行いました。スケッチと同じフォルダにdataフォルダを作成し、そのなかにフォントファイルを入れておきこのツールを起動するとアップロードされます。このときシリアルモニタを開いておくとエラーになるので、閉じておく。

以下の3つのファイルをdataフォルダに格納しておきます。
/shnmk16.bdf
/shnm8x16r.bdf
/Utf8Sjis.tbl


フォントファイルとUTF8/SJIS変換テーブルをSPIFFSにアップロードした様子です。この表示を行うスケッチがSPIFFSのスケッチ例にあります。



東雲フォントのアクセスは、以下のライブラリを使わせてもらいました(Githubにあります)。

ESP32_SPIFFS_ShinonomeFNT ... 東雲フォントにアクセスする
ESP32_SPIFFS_UTF8toSJIS ... ArduinoIDEのUTF8を東雲フォントのSJISに変換する

スクロール表示

以下の美咲フォント(8x8)をスクロール表示するスケッチを参考にさせて頂き、というかほぼ流用させて頂きました。とても分かりやすいスケッチです。



ひとまず以上です。

このあとは2枚のマトリクスLEDシートをシリーズに繋いでみようと思っています。さらに追加で3枚のシートを注文したので、届けば5枚繋げられます。5枚で1,280個のLEDになり、1280×3×8bit=30,720bitです。エラー無しにちゃんとデータが繋がっていくのか!?

0 件のコメント:

コメントを投稿