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++; 
}