Arduinos間のI2C

Arduinoのワークロードを別のArduinoと共有したい場合があります。 または、より多くのデジタルまたはアナログピンが必要な場合もあります。 Inter-Integrated CircuitまたはI2C (I squared Cと発音)が最適なソリューションです。

I2Cは興味深いプロトコルです。 通常、カメラ内のマザーボードと組み込み電子システムのコンポーネント間の通信に使用されます。

ここでは、2つのArduinoを使用してI2Cバスを作成します。 1つのマスターArduinoをプログラムし、他のスレーブArduinoにコマンドを送信して、受信した値に応じて、内蔵LEDを1回または2回点滅させます。

これを構築するには、次の「成分」が必要です。

  • 2 Arduinos
  • ジャンパーケーブル
この説明可能な多くの情報は、ここにある私のArduino開発クックブックにあります。 :D

ステップ1:それらを接続する方法

I2Cを使用して2つのArduino UNOを接続するには、次の手順に従います。

  1. 一方のArduinoのピンA4A5をもう一方のピンと同じピンに接続します。
  2. GNDラインは両方のArduinoで共通でなければなりません。 ジャンパーで接続します。

回路図と「ブレッドボード」の実装もあり、どちらも簡単に実行できます。 幸いなことに、これは単純な実装です。

5 Vと3.3 VのArduinoを接続しないでください。 しません
5V Arduinoを傷つけますが、それは確かに3.3 Vの兄弟を困らせます!

ステップ2:コード

次のコードは、2つの異なるArduinoで実行されるマスターコードスレーブコードの 2つの部分に分かれています。 最初に、 マスターコードを見てみましょう。

 // I2Cに必要なWireライブラリを含めます 
#include int x = 0; void setup(){//マスターWire.begin()としてI2Cバスを開始 } void loop(){Wire.beginTransmission(9); //デバイス#9に送信Wire.write(x); // x Wire.endTransmission()を送信します; // x ++の送信を停止します; // xをインクリメントif(x> 5)x = 0; // `6 delay(500)になったらxをリセットします; }

次に、マスターから送信された文字を解釈するスレーブコードを示します

 // I2Cに必要なWireライブラリを含めます 
#include int LED = 13; int x = 0; void setup(){// LEDピンを出力pinMode(LED、OUTPUT)として定義します; //アドレス9でスレーブとしてI2Cバスを開始しますWire.begin(9); //何かを受け取ったときにトリガーする関数をアタッチします。 Wire.onReceive(receiveEvent); } void receiveEvent(int bytes){x = Wire.read(); // I2Cから1文字を読み取りますvoid void loop(){//受信した値が0の場合、200ミリ秒間LEDが点滅if(x == '0'){digitalWrite(LED、HIGH); delay(200); digitalWrite(LED、LOW); delay(200); } //受け取った値が400 msの間3回点滅する場合if(x == '3'){digitalWrite(LED、HIGH); delay(400); digitalWrite(LED、LOW); delay(400); }}

添付ファイル

  • I2C_master.inoダウンロード
  • I2C_slave.inoダウンロード

ステップ3:コードの詳細

まず、 マスターを見てみましょう。 必要なWire.hライブラリを含める必要があります。

 #含める 

次に、セットアップ関数で、 Wire.begin()関数を使用してI2Cバスを開始します。 関数に引数が指定されていない場合、Arduinoはマスターとして起動します。

最後に、0〜5の文字xを送信します。次の関数を使用して、
アドレス9でデバイスへの送信を開始し、文字を書き込んでから送信を停止します。

 Wire.beginTransmission(9); //デバイス#9に送信Wire.write(x); // x Wire.endTransmission()を送信します; //送信を停止します 

それでは、 スレーブArduinoコードを調べてみましょう。 ここにはWire.hライブラリも含まれていますが、ここではWire.begin(9)を使用してI2Cバスを開始します。 引数の数値は、Arduinoに使用するアドレスです。 アドレス9のすべてのデバイスが送信を受信します。

ここで、I2C送信を受信したときに何らかの方法で対応する必要があります。 次の関数は、文字が受信されるたびにトリガー関数を追加します。 より良いのは、ArduinoがI2Cで文字を受け取ると、実行するように指示した関数を実行するということです。

 Wire.onReceive(receiveEvent); 

そして、これが機能です。 ここでは、受け取った文字の値を単純に保存します。

 void receiveEvent(int bytes){x = Wire.read(); } 

loop()では、その文字を解釈して、受信した文字に応じて異なる速度で内蔵LEDを点滅させます。

ステップ4:I2Cの詳細

理論を簡単に説明すると、I2Cには2つのデジタルラインが必要です。 データを転送するシリアルデータラインSDA )と、クロックを保持するシリアルクロックラインSCL )です。 各I2C接続は、1つのマスターと複数のスレーブを持つことができます。 マスターはスレーブに書き込み、スレーブにデータを要求することができますが、マスターまたは別のスレーブに直接書き込むことのできるスレーブはありません。 すべてのスレーブにはバス上の一意のアドレスがあり、マスターはアクセスしたい各スレーブのアドレスを知る必要があります。

I2Cバスは、最大112個のデバイスをサポートできます 。 すべてのデバイスでGNDを共有する必要があります。 速度は約100 kb / sです。それほど高速ではありませんが、それでも立派で非常に使いやすいです。 バス上に複数のマスターを配置することは可能ですが、それは非常に複雑で一般的に回避されます。

多くのセンサーは通信にI2Cを使用します。通常、慣性測定ユニット、気圧計、
温度センサー、およびいくつかのソナー。 I2Cは長いケーブル用に設計されていないことに注意してください。 使用するケーブルの種類によっては、 2メートルがすでに問題を引き起こしている可能性があります。

I2Cは複雑な伝送プロトコルですが、非常に便利です。 すべてのArduinosはそれを実装しますが、ピンマッピングにいくつかの違いがあります。

ボードI2Cピン

Uno、Pro Mini A4(SDA)、A5(SCL)

メガ、期限20(SDA)、21(SCL)

レオナルド、ユン2(SDA)、3(SCL)

ステップ5:より多くのデバイスを接続する

I2Cバスで3つ以上のデバイスを接続する必要がある場合は、すべてのSDAおよびSCLラインを一緒に接続する必要があります。 マスターArduinoからすべてのスレーブのアドレスをアドレス指定する必要があります。

これは、1つのマスターと3つのスレーブを使用した個人的な実装のビデオです。

ワイヤレスシリアルSDカードイーサネットなどのArduino通信に関するその他のトピックについては、こちらのArduino開発クックブックをご覧ください。 :D

関連記事