RPi PicoでOLED液晶 ssd1306 I2Cを使ってみる(circuitpython編)
circuitpython でもSSD1306を使ってみる。
MicroPython編はこっち。
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 にあったので、それを参考にした。