Arduino-集積回路間
インター集積回路(I2C)は、マイクロコントローラーと新世代の特殊な集積回路との間でシリアルデータを交換するためのシステムです。それらの間の距離が短い場合に使用されます(受信機と送信機は通常同じプリント基板上にあります)。接続は2本の導体を介して確立されます。1つはデータ転送に使用され、もう1つは同期(クロック信号)に使用されます。
次の図に示すように、1つのデバイスは常にマスターです。通信を開始する前に、1つのスレーブチップのアドレス指定を実行します。このようにして、1つのマイクロコントローラーが112の異なるデバイスと通信できます。ボーレートは通常、100 Kb /秒(標準モード)または10 Kb /秒(低速ボーレートモード)です。ボーレートが3.4Mb /秒のシステムが最近登場しました。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バスに参加するために使用されます。これは通常1回だけ呼び出されます。
Wire.begin(address) −この場合、マスターが指定されておらず、マスターとしてバスに参加するため、アドレスは7ビットのスレーブアドレスです。
Wire.beginTransmission(address) −指定されたアドレスでI2Cスレーブデバイスへの送信を開始します。
Wire.write(value) −マスターからスレーブデバイスへの送信のためにバイトをキューに入れます(beginTransmission()とendTransmission()の呼び出しの間)。
Wire.endTransmission() − beginTransmission()によって開始されたスレーブデバイスへの送信を終了し、wire.write()によってキューに入れられたバイトを送信します。
Example
#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()ハンドラー内で呼び出す必要があります。
Example
#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()関数を使用してバイトを取得できます。
Example
#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) −マスターがこのスレーブデバイスにデータを要求すると、関数が呼び出されます。
Example
#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++;
}