I2C通信は、1台の親機(マスタ)が多数の子機(スレーブ)とデータ通信を行なうための方式の一つである。 親機と子機は3本の線(SCL(Arduinoではアナログピン5)、SDA(Arduinoではアナログピン4), GND)で接続されている。複数のスレーブは7ビットのI2Cアドレスで区別する。通信はマスタがスレーブのうち1台との間で行なわれる。
1台のArduinoに入出力装置を接続する場合には、Arduinoがマスタ、入出力装置がスレーブになる。 2台以上のArduinoがある場合に、一方がマスタ、他方がスレーブになることも可能である。
#include <Wire.h>setup()の中などで、I2Cを使うことを宣言する。マスタならば、
Wire.begin();スレーブならば、
Wire.begin( address );を実行する。addressは8から119まで(16進数で0x08から0x77まで)の整数である。I2Cで通信を行なうほかの装置と重複しないように設定する。
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型の配列とデータの個数を書くことができる。
Wire.onReceive( received );ただし、receivedは次に書く受信処理のための関数の名前。
void received( int length ){ while( Wire.availabel() ){ byte c = Wire.read(); } ... }
Wire.requestFrom( address, length ); while( Wire.available() ){ byte c = Wire.read(); }
Wire.onRequest( requested );ただし、requestedは次に書く受信処理のための関数の名前。
byte data; String string; byte buffer[]; void requested( ){ Wire.write( data ); Wire.write( string ); Wire.write( buffer, length ); }