コンテンツにスキップ

I2C インターフェース

I2C はコントローラー近くの小さなマイクロチップおよびモジュール間の通信インターフェースです。展開: Inter-Integrated Circuit。ドキュメントでは I2C バス がしばしば表示されます。

主な考え: 複数のデバイスが異なるアドレスを持つ場合、同じ 2 つの信号線 SDA および SCL に接続できます。

I2C が使用される場所

3D プリンタの周りのシンプルなデバイスでは、I2C は多くの場合以下に使用されます:

  • OLED ディスプレイ;
  • 温度、湿度、圧力、および光センサー;
  • リアルタイムクロック;
  • GPIO エクスパンダー;
  • いくつかのエンコーダーおよびボタンモジュール;
  • I2C マルチプレクサー;
  • いくつかの RFID/NFC モジュール;
  • 小さなアディショナルボード。

I2C は 1 つのエンクロージャ内での短い接続でよく機能します。プリンタ全体で長いワイヤーや電源線の近くでは、より危険になります。

SDA、SCL、電力、および GND

I2C モジュールは通常 4 つの接点を持ちます:

  • VCC または VIN - 電力;
  • GND - 共通グラウンド;
  • SDA - データ;
  • SCL - クロック信号。

複数のデバイスを持つ回路は次のようになります:

I2C バス: 1 つのマスターと 3 つのデバイス (共通 SDA/SCL)

ソース: Wikimedia Commons, Cburnett, CC BY-SA 3.0

同じ I2C バス上のすべてのデバイスは同じ SDASCL、および GND に接続します。電力は共通できますが、その電圧とロジックレベルは各モジュールについて検証される必要があります。

デバイスアドレス

各 I2C デバイスはアドレスを持ちます。例えば、小さな OLED は多くの場合 0x3C を使用し、一部のセンサーは 0x760x770x680x69 などを使用します。

同じバス上の 2 つのデバイスが同じアドレスを持つ場合、コントローラーはそれらを個別に適切に対処できません。

アドレス競合の対処方法:

  • モジュールがそれをサポートしている場合、ジャンパーまたはハンダブリッジ経由でアドレスを変更します;
  • 別のモジュールバリアントを選択します;
  • I2C マルチプレクサーを使用します;
  • コントローラーとファームウェアがそれを許す場合、異なる I2C バス間でデバイスを分割します。

アドレスはしばしば 16 進数形式 (hex) で与えられます: 0x3C。ただし、一部のファームウェアまたは設定では 10 進数形式 (decimal) が必要になる場合があります。例えば、0x3C は 10 進数では 60 です。特定のシステムのドキュメントを確認する必要があります。

プルアップ抵抗

I2C 線はプルアップ抵抗を通じて動作します。バス上のデバイスは通常 SDA または SCL を低く引くことができ、高いレベルはロジック電源へのプルアップから来ます。

プルアップなしで、バスは機能しないかもしれません。ただし、1 つのバス上に独自のプルアップを持つ多くのモジュールも問題になる可能性があります: 総抵抗は小さくなり、線は難しく負荷され、信号エッジおよびレベルは低下する可能性があります。

実際:

  • 多くの OLED およびセンサーボードには既にプルアップ抵抗があります;
  • 短いシンプルなバスでは、これは通常すぐに機能します;
  • 多くのデバイスがある場合、モジュールシェマティックと総プルアップを確認する必要があります;
  • バスが不安定な場合、最初のチェックの 1 つはプルアップ抵抗です。

別のバスの一般的な開始抵抗は約 4.7 kOhm ですが、既製モジュール内のプルアップは異なる可能性があります。

3.3V および 5V

I2C は特にロジックレベルに敏感です。SDA および SCL は通常何らかの電源に引き上げられているためです。

ESP32、RP2040、および STM32 は通常 3.3V ロジックで動作します。Arduino Uno/Nano はしばしば 5V ロジックで動作します。

危険な状況:

  • 3.3V コントローラー;
  • 5V から供給される I2C モジュール;
  • モジュール上のプルアップ抵抗は SDA および SCL5V に引き上げます。

この場合、5V はコントローラーの GPIO に表示される可能性があります。これはマイクロコントローラーを損傷する可能性があります。

接続する前に、確認してください:

  • モジュールが供給される電圧;
  • SDA および SCL が何に引き上げられているか;
  • モジュール上にレベルコンバーターがあるかどうか;
  • モジュールが 3.3V コントローラーと互換性があるかどうか。

