I2Cとは?SDA・SCL・アドレス・通信の仕組みを初心者向けに解説

組み込み基礎

I2C(I²C/アイ・スクエアド・シー)は、マイコンとセンサーやディスプレイなどを接続するためによく使われる通信方式です。

I2Cでは、基本的にSDA(データ)とSCL(クロック)の2本の信号線を使って通信します。さらに、1組のSDA・SCLに複数のデバイスを接続できるため、限られたGPIOを有効に使えるのも大きな特徴です。

この記事では、I2Cの基本からSDA・SCL、I2Cアドレス、ACK、プルアップ抵抗、実際の通信の流れまで、組み込み開発を始めたばかりの方にも分かるように解説します。

I2Cとは?

I2C(Inter-Integrated Circuit)は、IC同士を比較的少ない配線で接続するためのシリアル通信方式です。

マイコン開発では、例えば次のようなデバイスとの通信によく使われます。

  • 温度・湿度センサー
  • 加速度・ジャイロセンサー
  • 照度センサー
  • OLEDディスプレイ
  • RTC(リアルタイムクロック)
  • GPIO拡張IC

マイコンでよく使われる通信方式には、I2CのほかにSPIやUARTがあります。

  • I2C:少ない信号線で複数のデバイスを接続しやすい
  • SPI:信号線は増えるが高速通信に向いている
  • UART:TXとRXを使った比較的シンプルな1対1の通信に向いている

それぞれ特徴が異なるため、接続するデバイスや必要な通信速度などに応じて使い分けます。

I2Cで使うSDAとSCL

I2CのSDAとSCLの配線例

I2C通信そのものに使う信号線は、次の2本です。

  • SDA(Serial Data):データを送受信する信号線
  • SCL(Serial Clock):通信のタイミングを合わせるクロック信号線

センサーモジュールなどを実際に接続するときは、SDA・SCLに加えて電源のVCCとGNDも接続するため、4本の配線になることがよくあります。

ただし、VCCとGNDはI2Cの通信信号ではありません。そのため、I2Cは一般に2線式の通信方式として説明されます。

I2Cは複数のデバイスを同じ配線に接続できる

I2Cの大きな特徴が、同じSDA・SCLに複数のデバイスを接続できることです。

例えば、1台のマイコンに温湿度センサー、照度センサー、OLEDを接続するとします。I2C対応デバイスであれば、それぞれに専用のSDA・SCLを用意するのではなく、同じ2本の信号線を共有できます。

では、同じ配線につながっているのに、マイコンはどのデバイスと通信すればよいのか、どうやって判断するのでしょうか。

そこで使われるのがI2Cアドレスです。

I2Cアドレスとは?

I2CアドレスとACKの通信イメージ

I2Cでは、それぞれのデバイスにアドレスが割り当てられています。

例えばマイコン側が、

「アドレス0x44のデバイスと通信したい」

という情報をバス上に送ると、そのアドレスに該当するデバイスが応答します。

一般的なI2C通信では7ビットアドレスが広く使われています。データシートには「I2C Address」や「Slave Address」などとして記載されています。

最近の仕様書や技術資料では、従来の「Master / Slave」に代えて「Controller / Target」などの表現が使われる場合もあります。古いデータシートではMaster / Slave表記も多いため、両方の用語を知っておくとよいでしょう。

I2C通信の基本的な流れ

I2C通信では、単純にデータだけを送っているわけではありません。基本的には次のような手順で通信します。

  1. STARTコンディションを送る
  2. I2Cアドレスを送る
  3. 読み出し/書き込み(R/W)を指定する
  4. 相手からACKを受け取る
  5. コマンドやデータを送受信する
  6. STOPコンディションで通信を終了する

この仕組みによって、同じSDA・SCL上に複数のデバイスが存在していても、目的のデバイスを指定して通信できます。

ACKとは?

I2Cでは、アドレスやデータを送信したあと、受信側がACK(Acknowledge)を返す仕組みがあります。

  • ACK:受信側がSDAをLOWにして、受信したことを示す
  • NACK:SDAがHIGHのままで、ACKが返されない状態

例えばマイコンがI2Cアドレスを送信したにもかかわらずACKが返ってこない場合、配線ミス、アドレスの間違い、電源の問題などが考えられます。

I2Cデバイスが認識されないときには、ACKが返っているかをロジックアナライザなどで確認すると、原因調査に役立ちます。

I2Cにプルアップ抵抗が必要な理由

I2Cを使ううえで非常に重要なのが、SDAとSCLのプルアップ抵抗です。

I2CのSDA・SCLは、一般的なGPIO出力のようにデバイスがHIGHとLOWの両方を積極的に出力するのではなく、基本的にLOWへ引き下げることで信号を作ります。

どのデバイスもLOWへ引き下げていないときに信号をHIGHへ戻す役割をするのが、プルアップ抵抗です。

そのため、一般的にはSDAとSCLそれぞれを電源へプルアップします。

市販のI2Cセンサーモジュールでは、基板上にプルアップ抵抗が実装されている場合もあります。複数のモジュールを接続するとプルアップ抵抗が並列になり、合成抵抗値が小さくなることもあるため、回路図やモジュールの仕様を確認しましょう。

I2Cアドレスが重複するとどうなる?

