Raspberry Pi Pico に CircuitPytnon を使い SSD1306 に文字を表示する

![IMG_1259.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360970/dd177710-02e4-49af-0db9-93784ed16ba4.jpeg)

以下の記事の Raspberry Pi Pico + CircuitPython 版です。

https://qiita.com/tkarube/items/6808538012cba499d5e2

まず Raspberry Pi Pico で CircuitPython が動く環境を作ります。公式ガイドは以下となります。

https://learn.adafruit.com/getting-started-with-raspberry-pi-pico-circuitpython

Raspberry Pi Pico 上の BOOTSEL とラベルがされたボタンを押しながら PC と USB ケーブルで接続します。 すると RPI-RP2 という名前でストレージが接続されるので以下からダウンロードした UF2 ファイルをダウンロードしてコピーします。

https://circuitpython.org/board/raspberry_pi_pico/

すると今度は CIRCUITPY という名前でストレージが接続されます。

エディタはなんでもかまいません。いずれのエディタを使った場合でも CIRCUITPY というストレージの下に code.py というファイルがあるためこれを編集します。CircuitPython では Raspberry Pi Pico 起動時に自動的にこのファイルを実行します。

[Thonny](https://thonny.org/) 、[Mu](https://codewith.mu/)、あるいは [VSCode](https://code.visualstudio.com/) あたりを使うと REPL と呼ばれる Python の対話モードのプロンプトが簡単に取れるので便利です。尚、プログラムの実行は code.py を保存すると自動的に実行されます。REPL は COM6 などのシリアルポートとして認識されるため TeraTerm や Putty などのソフトでも接続することができます。

VSCode なら [Pico-Go](https://marketplace.visualstudio.com/items?itemName=ChrisWood.pico-go) という extention を使うことになると思います。[CircuitPython](https://marketplace.visualstudio.com/items?itemName=joedevivo.vscode-circuitpython) という extention もありますが私の環境で試したかぎりではうまく動いてくれませんでした。

前述の [公式ガイド](https://learn.adafruit.com/getting-started-with-raspberry-pi-pico-circuitpython) では Mu を前提としています。Thonny でも問題ないと思います。エディタの使い方に関してはそれぞれのドキュメントを参照してください。

Raspberry Pi Pico と SSD1306 の配線は以下のとおりです。Raspberry Pi Pico のピン配列は [ここ](https://datasheets.raspberrypi.com/pico/Pico-R3-A4-Pinout.pdf) や [ここ](https://learn.adafruit.com/getting-started-with-raspberry-pi-pico-circuitpython/pinouts) などを参照してください。

|Pico  |SSD1306  |
|---|---|
|GP0 (1) |SDA |
|GP1 (2) |SCL |
|3V3_EN (36)  |VCC |
|GND (38 等) |GND |

続いてプログラムですが SSD1306 を使う場合はライブラリを使うと便利です。ライブラリをインストールするにはライブラリをダウンロードし CIRCUITPY の下の libs というフォルダにコピーします。[公式ガイド](https://learn.adafruit.com/getting-started-with-raspberry-pi-pico-circuitpython) では [NeoPixel LEDs](https://learn.adafruit.com/getting-started-with-raspberry-pi-pico-circuitpython/neopixel-leds) を例にライブラリの使い方を解説しています。

ライブラリを入手するには以下のページから adafruit-circuitpython-bundle-7.x-mpy をダウンロードします。

https://circuitpython.org/libraries

今回は SSD1306 を使うので zip ファイルを解凍し lib フォルダにある以下のフォルダとファイルを CIRCUITPY の下にある libs フォルダにコピーします。 

```
adafruit_display_text フォルダ
adafruit_displayio_ssd1306.mpy
```

続いて CIRCUITPY の下の code.py を編集します。単純に画面の真ん中に Hello World! と表示するには以下のような Python プログラムを書きます。

``` code.py
import board
import busio
import displayio
import terminalio
from adafruit_display_text import label
import adafruit_displayio_ssd1306

displayio.release_displays()

SDA = board.GP0
SCL = board.GP1
i2c = busio.I2C(SCL, SDA)

display_bus = displayio.I2CDisplay(i2c, device_address=0x3C)

WIDTH = 128
HEIGHT = 64

display = adafruit_displayio_ssd1306.SSD1306(display_bus, width=WIDTH, height=HEIGHT)

splash = displayio.Group()
display.show(splash)

text = "Hello World!"
text_area = label.Label(
    terminalio.FONT, text=text, color=0xFFFFFF, x=28, y=HEIGHT // 2 - 1
)
splash.append(text_area)

while True:
    pass
```

いずれのエディタでも code.py を保存すると自動で code.py が実行されます。Thonny または VSCode ではエディタからプログラムを実行することもできます。USB ケーブルを抜いてから接続しても Raspberry Pi Pico 起動時に自動で code.py が実行されます。

実行結果は本エントリーのトップの写真のとおりとなるはずです。

Adafruit に [SSD1306 のページ](https://learn.adafruit.com/monochrome-oled-breakouts) がありますが Raspberry Pi Pico は前提としていないようです。やや手直しが必要ですがもう少し複雑なサンプルプログラムは adafruit-circuitpython-bundle-7.x-mpy や [ここ](http://helloraspberrypi.blogspot.com/2021/02/raspberry-pi-picocircuitpython-ssd1306.html) などから入手できます。

Pillow を使ったサンプルもありますが Raspberry Pi Pico の場合 CircuitPython を使うとプログラムやライブラリで使えるストレージ容量は 1MB となるためそのまま日本語の TrueType フォントなどは使えないようです。

参考:

[Hello Raspberry Pi](http://helloraspberrypi.blogspot.com/2021/02/raspberry-pi-picocircuitpython-ssd1306.html)