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()によってキューに入れられたバイトを送信します。
例
スレーブ受信機
次の機能が使用されます-
- * Wire.begin(address)*-アドレスは7ビットのスレーブアドレスです。
- * Wire.onReceive(received data handler)*-スレーブデバイスがマスターからデータを受信したときに呼び出される関数。
- * Wire.available()*-Wire.read()で取得できるバイト数を返します。これはWire.onReceive()ハンドラー内で呼び出す必要があります。
例
マスターレシーバー/スレーブトランスミッター
ここで、マスターレシーバーとスレーブトランスミッターを見てみましょう。
マスターレシーバー
マスターは、一意にアドレス指定されたスレーブArduinoから送信されるデータのバイトを要求し、読み取るようにプログラムされています。
次の機能が使用されます-
- Wire.requestFrom(address、number of bytes)*-マスターがスレーブデバイスからバイトを要求するために使用します。 次に、関数wire.available()およびwire.read()関数を使用してバイトを取得できます。
例
スレーブ送信機
以下の機能が使用されます。
- Wire.onRequest(handler)*-マスターがこのスレーブデバイスからデータを要求すると、関数が呼び出されます。
例