部品屋根性(78) LM61、アナログ出力温度センサをラズパイPythonで読み取る

Joseph Halfmoon

前回はI2C接続の温湿度センサAHT21Bをラズパイ上のPythonで読み取ってみました。今回は、アナログ信号出力の温度センサLM61をやはりラズパイPythonで読み取ってみます。アナログ入力を持たないラズパイのために外付けADCのMCP3421を取り付けてあるので「端子を接続するだけ」で読める筈なのですが。

※「部品屋根性」投稿順Indexはこちら

装置の温度制御のためのIC温度センサ

今回使ってみる、LM61というのはアナログ出力(温度に比例する電圧が出力される)IC温度センサです。メーカー(TI社)の製品ページへのURLが以下に。

LM61

今回購入したのは、TO-92パッケージ(いわゆるバイポーラのトランジスタによく使われている3本脚のパッケージ)品です。2.7Vから10Vの単一電源とグラウンドに接続しさえすれば、OUT端子から温度に比例する電圧(摂氏0度のときに600mV、1℃あたり10mV)が出力されるという、ほとんど何も考えなくても使えそうな製品です(そう言いながら私は大失敗をしましたが。)

この手の製品は各社から出てますが、目的は回路/装置の動作温度を測定し動作温度に応じた制御を行うためのものです。多分、測定した温度を数値として表示するというようなことは滅多にないことだと思います(今回はやっているケド。)典型的なアプリケーションとしては、AD変換などせず、アナログコンパレータで、設定電圧(温度)を超えたことを検出したらファンの電源入れる、といった使い方でないかと思います。

今回はいつものように、Raspberry Pi 3 model B+の先の回路に LM61 を接続して動作を観察してみました。回路図が以下に。LM61sch

上記では5VのIOのサポートのためにI2Cバスを5V化していますが、ADCであるMCP3421も、温度センサであるLM61も、3.3V電源で動作可能なデバイスであるので、上記のレベル変換はMCP3421とLM61だけを見れば余分な回路です。あしからず。

LM61の温度を読み取る実験用のPythonスクリプト

LM61が出力する電圧をラズパイが直接読み取れるわけではないので、I2C接続のMCP3421 ADコンバータで読み取っています。MCP3421は±2.048Vの範囲を最大18ビットレゾリューションでAD変換できる高分解能のチップです。

LM61は、は、-30℃から100℃という温度範囲で±4℃の精度、公称出力電圧は300mVから1600mVです。すると18ビットはおろか、MCP3421の最小分解能12ビットでも十分すぎるくらいです。今回は最も粗い12ビットでやっています。MCP3421を12ビットモードにしても、0Vから2.048Vの範囲を1mV単位で読み取れるのでLM61の公称出力電圧範囲を0.1℃レゾリューションで読み取れることになります(実際の精度は0.1℃なんてないけれど。)

読み取りスクリプト(実際にはMCP3421制御スクリプト)が以下に。

from smbus2 import SMBus, i2c_msg
import time

device = 0x68

def conv16count2mV(count):
    """convert MCP3421 count(12bit mode) to Vin
    
    Experimental: count = mV;
    Returns Vin [mV]
    """
    return count

def convMV2Temp(mv):
    """convert LM61 output voltage to Temp.
    
    input: mv [mV] 
    Retruns Temp[C]
    """
    return (mv - 600) / 10

def main():
    print("LM61 Read test")
    with SMBus(1) as bus:
        cnt = 5
        while (cnt > 0):
            msg = i2c_msg.read(device, 3)
            bus.i2c_rdwr(msg)
            data = list(msg)
            if len(data)==3:
                mV = conv16count2mV(data[0]*256+data[1])
                temp = convMV2Temp(mV)
                print("Count:", data[0]*256+data[1])
                print("Control: 0x{0:02x}".format(data[2]))
                print("Output Voltage[mV]:", mV)
                print("Temperature[C]    :", temp)
            cnt -= 1
            time.sleep(3)

if __name__ == "__main__":
    main()
実機実行結果

実行結果が以下に。出だし32.4℃とか表示されているのは、実際に部屋が暑かったせいもありますが「チップがあったまっていた」せいもあります。Result

今回、大失敗をしてしまいました。LM61逆刺し! データシートを見て「ちゃんと配線したつもり」だったのですが、頭の中で左右逆転、鏡像の端子と誤認識してました。動作が変、チップ触ったら熱かったです。大慌てで電源OFF。壊してしまったかと思いましたが、とりあえず壊れてはいないようでした(逆刺ししてもあまり電流流れない構成になっていたので救われたみたい。)

いやあ、上下反転、鏡像回転、この手の認識力が衰えてきているのかも知れません。ヤバイなあ。ますますリハビリ(ブレッドボードで部品組み立て)に励まないと。

部品屋根性(77) AHT21B、CRC8でのデータ検査を追加。ラズパイPython へ戻る

部品屋根性(79) Force Sensing Linear Potentiometer へ進む