Pimoroni製品が発売された瞬間に購入するものの宿命として、改良の余地がある初期リビジョンを所持してしまうというのがあるのですが、400x300の3色電子ペーパーのInky wHATもその一つで、いまいち活用できていないうちに、ライブラリによる自動検出ができるようになった改良版が出てきて、今年はついに4色(黒・白・赤・黄)電子ペーパーとなって価格も少しお安くなりました。
そんなわけで手持ちのInky wHATではライブラリによる自動検出ができず、コード側で手動指定するみたいなことはできますが、最近は多色電子ペーパーも買ってしまったので、断捨離として物好きな人におしつけお譲りしてもいいかなあと思って、再来週末のOSC 2025 Tokyo/Fallの自ブースで配布する袋に入れかけていました。
が、さっきなんとなく調べてみたら、CircuitPythonがライブラリを作って公開していました。前調べたときはなかったのになあと思ったら、リリース日は昨日。ウソでしょ……こんなタイミング良く見つけることある……?
試すしかないでしょ
というわけで早速ダウンロードしてお試ししました。Picoへの接続は、いつも通り拙作のuHAT Porter Picoです。

サンプルスクリプトをベースにして、まずは白い画面に赤と黒でテキストを出すものを作成。display = adafruit_ssd1683.SSD1683()の中で、サンプルとかドキュメントにはない「highlight_color=0xff0000」を追記していますが、これを書くと赤色に対応できるみたいです。
import time import board import busio import displayio from fourwire import FourWire from terminalio import FONT from adafruit_bitmap_font import bitmap_font from adafruit_display_text import label from adafruit_display_shapes.rect import Rect import adafruit_ssd1683 displayio.release_displays() spi = busio.SPI(board.GP18, MOSI=board.GP19, MISO=None) epd_cs = board.GP22 epd_dc = board.GP8 epd_reset = board.GP9 epd_busy = board.GP2 display_bus = FourWire(spi, command=epd_dc, chip_select=epd_cs, reset=epd_reset, baudrate=1000000) time.sleep(1) display = adafruit_ssd1683.SSD1683(display_bus, width=400, height=300, busy_pin=epd_busy, highlight_color=0xff0000) g = displayio.Group() display.root_group = g rect = Rect(0, 0, 400, 300, fill=0xffffff) g.append(rect) t = label.Label(FONT, text="HELLO!!!!", color=0xFF0000, scale=3,x=10,y=20) g.append(t) t2 = label.Label(FONT, text="HELLO!!!!", color=0x000000, scale=3,x=10,y=50) g.append(t2) display.refresh() print("refreshed") time.sleep(display.time_to_refresh + 5) # Always refresh a little longer. It's not a problem to refresh # a few seconds more, but it's terrible to refresh too early # (the display will throw an exception when if the refresh # is too soon) print("waited correct time") # Keep the display the same while True: time.sleep(10)
そして実行結果はこんな感じ。

画像も出せた
画像も試してみます。画像の作成にはシャポコさんのArrayfyを使用しました。これめちゃくちゃ便利。PNG画像をダウンロードした後、Gimpで3色のインデックスカラーに変換して、BMPとして出力しています。BMPのファイルサイズは60KBほど。PNGのデコードができるライブラリはあるのですが、Pico/Pico2ではRAM不足でコケるので、displayio.OnDiskBitmap()を使用してBMPのデコード・表示をしています。

コードはこんな感じのを、上のやつの描画部分と差し替えればいけます。
bmp = displayio.OnDiskBitmap("reducedImage.bmp")
tilegrid = displayio.TileGrid(bmp, pixel_shader=bmp.pixel_shader)
g.append(tilegrid)
で、使うの?
そうなんですよねえ。何に使うの?ってのがないと結局使わないので、悩ましいですよね。会社に持っていって何かを表示するのに使ってもいいのかなって思ったけど、何を?ってのがやっぱないんですよね。サーバーのなんかの情報とか?
ちょっと引き出しに戻して、何に使えるか考えましょうかね(断捨離失敗のおたく)