MLX90614をRaspberry piで使う
前回紹介したシアーハートアタックの熱源探知には、赤外線温度センサーを使用しています。
赤外線温度センサーは、非接触で対象物の温度を測ることのできる温度計です。
今回使用したのは、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の差分を取って熱源判定をしています。