わからない場合は、I2C モジュール用に 3.3V 電力またはレベルコンバーターを使用してください。

スピード

典型的な I2C スピード:

100000   # standard mode, 100 kHz
400000   # fast mode, 400 kHz

短いワイヤーと通常のモジュールでは、400 kHz はしばしば機能します。ただし、長いワイヤー、弱いプルアップ、多くのデバイス、またはノイズの多い環境では、100 kHz で開始する方が良いです。

Klipper では、i2c_speed パラメーターはすべての MCU 間で均等にサポートされていません。ドキュメントは、多くのマイクロコントローラーが 100000 を使用し、いくつかのプラットフォームが 400000 をサポートしていることを述べています。そのため、高いスピードを書いて、実際に適用されていると仮定することはできません。

I2C スキャナー

I2C スキャナーは、アドレスを反復処理し、バスで応答するデバイスを表示する小さなプログラムまたはコマンドです。

以下の理解に役立ちます:

  • コントローラーはモジュールを見ているか;
  • デバイスアドレスは何か;
  • SDA および SCL が混在しているか;
  • 電力と共通の GND があるか;
  • アドレス競合があるか。

ただし、スキャナーはデバイスが完全に機能することを証明しません。それは、誰かがそのアドレスで応答していることを示すだけです。

Klipper の I2C

Klipper では、I2C デバイスは特定の MCU に接続されています。

設定には以下のパラメーターが含まれる場合があります:

  • i2c_mcu - デバイスが接続されている MCU;
  • i2c_bus - ハードウェア I2C バス (複数ある場合);
  • i2c_software_scl_pin および i2c_software_sda_pin - 選択されたピン上のソフトウェア I2C;
  • i2c_address - デバイスアドレス;
  • i2c_speed - スピード (サポートされている場合)。

重要: Klipper の i2c_address はしばしば 16 進数形式ではなく 10 進数として指定されます。データシートが 0x3C を示す場合、設定は 60 を要求する可能性があります。

デバイスがアディショナル MCU に接続されている場合、それも指定する必要があります。そうでない場合、Klipper はそれをメインボード上で探すでしょう。

ワイヤー長およびインターフェア

I2C は短い接続用に設計されています。小さなエンクロージャー内または 1 つのボード上では便利です。3D プリンタでは、条件はより悪いです:

  • 近くのモーター;
  • 近くのヒーター;
  • 長いワイヤー;
  • ドア上のコネクタ;
  • ファンおよびヒーターの電力線;
  • 電磁干渉。

実践的なルール:

  • SDA および SCL は短くしてください;
  • それらを GND 近くでルーティングしてください;
  • ヒーター電力ワイヤーに平行にルーティングしないでください;
  • 理由なく移動する部分に長いリボンケーブルを作らないでください;
  • エラーがある場合は、スピードを 100 kHz に低下させてください;
  • 適切なコネクタおよび ストレインリリーフを使用してください;
  • 長い接続の場合、別のインターフェースを選択してください: UART、CAN、RS-485、またはセンサー近くのローカル MCU。

接続前に確認すること

I2C モジュールを接続する前に、確認してください:

  • モジュール電力;
  • ロジックレベル;
  • SDA および SCL が何に引き上げられているか;
  • デバイスアドレス;
  • アドレスが変更できるか;
  • 他のデバイスとの競合があるか;
  • ワイヤー長;
  • ファームウェアサポートがあるか;
  • デバイスが接続する MCU とバス;
  • ハードウェア I2C またはソフトウェア I2C が必要か。

典型的な間違い

  • SDA および SCL が混在しています;
  • 共通の GND を忘れました;
  • 5V プルアップを 3.3V コントローラーに適用しました;
  • 2 つのデバイスが同じアドレスを持っています;
  • 10 進数が必要な場合、16 進数アドレスを指定しました;
  • 長すぎるワイヤーを使用しました;
  • プルアップ抵抗を持つ多くのモジュールを接続しました;
  • ファームウェアでサポートされていないモジュールを選択しました;
  • デバイスをアディショナル MCU に接続しましたが、i2c_mcu を指定しませんでした;
  • I2C および I2S を混同します。

要点

I2C はコントローラー近くの小さなディスプレイ、センサー、および補助モジュールに便利です。SDASCL、電力、および共通の GND が必要です。

接続前のメインチェック: アドレス、3.3V/5V レベル、プルアップ抵抗、ワイヤー長、およびファームウェアサポート。ノイズの多いプリンタ環境では、I2C を短くしてください。

関連資料