MicroPythonのファイル機能を使用すると、Picoのストレージにテキストファイルを保存することができます。テキストにはデータが保存できるので、Picoに接続した各種センサーからのデータを記録することができます。
たとえばGPSセンサーをPicoに接続して位置を追跡して記録するプログラムを作成し、尾行したい誰かの車の中に放り込んでおくと、その誰かの移動記録が作成できます。
、
今回は、Picoに内蔵されている温度センサーの数値をデータとして記録するプログラムを作成します。
目次
MicroPythonのファイル操作
MicroPythonでも、Pythonと同様の方法でファイル操作が行えます。
# ファイル操作
# 上書き、なければ新規作成モード
file = open("test.txt", "w")
# 英数字と日本語文字を書き込む
file.write("ABcd 1234" + "日本語の文字")
file.close()
# 読み取りモード
file = open("test.txt")
r = file.read()
print(r)
file.close()
これを実行すると、[シェル]にファイルに書き込んだ内容が表示されます。
温度の測定
PicoのRP2040チップには温度センサーがあり、4番めのADCチャンネルからアクセスできます。
配線
なし
プログラムコード
from machine import ADC
# ADC4は4だけ指定
sensor_temp = ADC(4)
conversion_factor = 3.3 / (65535) # 変換要因
reading = sensor_temp.read_u16()*conversion_factor
# RP2040チップの公式を使って摂氏の温度に変換
temperature = 27 - (reading - 0.706)/0.001721
print(temperature)
プログラムを実行すると、[シェル]にPicoが測定した温度が表示されます。
27 – (reading – 0.706)/0.001721 というのは、RP2040のデータシートに記載されている温度センサーの数値から摂氏の温度に変換するRP2040での公式です。RP2040のデータシートは[Raspberry Pi Documentation]ページの[RP2040 Device]項からダウンロードできます。
温度をファイルに書き込む
ファイルを作成して書き込む方法と、温度のデータを得る方法が分かったので、温度のデータをPicoに保存することができます。
配線
なし
プログラムコード
# 温度を測って、データをPicoに保存する
from machine import ADC
sensor_temp = ADC(4)
conversion_factor = 3.3 / (65535)
reading = sensor_temp.read_u16()*conversion_factor
temperature = 27 - (reading - 0.706)/0.001721
# 温度のデータをtemps.txtファイルに書き込む
file = open("temps.txt", "w")
file.write(str(temperature))
file.close()
プログラムファイルはPC上にあっても(PC上に保存していなくても)、temps.txtはPico上に作成されます。
Thonnyの[実行]ボタンをクリックしてプログラムを実行します。[ファイル]ビュー(表示されていない場合は[表示]->[ファイル]を選択します)下半分の[Raspberry Pi Pico]にtemps.txtが現れます。表示されない場合は[Raspberry Pi Pico]の右にあるボタンのクリックで表示されるメニューから[更新]を選びます。
[ファイル]に表示されたtemps.txtをダブルクリックして開きます、すると、Picoの温度センサーのデータが記録されているのが確認できます。
複数のデータを自動的に記録できるようにする
現状では、新しく書き込んだデータは前のデータを上書きしてしまうので、データは最新のものしか残りません。またデータの記録は[実行]ボタンをクリックしたときしか行えないので、自動的に記録できるようにしたいものです。
データの記録を自動的に行えるようにするには、ループを使って測定と記録を実行し、utime.sleep()を使って間隔を空けます。ずっと行いたいのであればwhile Trueの無限ループを使用し、有限回にしたい場合にはfor in ループを使います。
データを複数残すには、ファイルのflush()メソッドを使用します。flush()はファイルにデータを書き込みますが、ファイルを閉じないで開いたままにします。
下図ではこれを説明しています。まずopen()関数でファイルが作成されます。データはファイルのwrite()メソッドで書き込まれます(実際には予約だけで書き込みはまだ)。ファイルはその後、バッファと呼ばれる一時的な預かり所に移されます。MicroPythonは忙しく、ファイル操作だけに専念できないので、こういう仕組みになっています。
ファイルのclose()メソッドが呼び出されると、ファイルが閉じられるときにフラッシングという処理でデータが実際にファイルに書き込まれます。
このとき、close()の代わりにflush()メソッドが呼び出されると、flush()はclose()と同じようにデータをファイルに実際に書き込みますが、ファイルは閉じず開いたままにします。ファイルは開いたままなので、open()を使うことなく、次のデータをそこに書き込むことができます。
配線
なし
プログラムコード
# 複数のデータを自動的に記録
from machine import ADC
import utime
sensor_temp = ADC(4)
conversion_factor = 3.3 / (65535)
file = open("temps.txt", "w")
# 10秒おきに温度を測り、記録する
while True:
reading = sensor_temp.read_u16()*conversion_factor
temperature = 27 - (reading - 0.706)/0.001721
file.write(str(temperature))
file.flush()
print("データを書き込んだ")
utime.sleep(10)
プログラムを実行する前に、[ファイル]ビューにあるtemps.txtを右クリックし、表示されるコンテキストメニューからtemps.txtを削除します。
プログラムを実行し、[シェル]に「データを書きこんだ」が5回表示されるまで、そのままにしてデータの書き込みをつづけます。[停止]ボタンでプログラムを停止すると、[ファイル]ビューにtemps.txtが表示されます。temps.txtをダブルクリックして開きます。
確かに5回分のデータが記録されているようですが、残念ながら1行で読みづらいので、これを修正しましょう。
データを読みやすく記録し、データの計測時にオンボードLEDを光らせる
データを読みやすくするために、1回のデータの末尾に改行を追加しましょう。改行は”\n”という文字コードで表されます。
# データの末に改行を追加
file.write(str(temperature) + "\n")
配線
なし
プログラムコード
# 複数のデータを自動的に記録
from machine import ADC,Pin
import utime
# sensor_temp = ADC(4)
# この書き方の方が温度センサーを使っていることが分かりやすい
sensor_temp = ADC(ADC.CORE_TEMP)
conversion_factor = 3.3 / (65535)
led_onboard = Pin(25,Pin.OUT)
file = open("temps.txt", "w")
# 10秒おきに損度を測り、記録する
while True:
reading = sensor_temp.read_u16()*conversion_factor
temperature = 27 - (reading - 0.706)/0.001721
file.write(str(temperature) + "\n")
file.flush()
# print("データを書き込んだ")
# オンボードLEDを点滅
led_onboard.on()
utime.sleep(1)
led_onboard.off()
utime.sleep(9)
プログラムを実行すると、LEDが点滅し、温度を計測するタイミングが分かりやすくなったことが分かります。プログラムを停止してtemps.txtを開くと、データは確かに1つずつ改行され、読みやすくなりました。