#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


トップ   新規 検索 最終更新   ヘルプ   最終更新のRSS