ここではArduinoでよく使う通信方式についてまとめています。細かいことは置いておいて、実践重視の内容にしました。今後内容を更新するかもしれません。
実際に使うときは、マイコンやIC関連の回路の知識と、プログラミングの知識が必要です。基本的な使い方が分かれば、あとは大体同じように使えると思います。ご参考になれば幸いです。
▼通信方式について学ぶには、ATP3012を使ってみるのが一番いいと思います。日本語のデータシートで詳しく説明されています。
https://akizukidenshi.com/catalog/g/gI-09973/
▼Arduino IDEの公式リファレンスはこちら。ライブラリの検索もできます。
https://www.arduino.cc/reference/en/
マイコンで使う通信方式
Arduino Unoでよく使うのは、UART通信、I2C通信、SPI通信の3つです。それぞれの通信方式に対応したピンが指定されています。
他にもノイズに強いCAN通信、RS232C、RS485など様々なものがあります。Arduino Unoではシールドを換装すると使うことができます。電子部品を購入して回路を組んでもいいのですが、ややこしいのでシールドが一番楽だと思います。
▼シールドはこちら
▼CAN通信については以前の記事で使ったことがあります。
UART通信
UART通信では一対一の通信になります。パソコンからArduinoにプログラムを書き込むときもUART通信です。Arduino UnoのD0、D1ピンはパソコンで書き込むときと同じピンを使っています。D0、D1ピンに他の電子部品が接続されていると書き込めないことがあるので注意してください。
例えばArduino UnoではUART通信用のピンが一組しかありません。しかし、プログラムで擬似的に増やすことができます。
Arduino IDEでプログラムを書く場合
Arduino IDEのシリアルモニターにデータを出力するのに頻繁に使われます。特に以下の関数はよく使います。
- Serial.print():シリアルモニタに表示
- Serial.println():シリアルモニタに表示して改行
- Serial.begin():通信速度の指定
▼Arduino IDEの右上に、シリアルモニタのボタンがあります
Arduino系のマイコンはUART端子が少ないのですが、SoftwareSerial.hを使って、擬似的にUART端子として使うことが可能です。これでプログラムを書き込む毎にピンを接続しなおさずに済みます。
▼SoftwareSerial.hに関する公式リファレンスのページ
https://docs.arduino.cc/learn/built-in-libraries/software-serial
I2C通信
I2C通信はSDAとSCLの2線だけで、複数のICと接続することができます。それぞれの信号線には、プルアップ抵抗を接続します。プルアップ抵抗の値はICや条件によってさまざまなので、データシートで確認します。
▼SDA、SCLに繋がっているのがプルアップ抵抗です
複数のICを接続して、すべてのICに同じ信号が伝わるというのは使いにくいです。そこで、I2C通信ではそれぞれのICにアドレスがあって、プログラムでそのアドレスにデータを送信することができます。
I2C通信に対応したセンサーやディスプレイを使うときは、データシートや販売ページでアドレスを確認する必要があります。
Arduino IDEでプログラムを書く場合
Wire.hを使って、プログラムを書きます。よく使うのは以下の4つです。
- Wire.begin():通信開始
- Wire.beginTransmission():アドレスの指定
- Wire.write():送信するデータ
- Wire.endTransmission():通信終了
▼以前の記事で使ったことがありますが、たったのこれだけです。
▼以前の記事
SPI通信
SPI通信もI2C通信と同様に複数のICと通信でき、アドレスの指定もあります。
SPI通信で用いるディスプレイをよく見かけますが、接続しないといけないピンが多いです。データシートや回路のサンプルがあって、使いやすいものを購入することをお勧めします。
▼例えばMCP23S08では、A0、A1の電圧によってアドレスを変更することができ、4つのデバイスを使い分けることができます。
https://akizukidenshi.com/download/ds/microchip/mcp23008_mcp23s08.pdf
▼SPI通信を用いるI/O Expanderを使ったときの記事
Arduino IDEでプログラムを書く場合
SPI.hが用意されていますが、電子部品の名前で調べたらライブラリが出てくることがあります。ディスプレイやI/O Expanderは処理が複雑になるので、専用のライブラリを使うのが一番楽だと思います。サンプルプログラムも用意されています。
▼例えば、ILI9341というタッチディスプレイの場合は、Adafruitのライブラリが用意されていて使いやすいです。