アプリケーションで個別の集積回路間の通信が必要な場合は、I²Cテクノロジが解決策となる可能性があります。I2Cは1982年に登場して以来、信号伝送に2本のワイヤのみを使用しながら複数のノードで動作することを可能にしました。このテクノロジーは、IICまたはI2C、あるいは若干異なるバージョンである2線式インターフェイス (TWI) とも呼ばれ、現在でも使用されており、2006年以降、ユーザーは自由に実装できます。I²Cは、さまざまな Arduino ボードで動作する周辺機器など、さまざまなテクノロジーで使用されています。
I2C配線: 物理的な配線の設定
画像: ジェレミー・S・クック
まず、 I²C モジュールを実行するために必要な基本事項から始めましょう。このチュートリアルでは、Arduino Unoを使用していることを前提としていますが、任意のArduinoまたは別のコンピューティング システムを使用することもできます。詳細については、Arduinoの Wireライブラリのドキュメントをご覧ください。このコードは、通常、 I²C テクノロジに関連するコードです。ボードを次のように設定します。
- SDA (シリアルデータライン): A4
- SCL (シリアルクロックライン): A5
- Vcc: +5V、モジュールによっては+3.3V
- グランド: グランド
- 割り込み: モジュールとプログラミングによって異なります
また、プルアップ抵抗を介してSDAとSCLを正電圧に接続する必要があります。このセットアップでは4.7kΩ の値を使用します。これは標準ですが、必須ではありません。一部のボードには、これらの抵抗器を収容する機能が組み込まれています。注意: 複数のモジュールを連結している場合でも、各ラインに必要な抵抗器は1つだけです。
I²C モジュールにはアドレスのデフォルト値が含まれていますが、設定するにはジャンパーを使用するか、特定のはんだパッドを接続する必要があります。デバイスのアドレスが不明な場合、特にプロジェクトで1つの I²C デバイスのみを使用する場合は、 Arduino I2C Scanner というプログラムを使用して、接続されている各デバイスのアドレスを確認します。
Arduino I2Cの例
画像: ジェレミー・S・クック
I²Cテクノロジーは、多くのアプリケーションを簡素化および強化できます。I²Cエンコーダーと小型の OLEDディスプレイ の設定方法を紹介します。私たちは、I²Cコンポーネントを備えた小さなボードとして提供される エンコーダーI²Cインターフェース を使用しました。このインターフェースにはエンコーダー自体は含まれません。
1.まず、エンコーダーと、 Arduino Uno に接続する5本の線をはんだ付けし、これらをすべて適切なArduinoヘッダー ピンに接続しました。
2.このピン配置はほとんどのモジュール間で一貫していますが、割り込みを表す「INT」というラベルが付いた5番目のワイヤをA2に接続する必要があります。このワイヤはArduino割り込みピンには接続されません。代わりに、Arduinoマスターにエンコーダ スレーブ モジュールからの受信を促します。
3.すべての接続が完了したら、適切なサンプル コードと、スケッチと同じディレクトリに存在する必要がある対応するライブラリのペアを読み込みます。
デバイスによっては、16進数で0から127の範囲 (0x00から0x7Fと表現) のアドレスを変更する必要がある場合があります。使用するエンコーダーの種類に応じて、コメント化またはコメント解除する別の行を選択することもできます。
I²C 形式は物理的には同じままですが、このバスの汎用性により、ソフトウェア側で実装する方法にはさまざまなバリエーションがあります。適切な構成を見つけるには、ある程度の調整が必要になる場合がありますが、I/Oとプロセッサのオーバーヘッドを節約できる可能性があるため、その努力は十分に価値があります。
I²C 出力
ここで使用したI²Cエンコーダーには独自の出力機能 (主に追加されたGPIOの形式) があるという事実を無視して、I²Cを使用して視覚的なフィードバックを受け取りたい場合はどうすればよいでしょうか。このフィードバックを実現する1つの方法は、手頃な価格の128 x 16ピクセル OLEDディスプレイを使用することです。
これらのデバイスをロータリーエンコーダーと同様に接続します。ただし、このセットアップには「割り込み」ピンはありません。これは、小型モニターが完全に受動的なデバイスであり、Arduinoからの信号に反応し、その逆ではないためです。SCLピンとSDAピンの間にVCCピンと同様の抵抗器セットを使用しましたが、抵抗器を使用しない例も見つかります。
画像: OLED画面を動作させるために必要な、コードのマイナー変更を以下に示します。ジェレミー・S・クック
デバイスを実行するには、 Adafruit SSD1306とAdafruit GFXライブラリが必要です。どちらもArduino IDEライブラリ マネージャーから入手できます。プロセスは次のとおりです。
1.デバイスを実行するには、サンプル プログラムssd1306_128x64_i2cをロードします。
2.ロータリーエンコーダと同様に、いくつかのコンポーネントを変更する必要があります。まず、Atomなどの高度なテキスト エディターを使用して適切な行のコメントを解除し、Adafruit_SSD1306.hライブラリの高さの値を128x64に変更します。私のディスプレイでは、I²C値と一致させるために、I2Cアドレスを0x3Dから0x3Cに変更する必要がありました。通常、このタイプのデバイスの適切な値は、I2Cスキャナーを使用して見つけることができます。
3.次に、サンプル プログラムをArduinoボードにロードします。
このプログラムはさまざまな画面とアニメーションを循環表示し、非常に小型で安価なデバイスとしては印象的な表示を実現します。一方、OLEDディスプレイでは、システム内で何が起こっているかについてはまだ何もわかりません。これについては次のセクションで説明します。
One Wire I2C: 二重の役割の実装
画像: ジェレミー・S・クック
エンコーダーは数値入力を提供し、OLED画面は出力方法を提供するので、この2つを組み合わせてみませんか? デモに含まれるスクロール テキストに値を表示するエンコーダー用の 基本コード をいくつか作成しました。このアプリケーションは、ノブがどのくらい回転するかをユーザーに視覚的に表示します。さらに良いことに、この同じ方法を使用して、同じ2つの回線を介して入力モードまたは出力モードで複数のデバイスを制御することもできます。エンコーダーは電源、グランド、SCL、およびSDAピンをディスプレイに渡すことができるため、Arduinoには追加のピンは必要ありません。
I/Oが限られている場合、この設定は最適なオプションです。このタイプの接続を使用すると、特に各コンポーネントに複数のワイヤを配線している場合に、配線を整理するのに役立ちます。I2Cデバイスは、正しく動作させるには多少の調整が必要になることがよくありますが、少し調整すれば、その汎用性とシンプルなインターフェースによってプロジェクトを効率化できます。
ArduinoでI2Cコンポーネントを使用する別の例については、 MPU-6050加速度計の操作に関するこの記事をご覧ください。