#author("2019-04-21T23:21:23+09:00","default:qua","qua") #author("2020-09-11T11:49:20+09:00","default:qua","qua") * I2C通信 [#c4117b20] I2C通信は、1台の親機(マスタ)が多数の子機(スレーブ)とデータ通信を行なうための方式の一つである。 親機と子機は3本の線(SCL(Arduinoではアナログピン5)、SDA(Arduinoではアナログピン4), GND)で接続されている。複数のスレーブは7ビットのI2Cアドレスで区別する。通信はマスタがスレーブのうち1台との間で行なわれる。 親機と子機は3本の線(SCL(Arduinoではアナログピン5)、SDA(Arduinoではアナログピン4), GND)で接続されている。複数のスレーブは7ビットのI2Cアドレスで区別する。通信はマスタとスレーブのうち1台との間で行なわれる。 1台のArduinoに入出力装置を接続する場合には、Arduinoがマスタ、入出力装置がスレーブになる。 2台以上のArduinoがある場合に、一方がマスタ、他方がスレーブになることも可能である。 ** プログラム [#ddb0c11b] - 準備 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 ); }