Blog2Viewer

以前、Movable Typeで運用していたブログの内容を表示させるために作成したページです。
Bad Apple on ESP8266 + OLED


HSES-NODE-OLEDでBad Apple(影絵)を再生できた... って、結構前に出来ていたのだけれど、Blogに記事を書くのが遅くなってしまった。画像データは ffmpegで1フレームづつBMPファイルに変換し、PCからpythonのプログラムでudpパケットにして送信している。詳しい話はQiitaに書いた。ソースコードはGitHubで公開している。



音も再生できると良いんだけどね...とか思う。とにかくOLEDにはネット経由でも十分高速に表示できることがわかった。あとは何を表示させるか、どれだけ手間をかけるかの問題、とか考えるとやる気が消え始めるが、何か面白いデモを考えてみたい。

あと、高速に色々表示できますよというデモの動画



もうひとつBad Appleの動画。こちらは、カメラ固定のまま、曲全体を再生させているが、表示部分が合成っぽくも見えるので、最初の動画では、カメラ位置を動かしている。



しかし、やっぱり、Bad Apple(影絵)は偉大。モノクロや低解像度のディスプレイでも十分それっぽく見える。
ESP32のGPIOのバグ
ESP32でパラレル接続のTFT LCDに表示を行おうと、既存のライブラリを参考にプログラムを書き、大体動くようになったのだが、なんか変。変な点が描画される。(右上の写真参照)

怪しいところはたくさんある。自分のコードも怪しいし、LCDは使用実績はあるものの、結構古いものなので怪しいし、esp32-arduinoもesp-idfも日々更新されていて怪しい。電源ラインも怪しい。オシロスコープを駆使し、しつこく調べると WRパルスが出ているタイミングでCSがHighになっている状況を発見。WR信号もCS信号もGPIOで操作している。これは、プログラムのミスではありえない。





この現象が、ちょうど1mS毎、割り込み処理後に起こっているように見えるので、割り込み処理にバグか。ちなみに、自分では割り込みを使っていない。システムの割り込み処理のソースコードを探すが、見つけ出すことができない。

どうしようか、途方にくれるが、問題のタイミング以外でもCS信号がプログラム通り変化しないことに気が付き、いろいろ試すとタイミングをずらしたり、GPIOのレジスタに2度書きしたりすることで、プログラム通りに動くこともあることがわかって来た。

ここでやっと、ESP32のエラッタを見る。なんか3.3. When the CPU accesses peripherals and writes one address repeatedly, random data loss occursというのが該当しそうだ。回避策を試すと、問題は解消した。詳しくはQiitaの方に書いた。

[caption id="attachment_11219" align="aligncenter" width="300"] 正常動作したLCDの表示[/caption]



このバグ、GPIOを操作していると、ランダムにデータの欠落、つまり変化させたはずが変化しないというバグ。発生のタイミングがランダムなのがいやらしい。またエラッタに引っかかってしまった。新しいチップを使う際は最初に熟読すべきだ。
ESP32で動画表示
ESP32に接続した320x240のTFT LCDにネットワーク経由でデータを転送し動画を表示することができた。表示速度は、240x160だと10fps, 240x135で15fps, 120x90なら30fps以上が可能。あと2倍ぐらい高速化の余地はありそう。

ESP32側のプログラムはArduino環境で開発。udpパケットを受信し、データをそのままLCDに書き込む。簡単なフロー制御も実装している。tcpではなく、udpを使用したのは、フロー制御を自前でやりたかったから。通信エラーでパケット欠落が起きても再送などして欲しくなかったから。あとudpだと自然にパケット単位で処理することになり、プログラムがわかりやすい。tcpのストリームにパケットの切り出し処理が面倒。やってみた結果,フロー制御でいろいろ実験できて面白かった半面、いろんな通信環境にちゃんと対応できているかどうか不安。そのうちtcpでも試してみたい。

動画データは、既存の動画ファイルをffmpegで専用フォーマットに変換したものを使用。ファイルの中には RGB各5,6,5bitづつの16bit/pixelのTFT LCDのフォーマットで画像データが収められている。これをpythonのプログラムでudpパケットで送信している。






実験で使用している元動画は以下の通り。



使用しているESP32の基板は自作のもので、実験用に、いろんなモジュールを接続するコネクタが付いている。LCDモジュールは以前購入したArduino-UNO用のTFT LCDシールド。コントローラはST7781。接続は8bit パラレル。



今回の動画実験で、ESP32でやりたいことの1つを達成できた。あと、やっぱり音もなんとかしたい。
ESP8266+OLEDでRSS表示
HSES-NODEのサンプルプログラムにRSS表示のプログラムを追加することは、前々から予定していた。RSS表示自体はHSES-LCD24で既にやっていて新味が無いので後回しになっていたのだが、やっと完成した。実際に動かして見ると案外面白い。OLEDなので、表示が鮮明。LCDより、はるかに見やすい。表示される文字数が少なく、スクロールされていくので、見続けないと内容がわからないため、つい見続けてしまう。あとサイズが小さいのも魅力的。



プログラムとしては、まずHumblesoft_SSD1306ライブラリに文字をスクロール表示する機能(ScrollTextクラス)を追加。HSES-LCD24用のRssDispのソースプログラムを持ってきて、ちょっと修正してやったら、すぐにRSSが表示された。 それに日付・時刻等を表示する機能を追加し、さらに画面のレイアウトを変更する機能もつけた。スイッチ(IO0)を押すとレイアウトが切り替わり、時刻が大きく表示されたり、RSSが大きく表示されたりする。