Top/Arduino/みんな試作機/I2C通信と温湿度計

I2C通信と温湿度計

SHT25(あるいは SHT-25, Strawberry Linux ではこちら) を Arduino で扱う。 I2C 通信の練習でもある。
先日、mbed 祭りに参加したので、mbed でもいいけれど、ついつい Arduino になってしまう。

I2C 通信

  1. はじめに
    I2C 通信と SPI 通信は Arduino と他のデバイスとの通信のスタンダードになっている。I2C の学習と練習も兼ねて、Sensirion SHT25のデータを読み出す。
    2014-12-23 (火) 12:20:56
  2. I2C 通信の基礎知識
    1. 配線
      センサー(スレーブ)への配線は4本。Arduino(マスター) 側のどこに接続するかも決まっている。
      センサー(スレーブ)Arduino(マスター)(Mega2560, Leonardo, Due などは違うので注意。)
      Vin 電源供給3.3V か 5V か(センサーによる)
      GND グラウンドGND
      SCL クロックA5
      SDA データ送受信A4
    2. マスターとスレーブ
      通信は双方向である。ただし、通信のクロックを決める方をマスターといい、それに従うのをスレーブという(という理解でよいのか?)。
      普通、Arduino をマスターにすると思われるので、以下はその前提で話を進める。
      接続について、マスターは一つだけである。しかし、スレーブは複数つないでもいい。

    3. アドレス
      複数つないだスレーブは、(通常7bit の)アドレスで区別する。アドレスが同じものは載せられない。センサーの場合、アドレスが固定して
      作られているので、複数の同種センサーは一つのI2C通信のラインに載せられない。
      特に Arduino の場合には、I2C 通信用のポートが1組しかないために、複数の同種センサーは載せられない。mbed などでは、複数の I2C
      のポートが用意されている(ことがある)。

    4. プルアップ
      SCL と SDA のラインは数kΩ程度の抵抗でプルアップされている。つまり、これらのラインは、抵抗を介して電源供給線とつながっていて、
      特に何もなければ、電源電圧と同じ電圧になるようになっている。
      気をつけなければならないのは、複数のスレーブを接続した場合であって、スレーブがプルアップ抵抗を含んでいるような場合である。
      利用者がプルアップ抵抗を用意しなくていいように、というメーカー側の親切心が、複数のスレーブがあることによって、抵抗を並列に
      接続することになり、あだとなる。気をつけたい(>自分)。

  3. Arduino の Wire ライブラリ
    Arduino は、I2C 通信のために、Wire というライブラリを用意している。これを用いて通信する。Wireについては、学習ページ(英語)参照の
    こと。日本語リファレンスのページもある。ありがたい。
    関数は多くないので、全部掲載する。
    分類関数使い方
    初期化Wire.begin()通信開始。マスターの時には、引数不要。
    書き込みWire.beginTransmission(アドレス)どのスレーブに書き込むか、アドレスを指定
    Wire.write(データ)データは、1バイトのデータ、文字列、1バイトのデータの配列など。
    Wire.endTransmission()送信終了(戻り値 0 で正常終了)
    読み込みWire.requestFrom(アドレス, バイト数)どのアドレスのスレーブから、何バイト読むかを指定。
    Wire.available()引き続く read() でスレーブ側が何バイト提供するかをあらかじめ調べる。
    Wire.read()1バイトだけ受け取る。引数なし。戻り値は受信した1バイトのデータ。
    その他Wire.onReceive()スレーブとして動く時に用いる関数なのでここでは説明しない。
    Wire.onRequest()スレーブとして動く時に用いる関数なのでここでは説明しない。
    2014-12-23 (火) 13:20:59

I2C のレベル変換

センサー SHT-25


添付ファイル: fileCIMG3420.JPG 2607件 [詳細]

トップ   編集 凍結 差分 添付 複製 名前変更 リロード   新規 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-12-23 (火) 19:44:21