マイクロビットで使われているプロセッサ(nRF51822)には、256KBのフラッシュメモリが搭載されています。
このフラッシュメモリには、プログラムが書き込まれますが、一部の領域は、ユーザがストレージとして、データを保存するのに使えます。この仕組みをファイルシステムといいます。
ファイルシステムに格納されたデータは、デバイスの電源を入れ直しても、消えずに残ります。
なお、マイクロビットのファイルシステムには、以下の制限があります。
- 利用可能な容量は約30KBです。
- ディレクトリがなく、すべてのファイルは同じ場所に保存されます。
- マイクロビットにプログラムを転送すると、すべてのデータが破棄されてしまいます(電源を切っただけではデータは消えません)。
今回は、このファイルシステムを使って、温度センサで採取した温度情報を、ファイルに保存してみようと思います。
プログラムは、「muエディタ」を使って、MicroPythonで作ります。
機能
ファイルが存在しない場合は、新規に「meas.csv」というファイルを作り、先頭行に「time,temperature」という文字列を書き込みます。
温度センサで、温度情報を採取します。
5分ごとに、ファイルに「時間」,「採取温度」のペアを書き足していきます。「時間」は、マイクロビットの電源を入れてからの経過時間です。
材料
- マイクロビット
- セリアのUSBチャージャー(単三x2本用の充電用電池ボックス)
- 電池(単三×2)
- USBケーブル
プログラム
マイクロビット用の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)
つなぎかた
マイクロビットのUSB端子に電池ボックスをつなぐだけです。
結果
データ採取が完了したマイクロビットをパソコンとつなぎ、「muエディタ」を起動します。
「ファイル」ボタンをクリックすると、画面の下部に、マイクロビットに格納されているファイルと、パソコンに格納されているファイルが表示されます。
マイクロビットに格納されている「meas.csv」を、「コンピュータのファイル」側にドラッグすることで、パソコンにコピーできます。
パソコンにコピーした「meas.csv」を選択して、「右クリック」>「開く」で、Excelでファイルが開きます。画像は、一部のゴミデータを削除(マイクロビットの電源を入れ直すたびにデータが追記されますので、どうしても若干のゴミデータが含まれます)し、「散布図」でグラフ描画してみたものです。
(2019/2/21追記)
我が家のベランダには、ESPr Developerというマイコンボードで作った温度計が置いてあり、これでベランダの気温を測定し続けています。
上記のマイクロビット温度計も、一晩ベランダに置いておき、ESPr Developer温度計の測定データと比較してみました。
マイクロビットの温度センサは、プロセッサに内蔵されており、本来はプロセッサの温度を測定するためのものです。それもあって、マイクロビットの測定温度はやや高めになっていますが、傾向としては把握できていると思います。
なお、上記のプログラムでは、保存するファイルサイズが大きくなってきたときにエラーが発生してしまったので、以下のように修正しました。
ファイルに追加書き込みしたいだけなのですが、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)
なお、私がマイクロビットの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。
初心者向けから、比較的高度なものまで、さまざまな情報が記載されているだけでなく、子供向けの作例も多数掲載されていますので、「プログラミング教育」のための題材さがしなどにもおすすめです。