2016年11月12日土曜日

Arduino Pro mini で I2C 接続されたセンサデバイスから値を取得する方法

概要

過去に 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 関数を使って温度の情報を取得してます
いろいろと取得した値をシフトレジストしたり論理積の計算をしたりしていますが、これも今回はライブラリでやっていることをそのまま実装しました

で、あとは結果を表示しているだけです

動作確認

配線したらスケッチを書き込んで動作確認してみましょう
今回の場合は以下のように温度情報が取得できると思います
mcp9808_only_wire_lib_ret.png

最後に

Wire ライブラリだけを使って I2C デバイスからセンサの値を取得してみました
今回は勉強目的で Wire ライブラリだけを使って取得したので基本はライブラリが存在するのであれば、それを使うのが良いと思います

もし専用のライブラリがないのであれば、今回の方法を使って最低限の情報は取得できるようになると思います
余裕があれば Wire.h を使ってライブラリを作って上げてしまうと更に良いかもしれません

参考サイト

0 件のコメント:

コメントを投稿