私がEmbedded Linux Conferenceで提供したこのチュートリアルでは、質問に答え、対処されたトピックの詳細な説明へのリンクを提供し、Arduino Mini Proがスレーブとして機能し、4つの独立したホイールを制御する4WDドローンの運転の実際的な例を使用します。元のドキュメントはここにあります。
注:この回答は、リンクのハイライトを調整しているため、現在作業中です。
I2Cバスの典型的なアプリケーション
複数のバスコントローラが使用可能な場合、周辺機器は速度によってグループ化されるため、高速のものが周辺機器によってペナルティを課されることはありません。
I2Cバスの概要-主な機能
- シリアルバス。
- 2行のみ:Serial CLockおよびSerial DAta(プラスアース)。
- 4つの速度:100kHz、400kHz、1MHz、3.2MHz。
- 通常、1つのマスターデバイスと1つ以上のスレーブ。
- 通信は常にマスターデバイスによって開始されます。
- 同じバス上に複数のマスターを共存させることができます(マルチマスター)。
- オープンドレイン:SDAとSCLの両方にプルアップ抵抗が必要です。
- 「クロックストレッチ」
- マスターはSCLを制御しますが、速度を調整する必要がある場合は、スレーブが(オープンドレインのため)SCLを保持できます。
- マスターはこのシナリオをチェックする必要があります。
- スレーブはスタックしてバスを詰まらせる可能性があります。マスターからスレーブへのリセットラインが必要です。
- 通常は7ビットのアドレス指定ですが、10ビットもサポートされています。
- 論理プロトコル:実際の電圧レベルは指定されておらず、個々の実装に依存します。例:1.8V / 3.3V / 5.0V
参照URL:
バス構成の例

プロトコルの特性(簡略化)
- 2つのメッセージタイプ:読み取りと書き込み
- 開始/停止ビット-残りの回答では「[」と「]」として表されます
- アドレス:7または10ビット
- R / Wビット:R = 1 / W = 0送信されたメッセージのタイプを識別するために使用されます。
- バス上のデータ:(アドレス<< 1 | R / W)
- 選択したデバイス内で、情報ハンドラーとして登録します。
バス交通の例

カスタムスレーブ
なぜカスタムI2Cスレーブを作成するのですか?
- 必要なセンサー/アクチュエータはI2Cインターフェイスでは利用できません。
- 必要なスレーブよりも固有のアドレスが少ない。
- スレーブで必要なカスタム機能:
- 刺激に対する半自律的反応。
- 入力データのフィルタリング/前処理。
- 電力の最適化:カスタムの「センサーハブ」がメインプロセッサのアイドル中にハウスキーピングを行います。
- 入力に対するリアルタイムの応答。
- [ここにあなたの想像力]
カスタムI2Cスレーブを設計する方法は?
- 要件を定義します(前のスライドを参照)。
- マイクロコントローラまたはマイクロプロセッサを選択してください。
- スケジューラまたはオペレーティングシステム(存在する場合)を選択します。
- 通信サブプロトコルを定義します。
- 交換するパラメータとコマンドを定義します。
- それらを「レジスタ」に整理し、無料のアドレスを選択します。
I2Cマスターの設計
主要な設計基準:
- 重量/寸法。
- 必要な計算能力と平均待ち時間。
- PCのようなデバイス
- 組み込みデバイス、通常はヘッドレス。
- 優先プログラミング言語:インタープリタとコンパイルの比較。
- スレーブを駆動するためのバス/ gpiosの可用性:
- GPIOのみ:プロトコルのビットバン
- I2C:ユーザー空間アプリケーションとカーネルドライバー。
- 使用可能なGPIO / I2Cインターフェースはありません:USB-I2Cアダプター。
デバッグ:分割統治
アドホックデバイスを使用してバスを直接制御します。例:
バス海賊

- 主に開発目的のため。
- バスを嗅ぎ、運転することができます。
- マクロを含むシリアル(ttyACM)ポート経由のコンソールインターフェイス、またはいくつかのプログラミング言語のプログラムによるアクセス。
- 内蔵プルアップ抵抗と電圧源(5V / 3.3V)
- 他の多くのプロトコルをサポートします。
- 参考文献:ウィキペディア、メインページ
USB-I2Cアダプター

- 小さな足跡。
- 恒久的な設置に適しています。
- ホストでの特別な接続は不要です。通常のPCとのインターフェースに使用できます。
- SPI対応のバリアントも利用可能です。
- コンソールインターフェイスはなく、シリアルバイナリプロトコルのみ。
- プロトコルラッパーが必要です。
- リファレンス:プロトコル
シグロクとパルスビュー
sigrok(bakendコンポーネント)ロゴ

PulseView(ビジュアライザ)の例

ローエンドロジックアナライザーの例

- LinuxでのPC駆動測定のデファクトスタンダード(他のOSでも利用可能)。
- 幅広いロジックアナライザー、スコープ、メーターをサポート。
- I2Cを含むさまざまなプロトコルデコーダー。
- 論理信号の視覚化とプロトコルエラーのデバッグに役立ちます。
- 非常にローエンドで安価なハードウェアでも、デバッグにまったく新しい次元を提供できます。
- 参照:sigrok、pulseview、サポートされているハードウェア
例:4WDドローンの操縦
2つのArduino Mini Proを使用して構築されたプロトタイプ。

例ではスレーブは何をしますか?
I2Cスレーブ:
- 各ホイールに適用されるトルクの量を制御します。
- 各ホイールが回転する方向を制御します。
- 光学式エンコーダー(走行距離計)を介して各ホイールの回転速度を測定します。
- 上記のパラメーターをI2Cマスターに公開します。

I2Cスレーブの高レベルのブロック図。

- 各ホイールに提供するのに十分なピン/機能:
- デューティサイクルの独立した構成を備えた1つのPWM出力。
- オドメーター入力をIRQとして登録するための1 GPIO。
- 選択するための2つのGPIO:
- 割り込み駆動のi2c交換用のI2C HWブロック。
- SPIベースのプログラミング専用ピン。
- 小さな足跡。
- 低価格。
- 写真に示されているクローンのボードレイアウトは、DILソケットへの取り付けに最適化されています。


- RTOS:プリエンプション、タスク、セマフォ、動的システムティックなど。
- 小さな設置面積:使用されたコード/データのみをリンクします
- HALによるRTOSとBSPの区別。
- 非商用利用のためのGPLv3。
- 活発に開発されていますが、すでに成熟しています。
- 8bit AVRをサポートします。
ただし、AVRのBSPサポートが制限されていたため、次の機能がありません。-AVR GPIOの割り込みドライバー(追加)。-AVRスレーブモードのI2Cサポート(カスタム)。AVRのドローンソフトウェアの一部として個別に開発する必要がありました。
通信パラメーターの定義
各ホイールについて:
サブプロトコル:レジスターの定義
レジスタ形式:0xαβ
-α=パラメータインデックス-β=ホイールインデックス
アドレス(任意に選択):0x10
バス海賊フォーマット:
-[=開始ビット-] =終了ビット-r =読み取りバイト-アドレス時間2(左シフト1)、R / Wビット用
例-バス海賊フォーマット
[i2c_addr reg_addr =(parm、wheel)reg_value]
[0x20 0x20 0x02] Left Rear Forward
[0x20 0x21 0x01] Right Rear Backward
[0x20 0x22 0x01] Right Front Backward
[0x20 0x23 0x02] Left Front Forward
[0x20 0x14 0xFF] Wheels set to max torque
車は時計回りに回転します。