この記事は EtherCATについて語る Advent Calendar 2019 の19日目です。
昨日は@nonNoiseさんの EtherCAT 動画集(デモストレーション編) でした。
【注意!】 今日の記事はかなり偏った見解を含んでいる可能性があります。
今日はロボットに使われる通信方式のお話です。多足歩行ロボットや車輪走行ロボットのようなロボットの体内にはさまざまなセンサ、モータ、マイコン、無線モジュールなどが搭載され、それらは互いに有線で接続され通信しあって動作します。そのような通信網をここではロボットの体内ネットワークと呼ぶことにします。ロボットの体内ネットワークには種々の通信方式が用いられます。
ロボットの体内ネットワークによく用いられる通信方式を以下に示します。
通信方式 | 通信速度 | リアルタイム性 | 通信距離 | コスト・ 難易度 |
上位層 プロトコル |
---|---|---|---|---|---|
UART | ~数Mbps程度 | 〇 | ~1m程度 | 低 | 無 |
I2C | ~400kbps | 〇 | ~1m程度 | 低 | 無 |
SPI | ~20Mpbs程度 | 〇 | ~1m程度 | 低 | 無 |
RS-485 | ~10Mpbs程度 | 〇 | ~1200m (@100kbps) |
低 | △ |
CAN | ~1Mbps | △ | ~40m (@1Mbps) |
中 | 有 |
Ethernet (TCP/IP) |
~1000Mbps | × | ~100m | 高 | 有 |
EtherCAT | ~100Mbps | 〇 | ~100m | 高 | 有 |
UART
いわゆる「シリアル通信」です。昔からある通信方式で、今でもほとんどのマイコンに搭載されています。
基本的には一対一の双方向通信となります。マイコンどうしの通信や、無線モジュールとの通信に用いられることが多いです。デバッグや実験のためのログ出力に用いることも多いでしょう。
USBシリアル変換ICをUSBハブに挿しまくって仮想シリアルポートだらけの一対多通信(?)をするという荒業もあります(笑)
I2C / SPI
I2CとSPIはUARTとならんでよく使う通信方式です。これらもほとんどのマイコンに搭載されています。
近ごろではI2CやSPIのインターフェースを持ったセンサICやモータドライバICなどが安く手に入るようになり、Arduinoとかでライブラリが用意されることが多いので趣味のロボット開発でもよく使われています。
しかし、I2Cはオープンドレインという電気的な仕様上、高速通信には向きませんしノイズにも弱いです。また、I2Cは1個のスレーブがトチ狂ってバスを握ってしまうとネットワーク全体が死ぬという弱点があります。I2Cは基板上の通信かごく短い基板間の通信に使うものです。長く伸ばしたI2Cケーブルをモータの電源ケーブルと束ねたりするのはホントにやめてください!
SPIはI2Cに比べれば高速で、ノイズ耐性もマシとはいえ決して強いとはいえません。
RS-485
UARTにRS-485トランシーバを接続することで実現できます。半二重通信になるので通常のUARTよりやや処理が面倒になりますが、さほどの難易度ではありません。
差動信号を用いるので通常のUARTやI2C、SPIに比べてノイズ耐性は高く、通信距離を長く伸ばせます。ホビーロボットではあまり用いることがありませんが、ある程度本格的なロボットではよく用いられます。一部のシリアルサーボにはRS-485を用いるものがあります。
上位層のプロトコルは特に標準化されてないので、オレオレプロトコルになりがちです。オレオレプロトコルの問題点は同一バス上で共存できないことです。いちおうModbusというFA業界でデファクトスタンダートなプロトコルもあるにはあります。
CAN
車載で用いられる通信方式です。最近ではマイコンに搭載されることも多くなりましたが、やはりCANを搭載するのはミドルレンジ以上のマイコンが多いように思います。
今まで挙げた通信方式と比べてソフトウェアの処理がすこし複雑です。上位層のプロトコルとしてCANopenが存在します。ハイエンドなモータドライバにはCAN/CANopenに対応したものがあります。RS-485と同様に、ホビーロボットではあまり用いることがありませんが、ある程度本格的なロボットではよく用いられます。
ただし、最大1Mbpsと通信速度が低いのが難点です。
Ethernet (TCP/IP)
Ethernetについては説明不要でしょう。やはりEthernetを搭載するマイコンというとハイエンド寄りのものに限られます。ソフトウェア処理の負荷も、今まで挙げた通信方式と比べて各段に高いです。加えてリアルタイム性が無いというのがロボットの制御にとっては致命的な欠点です。スループットこそ抜群に高いEthernetですが、ロボットの制御においてはスループットの高さよりもリアルタイム性 (レイテンシの低さ)こそが命です。
EtherCAT
そこで我らがEtherCATです。
Ethernet(100BASE-T)に基づく100Mbpsの通信容量を無駄なく使う高いスループットと低いレイテンシを両立し、通信距離もノード間最大100mとロボットの体内ネットワークとしては十分すぎる長さであり、差動信号のためノイズ耐性もあり、そしてCoE(CANopen over EtherCAT)という標準化された上位層プロトコルが用意されています。ハイエンドなモータドライバにはEtherCATに対応したものがあります。
欠点は、部品コストが高いこと、ソフトウェア負荷が高いこと、技術的な難易度が高いこと、そして、やってる人が少ない (=情報が少ない) ことです(涙)。
なぜそんなにEtherCATを使いたいか?
ロボットの制御とは物理の計算であり、物理の計算とは微積分です。時間微分・時間積分を正確に計算するためには⊿Tが可能な限り正確で可能な限り小さいことが求められるのです。⊿Tとはすなわちデータ更新周期であり、すなわちそれは通信周期です。
そしてロボットは多数のセンサとモータのかたまりです。そのため通信量も大きくなります。かりに10個のモータ、10個のセンサと各々16バイトずつの通信をしたいとします。通信周期を1msec(1000Hz)にするには、(10+10)×16×8×1000 bps = 10.24Mbps以上の速度が最低限必要になります。
こうした理由で、低レイテンシ・低ジッタと高スループットを両立できるEtherCATが望まれるのです。
EtherCATが使われるケース
現状、EtherCATが用いられるロボットというのは、大きさでいえば大型犬サイズ以上、ご予算でいえば少なくとも100万円超えの規模になると思います。例えば3万円のモータと3万円のモータドライバを16軸使ったロボットを作ろうとするとそれだけで(3+3)万円×16軸=96万円になりますよね。
投げ売り2万円のプリメイドAIに群がってサーボモータをむしり取るような私たちとは次元の違う世界です。産業用ロボットを除けば、ほぼ研究開発用ロボットにかぎられるんじゃないかと思います。数万円~数十万円台のホビーロボットにEtherCATを用いることは今のところ非現実的です。
…が、10年後においては定かではない。(願望)