#topicpath ** I2C通信と温湿度計 [#sdfb243f] >> SHT-25(Strawberry Linux では[[こちら>http://strawberry-linux.com/catalog/items?code=80025]]) を Arduino で扱う。 I2C 通信の練習でもある。~ 先日、mbed 祭りに参加したので、mbed でもいいけれど、ついつい Arduino になってしまう。 << *** I2C 通信 [#ieb45f87] + はじめに~ I2C 通信と SPI 通信は Arduino と他のデバイスとの通信のスタンダードになっている。I2C の学習と練習も兼ねて、[[Sensirion SHT-25>http://www.sensirion.com/en/products/humidity-temperature/humidity-temperature-sensor-sht2x/]]のデータを読み出す。~ RIGHT:2014-12-23 (火) 12:20:56 ~ + I2C 通信の基礎知識 ++ 配線~ センサー(スレーブ)への配線は4本。Arduino(マスター) 側のどこに接続するかも決まっている。 #style(class=table_left) |センサー(スレーブ)|Arduino(マスター)(Mega2560, Leonardo, Due などは違うので注意。)|h |Vin 電源供給 | 3.3V か 5V か(センサーによる)| |GND グラウンド | GND | |SCL クロック | A5 | |SDA データ送受信 | A4 | #clear ++ マスターとスレーブ~ 通信は双方向である。ただし、通信のクロックを決める方をマスターといい、それに従うのをスレーブという(という理解でよいのか?)。~ 普通、Arduino をマスターにすると思われるので、以下はその前提で話を進める。~ 接続について、マスターは一つだけである。しかし、スレーブは複数つないでもいい。~ ~ ++ アドレス~ 複数つないだスレーブは、(通常7bit の)アドレスで区別する。アドレスが同じものは載せられない。センサーの場合、アドレスが固定して~ 作られているので、複数の同種センサーは一つのI2C通信のラインに載せられない。~ 特に Arduino の場合には、I2C 通信用のポートが1組しかないために、複数の同種センサーは載せられない。mbed などでは、複数の I2C~ のポートが用意されている(ことがある)。~ ~ ++ プルアップ~ SCL と SDA のラインは数kΩ程度の抵抗でプルアップされている。つまり、これらのラインは、抵抗を介して電源供給線とつながっていて、~ 特に何もなければ、電源電圧と同じ電圧になるようになっている。~ 気をつけなければならないのは、複数のスレーブを接続した場合であって、スレーブがプルアップ抵抗を含んでいるような場合である。~ 利用者がプルアップ抵抗を用意しなくていいように、というメーカー側の親切心が、複数のスレーブがあることによって、抵抗を並列に~ 接続することになり、あだとなる。気をつけたい(>自分)。~ ~ + Arduino の Wire ライブラリ~ Arduino は、I2C 通信のために、Wire というライブラリを用意している。これを用いて通信する。Wireについては、[[学習ページ(英語)>http://arduino.cc/en/Reference/Wire?from=Libraries.Wire]]参照の~ こと。[[日本語リファレンスのページ>http://www.musashinodenpa.com/arduino/ref/]]もある。ありがたい。~ 関数は多くないので、全部掲載する。 #style(class=table_left) | 分類| 関数|使い方|h | 初期化| Wire.begin() | 通信開始。マスターの時には、引数不要。| | 書き込み| Wire.beginTransmission(アドレス)| どのスレーブに書き込むかを指定 | | | Wire.write(データ) | データは、1バイトのデータ、文字列、1バイトのデータの配列など。 | | | Wire.endTransmission() | 送信終了(戻り値 0 で正常終了)| |読み込み| Wire.requestFrom(アドレス, バイト数) | どのアドレスのスレーブから、何バイト読むかを指定。| | | Wire.available() | 引き続く read() でスレーブ側が何バイト提供するかをあらかじめ調べる。| | | Wire.read()| 引数なし。戻り値は受信データ | |その他| Wire.onReceive() | スレーブとして動く時に用いる関数なのでここでは説明しない。| | | Wire.onRequest() |スレーブとして動く時に用いる関数なのでここでは説明しない。| #clear RIGHT:2014-12-23 (火) 13:20:59 *** センサー SHT-25 [#c9b683e1] - インターネット上の情報源 -- [[データシート>http://www.sensirion.com/fileadmin/user_upload/customers/sensirion/Dokumente/Humidity/Sensirion_Humidity_SHT25_Datasheet_V3.pdf]](Sensirion, pdf) -- [[誤り検出符号(CRC checksum)計算方法>http://www.sensirion.com/nc/en/products/humidity-temperature/download-center/?cid=884&did=126&sechash=3fb04c33]] -- Sensirion に掲載されている[[サンプルプログラム>http://www.sensirion.com/nc/en/products/humidity-temperature/download-center/?cid=8585&did=102&sechash=03a6edbf]] -- SHT25 Arduino の[[ライブラリ>https://github.com/misenso/SHT2x-Arduino-Library]](github)~ ライブラリを使ってもいいけど、これらを元に自分でプログラムしてみる。~ RIGHT:2014-12-23 (火) 14:24:00