Arduino-inter-integrated-circuit

提供:Dev Guides
移動先:案内検索

Arduino-集積回路間

Inter-integrated circuit(I2C)は、マイクロコントローラと新世代の専用集積回路との間でシリアルデータを交換するためのシステムです。 それらの間の距離が短い場合に使用されます(受信機と送信機は通常同じプリント基板上にあります)。 接続は2本の導体を介して確立されます。 1つはデータ転送に使用され、もう1つは同期(クロック信号)に使用されます。

次の図に示すように、1つのデバイスが常にマスターです。 通信を開始する前に、1つのスレーブチップのアドレス指定を実行します。 このようにして、1つのマイクロコントローラーが112の異なるデバイスと通信できます。 ボーレートは通常、100 Kb/秒(標準モード)または10 Kb/秒(低速ボーレートモード)です。 ボーレートが3.4 Mb/秒のシステムが最近登場しました。 I2Cバスで通信するデバイス間の距離は数メートルに制限されています。

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