特にホーム オートメーション プロジェクトでは、複数のデバイス間で通信することが実用的である場合があります。 一般的に使用される手法の 1 つに、I2C (または TWI) プロトコルがあります。 I2C プロトコルは、複数の「マスター」カードと複数の「スレーブ」カードを接続し、最大 128 デバイスの通信を可能にする方法です。 複数のコンポーネントを非同期で接続し、「共通のバス」を介して情報を共有することができます。 私たちは、コンピュータからArduinoにコードを送信したり、特にBluetoothで2つのデバイスを接続するために使用されるシリアルポート(UARTと呼ばれる)を介した通信を見たことがあります。
機材
- パソコン
- Arduino UNO x2以上
- Jumper cable M / M x3 times of cards
Arduinoボード間のI2Cバス接続図
I2Cプロトコルにより、異なるシステム(センサー、LCDスクリーン、Raspberry Piなど)間でコミュニケーションも可能になります。 興味深い例として、複数の Arduino ボード間の通信があります。 1 つは「ミストレス」カード (マスター) 用、もう 1 つは「スレーブ」カード用です。
I2C通信は、2 線式バス (TWI (Two Wire Interface) と呼ばれることもある) とアドレスで定義されます。 I2C通信で使用されるピンは、通常、各デバイスごとに固定されています。
I2C / TWI のピンは、データを送信するピン (SDA Serial Data Line) と同期クロック (SLC Serial Clock Line) があります。
- Uno, Ethernet A4 (SDA), A5 (SCL)
- Mega2560 20 (SDA), 21 (SCL)
- Leonardo 2 (SDA), 3 (SCL)
- Due 20 (SDA), 21 (SCL), SDA1, SCL1
このサンプルでは、Arduino Uno ボードを使用するので、ピン A4 と A5 が使用されました。
2つのカードが互いに通信するためには、正しく接続する必要があり (A4はA4と、A5はA5と)、次の図のようにアース (GND) を接続することを忘れないでください
注意。 A4とA5ピンを非電源カードのピンに接続した場合、送信時にコードがフリーズします。
一般的に、あるカードから情報を送り(ライター)、別のカードでそれを受け取る(リーダー)ことになります。
I2Cバス設定コード
Wire.hライブラリを使うと、I2Cバスのシリアル通信を簡単に定義することができます。 関数はSerialライブラリと同様です。
- Wire.begin () はデバイスアドレスを初期化します。 Function argument may be empty for master devices
- Wire.write () allows you to send bytes.
- Wire.requestFrom () handles the request receive function
- Wire.beginTransmission () starts transmitting data and defines the receiver.
- Wire.endTransmission ends data transmission
- Wire.onRequest () handles the request receive function
- Wire.onRecieve () manages the data reception function
Code of the “Master” card
“Slave” card code
Open the slave card serial monitor before the master card monitor.
In the serial monitor of the “Master” card:
In the serial monitor of the “Slave 1” card:
We can see that the two cards are exchanging information.
I2Cバスに接続されたデバイスを特定するコード
デバイス同士がうまく通信できているかどうかを知るための良いテストは、以下のコード (I2CScanner) を使用することです。