M5StickC(ESP32)での有線通信方式の選び方

現時点の情報です。最新情報はM5StickC非公式日本語リファレンスを確認してみてください。

概要

前回無線をやったので、有線もまとめてみました。こちらもM5StickCとタイトルに書きましたが、内容的にはすべてESP32に関することです。

ESP32の有線ユニット

無線と違い、特別なユニットはありません。GPIOを使って外部と有線接続を行います。機能によりますが、多くの方式ではどのGPIOでも使えるものが多いです。

接続形態

どのような通信相手と通信をするのかで、接続形態を選ぶ必要があります。

1対1

一番基本的な接続形態です。相手と直接有線で接続しているので比較的安定した通信が可能です。

1対多(親子関係)

1台が親になり、複数台のデバイスなどを子として接続する方式です。親から子を指定して通信をするような接続形態になります。

クライアント(全員子)

親となる端末がない形です。マスターレスなどとよばれることもあります。相手のアドレスなどを指定して通信をする接続形態です。

通信プロトコル

信号線の説明は、必要最低限な信号線の本数のみを記述してあります。基本的には信号線の他にGNDを接続することがあります。通信相手に電源が接続されていない場合には、電源も接続する必要がありますのでご注意ください。

また、有線での通信の場合には接続先との信号線の電圧が同じかを確認する必要があります。ESP32は3.3Vの電圧ですので、相手も3.3Vである必要があります。

Arudino UNOなどは5Vなので注意してください。パソコンなども5Vの場合があります。電圧が違う場合には、レベルシフタや中継用のICなどを利用して、違う電圧のまま接続しない構成を取る必要があります。

UART(1対1)

シリアル通信とよばれるものです。2本の信号線を利用して、テキストデータなどを送信します。送信用の線と、受信用の線をクロスに接続することによって、通信を行います。一方的にデータを送信する場合には、送信側の送信と、受信側の受信を接続することで1本だけの信号線でも通信が可能です。

UARTは比較的かんたんに利用することができますが、送信結果が本当に届いたのかを確認してくれません。一方的に送りつけているので、相手側が受信取りこぼしをしている可能性もあります。

比較的送信したデータが欠落したり、他のデータに変わりやすいので注意して使う必要があります。BluetoothSerialが使えるのであれば、BluetoothSerialの方が細かいことは気にせず、通信が可能です。

RS232CなどはUARTを拡張して、もうすこし信号線を使って相手が確実に受信できるかを確認する機能などが追加されています。

I2C(1対多)

センサーなどを接続するための比較的低速の通信プロトコルです。ESP32側が親となり、センサーなどに対して通信をするような用途が多いです。そのため、通信線は2本ですが、GNDと電源を含めた4本が接続されていることが多いです。

I2Cは複数のセンサーなどを並行に接続していくことが可能ですが、複数つなぎすぎると信号が劣化していきますので注意してください。

信号の劣化はおそらくオシロスコープを使って、波形をみないとわからないので、大量のセンサーを接続したり、長いケーブルを使わないようにしてください。

信号が劣化した場合には、多くの場合にはプルアップ抵抗が低くなりすぎているので、抵抗値の見直しか、I2Cリピーターなどの機材を間にいれて信号を強化してあげてください。

I2Cは親となるマスタと、スレイブで役割がわかれています。センサーなどはすべて子のスレイブとして動作します。

親側(マスタ)

一般的にESP32は親となるマスタとなります。通信するための電圧や、クロックを供給します。

子側(スレイブ)

ESP32同士などをI2Cで接続することも一応可能です。この場合、1台が親となり、それ以外は子となります。その場合、子側はスレイブとして動作させる必要があります。

ただArduinoでESP32を開発する場合には、I2Cのスレイブ側として動かすライブラリは提供されていません。(内部APIは公開されているので自作すれば動く可能性はありそうです)

ESP32同士であれば無線などで通信をするか、他のマイコンとI2C接続する場合にはESP32をマスタとするような接続にする必要があります。

SPI(1対多)

高速で通信をするためのプロトコルです。液晶画面やSDカードなどの転送に利用されています。

信号線は3本なのですが、複数の子が接続した場合に通信相手を選択するための線が必要となります。

子が1台の場合には、子の選択線をGNDに接続することで常に選択されている状態にすることができ、信号線は3本になります。

子が2台の場合には、3本の通信線の他に、2本の選択線を親から子に別々に接続する必要があるので、合計5本が必要になります。(こちらもGNDと電源が追加される可能性があります)

また、デバイスによっては通信線以外にバックライトの調整用の線や、リセット用の線などが必要な子がいまるので、更に追加されます。

親側(マスタ)

一般的にESP32は親となるマスタとなります。通信相手となる子を選択して高速通信を行います。

子側(スレイブ)

ESP32は基本的にはスレイブとして動作することは推奨されていません。ハードウエア的に制限があり、スレイブとして動かした場合に、通信したデータの最後が1バイトから7バイト受信できないことがあります。

また、ArduinoでESP32を開発する場合には、I2Cのスレイブ側として動かすライブラリは提供されていません。(内部APIは公開されているので自作すれば動く可能性はありそうです)

他のマイコンと高速データ通信を行いたい場合には、ESP32をSPIのマスタとするか、SPI以外の通信方法を検討してみてください。たとえば無線通信や、SPI接続のEthernetであれば、ESP32側はSPIのマスタとして動作が可能です。

I2S(1対1)

オーディオデータなどを高速転送するためのプロトコルです。ESP32側がマスタとなり、各種デバイスとデータ通信を行う形となります。

信号線は3本ですが、I2Sだけは利用できるGPIOが一部固定されていまるので注意してください。

外部デバイスの通信はどのGPIOでも可能ですが、直接オーディオ出力などをする場合にはDACが使えるGPIO25かGPIO26を出力に選択する必要があります。

CAN(クライアント)

自動車向けの通信プロトコルで、ノイズにつよく、比較的低速ですが安定して通信をすることが可能です。

利用する場合にはESP32以外にCAN用のトランシーバーデバイスなどが別途必要になります。また、情報が少ないのでCANを使う目的がある人以外は使わないほうがよいと思います。

Ethernet(クライアント)

ESP32は直接Ethernetの有線LANを接続することも可能です。とはいえ、こちらも大量のGPIOと専用チップなどが必要になるので、あまり一般的ではありません。

SPI接続のEthernetモジュールを使う方法などのほうが一般的だと思います。SPI以外にもUARTのシリアル通信からEthernetに変換してくれるデバイスなどもあります。

プロトコルのまとめ

プロトコル対象信号線数備考
UART1対12シリアル通信
I2C1対多2低速でお手軽
SPI1対多3以上高速通信
I2S1対13音声や映像など
CANクライアント2自動車向け
Ethernetクライアントたくさんあまり使わない

まとめ

有線は無線と違って接続したい相手がまずいる事が多いと思いますので、通信方式で迷うことは少ないと思います。

ただし、マスタとスレイブがある通信方式の場合にはESP32をマスタ側にする必要があるので注意してください。

コメント