キノコの自省録

日々適当クリエイト

MLX90614をRaspberry piで使う

前回紹介したシアーハートアタックの熱源探知には、赤外線温度センサーを使用しています。

赤外線温度センサーは、非接触で対象物の温度を測ることのできる温度計です。

kinokorori.hatenablog.com  

今回使用したのは、MelexisのMLX90614という赤外線温度センサーです。

正確に測定するには5cmくらいの距離じゃないとダメですが、

多少離れていても、「なんか熱源がある」くらいは検出できます。

例えば、50cmくらい離れた場所に人がいた場合、室温よりは1℃くらい高くなります。

(レンズを使用したりすると、もっと伸びるかもしれません。)

3.3V(5V品もあるので注意), I2Cで制御可能ということもあり、ラズパイでもArduinoでも扱いやすい。

検出温度のレンジは-40~125℃ほど。

 

ただ、赤外線温度センサーって高いんですよね。

MLX90614は単価2200~3000円くらいです。壊したら泣きます。

ちなみに私は千石電商で2800円で買いました。

評価ボード付きだと7000円くらいですが、素で十分扱えます。

 

Amazonでは、ノーブランド品が\690で売ってるみたいです。

ふーん、これでもよかったかもしれない。

色々調べると、結構安値のものがありますね。ムムム。

例えば、多くの電子部品を安値で販売しているHiLetGoも、赤外線温度センサーを販売している模様。\430也

ちなみに、赤外線温度センサーには、4x4とか8x8とか、点ではなく2Dでデータを取れるものがあります。

こういう2Dセンサーをアレイセンサーと呼んだりします。値段は少々高めです。

買いやすいところではOMRONのD6TとかGrid-Eyeとか。

下の画像はOMRONのD6T-L44です。Grid-EyeはRSオンラインから買えます。

とりあえず、MLX90614の話に戻ります。

Raspberry piで扱う

ラズパイで扱う、というよりI2Cでどう扱うかという話がメインになります。

脚が4本で、Vdd, GND, SCL, SDAと、実に普通のI2Cです。

対応するラズパイのGPIOピンに差すだけです。SlaveAddrは0x5a。

$ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- 5a -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         

ここまではいいのですが、MLX90614のプロトコルはちょっとした癖があるので、適当にreadを試みても失敗します。

データの読み込み

データシート(これがまためちゃめちゃ分厚い)の8.4.3.1.1あたりですかね。

こんな風に書いてあると思います。

1      7        1
S|Slave Address|Wr|..(略)

これの意味するところは、Slave Addressは7bitで書いてください、ということです。

0x5a=0101 1010を表現するには、1bit左にシフトして、1011 0100=0xb4としなければなりません。

読み込みデータは、8.4.3.1.1にも、以下の文章、

If the access to the MLX90614 is a read operation it will respond with 16 data bits and 8 bit PEC only if its own slave address,

にも書いてある通り、Data-High, Data-Low, PECの3octetです。

The PEC is a CRC-8 with polynomial X8+X2+X1+1. T

ということで、PECはCRC-8です。誤り制御用なので、ホビー用途なら捨てても構わないと思います。

一度に3Byte読む必要があるので、SMbusのread_i2c_block_dataで読み込みましょう。

レジスタアドレスは0x7なので、

bus = smbus.SMBus(1)
t = bus.read_i2c_block_data(0xb4, 0x7, 3)

で読み込めます。なお、アドレス0x6を読むと、外気温が取れます。

シアーハートアタックでは、0x7と0x6の差分を取って熱源判定をしています。