赤外線温度センサーMLX90614とArduinoを接続する [電子工作]

RIMG1904.JPG
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 を使用することにします。

インストールの手順は下記の通りです。
  1. AVR-GCC Source Examplesのページにアクセス
  2. AVR-GCC librariesのi2cmaster.zipをダウンロード
  3. Arduinoの導入フォルダ\ibrariesの下にi2cmasterというフォルダを作成
  4. ZIPファイルより、i2cmaster.hとtwimaster.cを上記フォルダにコピーする
  5. twimaster.cをtwimaster.cppにリネーム
  6. 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は間違いです。ゼロΩと読替えて下さい。(いずれ差替えします)
MXL90614_test1.gif

部品一覧
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スケッチを作成して、リアルタイムでセンサーの検知した温度を表示させるようにしてみました。
WS000028.JPG
データシートによるとセンサーの有効範囲は約60度ということなので、マグカップ程度の大きさのものを測定する場合は10cm程度に近づけないと、正しい値が測定出来ません。
今後はもう少しピンポイントでの計測を出来るようにするのが課題です。(電子工作というより工作向けの課題ですが)





タグ:Arduino mlx90614 I2C
nice!(0)  コメント(1)  トラックバック(0) 
共通テーマ:趣味・カルチャー

nice! 0

コメント 1

ちょこっとUPDATE.
Arduino 1.0以降であれば、Adafruitのライブラリーで、より簡単にコーディングできます。
https://github.com/adafruit/Adafruit-MLX90614-Library
最初から5V品をかえば、レベルシフトも不要です。
by (2014-10-26 18:11) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

Arduino 0021Arduino 0022 ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。