概要
過去に I2C 接続の高精度の温度センサ MCP9808 を Arduino Pro mini で使用してみました
そのときは専用のライブラリを使用して動作させました
今回は勉強のためライブラリを使わずに MCP9808 から値を取得してみました
環境
- Mac OS X 10.10.5
- Arduino IDE 1.6.12
- Arduino Pro mini (5v, 16MHz)
配線
こちらと全く同じなので、参考に配線してください
I2C を一つ繋いでいるだけの配線なので簡単です
スケッチ
Wire.h
というデフォルトで使用できる I2C 用のライブラリを使ってプログラミングします
setup で Wire.begin()
するのを忘れないようにしましょう
#include <Wire.h>
void setup() {
Wire.begin();
Serial.begin(9600);
}
void loop() {
uint16_t val;
// デバイスのアドレスを指定
Wire.beginTransmission(0x18);
// 温度を管理しているアドレスを指定
Wire.write((uint8_t) 0x05);
Wire.endTransmission();
Wire.requestFrom((uint8_t)0x18, (uint8_t)2);
// 温度を取得して値をごにょごにょする (ライブラリがやっていることと同じことをやる)
val = Wire.read();
val <<= 8;
val |= Wire.read();
float temp = val & 0x0FFF;
temp /= 16.0;
// 出力
Serial.println(temp);
delay(500);
}
サンプルに記載されている通りですが、まず beginTransmission
でデバイスとの接続を開始します
MCP9808 のデバイスアドレスは前回の I2C デバイスを検索する記事から「0x18」だとわかっています
ここのアドレスはデバイスごとに違うので各自の I2C デバイスに併せて変更してください
次に write
関数を使って取得したい値のアドレスを I2C デバイスに伝えます
I2C デバイスには値を管理するアドレスも振られており、今回取得したい温度 (摂氏) の情報は 0x05 で管理されています
この 0x05 はどうやって調べたかというと、今回はライブラリのコードを直接見ました
おそらく、デバイスの公式サイトにアドレス表があると思うので基本はそういった情報を参考にして探すと良いと思います
そしてその後で read
関数を使って温度の情報を取得してます
いろいろと取得した値をシフトレジストしたり論理積の計算をしたりしていますが、これも今回はライブラリでやっていることをそのまま実装しました
で、あとは結果を表示しているだけです
動作確認
配線したらスケッチを書き込んで動作確認してみましょう
今回の場合は以下のように温度情報が取得できると思います
最後に
Wire ライブラリだけを使って I2C デバイスからセンサの値を取得してみました
今回は勉強目的で Wire ライブラリだけを使って取得したので基本はライブラリが存在するのであれば、それを使うのが良いと思います
もし専用のライブラリがないのであれば、今回の方法を使って最低限の情報は取得できるようになると思います
余裕があれば Wire.h を使ってライブラリを作って上げてしまうと更に良いかもしれません
0 件のコメント:
コメントを投稿