> For the complete documentation index, see [llms.txt](https://taiphoon-com.gitbook.io/taiphoon.com-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://taiphoon-com.gitbook.io/taiphoon.com-docs/ja/support/knowledge-base/commication-bus.md).

# 通信バス(I2C, SPI)

### 通信バスとは <a href="#undefined" id="undefined"></a>

通信バスとは、フライトコントローラー上の MCU がセンサー、メモリ、その他の周辺機器とデータをやり取りするための、共有された信号線と通信ルールの組み合わせと理解できます。

フライトコントローラーシステムでは、バスごとに役割が異なります。I2C と SPI は通常、フライトコントローラー基板上やフライトコントローラーのすぐ近くで使用されます。これらは長距離の外部周辺機器リンクではなく、短距離から中程度の距離のボードレベル通信向けだからです。

### 異なるバスが必要な理由 <a href="#undefined" id="undefined"></a>

フライトコントローラーシステムは、高速な IMU、気圧計、磁気センサー、Flash、距離センサー、その他の周辺機器を同時に扱う必要があるため、1 種類の通信方式だけですべてのタスクをこなすことはできません。

バスごとのトレードオフは、通常、速度、配線の複雑さ、接続できる機器の数、ノイズ耐性、許容できる配線距離といったいくつかの観点に集約されます。

## I2C <a href="#i2c" id="i2c"></a>

### I2C とは <a href="#i2c" id="i2c"></a>

I2C（Inter-Integrated Circuit）は 2 線式のシリアルバスで、複数の機器が同じデータ線とクロック線を共用できます。

主な利点は、配線がシンプルで MCU のピンを節約でき、同じバス上に複数の機器を接続できることです。そのため、低速から中速の短距離センサー通信に適しています。

### I2C の基本信号 <a href="#i2c" id="i2c"></a>

I2C は基本的に 2 本の信号線を使用します。

| 信号  | 用途                      |
| --- | ----------------------- |
| SCL | クロック線。マスター側がクロックを供給します。 |
| SDA | データ線。双方向で共有されます。        |

実際には I2C にも必ず電源線と GND 線が必要ですが、通信自体の中核は SCL と SDA の 2 本だけです。

### I2C が機器を選択する方法 <a href="#i2c" id="i2c"></a>

I2C はアドレス指定可能なバスで、各機器はそれぞれ独自のアドレスを持ち、マスター側はアドレスによってどの機器と通信するかを決定します。

この構造により複数のセンサーが同じ線を共用できますが、同じバス上の各機器のアドレスが競合しないことが前提です。2 つの機器が同じアドレスを使用し、かつアドレスを変更できない場合は、同じ I2C に直接接続することはできません。

### I2C の一般的な速度 <a href="#i2c" id="i2c"></a>

I2C の一般的な速度は通常 **100 kHz** と **400 kHz** で、それぞれ標準モードとファストモードに対応します。

フライトコントローラーの用途では、この速度は気圧計、磁気センサー、LED、一部の測距計、その他の低速センサーには適していますが、更新レートが高く遅延に敏感なメイン IMU のデータストリームには通常適していません。

### I2C の一般的な用途 <a href="#i2c" id="i2c"></a>

フライトコントローラーシステムでは、I2C は次のような場面でよく使用されます。

* 基板上の気圧計またはサブの磁気センサー。
* 短距離で外付けするコンパス、LED、一部の測距計。
* I2C インターフェースのみを提供する一部の低速センサー。

PX4 のドキュメントでは、I2C は短距離、基板内または近距離の接続に適しており、compass、rangefinder、LEDs などの周辺機器の接続によく使用されると特に指摘しています。

### I2C の制限 <a href="#i2c" id="i2c"></a>

I2C は配線がシンプルですが、長距離、高ノイズ、高帯域の場面には適していません。

ドローンの環境では、I2C は約 10～15 cm を超えると、線路容量やノイズの影響で信頼性が低下しやすくなります。そのため、外部モジュールまでの距離が長い場合は、通常 I2C の使用を続けることはお勧めしません。

### Pull-up 抵抗 <a href="#pull-up" id="pull-up"></a>

I2C の SDA と SCL は、pull-up 抵抗で 3.3V にプルアップしないと、バスが正常に動作しません。

多くのフライトコントローラー基板には、これらの pull-up がすでに基板上に用意されています。ただし、外部機器や変換基板の回路設計が異なる場合は、pull-up の重複、pull-up の欠如、または電圧レベルの非互換がないかを確認する必要があります。

### I2C バスのロックアップ <a href="#i2c" id="i2c"></a>

I2C の典型的な問題の一つは、ある機器が干渉、ファームウェアのエラー、または伝送の中断によって SDA を Low に引き続け、バス全体が正常に動作しなくなることです。

このような状況は bus lockup と呼ばれることがよくあります。発生した場合、単一の機器だけの問題にとどまらず、同じ I2C 上の他の機器もすべて機能しなくなる可能性があり、多くの場合、復旧には電源の入れ直しが必要です。

### メイン IMU に I2C を使用しないよう推奨される理由 <a href="#imu--i2c" id="imu--i2c"></a>

PX4 のドキュメントの推奨によると、IMU は I2C で接続すべきではありません。I2C の速度では、高頻度のセンシングや、振動フィルタリングのような大量のリアルタイムデータを必要とする処理を支えるのに不十分だからです。

また、同じ I2C 上の機器が多いほど性能はさらに低下するため、姿勢制御にとって最も重要なメイン IMU には、通常、より高速で安定した SPI が使用されます。

## SPI <a href="#spi" id="spi"></a>

### SPI とは <a href="#spi" id="spi"></a>

SPI（Serial Peripheral Interface）は高速シリアルバスで、独立した送信線、受信線、クロック線を使用し、チップセレクト線で現在通信する機器を決定します。

I2C と比べて SPI は配線が多くなりますが、その代わりにより高速、低遅延で安定した基板内データ転送が可能であるため、メイン IMU、Flash、その他の高速機器によく使用されます。

### SPI の基本信号 <a href="#spi" id="spi"></a>

SPI の最も一般的な信号は次のとおりです。

| 信号   | 用途                           |
| ---- | ---------------------------- |
| SCLK | クロック線。マスター側が供給します。           |
| MOSI | マスター側出力、デバイス側入力。             |
| MISO | デバイス側出力、マスター側入力。             |
| CS   | チップセレクト線。通常、機器ごとに 1 本ずつあります。 |

I2C との最大の違いの一つは、SPI には機器アドレスの概念がないことです。CS 線によってどの周辺機器を有効にするかを指定します。

### SPI の速度と全二重特性 <a href="#spi" id="spi"></a>

SPI の一般的な速度は約 **1～10 MHz** で、一部の機器はさらに高い速度にも対応しています。

また、SPI は**全二重**通信であり、マスター側が機器にデータを送信すると同時に、機器から返されるデータも同期して受信できます。これは高頻度のセンサーやリアルタイムのデータ交換に特に有利です。

### SPI の一般的な用途 <a href="#spi" id="spi"></a>

フライトコントローラーシステムでは、SPI は主に次の用途で使用されます。

* メイン IMU（加速度センサー、ジャイロスコープ）。
* 基板上の高速センサー。
* 外部またはオンボードの Flash メモリ。
* より高いサンプリングレートやより低い遅延を必要とする一部の周辺機器。

### SPI の制限 <a href="#spi" id="spi"></a>

SPI の主な制限は速度ではなく、拡張時の配線コストと距離です。

SPI 機器を 1 つ追加するごとに、通常は独立した CS 線が 1 本増えます。また、SPI は長い線での伝送を想定して設計されていないため、通常は基板上または非常に短い距離の接続にのみ適しており、高速 SPI を機体の離れた場所まで引いて外部モジュールに接続するのには適していません。

### SPI がメイン IMU に適している理由 <a href="#spi--imu" id="spi--imu"></a>

メイン IMU には、姿勢推定、制御ループ、振動処理を支えるために、高頻度、低遅延で安定したデータ転送が必要です。

I2C と比べて SPI は、より高いクロック、より少ないバス共有の競合、より優れたリアルタイム性を提供できるため、ほとんどの最新のフライトコントローラーでは、メイン IMU を I2C ではなく SPI で接続しています。

### I2C と SPI の比較 <a href="#i2c--spi" id="i2c--spi"></a>

### 基本的な違い <a href="#undefined" id="undefined"></a>

I2C と SPI はどちらもフライトコントローラー基板上でよく見られますが、用途は異なります。

| 項目      | I2C                    | SPI                           |
| ------- | ---------------------- | ----------------------------- |
| 線数      | 中核となる信号線 2 本：SCL、SDA。  | 共有線 3 本＋機器ごとに CS 1 本。         |
| 機器の選択方法 | アドレス。                  | チップセレクト線 CS。                  |
| 典型的な速度  | 100 kHz、400 kHz。       | 1–10 MHz                      |
| 拡張性     | 複数の機器で 2 線を共用でき、拡張が容易。 | 機器を 1 つ追加するごとに、通常 CS が 1 本必要。 |
| 適した距離   | 非常に短い。基板上または近距離。       | 基板上または極めて短い距離。                |
| 一般的な用途  | 気圧計、磁気センサー、測距計、LED。    | メイン IMU、Flash、高速センサー。         |

### 選び方 <a href="#undefined" id="undefined"></a>

**配線がシンプル、機器の数が多い、データ量が少ない**という要件であれば、通常は I2C が適しています。

**高速、低遅延、高い更新レート**が必要な場合、特にメイン IMU や高速メモリに関わる場合は、通常 SPI のほうが優れた選択肢になります。

## 他のバスとの関係 <a href="#undefined" id="undefined"></a>

### 外部周辺機器で CAN や UART がよく使われる理由 <a href="#can--uart" id="can--uart"></a>

I2C と SPI は重要ですが、その多くは基板内または近距離で使用されるバスです。

センサーの位置がフライトコントローラーから遠い場合や、システム環境に強い電磁干渉がある場合は、外部周辺機器には UART や CAN がよく使用されます。中でも CAN は、ノイズ耐性と長距離での信頼性の面で通常より有利です。

### よくある問題 <a href="#undefined" id="undefined"></a>

### I2C のよくある問題 <a href="#i2c" id="i2c"></a>

I2C の典型的な問題には次のものがあります。

* アドレスの競合（2 つの機器が同じアドレスを使用）。
* pull-up 抵抗の欠如または重複。
* ケーブルが長すぎて信号品質が低下する。
* ある機器がバスをロックし、bus 全体が動作しなくなる。

### SPI のよくある問題 <a href="#spi" id="spi"></a>

SPI の典型的な問題には次のものがあります。

* CS 線の接続ミスまたはフローティングにより、機器が正しく選択されない。
* MOSI、MISO、SCLK の対応の誤り。
* SPI を長すぎる外部配線で引き回し、信号品質が低下する。
* 複数の機器で線を共用する際、チップセレクトの制御が不適切でデータの衝突が起きる。

### 推奨される確認手順 <a href="#undefined" id="undefined"></a>

I2C または SPI の周辺機器が正常に動作しない場合は、次の順序で確認することをお勧めします。

1. 信号線の名称と実際の配線の対応が正しいことを確認します。
2. 電圧レベルと電源供給が正常であることを確認します。
3. I2C では、機器アドレスと pull-up 抵抗を確認します。
4. SPI では、CS 線が正しく接続され、正しいピンで制御されているかを確認します。
5. そのフライトコントローラーファームウェアが、対応する機器と対応するバスをサポートしているかを確認します。
6. 必要に応じて、ロジックアナライザーを使用して SCL/SDA または SCLK/MOSI/MISO/CS の実際の波形とパケットを観察します。

### 注意事項 <a href="#undefined" id="undefined"></a>

**注意：** I2C と SPI はどちらも長距離の外部配線を想定して設計されたバスではありません。モジュールをフライトコントローラーから離して配置する必要がある場合は、より適したインターフェースに変更すべきかどうかをまず再評価してください。

**注意：** あるセンサーが I2C と SPI の両方に対応しているからといって、2 つのモードを自由に切り替えられると安易に想定しないでください。実際には、フライトコントローラー基板が対応するバスを外部に提供しているか、ファームウェアがサポートしているかを確認する必要があります。

**注意：** メイン IMU は姿勢制御と密接に関わるため、通常は SPI を優先して使用すべきであり、I2C を主要な姿勢センシングのソースとすることはお勧めしません。
