前の記事で紹介したPWMやデジタルIOよりも少し魅力的な例を取り上げてみました。
同様にMicroPythonの対話型インタープリターモードを使うのですが、SPI接続の熱電対アンプMAX31855を使います。あまりPythonのプログラミングに深入りせずにIOとして使いたい人やLabVIEWのグラフ表示などUIを活用したい人に向いていると思います。
半田ごてを測定してみました。普通に使えそうです。
MAX31855のブレークアウトボードは秋月電子通商で3500円ぐらいで販売されています。Raspberry Pi Picoは800円ぐらいです。
Picoが使っているRP2040というマイコンにはハードウェアSPIが2チャンネルあり、今回は0chを使います。CS,SCLK,MOSI,MISOは以下の複数のIO端子から選択することができます。
#SPI0 pins available in RP2040
#RX(MISO): GP0,GP4,GP16
#CS: GP1,GP5,GP17
#SCK(SCLK): GP2,GP6,GP18
PICO <----------------------->MAX31855
3V3 Vin
GND GND
GP16 CLK
GP17 CS
GP18 DO
以下のMicroPythonのプログラムをtc_max31855.pyという名前でPicoのフラッシュメモリに保存しておきます。PCから対話型インタープリターモードで関数get_thermoをMicroPythonにインポートして使うことができます。
from machine import Pin, SPI
import time
# range of 14bit two's complement: -8192~8191
DATA_POSI_MAX = 8191
NEGATE_CONST = -16384
#SPI0 pins available in RP2040
#RX GP0,GP4,GP16
#CS GP1,GP5,GP17
#SCK GP2,GP6,GP18
SPI_CH = 0
RX_PIN = 16 #MISO_PIN
CS_PIN = 17
SCLK_PIN = 18
SPI_SPEED = 4_000_000
cs = Pin( CS_PIN, Pin.OUT )
cs.value( 1 )
spi = SPI( SPI_CH, sck=Pin( SCLK_PIN ), miso=Pin( RX_PIN ), baudrate = SPI_SPEED )
def get_thermo():
cs.value( 0 )
data = spi.read( 4 )
cs.value( 1 )
#print(f'{data[0]:08b}')
#print(f'{data[1]:08b}')
#print(f'{data[0] << 6:014b}')
#print(f'{data[1] >> 2:014b}')
temp_data = ((data[0] << 6) | (data[1]>>2))
#print(f'{temp_data:014b}')
if ( temp_data > DATA_POSI_MAX 😞 # Negate for two's complement
temp_data = temp_data + NEGATE_CONST
temp_c = temp_data * 0.25
print(f'{temp_c:.2f}')
return
'''
while True:
temp = get_thermo()
print(f'{temp:.2f}')
time.sleep( 1 )
'''
MAX31855では14ビットの2の補数表現で出力してきますので、負数の領域はif文の中で変換しています。
MicroPythonで入出力するプログラミングに関しては「これ1冊でできる!ラズベリー・パイPicoではじめる電子工作 超入門」が多くのデバイスをカバーしています。
pico_temp.viではスタックシーケンスを使って、シーケンス0で「from tc_max31855 import get_thermo」で関数をインポートして、シーケンス1のタイムドループで温度データを読み込んでいます。
各種センサー・アクチュエーターをArduinoボードで使う場合にはHobbyistツールキットを使ったり、Arduino IDEでLabVIEWからのコマンドを待ち受ける処理を書くか、随時データを送り出すプログラムを書いてきました。
MicroPythonの対話型インタープリタモードを使うことで、IO処理に必要なプログラムだけPicoに保存しておけばLabVIEW側から好きな時に自由に使うことができます。かなり便利だと思いませんか?