spresense で circuitpython を使う

最終更新日

マイコンの開発は、python! と色々試していたら、こんなtweetを発見。

SPRESENSEで、CircuitPython が動かせるって知ってました?実は英語版のサポートサイトのみ CircuitPython のスタートガイドが載ってます (なんでやろ?)

え! spresense でも CircuitPython 動くの?

firmware のupdate

ひさしぶりなので、spresnse の firmware をupdate する。

firmware のdownload

2021/06/01 時点では、 v2.0.2。

zip ファイルは解凍しておく

$ unzip spresense-binaries-v2.0.2.zip

書き込みツールのdownload

firmware を書き込む為に、 flash_writer をdownlaod(mac版)

https://github.com/sonydevworld/spresense/blob/master/sdk/tools/macos/flash_writer

実行権を付与する。

$ chmod +x flash_writer

書き込み

まず、大事なことは、

USBケーブルは、spresense本体のUSBコネクタに挿すこと。
あとで、CircuitPython を利用するときは、逆に拡張ボード側のUSBコネクタに挿す。

tty を確認すると2つのserialが見つかる

  • /dev/tty.usbserial-1432330(数字はrandam?)
  • /dev/tty.SLAB_USBtoUART

きっと、spresenseのserialドライバが用意した /dev/tty.SLAB_USBtoUART を利用する。

CP210x USB to serial driver for Mac OS X

また、spresenseの該当箇所のcommand例は、flash_writer 引数が間違ってる(バージョン違い?)ので注意。
-S option は、最新の flash_writer command で不要になったらしい。

NG

$ ./flash_writer -s -c <serial_port> -b 115200 -d -n -S "./loader.espk" -S "./gnssfw.espk" -S "./dnnrt-mp.espk" -S "./AESM.espk"

OK

$ ./flash_writer -s -c /dev/tty.SLAB_USBtoUART -b 115200 -d -n -s "./loader.espk" "./gnssfw.espk" "./dnnrt-mp.espk" "./AESM.espk"
>>> Install files ...
install -b 115200
Install ./loader.espk
|0%-----------------------------50%------------------------------100%|
######################################################################

120320 bytes loaded.
Package validation is OK.
Saving package to "loader"
updater# install -b 115200
Install ./gnssfw.espk
|0%-----------------------------50%------------------------------100%|
######################################################################

457552 bytes loaded.
Package validation is OK.
Saving package to "gnssfw"
updater# install -b 115200
Install ./dnnrt-mp.espk
|0%-----------------------------50%------------------------------100%|
######################################################################

90640 bytes loaded.
Package validation is OK.
Saving package to "dnnrt-mp"
updater# install -b 115200
Install ./AESM.espk
|0%-----------------------------50%------------------------------100%|
######################################################################

28944 bytes loaded.
Package validation is OK.
Saving package to "AESM"
updater# sync
updater# Restarting the board ...
reboot

数分以上かかるので気長に待つ。

CircuitPython のinstall

バイナリを以下のサイトをからdownload

ただし!
言語は、ENGLISH を選ぶこと。USでもUKでも可。

理由は、後述の ampy を利用するときに、REPL(Read Evaluate Print Loop)が返す soft reboot という文字列が、 JAPANESE 版だと ソフトリブート にローカライズされてしまうから。

そのせいで、ampy コマンドを実行すると以下のエラーが発生する

could not enter raw repl

downloadできたら先ほどと同じようにspresense に書き込む。大事なことは、USBケーブルをspresense本体のUSBコネクタに挿すこと。

$ ./flash_writer -s -c /dev/tty.SLAB_USBtoUART -b 115200 -d -n ./adafruit-circuitpython-spresense-en_US-6.2.0.spk 
>>> Install files ...
install -b 115200
Install ./adafruit-circuitpython-spresense-en_US-6.2.0.spk
|0%-----------------------------50%------------------------------100%|
######################################################################

502624 bytes loaded.
Package validation is OK.
Saving package to "nuttx"
updater# sync
updater# Restarting the board ...
reboot

CircuitPython を試す

準備が完了すると、macにお馴染みのdrive CIRCUITPY が現れる

あわててはいけない。
USBケーブルをspresenseの拡張ボードにあるUSBコネクタに刺しなおす。

ファイル確認

$ ampy -p /dev/tty.usbmodem1839CC0AC91 ls
/.Trashes
/._code.py
/.fseventsd
/.metadata_never_index
/boot_out.txt
/code.py
/lib

小さいプログラムで試す。
led.py

import board
import digitalio
import time

led = digitalio.DigitalInOut(board.LED0)
led.direction = digitalio.Direction.OUTPUT

while True:
    led.value = True
    time.sleep(0.5)
    led.value = False
    time.sleep(0.5)

ampy で実行

$ ampy -p /dev/tty.usbmodem1839CC0AC91 run led.py

4個ある本体上のLEDの1個が、チカチカしたら成功。

built in modules

REPL で help('modules') を試す。

Auto-reload is on. Simply save files over USB to run them or enter REPL to disable.

Press any key to enter the REPL. Use CTRL-D to reload.

Adafruit CircuitPython 6.2.0 on 2021-04-05; SPRESENSE with CXD5602
>>> help('modules') 
__main__          builtins          json              rtc
_bleio            busio             math              sdcardio
_pixelbuf         camera            microcontroller   sdioio
adafruit_bus_device                 collections       micropython       storage
analogio          digitalio         os                struct
array             errno             pulseio           supervisor
binascii          gc                pwmio             sys
bitbangio         gnss              random            time
board             io                re                ulab
Plus any modules on the filesystem
>>> 

おまけ

spersenseのCircuitPythonのマニュアルをみていたら、いつか調べようと思っていた、フォルダ内のプログラム名の実行時の優先順位があったので、メモ。

CircuitPython looks for a code file on the board to run. There are four options:

  1. code.txt
  2. code.py
  3. main.txt
  4. main.py

シェアする