【連載③】宇宙を目指す小さなIMU試作の記録:TMP102を使って温度をArduinoで読み取る
はじめに
この回では、**高精度なI²C接続型温度センサー「TMP102」**を使って、Arduinoで温度データを取得する方法を解説します。
本連載では、MPU6050による加速度・ジャイロデータを使って姿勢推定を行うことを目指していますが、その精度に大きな影響を与えるのが、**「温度によるセンサ出力のドリフト(変動)」**です。
MEMSセンサーは、温度変化に対して敏感であり、
- 静止しているのに加速度値が徐々にずれてくる
- 角速度が出ていないのに微妙な回転を検出してしまう
といった現象が起きます。
このような**「誤差の傾向をつかむ」ためには、センサー出力と同時に周囲温度を記録すること**が不可欠です。
なぜTMP102なのか?
TMP102は、以下のような特徴を持つTI製の高精度デジタル温度センサーです:
- ±0.5°C程度の精度で、動作も安定
- I²C通信でArduinoと簡単に接続可能
- データ読み出しが速く、複雑な設定も不要
- 小型・低消費電力でIMUと組み合わせやすい
この回では、TMP102の接続方法とArduinoスケッチを使って、シリアルモニターに温度を表示するところまでを行います。
配線図
実際に繋いでみた(強引ですが)
Arduinoコード
TMP102はI²C通信で動作する高精度温度センサーです。
ここでは、ライブラリを使用せずに、レジスタを直接操作して温度データを読み取る方法を紹介します。
TMP102をレジスタで直接制御して読み取る
TMP102はI²C接続のシンプルな温度センサーで、温度データはアドレス0x00のレジスタに格納されています。
このデータを Wire
ライブラリで直接読み出すことで、ライブラリを使わずに制御できます。
TMP102の温度出力は16ビット中の上位12ビットが有効で、スケーリング係数は0.0625°C/LSBです。
データ形式は、2の補数(負の温度にも対応)となっています。
スケッチコード(レジスタ直読み版)
sketch_temp_monitor.ino
#include <Wire.h>
#define TMP102_ADDR 0x48
void setup() {
Serial.begin(9600);
Wire.begin();
Serial.println("TMP102 initialized (raw access).");
}
void loop() {
Wire.beginTransmission(TMP102_ADDR);
Wire.write(0x00); // 温度レジスタ
Wire.endTransmission();
Wire.requestFrom(TMP102_ADDR, 2);
if (Wire.available() == 2) {
uint8_t msb = Wire.read();
uint8_t lsb = Wire.read();
int16_t rawTemp = ((msb << 8) | lsb) >> 4;
// 符号付き12ビット補正
if (rawTemp & 0x800) {
rawTemp |= 0xF000; // 負の数として拡張
}
float temperature = rawTemp * 0.0625;
Serial.print("Temperature (°C): ");
Serial.println(temperature, 2);
}
delay(1000);
}
結果
シリアルモニターにセンサーのデータが出力されていることを確認。
参考資料:TMP102の公式ドキュメント
- 📘 TMP102 Digital Temperature Sensor Datasheet(Texas Instruments)
https://www.ti.com/lit/ds/symlink/tmp102.pdf
このデータシートでは、TMP102の以下のような情報が詳しく記載されています:
- 動作電圧・消費電流
- I²C通信仕様
- レジスタマップ(特に温度取得:
0x00
レジスタ) - アラート設定・変換レート設定などの追加機能
Wireライブラリを使って直接温度を取得したい場合、TMP102の構造を知るうえで非常に有用な資料です。
Discussion