I2C通信と温湿度計 †
SHT-25(Strawberry Linux ではこちら) を Arduino で扱う。
I2C 通信の練習でもある。
先日、mbed 祭りに参加したので、mbed でもいいけれど、ついつい Arduino になってしまう。
I2C 通信 †
- はじめに
I2C 通信と SPI 通信は Arduino と他のデバイスとの通信のスタンダードになっている。I2C の学習と練習も兼ねて、Sensirion SHT-25のデータを読み出す。
2014-12-23 (火) 12:20:56
- I2C 通信の基礎知識
- 配線
センサー(スレーブ)への配線は4本。Arduino(マスター) 側のどこに接続するかも決まっている。
センサー(スレーブ) | Arduino(マスター)(Mega2560, Leonardo, Due などは違うので注意。) |
Vin 電源供給 | 3.3V か 5V か(センサーによる) |
GND グラウンド | GND |
SCL クロック | A5 |
SDA データ送受信 | A4 |
- マスターとスレーブ
通信は双方向である。ただし、通信のクロックを決める方をマスターといい、それに従うのをスレーブという(という理解でよいのか?)。
普通、Arduino をマスターにすると思われるので、以下はその前提で話を進める。
接続について、マスターは一つだけである。しかし、スレーブは複数つないでもいい。
- アドレス
複数つないだスレーブは、(通常7bit の)アドレスで区別する。アドレスが同じものは載せられない。センサーの場合、アドレスが固定して
作られているので、複数の同種センサーは一つのI2C通信のラインに載せられない。
特に Arduino の場合には、I2C 通信用のポートが1組しかないために、複数の同種センサーは載せられない。mbed などでは、複数の I2C
のポートが用意されている(ことがある)。
- プルアップ
SCL と SDA のラインは数kΩ程度の抵抗でプルアップされている。つまり、これらのラインは、抵抗を介して電源供給線とつながっていて、
特に何もなければ、電源電圧と同じ電圧になるようになっている。
気をつけなければならないのは、複数のスレーブを接続した場合であって、スレーブがプルアップ抵抗を含んでいるような場合である。
利用者がプルアップ抵抗を用意しなくていいように、というメーカー側の親切心が、複数のスレーブがあることによって、抵抗を並列に
接続することになり、あだとなる。気をつけたい(>自分)。
- Arduino の Wire ライブラリ
Arduino は、I2C 通信のために、Wire というライブラリを用意している。これを用いて通信する。Wireについては、学習ページ(英語)参照の
こと。日本語リファレンスのページもある。ありがたい。
関数は多くないので、全部掲載する。
分類 | 関数 | 使い方 |
初期化 | Wire.begin() | 通信開始。マスターの時には、引数不要。 |
書き込み | Wire.beginTransmission(アドレス) | どのスレーブに書き込むかを指定 |
| Wire.write(データ) | データは、1バイトのデータ、文字列、1バイトのデータの配列など。 |
| Wire.endTransmission() | 送信終了(戻り値 0 で正常終了) |
読み込み | Wire.requestFrom(アドレス, バイト数) | どのアドレスのスレーブから、何バイト読むかを指定。 |
| Wire.available() | 引き続く read() でスレーブ側が何バイト提供するかをあらかじめ調べる。 |
| Wire.read() | 引数なし。戻り値は受信データ |
その他 | Wire.onReceive() | スレーブとして動く時に用いる関数なのでここでは説明しない。 |
| Wire.onRequest() | スレーブとして動く時に用いる関数なのでここでは説明しない。 |
2014-12-23 (火) 13:20:59
センサー SHT-25 †