🪐

【連載③】宇宙を目指す小さな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の以下のような情報が詳しく記載されています:

  • 動作電圧・消費電流
  • I²C通信仕様
  • レジスタマップ(特に温度取得:0x00 レジスタ)
  • アラート設定・変換レート設定などの追加機能

Wireライブラリを使って直接温度を取得したい場合、TMP102の構造を知るうえで非常に有用な資料です。

Discussion