ArduinoやラズパイでEtherCAT

ArduinoやラズパイでカジュアルにEtherCATを組むまとめ。

EtherCATマスターとEtherCATスレーブ

まず前提として、

  • EtherCATマスターはふつうのEthernetのハードウェアでOK。ただし、Ethernetの生パケットを操作できる必要がある。(TCP/IPUDP/IPしか扱えないモジュールやライブラリは不可)
  • EtherCATスレーブは専用ハードウェアが必要。また、当然ながらEhernetコネクタはINとOUTの2口が必要。

f:id:licheng:20190811163758p:plain:w600

EtherCATスレーブ : EasyCAT + Arduino Uno

EtherCATスレーブは専用ハードを必要とするので、選択肢が限られる。カジュアルに使えて、比較的入手しやすく、1万円以下で買えるものというと、今のところEasyCATくらいしかないと思われる。(※ArtifactNoiseさんのこちらにも期待!)

EasyCATはイタリアのAB&T社の製品群で、以下がラインナップされている。

今回は、EasyCAT Shield for Arduinoを使用し、Arduino Unoと組み合わせる。購入は、今のところAB&T社の直販サイトから買うしかない。支払いはPayPalで可能。1個50ユーロで、送料が42ユーロするので、2個買うと142ユーロ。

f:id:licheng:20190811194257j:plain:w500

実験用プログラム

この実験用プログラムは、AB&T社のEasyCATライブラリに依存している。EasyCATライブラリは製品ページからダウンロードできる。このプログラムを書き込んだArduino UnoにEasyCATを取り付け、下記のように実験用のサーボとボリュームを接続する。

  • ポート3にサーボを接続
  • ポートA0にボリュームを接続

EtherCATマスター(1) : Rasoberry Pi

もっとも気軽に試せるEtherCATマスターはSOEMだろう。SOEMはオープンソースのEtherCATマスターで、WindowsMac OSLinux上で動作できる。もちろん、Rasoberry Piでも動作する。今回はRasoberry Pi 3Bを使用したが、もっと古い世代のRasoberry Piでもたぶん動作するだろう。Linuxカーネルをリアルタイム化しなければEtherCAT本来のご利益であるリアルタイム性は期待できないが、まあ素の(非リアルタイムカーネルの)Raspbianでも学習用途、実験用途には使えるし、割り切って使う分には使い道はあるだろう。

f:id:licheng:20190811174117j:plain:w500

実験用プログラム

【ソース】

【手順】

  • ラズパイの任意のディレクトリ(ここでは~/とする)に上記のSOEMをクローンまたはダウンロードする。
  • ~/SOEM/test/linux/の下に上記のeasycat_test.zipを展開する。
  • ~/SOEM/CMakeLists.txt の最後を下記のように編集する。
if(BUILD_TESTS) 
  add_subdirectory(test/linux/slaveinfo)
  add_subdirectory(test/linux/eepromtool)
  add_subdirectory(test/linux/simple_test)
  add_subdirectory(test/linux/easycat_test)  # ←この行を追加
endif()
  • 以下のコマンドを実行してテストプログラムをビルドする。
cd ~/SOEM
mkdir build
cd build
cmake ..
make
  • 前述のEtherCATスレーブ(EasyCAT + Arduino Uno)2台をラズパイに数珠つなぎに接続する。
  • ラズパイ側から見て1台目のスレーブにボリューム、2台目のスレーブにサーボを取り付ける。
  • 以下のコマンドを実行してテストプログラムを実行する。
cd ~/SOEM/build/test/linux/easycat_test
sudo ./easycat_test eth0
  • 1台目のスレーブのボリュームを回すと、2台目のスレーブのサーボがそれに応じて動く。


EtherCATマスター(2) : Ethernet Shield 2 + Arduino DUE

前述のSOEMをArduinoで使えるようにC++クラスにラップしたライブラリ SOEM4Arduino を作成した。

github.com

SOEMはスレーブを管理するためにメモリを大量に使うのでArduino UnoやArduino Megaでは動作させるのは現実的でない。いまのところ、Arduino Dueで動作確認できている。それでもオリジナルのSOEMに比べると管理テーブルのサイズを大幅にシュリンクしている。

EthernetコントローラにはWIZnet社製W5500を搭載したEthernet Shield 2を使用する。

f:id:licheng:20190811173944j:plain:w500

実験用プログラム

【ソース】

【手順】

  • Ethernet Shield 2を取り付けたArduino DUEに上記のプログラムを書き込み、マスターとする。
  • EtherCATスレーブ(EasyCAT + Arduino Uno)2台を数珠つなぎにマスターに接続する。
  • マスター側から見て1台目のスレーブにボリューム、2台目のスレーブにサーボを取り付ける。
  • スレーブ2台およびマスターに電源を投入する。
  • 2秒ほど待つとスレーブのLANコネクタのLEDが点滅しはじめる。
  • 1台目のスレーブのボリュームを回すと、2台目のスレーブのサーボがそれに応じて動く。


EtherCATマスター(3) : GR-SAKURA

前述のSOEM4ArduinoはGR-SAKURAでも動作する。GR-SAKURAはルネサスRX63Nマイコンを搭載したArduino Unoフォームファクタマイコンボードであり、Arduino IDEから派生したIDE for GRで開発できる。また、RX63NマイコンEthernetコントローラを内蔵しており、GR-SAKURAはEthernetコネクタを搭載している。つまりシールド基板なしでEtherCATマスターになれる。

ただし、SOEM4ArduinoをGR-SAKURAで動作させる場合には既知の不具合があり、受信の応答性が悪い。パケットを受信するのに8msecもかかってしまう。また、起動後3秒以上待ってからSOEMの初期化をする必要がある。これらについては現在調査中である。

f:id:licheng:20190811174033j:plain:w500

実験用プログラム

前述のEthernet Shield 2 + Arduino DUEの場合と同じプログラムが動作する。ただし、上記の不具合により、電源投入後10秒ほど待たないと、サーボの追従動作が始まらない。