赤外線温度センサーMLX90614とArduinoを接続する [電子工作]
Strawberry Linuxで赤外線温度センサーMLX90614を購入しました。
こいつとArduinoと接続してみます。
製品の特徴
MLX90614は放射温度センサーです。外気温ではなく、物体から放射される赤外線により温度を測定します。(サーモグラフィも同じ原理)
購入したのはMLX90614BAAというモデルでデータシートによれば次のような特徴があります。
商品ページより
■MLX90614は非接触で温度を観測できる赤外線温度センサです。
■しかも内部に17ビットのADコンバータを内蔵しているため、アナログ回路を必要とせず高精度・高分解能で計測できます。
■インターフェースはPWMとSMBus(≒I2C)が選べます。SBBusの場合最小分解能は0.02℃です。
■3V品
◆仕様
・Factory calibrated in wide temperature range:
-40 to +85°C for sensor temperature
-70 to +380°C for object temperature
データシートにSupply Voltage(VDD)は2.6V~3.6Vとあるので、Arduinoの3.3Vの出力を利用してドライブすることが出来ます。
インターフェースはSMBus(i2Cとほぼ同じ規格)を使用します。
レベルシフトについて
i2Cはクロックはマスターから供給しますが、データは一本の信号線を使い双方向でやり取りを行うので、電圧レベルの異なる場合でも確実にお互いのHIGH-LOWの変化を認識する必要があります。このような場合の回路については、エレキジャックのブログでレベル変換用のICを使うやり方が紹介されています。
私は今回gomisaiさんのブログにあった、バイポーラトランジスタを使用するレベルシフト回路を試して見ました。
詳しくはこちらを見て頂きたいのですが、50KHz 程度であれば私の環境では問題無く動作しました。
SMBusをArdionoで使用する
MLX90614とArduinoの接続については、本家のPlaygroundで紹介されているMartin Nawrathさんのソースで動作を確認しました。
本家のフォーラムのこの記事に書かれている通り、SMBusはi2Cとほぼ互換にも関わらずMLX90614は標準のWireライブラリでは動作しないようです。
記事にロジアナでの調査結果が載っていますが、要約するとマスターからSENDコマンドに続いてSTOP bit → START bitが発行されているため、Repeated Start Condition待ちのセンサーはエラーと見なして正しく値を返さないようです。
エレキジャックNo.8&No.9を読む限り、センサー側の仕様はi2Cの規格に沿っているようにしか思えないのですが、結果はNGのようです。
そのためMartinさんの例にならい AVR汎用の外部ライブラリ i2cmaster.h を使用することにします。
インストールの手順は下記の通りです。
- AVR-GCC Source Examplesのページにアクセス
- AVR-GCC librariesのi2cmaster.zipをダウンロード
- Arduinoの導入フォルダ\ibrariesの下にi2cmasterというフォルダを作成
- ZIPファイルより、i2cmaster.hとtwimaster.cを上記フォルダにコピーする
- twimaster.cをtwimaster.cppにリネーム
-
twimaster.cppの17行目と21行目をそれぞれの環境に合わせて変更
15 + /* define CPU frequency in Mhz here if not defined in Makefile */ 16 + #ifndef F_CPU 17 + #define F_CPU 4000000UL 18 + #endif 19 + 20 + /* I2C clock in Hz */ 21 + #define SCL_CLOCK 100000L 22 +
私のArduinoは16MHz稼働なので、F_CPUは 16000000UL (unsigned long で16M)に、SCL_CLOCKは安全をみて50000L (50KHz)にしました。
完成
回路図はこちらになります。R1及びR2は間違いです。ゼロΩと読替えて下さい。(いずれ差替えします)
部品一覧
No | 製品 | 個数 | 記号 |
---|---|---|---|
1 | 1KΩ 1/4W 炭素皮膜抵抗 | 4 | R3,R4.R5.R6 |
2 | 330Ω 1/4W 炭素皮膜抵抗 | 2 | R7,R8 |
3 | 2SC1815 NPNバイポーラトランジスター | 2 | Q1,Q2 |
4 | 0.1μF 積層セラミックコンデンサー | 1 | C1 |
5 | その他(ユニバーサル基板,ソケット等)必要に応じて準備 |   |   |
手持ちの部品で間に合わせた関係で若干gomisaiさんの記事と係数が異なりますが、いまのところ問題無いようです。
また、画面表示用に簡単なProcessingスケッチを作成して、リアルタイムでセンサーの検知した温度を表示させるようにしてみました。
データシートによるとセンサーの有効範囲は約60度ということなので、マグカップ程度の大きさのものを測定する場合は10cm程度に近づけないと、正しい値が測定出来ません。
今後はもう少しピンポイントでの計測を出来るようにするのが課題です。(電子工作というより工作向けの課題ですが)
ちょこっとUPDATE.
Arduino 1.0以降であれば、Adafruitのライブラリーで、より簡単にコーディングできます。
https://github.com/adafruit/Adafruit-MLX90614-Library
最初から5V品をかえば、レベルシフトも不要です。
by (2014-10-26 18:11)