[Arduino]I2C? SPI?

ArduinoやRaspberry Piなどでセンサーなどを接続する方法でI/Oポート(GPIO)に接続する方法意外にI2CやSPIと言うものがあり、時計作りに関係している(気がする)ので調べてみました。


赤外線センサや温度センサはデジタルデータとしてデータをArduinoなどに送っていました。

ただ、その場合複数本必要なLCDなどを複数つなげたらすぐにArduinoが使えるポートが足りなくなってしまいます。

そこで使えるのがI2C(以下I2C)とSPIです

共通点

この2つが違うところは他の通信方法はArduinoなどと一対一で接続するに対して、複数のセンサなどを数本のデータ線につなげてしまうということです。

例えば1つのセンサに3本(データ送受信、クロック)必要で、2つ接続する場合は6ポート消費することになります。

SPIで接続すればデータ受信、データ送信、クロックは共有して使い、センサを選択する線を1つづつになり、5ポートになります。また、1つセンサを追加するごとに1ポートだけ消費するだけになります(元の状態では3ポート)

I2Cではデータ送受信、クロックの2ポートだけになります。


I2C

2本のデータ線を使い、一本をデータ通信(双方向)にもう一本をクロックを送るために使います

Arduino UNOでは専用のポートがあります

SDAがデータ通信、SCLがクロックです

それぞれのセンサなどを区別するにはアドレスを(メーカーまたは自分が)設定しておき、それをもとに区別します

Arduinoを2つ使ってI2C接続ができるようなので試してみたいです

Arduino同士でI2C通信する方法 – Qiita


SPI

I2Cが2本に対してこちらは3本を共有して使い、センサなどを一つの未選択するために1本使います。

I2Cとの違いはまだあり、データ通信に使う線が2本あります

なのでI2Cより速度が出るのでLANシールドにあるLANモジュールやSDカードモジュールはSPIを使用しています

また、それぞれのセンサなどを識別するためアドレスではなくポートを1つ消費して、電気信号のHIGH,LOWで物理的に区別しています

Arduino UNOでは10ピン~13ピンを使います

10ピンでは識別(SS)、11ピンではデータ送信(MOSI)、12ではデータ受信(MISO)、13でクロック信号(SCK)を送っています(その他のピンをSSとして使えます→LANシールドのLANモジュール:10ピンSDモジュール:4ピン)


今まで使って来た部品でI2Cを使ったものはなく、SPIはLANシールドのLANモジュールとSDカードモジュールぐらいでした

(個人的に)Arduinoはポート数が多いイメージがありますが、限度があります

なるべく消費するものは少なくなるように考慮して頑張りたいですね

コメントする