電子ペーパーの Y-con P020 を使う

共立電子などで販売されている電子ペーパー Y-con P020使うためのプログラムを書いてみました。主に mbed LPC1768で動作確認とデバッグをしています。
トラ技ARMライタでも動作するようにしてあります。トラ技ARMライタではローカルファイルシステムが使えないなどの違いがありますが、相違点は #ifdef等で吸収して同じソースがそのまま使えるようにしてあります。ただしトラ技ARMライタでの動作確認はあまりやっていません(^^;)

2016/07/03追記: テキスト表示などが出来るようになりました

プログラムの使用説明書

準備:

  • UART(p9,p10)に Y-con P020
  • USBポートにPC
  • SPI(p5,p6,p7,p8) にSDカード

を接続します。
SDカードにはPC等を使ってルートディレクトリに BMPファイル(Y-con P020のマニュアルに書いてある形式の物)を書き込んでおきます。複数のBMPファイルを書き込んでおくことが出来ます。

使い方:
単純な USB-UART変換器で接続した場合とほぼ一緒ですが、以下のコマンドが追加されます。
( コマンドは小文字でもOKです)

コマンド説明
LS[space]*[CR]SDカードなどにある BMPファイルの一覧を表示します
LS[space]パス名[CR]パス名の下にあるファイルだけを一覧表示します
LS[CR]直前に表示した一覧を再表示します
D[space]F[space]ファイル名[CR]SDカードなどに置いたファイル名のファイルを Y-con P020で表示します
D[space]F数字[CR]LSコマンドで表示された番号のファイルを Y-con P020で表示します
D[space]I[CR]内蔵バッファを表示します
WI[CR]内蔵バッファをクリアします
T[space]文字列文字列を内蔵バッファに書き込みます

Tコマンドの文字列の中では以下の制御文字が使えます

文字列説明
\\\文字自身
\n改行
\c内蔵バッファのクリア
\f内蔵バッファを表示する
\l数値1,数値2;カーソル位置を(数値1)桁、(数値2)行にする
\s数値1,数値2;フォントの大きさを横(数値1)倍、縦(数値2)倍にする

mbed LPC1768ではローカルファイルシステムが SDカードと同様に使えます。
MBEDドライブ(コンパイルした *.binファイルを書き込むドライブ)に BMPファイルを書き込むだけで、SDカードに書き込んだファイルと同様に LSコマンドなどで扱えるようになります。

YconP020ライブラリ単独での使用

class YconP020はPC(USBでの接続)やSDカードの接続無し(UARTに Y-con P020をつないだだけ)でも使えるようになっています。プログラムのmain()の最初から whileループの直前までの部分が、その使用例になってますので参考にしてください。

  • Y-con P020の制御コマンド(D とか LEDとか)は全てメンバ関数として実装しています。
epd.dispstoredpict(3); // "D 3"に相当
epd.command_led(false); // "LED 0" に相当
bool b=epd.command_led(); // "LED" に相当、LEDの設定状態が b に入る
string s=infomation_str(); // "I"に相当、Y-con P020から送られた内容が s に入る
  • 上記の追加コマンドに相当する「SDカードなどに置いたファイルを表示する」等のメンバ関数があります。
  • 内蔵バッファを操作するメンバ関数があります。
epd.clear_internalbuf();
for(int i=0; i<epd.width(); i++) epd.pset(i,epd.height()/2);
epd.display_internalbuf();
  • text() を使って文字を内蔵バッファに書き込むことが出来ます。
    text()は mbed::Streamを継承したTextDisplayオブジェクト(へのポインタ)なので printf()等を使うことが出来ます。
    setfontscale()で text()で表示するフォントを整数倍で拡大できます
    内蔵バッファに書き込むだけです。実際に表示するには display_internalbuf()を呼んで内蔵バッファを表示する必要があります。 Y-con P020がページ全体を書き換えることしか出来ない(しかもそれに数秒掛かる)ため、このような仕様になっています。
epd.text()->cls();
epd.setfontscale(2,2);
epd.text()->printf("Hello\n");
epd.display_internalbuf();
  • mbed::Stream を継承しているので printf(),scanf()等を使うことが出来ます(ちょっと混乱しそうですが、上記のtext()とは別物です)
    mbed::Serial を直接使って書いた既存のプログラムをわずかな修正だけで拡張コマンド対応に出来ます(出来るはずです(^^;)。
    ちなみにこの機能はプログラムが最初は mbed::Serialを使った単純な USB-UART変換プログラムを書くことから始めたために入っています。class YconP020が単独でも使えるようになった現状では、この機能はクラスからは外して別のクラスとして実装した方が美しいと思いますが、面倒なのでそのままにしています(^^;)
epd.printf("D %d\r", i);

今後の予定

  • 内蔵バッファを操作する関数の充実
    内蔵バッファをSDカードなどとの間で読み書きする等
  • 表示フォントの自由度を上げる
    現状は8x8の英字フォントしかありません。整数倍の拡大だけは実装しましたが、まだまだ不足でしょう。
    ユーザーが用意したフォントファイルを追加出来る機能を付けようと考えています。

その他

テキスト表示の部分は グラフィックLCD用として公開されていたライブラリから流用させていただきました。TextDisplay.h,cpp GraphicsDisplay.h,cpp 計4つのファイルは一切改変せずにそのまま使っています。感謝いたします。


Please log in to post comments.