とともに Arduinoは多数のプロジェクトを作成できます Hwlibreを読んだら見てきたように、 簡単な方法でマイクロコントローラをプログラミングする。ただし、このボードのアナログ接続とデジタル接続の間 hardware libre、PWM 接続、SPI、シリアル ポートの RX ピンと TX ピン、または I2C バス自体の真の可能性など、多くの初心者にとってはまだ不明なものもあります。したがって、このエントリを使用すると、少なくとも I2C について必要なすべてを知ることができます。
とともに I2Cバス このタイプのプロトコルを備えた多くのサードパーティ製デバイスを接続して使用し、Arduinoボードと通信できます。 このフィリップスの発明のおかげで、それらの間で、加速度計、ディスプレイ、カウンター、コンパス、およびその他の多くの集積回路を接続できます。
I2Cとは何ですか?
I2Cは相互統合回路を指します、つまり、集積回路間。 これは、1982年にフィリップスセミコンダクターズ社によって開発されたシリアルデータ通信バスであり、このセクションを削除した後、現在はNXPセミコンダクターズです。 最初は、このブランドのテレビ用に作成され、いくつかの内部チップを簡単な方法で通信しました。 しかし、1990年以降、I2Cは普及し、多くのメーカーで使用されています。
現在、数十のチップメーカーによって使用されています 複数の機能のため。 Arduinoボード用のマイクロコントローラーの作成者であるAtmelは、I2Cと同じですが、ライセンスの目的でTWI(Two Wired Interface)の指定を導入しました。 しかし、2006年に元の特許が失効し、著作権の対象ではなくなったため、I2Cという用語が再利用されました(ロゴのみが引き続き保護されますが、この用語の実装または使用は制限されません)。
I2Cバスの技術的な詳細
El I2Cバスは業界標準になり、Arduinoはそれを実装しました それを必要とする周辺機器との通信用。 動作にはXNUMX本のラインまたはケーブルのみが必要です。XNUMXつはクロック信号(CLK)用で、もうXNUMXつはシリアルデータ(SDA)の送信用です。 これは、SPIバスと比較して他の通信と比較して有利ですが、追加の回路が必要なため、その動作はやや複雑です。
このバスで 接続されている各デバイスにはアドレスがあります これらのデバイスに個別にアクセスするために使用されます。 このアドレスはハードウェアによって固定され、ジャンパーまたはスイッチDIPを使用して最後の3ビットを変更しますが、ソフトウェアによっても実行できます。 各デバイスには一意のアドレスがありますが、それらのいくつかは同じアドレスを持っている場合があり、競合を回避するため、または可能であれば変更するためにセカンダリバスを使用する必要がある場合があります。
さらに、I2Cバスには マスタースレーブタイプのアーキテクチャ、 つまり、マスタースレーブです。 これは、マスターデバイスによって通信が開始されると、スレーブとの間でデータを送受信できることを意味します。 スレーブは通信を開始できず、マスターのみが通信を開始でき、スレーブはマスターの介入なしに互いに直接通信することはできません。
場合 バスに乗っている何人かの先生、同時に教師として行動できるのはXNUMX人だけです。 しかし、教師の交代は非常に複雑であることが要求されるため、それは価値がありません。したがって、それは頻繁ではありません。
覚えておいてください マスターは、バス上のすべてのデバイスを同期するためのクロック信号を提供します。 これにより、各スレーブが独自の時計を持つ必要がなくなります。
I2Cバスプロトコルでは、電源電圧ライン(Vcc)でのプルアップ抵抗の使用も予測されていますが、これらの抵抗は通常Arduinoでは使用されません。 プログラミングライブラリのためのプルアップ ワイヤーが20-30kの値で内部をアクティブ化するとき。 これは一部のプロジェクトでは柔らかすぎる可能性があるため、信号の立ち上がりエッジが遅くなるため、低速と短い通信距離を使用できます。 これを修正するには、外部プルアップ抵抗を1kから4k7に設定する必要がある場合があります。
信号
La 通信フレーム I2Cバス信号はビットまたは状態で構成されます(I2C標準では他のビットまたは状態が許可されているため、Arduinoで使用されます)。
- 8ビット、そのうちの7つ アドレス データを送受信するためにアクセスするスレーブデバイスの7ビットでは、最大128の異なるアドレスを作成できるため、理論的には128のデバイスにアクセスできますが、112は特別な用途のために予約されているため、16のみにアクセスできます。 そして、必要かどうかを示す追加のビット 送信または受信 スレーブデバイス情報。
- もあります 検証ビット、アクティブでない場合、通信は無効になります。
- そうして データバイト 彼らが奴隷によって送受信したいこと。 ご存知のように、各バイトは8ビットで構成されています。 送受信されるデータの8ビットまたは1バイトごとに、追加の18ビットの検証、アドレスなどが必要であることに注意してください。これは、バスの速度が非常に制限されていることを意味します。
- 最後のビット 検証 コミュニケーションの。
さらに、のクロック周波数 送信は標準で100MHzですが、 400Mhzでより速いモードがありますが。
I2Cバスの長所と短所
ラス ventajas 音:
- シンプルさ XNUMX行だけを使用します。
- 持っている 信号が到着したかどうかを知るメカニズム 他の通信プロトコルと比較して。
ラス デメリット 音:
- スピード かなり低い透過率。
- 全二重ではありませんつまり、送信と受信を同時に行うことはできません。
- パリティを使用しません また、受信したデータビットが正しいかどうかを知るための他のタイプの検証メカニズムもありません。
ArduinoのI2C
En モデルに応じて、Arduino、このI2Cバスを使用できるようにすることができるピンは異なります。 例えば:
- Arduino UNO、ナノ、ミニプロ:A4はSDA(データ)に使用され、A5はSCK(クロック)に使用されます。
- Arduinoメガ:SDAの場合はピン20、SCKの場合はピン21。
それを使用するには、あなたがしなければならないことを忘れないでください ライブラリを利用する ワイヤー.h Arduino IDEコード用ですが、他にも次のようなものがあります I2C y i2cdevlib。 これらのライブラリのドキュメントまたは関心のあるプロジェクトに関する記事を読んで、プログラム方法のコードを入手できます。
I2Cで使用するデバイスのアドレスを知る方法は?
最後にもうXNUMXつ警告があります。それは、ヨーロッパ、日本、またはアメリカのメーカーからICを購入すると、 方向を示す デバイスに使用する必要があります。 一方、中国人は時々それを詳述しないか、それが正しくないので、それは機能しません。 これは、アドレススキャナーを使用して簡単に解決でき、スケッチで参照する必要のある方向を知ることができます。
La arduinoコミュニティ これを作成しました アドレスをスキャンして識別するためのコード 簡単な方法で。 ここにコードを示しますが:
#include "Wire.h" extern "C" { #include "utility/twi.h" } void scanI2CBus(byte from_addr, byte to_addr, void(*callback)(byte address, byte result) ) { byte rc; byte data = 0; for( byte addr = from_addr; addr <= to_addr; addr++ ) { rc = twi_writeTo(addr, &data, 0, 1, 0); callback( addr, rc ); } } void scanFunc( byte addr, byte result ) { Serial.print("addr: "); Serial.print(addr,DEC); Serial.print( (result==0) ? " Encontrado!":" "); Serial.print( (addr%4) ? "\t":"\n"); } const byte start_address = 8; const byte end_address = 119; void setup() { Wire.begin(); Serial.begin(9600); Serial.print("Escaneando bus I2C..."); scanI2CBus( start_address, end_address, scanFunc ); Serial.println("\nTerminado"); } void loop() { delay(1000); }