From Saturday, Nov 23rd 7:00 PM CST - Sunday, Nov 24th 7:45 AM CST, ni.com will undergo system upgrades that may result in temporary service interruption.

We appreciate your patience as we improve our online experience.

北東北 LabVIEWユーザー会

キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 

MicroPythonとLabVIEWで熱電対を使った温度測定

前の記事で紹介したPWMやデジタルIOよりも少し魅力的な例を取り上げてみました。

同様にMicroPythonの対話型インタープリターモードを使うのですが、SPI接続の熱電対アンプMAX31855を使います。あまりPythonのプログラミングに深入りせずにIOとして使いたい人やLabVIEWのグラフ表示などUIを活用したい人に向いていると思います。

 

 

P1230081.JPG

 半田ごてを測定してみました。普通に使えそうです。

 

sc2.pngsc3.pngsc4.png

 

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 )
'''

 

sc5.png

 

MAX31855では14ビットの2の補数表現で出力してきますので、負数の領域はif文の中で変換しています。

MicroPythonで入出力するプログラミングに関しては「これ1冊でできる!ラズベリー・パイPicoではじめる電子工作 超入門」が多くのデバイスをカバーしています。

 

pico_temp.viではスタックシーケンスを使って、シーケンス0で「from tc_max31855 import get_thermo」で関数をインポートして、シーケンス1のタイムドループで温度データを読み込んでいます。

sc6.pngsc7.png

 

各種センサー・アクチュエーターをArduinoボードで使う場合にはHobbyistツールキットを使ったり、Arduino IDEでLabVIEWからのコマンドを待ち受ける処理を書くか、随時データを送り出すプログラムを書いてきました。

MicroPythonの対話型インタープリタモードを使うことで、IO処理に必要なプログラムだけPicoに保存しておけばLabVIEW側から好きな時に自由に使うことができます。かなり便利だと思いませんか?

 

すべてをダウンロード
メッセージ1/1
1,406件の閲覧回数