I2Cインターフェースのセンサを接続する(2)新しい温度センサTMP102
■I2Cインターフェースの温度センサTMP102を接続(2)
新しいTMP102のモジュールが届きました。購入した物にはピンヘッダは付属していません。新しいモジュールには固定のための3mmφの穴が二つ開けられています。次に示すように、6ピンのピンヘッダがはんだ付けできるようになっています。以前のモジュールより使いやすくなっています。
今回はブレッドボードに接続するため、次に示す一般的なピンヘッダを接続しました。
次に示すモジュールの部品面には、センサ・チップとSDA、SCL、ALT端子の1kΩのプルアップ抵抗、0.1μFの電源デカップリング・コンデンサが搭載されています。
●ADD0はジャンパでGNDに接続
部品面のADD0の表示の右側に「ADD0とGND、VCC」に接続するジャンパのランドが用意されています。購入時のデフォルトではADD0はGNDと接続されています。デフォルトではI2Cのスレーブ・アドレスは0x48です。今回はADD0をGNDに接続し、0x48として利用します。
部品面にも各端子の端子名が印刷されていますが、部品面の裏面には端子名の印刷文字しかないのでわかりやすくなっています。
ジャンパの変更時に容易なように、部品面を上にしてピンヘッダのはんだ付けを行いました。
はんだ付けは、次に示すようにピンヘッダをブレッドボードに挿し込みモジュールを載せます。モジュールを水平に保つために、別のピンヘッダを下に敷きました。まずはんだ付けは両端のピンをはんだ付けし、ピンがゆがみなく入っているのか確認します。
曲がりや、浮きがあったら補正します。確認を終えたら残りのピンをはんだ付けします。
このモジュールの回路図を次に示します。JP2は基板上のADD0とVCC、GNDのジャンパのランドです。
3.3V電源(赤)、GND(黒)でモジュールに電源の供給を行っています。緑はSDA、黄色はSCLでI2Cレベル変換モジュール、LCDモジュール、旧タイプのTMP102のそれぞれのSCL、SDAに接続されています。
ADD0とGNDを接続している橙色のジャンパを変更する場合は、モジュールのJP2のADD0とGNDを接続しているジャンパをカットする必要があります。購入時のボードはJP2でADD0とGNDが接続されています。そのままGND以外に接続すると、3.3Vをショートしたり、SCLやSDAをGNDに固定してしまいます。
●I2Cのバス・ラインの負荷抵抗
I2Cの電圧レベル変換モジュール、旧TMP102、新TMP102の各モジュールにそれぞれ1kΩのプルアップ抵抗がモジュールに内蔵されています。おおよそ330Ωの負荷となります。今回は実際に動かして動作確認を行います。
●プログラム
TMP102から温度を読み取るプログラムは、次に示すようにTMP102のそれぞれのアドレスを引数とするものに変更します。
float get_tmp102(unsigned char tmp0_adr) { Wire.requestFrom(tmp0_adr, 2); while (Wire.available() < 2) { } int tmpin = Wire.read() * 16; tmpin = tmpin + (Wire.read() >> 4); Wire.endTransmission(); float tmpdata = 0.0625 * tmpin; return tmpdata; |
新しいモジュールの温度表示を、見出しtmp2=として2行目の先頭から表示するようにします。変更したプログラムは次のようになります。変数の定義部で次のように、
unsigned char tmp2_adr = 0x48; |
このアドレスをget_tmp()関数の引数にして温度を読み取ります。
void loop() { lcdclear(); i2cprint("temp ="); float tdata = get_tmp102(tmp_adr); i2cprint(String(tdata)); lcdcu_set(0,1); // 2行めの先頭にカーソルをセット i2cprint("temp2="); tdata = get_tmp102(tmp2_adr); i2cprint(String(tdata)); delay(1000); } |
●実行結果
実行結果を次に示します。文字の抜けが生じました。
次に示すように、LCDに文字列を表示する関数の1文字書き出した後にdelay(1)の待ち時間処理を追加しました。
void i2cprint( String pdata) { int n = pdata.length(); for (int i = 0; i < n; i = i + 1) { i2cwritedata(pdata.charAt(i)); delay(1); } } |
この処理を行うと、次のように文字の抜けが生じなくなりました。
temp2の新しいモジュールの表示は実際の温度を表示しています。旧TMP102はセンサ部分などに不具合があり、正しい表示ができなくなったと想定されます。
次回、I2Cバスの負荷抵抗について確認してみます。
(2016/9/16 V1.0)
<神崎康宏>
バックグラウンドデカップリング・コンデンサ;二つの機能があります。デバイスが動作するとき急激に電流が流れるので一時的に電力を配給する役目、デバイス自体が出すノイズを外部に伝えないようにする役目です。