RPi PicoでOLED液晶 ssd1306 I2Cを使ってみる(circuitpython編)

最終更新日

circuitpython でもSSD1306を使ってみる。

MicroPython編はこっち。

PRi PicoでOLED液晶 ssd1308 I2Cを使ってみる(micropython編)

2021.04.14

python scriptの実行には、同様に ampy を利用する。

関連ライブラリのinstall

MicroPython では、必要なライブラリ ampy put で Pico にファイル転送した。

circuitpythonは、このputが使えない。エラーが発生する。

$ ampy -p /dev/tty.usbmodem14123301 put font5x8.bin
Traceback (most recent call last):
  File "/usr/local/bin/ampy", line 8, in <module>
    sys.exit(cli())
  File "/usr/local/lib/python3.9/site-packages/click/core.py", line 829, in __call__
    return self.main(*args, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/click/core.py", line 782, in main
    rv = self.invoke(ctx)
  File "/usr/local/lib/python3.9/site-packages/click/core.py", line 1259, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/local/lib/python3.9/site-packages/click/core.py", line 1066, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/local/lib/python3.9/site-packages/click/core.py", line 610, in invoke
    return callback(*args, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/ampy/cli.py", line 264, in put
    board_files.put(remote, infile.read())
  File "/usr/local/lib/python3.9/site-packages/ampy/files.py", line 214, in put
    self._pyboard.exec_("f = open('{0}', 'wb')".format(filename))
  File "/usr/local/lib/python3.9/site-packages/ampy/pyboard.py", line 279, in exec_
    raise PyboardError('exception', ret, ret_err)
ampy.pyboard.PyboardError: ('exception', b'', b'Traceback (most recent call last):\r\n  File "<stdin>", line 1, in <module>\r\nOSError: [Errno 30] Read-only filesystem\r\n')

Read-only filesytem と言われるので、しょうがない。

今回必要なファイルは、 BOOTSEL + REST (実際には RESETボタン を押しながら BOOLSELボタン を押す )で、USB storage mode にしてコピーする。

  • /Volumes/CIRCUITPY/font5x8.bin ... ./examples/font5x8.bin
  • /Volumes/CIRCUITPY/lib/adafruit_ssd1306.mpy
  • /Volumes/CIRCUITPY/lib/adafruit_framebuf.mpy

表示用アプリ

MicroPython と同じI/Fだから、簡単。

app.py

from board import *
import busio
import adafruit_ssd1306

sda = GP2
scl = GP3

i2c = busio.I2C(scl, sda)
disp = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c)

disp.fill(0)
disp.rect(0, 0, 128, 32, 1)
disp.fill_rect(120, 0, 128, 32, 1)
disp.line(112, 0, 112, 32, 1)

disp.text('circuitpython', 4, 4, 1)
disp.text('ssd1306 demo', 4, 20, 1)

disp.show()

実行してみる。

$ ampy -p /dev/tty.usbmodem14123301 run app.py
<I2C>

memo

circuitpython のライブラリは、 .mpy というsuffix になっている。
中身をみると、 .py をminimizeしたような感じ。

調べてみると、mpy-cross というプログラムで pre-compile したものらしい。 .pyc 的な感じか。

小さなメモリのコンピュータで実行するために最適化されているのはいいけど、今回のように source code から framebuffer のAPIが知りたい場合には、ちょっと不便。

github にあったので、それを参考にした。

シェアする