ITで遊ぶ

e-inkのディスプレイを使ってみる

e-inkディスプレイをちょくちょく見かけます。
私がもっているものだとKindle Paper Whiteです。

大きいと高いので安いものを探すとAmazonで見つけました。
似たようなデバイスがたくさんあります。Aliexpressで探してみても値段があまりAmazonと変わりませんでした。
購入してみると、裏にPico-ePaper-2.13とあり、V4というシールが貼ってあります。

調べると日本語表示を試したサイトがありました。

環境構築

*最初からe-paperモジュールを取り付けないこと。MicroPythonがインストールできません。

まずMicroPython(本家はこちら )をインストールするわけですが、。これを使わずにPython IDEのThonnyをインストールします。
なぜか?こんな疑問もちませんか?MicroPythonをボード上で動かしてどうやってPythonプログラムを読み込ませ実行するのだろうか?Thonnyを入れておけばシリアルで接続してMicroPythonプログラムを簡単に試せます。
最終的にはmain.pyをルートにおいておけば自動実行されます。

Thonnyをインストールしたら、ツール->オプションを選択します。(もちろん話はすべてMac上です)

ここで「ジェネラル」タブで言語を選べるので「日本語」を設定しておきます。
次に「インタプリタ」でPythonはMicroPython(Raspberry PI Pico)を選びます。
ここでRaspberry PI picoをUSBで接続します。
ThonnyにUSBシリアル接続するために「ポートまたはWebREPL」をクリックして妥当っぽいものを選びます。
そして
をクリックすると、MicroPythonがインストールされ、Thonnyとつながるはず。

OKを押して、メイン画面に戻るとシェルにPythonの状況が出力されています。

ここまでが開発環境作成です。

ちょっと試しにコードを書いて実行してみます。毎度おなじみLチカです。

右上のペインにコードを書いて、最上段のメニューで実行のコントロールができます。▶で実行STOP🛑で停止です。

e-paperディスプレイ表示

動作テストプログラムはここにあります。

ソースコードを睨むと、

class EPD_2in13_B_V4_Portrait:
class EPD_2in13_B_V4_Landscape:

とクラスがふたつあります。縦向き用、横向き用ですね。
__main__のスタート部分を見ると

epd = EPD_2in13_B_V4_Portrait()  #インスタンス化
epd.Clear(0xff, 0xff) #リセット

がスタートのようです。

epd = EPD_2in13_B_V4_Landscape()
epd.Clear(0xff, 0xff)
    
epd.imageblack.fill(0xff)
epd.imageblack.text("Waveshare", 5, 20, 0x00)
epd.display()
# epd.delay_ms(2000)

epd.sleep()

が最小限のルーチンでテキストを表示します。
imageblack.fillに0xffを渡すと画面が白くなります。

日本語フォントをもってこねばならず、https://github.com/Tamakichi/pico_MicroPython_Multifontを使わせてもらいます。ダウンロードし、misakifontのフォルダーをRaspi内にアップロードします。Thonnyの左上のローカルフォルダーを表示しているペインでダウンロードしたmfontに移動します。mfontフォルダーを右クリックすると「/にアップロード」というメニューがあるのでこれをクリックします。(このメニューはRaspiに接続していないと出ません)
なお、mfontのReadmeにあるとおり全部のフォントをそのままコピーすると入りきれません。私は14×14と16×16だけをアップロードしています。

このフォルダーを使うために、Pythonプログラムの冒頭のimportしているところに次を書き加えます。

from mfont import mfont

先のブログを参考にして、以下の2つの関数をクラス定義の後に追加します。

def jpblackchar(fd, epd, x, y, width, height): 
    bn = (width+7)>>3
    py = y
    for i in range(0, len(fd), bn):
        px = x
        for j in range(bn):
            for k in range(8 if (j+1)*8 <=width else width % 8): if fd[i+j] & 0x80>>k:
                    epd.imageblack.pixel(px + k, py, 0x00)
            px+=8
        py+=1

def jpblacktext(str, x, y, mf, epd):
    mf.begin()
    for c in str:
        d = mf.getFont(ord(c))
        jpblackchar(d, epd, x, y, mf.getWidth(), mf.getHeight())
        x = x + mf.getWidth() 
    mf.end()

メインを次のように書き換えてみましょう。

if __name__=='__main__':
epd = EPD_2in13_B_V4_Landscape()
epd.Clear(0xff, 0xff)

epd.imageblack.fill(0xff)
# epd.imageblack.text("Waveshare", 5, 20, 0x00)
mf = mfont()
mf.setFontSize(16)
str = "日本語表示"
jpblacktext(str, 5, 35, mf, epd)
mf.setFontSize(14)
str = "日本語表示2行目"
jpblacktext(str,5,60,mf,epd)
epd.display()
# epd.delay_ms(2000)

epd.sleep()

こんな感じ。電源を切っても表示されたままなところがうれしいです。

関連記事

  1. PHP, Python, Ruby, バランス

  2. CakePHP(2)

  3. Visual BasicとAccessDBを配布パッケージにする

  4. カラーミー 出荷日のリスト

  5. 多くのテキストファイルをWordPressの投稿に書き込む

  6. Raspberry PIに軽量webサーバーを入れる

  7. 製品を作るおじさんの独り言

  8. Visual Studio 2017 Visual Basic データ…