LoginSignup
7
6

More than 3 years have passed since last update.

matlabでラズパイにつないだ温度センサからデータをもってくる。確度は±0.1℃

Posted at

 テレビの天気予報では、0.1℃単位で温度が表示されます。温度計は、とうぜん気象庁の校正を受けていなければ、うそっこのデータになります。校正といえば、費用と時間がかかります。ここでは、±0.1℃がメーカによって保証?されているTMP117を使います。
 データシートに書かれている特徴です。

ASTME1112およびISO 80601の電子医療体温計の要件を満
たすように設計されています。較正不要で、-20°C~50℃
の温度範囲にわたって0.0078℃の分解能、最大±0.1℃
の精度で16ビットの温度結果を提供します。

TMP117のおもなスペック

  • 動作電圧 1.8~5.5V
  • 分解能 16ビット、LSBは0.007812℃
  • 動作温度範囲  -55~150℃
  • 確度
    • -20~+50℃ の範囲で±0.1℃ (最大値)
    • -40~+100℃ の範囲で±0.2℃ (最大値)
    • -55~+150℃ の範囲で±0.3℃ (最大値)
  • 消費電流 1Hzの変換サイクルで3.5uA
  • インターフェース I2C(1~400kHz)
  • データ長 2の補数形式の16ビット
  • 平均化出力が可能
  • 温度設定のアラートあり

評価ボードを加工

 とても小さいパッケージなので、手はんだは困難です。評価ボードTMP117EVMを入手しました。使用例は、こちらを参照してください。
IMG_3000.png

 先端を切り離して使います。
IMG_3989.png

 ケーブルをはんだ付けし、先端にコネクタを圧着し、ラズパイとの接続に使います。
IMG_3999 (2).png

接続

 SDAをラズパイの3番(GPIO2)、SCLを5番(GPIO4)に接続します。GNDはGNDへ、V+は3.3Vへ接続します。アラート出力のALRTは、今回使いません。
image.png

スレーブ・アドレス

 切り離したセンサ部分の基板上にはR16が取り付けられている(ADD0がGNDに接続)ので、スレーブ・アドレスは0x48です。
 プログラムで確認します。ラズパイのセットアップは、前回の記事を参照してください。

clear all
rpi = raspi('192.168.111.114', 'pi', 'raspberry');
for i = 1:length(rpi.AvailableI2CBuses)
   scanI2CBus(rpi, rpi.AvailableI2CBuses{i})
end

 0x48が返りました。

プログラム

 ConfigurationRegister に各種設定を書き込みます。データシートには、factory default reset = 0220hと書かれています。
 Conversion cycle bitが'100'です。変更する必要はなかったのですが、'000'にしました。
 Conversion averaging modesは'01': 8 Averaged conversionsです。'11': 64 averaged conversionsに変更しました。この時、変換時間は1秒になります。

 10回繰り返して温度を読み出します。分解能を見たいがために小数点第5位まで表示していますが、確度はそこまで取れません。
 パッケージが小さいので、レスポンスはよいです。

 読み出したデータは、16ビット長 2の補数形式なので、一度dec2bin()でバイナリの文字列に変換します。この文字列の前に接頭語'0b'をくっつけ、後ろに接尾辞's16'をつなげます。その文字列をbin2dec()で10進数に変換すると、先頭が'1'であればマイナスの符号の処理が行われます(R2020a以降)。

clear all
rpi = raspi('192.168.111.114', 'pi', 'raspberry'); % host name raspberrypi-uMchsTIvew
% for i = 1:length(rpi.AvailableI2CBuses)
%    scanI2CBus(rpi, rpi.AvailableI2CBuses{i})
% end

tmp117 = i2cdev(rpi, 'i2c-1', '0x48');

TemperatureRegister   = 0x00;
ConfigurationRegister = 0x01;

Ctrl_OUT = [0x00, 0x60]; % Continuous conversion,Conversion cycle=000,averaging=11 is 64...1sec
writeRegister(tmp117, ConfigurationRegister, Ctrl_OUT, 'uint8');

for i=1:10
    RegisterData = readRegister(tmp117, TemperatureRegister, 2);
    temperature =  double(bitshift(uint16(RegisterData(1)), 8)) + double(RegisterData(2));
    temperature = bin2dec(append('0b',dec2bin(temperature),'s16'))* 0.0078125;  % 2's complement R2020a
    fprintf(' temperature is %.5f \n', temperature);
    pause(2);
end
7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6