今年買ったボード:Badger 2040 W

今年、MicroPython用に買ったボードシリーズ。

[Badger 2040 W](https://akizukidenshi.com/catalog/g/g118000/)

2024年4月19日 秋月電子通商で購入

Raspberry Pico W 搭載の 2.9inch 白黒電子ペーパー。

![IMG_1670.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/053e67e2-7c4d-3cf7-715f-2f355b8cb089.jpeg)

MicroPython で組まれた Badger OS がプレインストールされている。名札、時計表示、電子ブック(この画面の大きさでは実用的ではないが)などの機能を提供。

![IMG_1672.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/31f0ddc9-03ee-eb20-cb00-27183ee3fb83.jpeg)

裏には Raspberry Pi Pico W がそのまんま張り付いている。

![IMG_1671.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/68d9ac06-058a-9c9a-9026-553945f2bdf7.jpeg)

電子ペーパーのコントローラとしては UC8151 というものを使っている。

https://www.orientdisplay.com/wp-content/uploads/2022/09/UC8151C.pd


# 購入のきっかけ

このボードを買ったのは、以下のサイトを見たのがきっかけ。

https://github.com/antirez/uc8151_micropython

製品仕様としては白と黒の２色のモノクローム表示しかできないところ、最大32階調まで表示できたり、フリッカー(点滅)なしに描き変えたりできるドライバをピュア MicroPython で作ったとのこと。

Wifi なしの Bedger 2040 でもよかったのだけれど、この時期には在庫のあるところが見つからなかったので、W 版の在庫があった秋月で購入。

# セットアップ

MicroPython は Badger OS の基盤としてインストール済みなので、ドライバーとデモスクリプトを mpremote で MicroPython のファイルシステムにコピーする。

```bash
$ git clone https://github.com/antirez/uc8151_micropython
$ cd uc8151_micropython
$ mpremote cp uc8151.py :
$ mpremote cp demo_no_flick.py :
$ mpremote cp demo_greyscale.py :
$ mpremote cp png2gs8/dama.gs8 :
```

# デモの実行

フリッカーなしとフリッカーありの描画

```bash
mpremote exec 'from demo_no_flick import *'
```

![IMG_1674.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/0c6302cc-818d-a1b1-ab93-4fd51e66d1b2.gif)

階調表示(同じ画像を 4, 8, 16, 32階調で表示)

```bash
mpremote exec 'from demo_greyscale import *'
```

![IMG_1678.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/b8f78f84-9ef9-13a4-37cd-8765cfde6afd.gif)

# 画像フォーマットについて

このドライバで扱う画像のフォーマット .gs8 については png2gs8/README.md に記載がある。

```text
+-------+--------+----------//
| width | heigth |  Image data... each byte between 0 - 255
+-------+--------+----------//
```

要するに、先頭４バイトに幅と高さ、続いて各ピクセルの階調が 0-255の範囲で格納している。

PNG形式の画像からの変換ツールとして C 言語のプログラム `png2gs8/png2gs8.c` が付いているが、PNG からしか変換できないのは不便。

ということで、python で簡易的な変換プログラムを作ってみた。

image2gs8.py

```python
import sys
from PIL import Image

width = 128
height = 296
rotation = 0

if len(sys.argv) < 3:
    print("""
Usage: {file} image-file-path gs8-file-path [rotation]
""".format(file=sys.argv[0]))
    sys.exit(1)

iname = sys.argv[1]
oname = sys.argv[2]

org_image = Image.open(iname)
if len(sys.argv) > 3:
    rotation = int(sys.argv[3])
    if rotation != 0:
        org_image = org_image.rotate(rotation, expand=True)

org_image = org_image.resize((width, height))
greyscale_image = org_image.convert('L')

size = org_image.size

hdr = bytearray([width>>8, width&0xff, height>>8, height&0xff])
pixels = bytearray(width*height)

idx = 0
for y in range(size[1]):
    for x in range(size[0]):
        lum = greyscale_image.getpixel((x, y))

        pixels[idx] = lum
        idx += 1

with open(oname, mode='wb') as of:
    of.write(hdr)
    of.write(pixels)
```

これでルノアールの絵を変換して Badger 2040 W で表示してみる。

元画像：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/04e7a1bf-7a27-a4ab-95d3-7d7bddf83cda.png)

32階調グレイスケール表示：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/c8c0ff75-6f08-3001-bf47-3402deee9cda.png)