同じI2Cバスに複数のデバイスを接続するときに注意したいのが、I2Cアドレスの重複です。

同じアドレスを持つデバイスを同じバスに接続すると、マイコンから見てどちらのデバイスにアクセスしているのか区別できません。

デバイスによっては、アドレス設定用のピンやジャンパによってアドレスを変更できます。

アドレスを変更できないデバイスを複数使用したい場合は、I2Cマルチプレクサを使うなどの方法があります。

SHT30を例にI2C通信を見てみよう

SHT30のI2C通信例

実際のI2Cデバイスとして、温湿度センサーSHT30を例に考えてみましょう。

SHT30では、I2Cを使ってマイコンから測定コマンドを送り、その後センサーから温度・湿度のデータを読み出します。

実際のコマンドや通信手順は、使用する測定モードによって異なります。例えば単発測定(Single Shot)と周期測定(Periodic Data Acquisition)では使用するコマンドが異なります。

このようにI2Cデバイスを扱うときは、データシートを確認して、「I2Cアドレス」「送信するコマンド」「読み出すデータの形式」を調べることが重要です。

大まかな流れとしては、次のようになります。

  1. 対象デバイスのI2Cアドレスを指定する
  2. 必要なコマンドを送信する
  3. センサーが測定などの処理を行う
  4. マイコンからデータを要求する
  5. 取得した値を温度・湿度などの物理量へ変換する

KUMITATE-C3でI2Cを使ってみる

I2Cは仕組みを読むだけでなく、実際にセンサーやディスプレイを接続して通信させると理解しやすくなります。

KUMITATE-C3は、ESP32-C3を搭載した電子工作・組み込みプログラミング学習用ボードです。

KUMITATE-C3にはOLEDディスプレイが搭載されており、I2C通信を使ったプログラムを実際に試すことができます。

さらに外部のI2Cセンサーを接続すれば、センサーから値を取得してOLEDへ表示するといった実践的なプログラムにも発展させられます。

例えば、温湿度センサーから取得した値をOLEDに表示することで、「センサーとのI2C通信」と「ディスプレイとのI2C通信」を一つのプログラムで体験できます。

I2C・SPI・UARTの違い

通信方式 主な信号線 特徴 よく使われる用途
I2C SDA・SCL 少ない信号線で複数デバイスを接続しやすい センサー、OLED、RTCなど
SPI SCLK・MOSI・MISO・CSなど 比較的高速な通信が可能 ディスプレイ、SDカード、ADCなど
UART TX・RX 構成がシンプル マイコン間通信、GPS、デバッグなど

「どれが一番優れている」というものではなく、必要な通信速度、接続するデバイス数、使用できるGPIO数などによって使い分けます。

I2Cのメリット・デメリット

I2Cのメリット

  • SDA・SCLの2本の信号線で通信できる
  • 同じバスに複数のデバイスを接続できる
  • センサーやOLEDなど対応デバイスが多い
  • マイコンのGPIOを節約しやすい

I2Cのデメリット

  • 同じアドレスのデバイスを接続すると競合する場合がある
  • SDA・SCLに適切なプルアップが必要
  • SPIなどと比べて高速通信には向かない場合がある
  • 配線容量やプルアップ抵抗などによって信号波形が影響を受ける

I2Cには複数の速度モードがあり、代表的なものとしてStandard-mode(100 kbit/s)、Fast-mode(400 kbit/s)、Fast-mode Plus(1 Mbit/s)などがあります。

実際に使用できる速度は、マイコンと接続するデバイスの仕様を確認して決めます。

I2C通信がうまくいかないときの確認ポイント

I2Cは配線が少なく便利ですが、「センサーが認識されない」というトラブルもよくあります。その場合は、まず次の点を確認してみましょう。

  • SDAとSCLを逆に接続していないか
  • GNDがマイコンとデバイスで共通になっているか
  • デバイスの電源電圧が正しいか
  • I2Cアドレスが正しいか
  • SDA・SCLが適切にプルアップされているか
  • 同じI2Cアドレスのデバイスが接続されていないか
  • 通信速度がデバイスの仕様に合っているか

ソフトウェアだけを疑うのではなく、配線・電圧・アドレス・波形を順番に確認することが、I2Cトラブル解決の近道です。

まとめ

  • I2CはSDAとSCLの2本の信号線を使うシリアル通信方式
  • 同じSDA・SCLに複数のデバイスを接続できる
  • 通信相手はI2Cアドレスで指定する
  • データの受信確認にはACKが使われる
  • SDAとSCLにはプルアップ抵抗が重要
  • 実際の制御方法はデバイスのデータシートで確認する

I2Cは、センサーやディスプレイを扱う組み込み開発では頻繁に登場します。まずはSDA・SCL・アドレス・ACKという基本を理解し、その後、実際のセンサーを動かしながら通信の流れを確認してみると理解が深まります。

KUMITATE

読むだけでなく、
実際に動かして学びませんか?

クミタテは、組み込み開発や電子工作を 実践しながら学べる学習プラットフォームです。 ESP32を使ったプログラミングから、電子回路、センサー、 通信、基板設計まで、自分のペースで学習できます。

  • 無料で学べる実践的な教材を掲載
  • すぐに試せるサンプルプログラム付き
  • Googleアカウントですぐに登録可能
クミタテに無料登録する
組み込み基礎
スポンサーリンク