今回は、秋月電子さんで売っている、”ADT7410使用 高精度・高分解能 I2C・16Bit 温度センサモジュール”の説明です。
秋月電子さんのHPに、マニュアルPDFが有ります。基本的操作はこれで十分なのですが詳細をHPにある、使用半導体資料 を元に調べて見ました。
レジスタの概要
ADT7410の各レジスタと電源投入時の値は下記の様になっています。
- 0x00 上位温度レジスタ
- 最上位ビットが負号をその他は温度データ
- 0x01 下位温度レジスタ
- データ長を13ビットとした場合
- ビット0: TLOW より測定値が小さい場合1。
- ビット1: THIGH より測定値が大きい場合1。
- ビット2: TCRIT より測定値が大きい場合1。
- データ長を13ビットとした場合
- 0x02 ステータスレジスタ
- ビット0から3は未使用
- ビット4:TLOWビット。 設定最低温度より測定値が低い場合1。
- ビット5:THIGHビット。設定最高温度より測定値が高い場合1。
- ビット6:TCRITビット。設定危険温度より測定温度が高い場合1。
- ビット7:RDYビット。測定値が温度ジスタに保管されたら0。
- 0x03 コンフィグレーションレジスタ
- ビット0から4
- 割り込みモード等の設定に使用する様ですが、秋月のモジュールはこれ関係の端子が出ていないので使えません。
- ビット5,6 測定モードの設定
- 00:連続モード。デフォルト。測定が終わると直ぐ次の準備
- 01:ワンショット測定。
- 10:SPSモード。繰り返し測定するモード。
- 11:シャットダウン。通信以外の電源オフ
- ビット0から4
- 0x04,0x05 THIGH SETPOINT レジスタ
- ユーザーが指定する測定最高温度。
- この温度より測定値が高くなると、THIGHビットが1。
- 0x06,0x07 TLOW SETPOINT レジスタ
- ユーザーが指定する測定最低温度。
- この温度より測定値が低くなると、TLOWビットが1。
- 0x08,0x09 TCRIT SETPOINT レジスタ
- ユーザーが指定する設定危険温度
- この温度より測定値が高くなると、TCRIT ビットが1。
- 0x0a ヒステリシス調整レジスタ
- 0x0b IDレジスタ
- 0x2f ソフトウエアリセット
この中でよく使用するのは、
- コンフィグレーションレジスタ
- ビット6,5: 測定モードの設定
- ビット7 : 分解能の設定
- 温度レジスタ ー> 測定データ読み取り
くらいです。ただ気になるのが、”TLOW SETPOINT レジスタ”。設定値が10℃になっています。つまり測定が10℃より低い場合、TLOWビットが1になります。このモジュールの場合、このビットを使用していないので、1になって困る事は無いと思いますが、設定値を変えたい所です。
ADT7410へのアクセス
説明書によると読み書きは以下の手順で行う様です
- 書き込み
- I2Cのアドレスを書き込みモードで送る。
- アクセスしたいレジスタ番号を送ってアクセスポインターをセットする。
- データを送る。
- アクセスポインターは自動でインクリメントされる為、データが連続する場合続けて送信可能。
- 書き込み終了後、Stopコンディションを送って終了
- 読み込み
- I2Cのアドレスを書き込みモードで送る。
- アクセスしたいレジスタ番号を送ってアクセスポインターをセットする。
- 2Cのアドレスを書き込みモードで送る。
- データを読み込む
- アクセスポインターは自動でインクリメントされる為、データが連続する場合続けて読み込み可能
- 読み込み終了後、Stopコンディションを送って終了
例えば、ADT7410の、”ステータスレジスタ”を読み込みたい場合。
- I2Cのアドレス(読み込み)+ ”ステータスレジスタ”の番号、”0x02”を書き込む。
- アドレスポインターが2に設定される
- 続いてADT7410からデータを読み込む。
また、測定データを読み込む場合、
- I2Cのアドレス(読み込み)+ ”温度レジスタ上位レジスタ”の番号、”0x00”を書き込む。
- アドレスポインターが0に設定される
- ADT7410から、1バイト読み込む。(測定値の上位バイト)
- アドレスポインターが自動でインクリメントされ1になる。これによりポインターは”温度レジスタ下位レジスタ”をさしている。
- ADT7410から、1バイト読み込む。(測定値の下位バイト)
Webでよく下記の様なスケッチで値を読み込んでいるのを見ます。
Wire.begin();
Wire.requestFrom(addr, 2);
data = Wire.read() << 8;
data |= Wire.read();
温度の読み取りですが、アドレスポインターの設定を行っていません。ADT7410は、電源投入で
- 測定長は13ビット。
- 測定モードは連続モード。
- アドレスポインターは0。
となっているます。アドレスポインターが既に読みたいレジスターに有る場合、ポインターを設定すること無く、レジスタの値を読む事が出来る様です。
ちょっと疑問
上記のスケッチでWire.requestFrom(Addr, 2);で2バイト読み込んだ後、もう一度2バイト読み込んだら読み込んだ値はどうなるのか。予想は、
- 最初の1回目は、レジスタ、”0x00,0x01”。
- 次は、レジスタ、”0x02,0x03”
と思います。下記のスケッチで確認しました。
Wire.requestFrom(Addr, 2);
Serial.println("1st=" + String(Wire.read(),HEX));
Serial.println("2nd=" + String(Wire.read(),HEX));
Wire.requestFrom(Addr, 2);
Serial.println("3rd=" + String(Wire.read(),HEX));
Serial.println("4th=" + String(Wire.read(),HEX));
結果は、2回とも、レジスタ、”0x00,0x01”の値を返して来ました。Wire.requestFrom(Addr, 2);は処理に最後にStopコンディションを送信します。多分Stopコンディションが送信されるとアドレスポインターレジスタは0になると思われます。
確認の為に
このスケッチは、
- アドレスを0x04に設定して4バイト読み込む。
- 続けて、アドレスを指定しないで4バイト読み込む。
a=0x04;
Wire.beginTransmission(ADT);
Wire.write(a);
Wire.endTransmission(false);
Wire.requestFrom(ADT, 4);
Serial.println(String(a,HEX) + "=" + String(Wire.read(),HEX));
Serial.println(String(a+1,HEX) + "=" + String(Wire.read(),HEX));
Serial.println(String(a+2,HEX) + "=" + String(Wire.read(),HEX));
Serial.println(String(a+3,HEX) + "=" + String(Wire.read(),HEX));
Wire.requestFrom(ADT, 4);
Serial.println(String(a,HEX) + "=" + String(Wire.read(),HEX));
Serial.println(String(a+1,HEX) + "=" + String(Wire.read(),HEX));
Serial.println(String(a+2,HEX) + "=" + String(Wire.read(),HEX));
Serial.println(String(a+3,HEX) + "=" + String(Wire.read(),HEX));
結果は、0x20,0x00,0x05,0x00 / 0x0b,0x5b,0x80,0x00 となりました。最初の4つは予想通り。次の4つはアドレス0x00からの4つです。つまり、Wire.requestFrom()でデータを読み込む時、1回の処理が終わるとポインターは0x00に戻るが正しい様です。
最後に今回使用した回路と、温度を読み出すプログラムは下記の通りです。
#include <Wire.h>
#define ADR 0x48
void setup() {
Wire.begin();
Serial.begin(115200);
}
void loop() {
float tp;
short int data;
Wire.beginTransmission(ADR);
Wire.write(0);
Wire.endTransmission(false);
Wire.requestFrom(ADR,2);
data = Wire.read() << 8;
data |= Wire.read();
data >>= 3;
tp = (float)data / 16.0;
Serial.println("T=" + String(tp) + "'C ");
delay(1000);
- 2行:define ADR 0x48
- 今回使用したモジュールのI2Cアドレス
- 13から15行:
- ここで、I2Cアドレスとアドレスポインターの値を送信しています。
- 17行:Wire.requestFrom(ADR,2);
- 2バイト読み込む事をデバイスに送信
- 18,19行:温度データの読み込み
- 21,22行:温度データの換算
- 23行:データの表示。
ちなみに温度データは13から15行のコードが無くても読み込む事が可能です。
追加
PIC版はここに有りますー>ADT7410 温度測定モジュール (for PIC)