Arduino-inter-integrated-circuit
Arduino-集積回路間
Inter-integrated circuit(I2C)は、マイクロコントローラと新世代の専用集積回路との間でシリアルデータを交換するためのシステムです。 それらの間の距離が短い場合に使用されます(受信機と送信機は通常同じプリント基板上にあります)。 接続は2本の導体を介して確立されます。 1つはデータ転送に使用され、もう1つは同期(クロック信号)に使用されます。
次の図に示すように、1つのデバイスが常にマスターです。 通信を開始する前に、1つのスレーブチップのアドレス指定を実行します。 このようにして、1つのマイクロコントローラーが112の異なるデバイスと通信できます。 ボーレートは通常、100 Kb/秒(標準モード)または10 Kb/秒(低速ボーレートモード)です。 ボーレートが3.4 Mb/秒のシステムが最近登場しました。 I2Cバスで通信するデバイス間の距離は数メートルに制限されています。
ボードI2Cピン
I2Cバスは、SCLとSDAの2つの信号で構成されています。 SCLはクロック信号で、SDAはデータ信号です。 現在のバスマスターは常にクロック信号を生成します。 スレーブデバイスの中には、マスターがより多くのデータを送信するのを遅らせるために(またはマスターがクロックアウトを試みる前にデータを準備するためにより多くの時間を必要とするために)クロックを時々低くするものがあります。 これは「クロックストレッチング」として知られています。
以下は、さまざまなArduinoボードのピンです-
- Uno、Pro Mini A4(SDA)、A5(SCL)
- メガ、期限20(SDA)、21(SCL)
- レオナルド、ユン2(SDA)、3(SCL)
Arduino I2C
I2Cを使用して2つのArduinoボードを接続するには、マスターコードとスレーブコードの2つのモードがあります。 彼らは-
- マスター送信機/スレーブ受信機
- マスターレシーバー/スレーブトランスミッター
マスター送信機/スレーブ受信機
ここで、マスター送信機とスレーブ受信機を見てみましょう。
マスター送信機
以下の関数は、Wireライブラリを初期化し、I2Cバスをマスターまたはスレーブとして参加させるために使用されます。 通常、これは一度だけ呼び出されます。
- * Wire.begin(address)*-アドレスは、マスターが指定されておらず、バスとしてマスターとして参加するため、この例では7ビットのスレーブアドレスです。
- * Wire.beginTransmission(address)*-指定されたアドレスでI2Cスレーブデバイスへの送信を開始します。
- * Wire.write(value)*-マスターからスレーブデバイスへの送信(beginTransmission()とendTransmission()の呼び出しの間に)のバイトをキューに入れます。
- * Wire.endTransmission()*-beginTransmission()によって開始されたスレーブデバイスへの送信を終了し、wire.write()によってキューに入れられたバイトを送信します。
例
#include <Wire.h>//include wire library
void setup()//this will run only once {
Wire.begin();//join i2c bus as master
}
short age = 0;
void loop() {
Wire.beginTransmission(2);
//transmit to device #2
Wire.write("age is = ");
Wire.write(age);//sends one byte
Wire.endTransmission();//stop transmitting
delay(1000);
}
スレーブ受信機
次の機能が使用されます-
- * Wire.begin(address)*-アドレスは7ビットのスレーブアドレスです。
- * Wire.onReceive(received data handler)*-スレーブデバイスがマスターからデータを受信したときに呼び出される関数。
- * Wire.available()*-Wire.read()で取得できるバイト数を返します。これはWire.onReceive()ハンドラー内で呼び出す必要があります。
例
#include <Wire.h>//include wire library
void setup() { //this will run only once
Wire.begin(2);//join i2c bus with address #2
Wire.onReceive(receiveEvent);//call receiveEvent when the master send any thing
Serial.begin(9600);//start serial for output to print what we receive
}
void loop() {
delay(250);
}
//-----this function will execute whenever data is received from master-----//
void receiveEvent(int howMany) {
while (Wire.available()>1)//loop through all but the last {
char c = Wire.read();//receive byte as a character
Serial.print(c);//print the character
}
}
マスターレシーバー/スレーブトランスミッター
ここで、マスターレシーバーとスレーブトランスミッターを見てみましょう。
マスターレシーバー
マスターは、一意にアドレス指定されたスレーブArduinoから送信されるデータのバイトを要求し、読み取るようにプログラムされています。
次の機能が使用されます-
- Wire.requestFrom(address、number of bytes)*-マスターがスレーブデバイスからバイトを要求するために使用します。 次に、関数wire.available()およびwire.read()関数を使用してバイトを取得できます。
例
#include <Wire.h>//include wire library void setup() {
Wire.begin();//join i2c bus (address optional for master)
Serial.begin(9600);//start serial for output
}
void loop() {
Wire.requestFrom(2, 1);//request 1 bytes from slave device #2
while (Wire.available())//slave may send less than requested {
char c = Wire.read();//receive a byte as character
Serial.print(c);//print the character
}
delay(500);
}
スレーブ送信機
以下の機能が使用されます。
- Wire.onRequest(handler)*-マスターがこのスレーブデバイスからデータを要求すると、関数が呼び出されます。
例
#include <Wire.h>
void setup() {
Wire.begin(2);//join i2c bus with address #2
Wire.onRequest(requestEvent);//register event
}
Byte x = 0;
void loop() {
delay(100);
}
//function that executes whenever data is requested by master
//this function is registered as an event, see setup()
void requestEvent() {
Wire.write(x);//respond with message of 1 bytes as expected by master
x++;
}