マイクロビットで使われているプロセッサ(nRF51822)には、256KBのフラッシュメモリが搭載されています。
このフラッシュメモリには、プログラムが書き込まれますが、一部の領域は、ユーザがストレージとして、データを保存するのに使えます。この仕組みをファイルシステムといいます。
ファイルシステムに格納されたデータは、デバイスの電源を入れ直しても、消えずに残ります。
なお、micro:bitのファイルシステムには、以下の制限があります。
- 利用可能な容量は約30KBです。
- ディレクトリがなく、すべてのファイルは同じ場所に保存されます。
- micro:bitにプログラムを転送すると、すべてのデータが破棄されてしまいます(電源を切っただけではデータは消えません)。
今回は、このファイルシステムを使って、温度センサで採取した温度情報を、ファイルに保存してみようと思います。
プログラムは、「muエディタ」を使って、MicroPythonで作ります。
機能
ファイルが存在しない場合は、新規に「meas.csv」というファイルを作り、先頭行に「time,temperature」という文字列を書き込みます。
温度センサで、温度情報を採取します。
5分ごとに、ファイルに「時間」,「採取温度」のペアを書き足していきます。「時間」は、micro:bitの電源を入れてからの経過時間です。
材料
- micro:bit
- セリアのUSBチャージャー(単三x2本用の充電用電池ボックス)
- 電池(単三×2)
- USBケーブル
プログラム
micro:bit用のMicroPythonには、ファイルの追加書き込み(append)機能がないようです。そのため、一旦ファイルを読み出し、それに情報を付け加えて、改めてファイルを書き込んでいます。
また、ファイルの存在チェックを行う機能も見つけられなかったので、ファイルシステム上のファイルを一覧表示し、そこに「meas.csv」が含まれるかを確認する方法をとっています。
import os from microbit import * list = os.listdir() if 'meas.csv' not in list: with open('meas.csv', 'w') as my_file: my_file.write('time,temperature\n') while True: time = str(running_time()) temp = str(temperature()) with open('meas.csv', 'r') as my_file: content = my_file.read() content = content + time + ',' + temp + '\n' with open('meas.csv', 'w') as my_file: my_file.write(content) sleep(300000)
つなぎかた
micro:bitのUSB端子に電池ボックスをつなぐだけです。
結果
データ採取が完了したmicro:bitをパソコンとつなぎ、「muエディタ」を起動します。
「ファイル」ボタンをクリックすると、画面の下部に、micro:bitに格納されているファイルと、パソコンに格納されているファイルが表示されます。
micro:bitに格納されている「meas.csv」を、「コンピュータのファイル」側にドラッグすることで、パソコンにコピーできます。
パソコンにコピーした「meas.csv」を選択して、「右クリック」>「開く」で、Excelでファイルが開きます。画像は、一部のゴミデータを削除(micro:bitの電源を入れ直すたびにデータが追記されますので、どうしても若干のゴミデータが含まれます)し、「散布図」でグラフ描画してみたものです。
(2019/2/21追記)
我が家のベランダには、ESPr Developerというマイコンボードで作った温度計が置いてあり、これでベランダの気温を測定し続けています。
上記のmicro:bit温度計も、一晩ベランダに置いておき、ESPr Developer温度計の測定データと比較してみました。
micro:bitの温度センサは、プロセッサに内蔵されており、本来はプロセッサの温度を測定するためのものです。それもあって、micro:bitの測定温度はやや高めになっていますが、傾向としては把握できていると思います。
なお、上記のプログラムでは、保存するファイルサイズが大きくなってきたときにエラーが発生してしまったので、以下のように修正しました。
ファイルに追加書き込みしたいだけなのですが、MicroPythonについてよく分からないので、とりあえず、このような泥臭い方法で対処しました。
import os from microbit import * list = os.listdir() if 'meas.csv' not in list: with open('meas.csv', 'w') as my_file: my_file.write('time,temperature\n') while True: with open('tmp.csv', 'w') as tmp_file: with open('meas.csv') as my_file: content = my_file.read(1000) while content != '': tmp_file.write(content) content = my_file.read(1000) time = str(int(running_time()/1000)) temp = str(temperature()) with open('meas.csv', 'w') as my_file: with open('tmp.csv') as tmp_file: content = tmp_file.read(1000) while content != '': my_file.write(content) content = tmp_file.read(1000) my_file.write(time + ',' + temp + '\n') os.remove('tmp.csv') sleep(300000)