マイクロビットを使ってみる 〜データロガーをつくる

スポンサーリンク
電子工作の作例

マイクロビットで使われているプロセッサ(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)

 

なお、私がマイクロビットの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。


初心者向けから、比較的高度なものまで、さまざまな情報が記載されているだけでなく、子供向けの作例も多数掲載されていますので、「プログラミング教育」のための題材さがしなどにもおすすめです。