#author("2019-04-21T22:57:14+09:00","default:qua","qua")
* I2C通信 [#jd42d57a]
I2C通信は、1台の親機(マスタ)が多数の子機(スレーブ)とデータ通信を行なうための方式の一つである。
親機と子機は3本の線(SCL(Arduinoではアナログピン5)、SDA(Arduinoではアナログピン4), GND)で接続されている。複数のスレーブは7ビットのI2Cアドレスで区別する。通信はマスタがスレーブのうち1台との間で行なわれる。
#author("2019-04-21T23:21:35+09:00","default:qua","qua")

1台のArduinoに入出力装置を接続する場合には、Arduinoがマスタ、入出力装置がスレーブになる。
2台以上のArduinoがある場合に、一方がマスタ、他方がスレーブになることも可能である。

** プログラム [#u577102f]
- 準備
ArduinoでI2C通信を使うには、Wire.hをインクルードする。
 #include <Wire.h>
setup()の中などで、I2Cを使うことを宣言する。マスタならば、
 Wire.begin();
スレーブならば、
 Wire.begin( address );
を実行する。addressは8から119まで(16進数で0x08から0x77まで)の整数である。I2Cで通信を行なうほかの装置と重複しないように設定する。
- マスタからスレーブへの送信例
-- マスタ側のプログラム(例えば、loop()中などに書く)
 byte data;
 String string;
 byte buffer[];
 
 Wire.beginTransmission( address );
 Wire.write( data );
 Wire.write( string );
 Wire.write( buffer, length );
 Wire.endTransmission();
Wire.write()の()内には、byte型の数、文字列、または、byte型の配列とデータの個数を書くことができる。
-- スレーブ側のプログラム~
setup()などに
 Wire.onReceive( received );
ただし、receivedは次に書く受信処理のための関数の名前。
 void received( int length ){
   while( Wire.availabel() ){
     byte c = Wire.read();
   }
   ...
 }
-スレーブからマスタへの送信例
-- マスタ側のプログラム(例えば、loop()中などに書く)
  Wire.requestFrom( address, length ); 
  while( Wire.available() ){
     byte c = Wire.read();
  }

-- スレーブ側のプログラム~
setup()などに
 Wire.onRequest( requested );
ただし、requestedは次に書く受信処理のための関数の名前。
 byte data;
 String string;
 byte buffer[];
 void requested( ){
   Wire.write( data );
   Wire.write( string );
   Wire.write( buffer, length );
 }


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS