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からできました。
以下の3つのファイルをdataフォルダに格納しておきます。
/shnmk16.bdf/shnm8x16r.bdf
/Utf8Sjis.tbl
東雲フォントのアクセスは、以下のライブラリを使わせてもらいました(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 件のコメント:
コメントを投稿