Raspberry Pi Picoで熱電対を使った温度測定
ある物の温度特性が測りたくなったので、Amazonでmax31855ボードとK型熱電対を買ってRaspberry Pi Pico(以下、Pico)で動かしました。Picoを除いて約2,000円で何でも温度が測れる環境が手に入るのだから安いものです。
普通に売っている熱電対は片側がコネクタの形状になっているので、max31855ボードで使うにはコネクタを分解して線をむき出しにする必要があります。Picoと買ってきたmax31855ボードと熱電対の接続は下記のようになりました。
さてmax31855から温度データを読み出すにはPicoからSPIでアクセスする必要がありますが、下記のサイトを参考にしてMicroPythonのプログラムを作成しました。
具体的にはmax31855のデータを読み出す部分を上のサイトにあるようにtc_max31855.pyという名前のファイルにして、別に作ったmain.pyというファイルでtc_max31855.pyを呼び出すようにしました。Thonnyを使ってtc_max31855.pyとmain.pyの2つのファイルをPicoに書き込んで使っています。
今回PCからPicoにアクセスして温度データをPCに取り込むわけですが、PCとPicoでデータをやり取りする部分をmain.pyに記述してます。通常この手のサンプルファイルだと無限ループ内に適当なウェイトを入れて走らせて定期的に温度データをPicoからPCに送るようなものが多いのですが、今回はPCからPicoにシリアルを使ってコマンドを送ったときだけ、Picoから温度データをPCに送るようにしました。
というのも、温度ではない特性データを得るために作ったPC上で動く既存のPythonスクリプトがあるので、そのPythonスクリプト内でPicoにアクセスして温度を取得するようにしたかったからです。
そんなわけで実際のmain.pyは下記のような感じになりました。
from tc_max31855 import get_thermo
while True:
s = input()
if s == 'temp?':
temp = get_thermo()
print(temp)
else:
print('?',s)
ざっくり説明すると、Picoが起動すると無限ループ内でPCからのコマンドを待って、指定のコマンド"temp?"を受信したらSPIでmax31855から温度データを読み出してPCに送るという感じです。
PicoでPCから送られてくるコマンドをどうやって受け取るのかが不明だったのですが、以下のサイトを参考にinput()を使うようにしました。
実はinput()を使うとPC側の受信処理を工夫しなければならなくなりました。実際に試してはいませんが以下のサイトのようにあるようにsys.stdin.readline()を使った方がいいのかもしれません。
このPicoに対してデータのやり取りを行うPC側のPythonスクリプトとしては以下のような感じになります。
import serial,time
PORT = 'COM7'
ser = serial.Serial(port=PORT,baudrate=115200,timeout=1)
try:
while True:
command = 'temp?'
ser.write((command+'\r\n').encode())
response_text = ser.read_until(('\r').encode()).decode().strip()
response_text = ser.read_until(('\r').encode()).decode().strip()
print(response_text)
ser.reset_input_buffer()
time.sleep(1)
except KeyboardInterrupt:
print('stop')
ser.close()
pass
ざっくり説明すると、Picoが接続されているCOMポートを調べてそのCOMポートを変数PORTで指定します。シリアルポートの設定をしたら無限ループで1秒おきにPicoへ"temp?"というコマンドを送ってPicoからの温度データを待ちます。スクリプトを終了するにはCtrl+cを押して終了させます。
ここで以下のように受信データを2回読み出していますが、
response_text = ser.read_until(('\r').encode()).decode().strip()
response_text = ser.read_until(('\r').encode()).decode().strip()
これが上で述べたinput()を使う際にPC側の受信処理を工夫しなければならなくなった部分です。
どうもMicroPythonでinput()を使うとPCから受信したコマンドをエコーバックするようです。コンソールなどからコマンドを送る時はその方が分かりやすいのでしょうが、純粋にデータだけが欲しい時はそのエコーバックが邪魔になります。そんなわけで上のように受信データを2回読み出すようにしてエコーバックで返ってきたコマンドを捨てるようにしました。
今回上記のような感じでPicoで熱電対を使った温度測定を行いました。PCとPico間でデータをやり取りする方法が分かったので、今後PCでPicoを使ったいろいろなデータ取り込みに応用できそうです。