CircuitPython対応ボードのストレージにセンサのログを記録する

CircuitPyhtonボードは、PCに接続するとUSBメモリとして認識されます。この機能のおかげで、ボード上のプログラムの書き換えが非常に簡単に出来るようになっています。
せっかくマイコンボードがUSBメモリとして認識されるのですから、ボード上のセンサの値をそのままcsvファイルとしてファイルシステム内に保存できたら便利ですよね。
今回はその方法を説明していきます。

明るさを測定してlog.csvとして記録する

Circuit Playground Express(CPX)の明るさセンサの値を読み取って、記録してみようと思います。

# 明るさを測定する
import time
import analogio
import board

# 光センサーを設定する
light = analogio.AnalogIn(board.LIGHT)

while True:
    print((light.value,))
    time.sleep(0.1)

このコードは「初心者のためのCircuitPythonの本1」に掲載されています。
これを、以下のように書き換えます。

# 明るさを測定してlog.csvとして記録する
import time
import analogio
import board
import neopixel

# 光センサーを設定する
light = analogio.AnalogIn(board.LIGHT)

# NeoPixelを設定する
pixels = neopixel.NeoPixel(board.NEOPIXEL, 10)

try:
    with open("/log.csv", "a") as logfile:
        while True:
            pixels[7] = 0x000077
            logfile.write("{}, {}\n".format(time.monotonic(), light.value))
            logfile.flush()
            pixels[7] = 0x000000
            time.sleep(1)

except:
    while True:
        print("Cannot record!!")
        pixels[7] = 0xFF0000
        time.sleep(0.2)
        pixels[7] = 0x000000
        time.sleep(0.2)

ちょっとコードが長くなりましたが、こんな挙動をするはずです。

  • CPXに搭載された光センサを設定する
  • NeoPixelを使って記録状態を表示する(赤の速い点滅はエラー、青の点滅は正常に記録)
  • CPXのストレージ内にlog.csvというファイルを作成し、その中にCPXの起動からの経過秒数とセンサの値をカンマ区切りで記録

それでは、実行してみましょう。
赤の点滅でエラーになっちゃいましたね…。

デフォルトでは、code.pyからストレージへのアクセスは読み取り専用

USBとして認識されるストレージの中には、自作のプログラム本体(code.py)やCircuitPythonのライブラリが入っていますね。これらをプログラムが破壊してしまうことを防ぐために、デフォルトの起動状態では、プログラムからストレージに書き込むことが許されていません。

そこで、起動時の設定を変更するboot.pyというプログラムを用意します。

CircuitPytrhonでは、マイコンボードに電源が入ると、まずboot.pyというファイルを探しに行きます。もし、boot.pyが存在する場合、そのプログラムを実行します。その後、code.pyの実行を開始します。

boot.pyの中に、起動時にプログラム(code.py)にストレージの書き込みを許可するコードを入れておけばいいわけです。

import board
import digitalio
import storage

# CPXのスライドスイッチを定義
switch = digitalio.DigitalInOut(board.D7)
switch.direction = digitalio.Direction.INPUT
switch.pull = digitalio.Pull.UP

# スイッチの値(左がTrue、右がFalse)によって、read onlyかどうかを切り替える
# storage.remountの2つめの引数がReadOnly
storage.remount("/", switch.value)

このコードをメモ帳などに書き込んで、boot.pyという名前でCPXのストレージの直下に保存してください。

storageライブラリのremountを使うと、マイコンボードのストレージを再設定することができます。
CPXのスライドスイッチを右に動かしてからCPXをリセットしてみてください。

今度はNepPixelが1秒に1回、短く青く点滅しているとおもいます。

記録を止めて、log.csvの値を見てみたい時には、スライドスイッチを左に戻してからリセットボタンを押してください。

ではCIRCUITPYドライブを見てみましょう。

log.csvが保存されていますね。これをダブルクリックすると…

CPXが起動してからの経過時間がA列に、明るさセンサの値がB列に保存されていますね。

以上のように、storage.remountをいつものcode.pyではなく、boot.pyとして保存することで起動時のストレージの設定を変更することが可能です。

Follow me on Twitter