Arduino＋EtherCAT の話 

#はじめに
Arduino Advent Calendar 2020　12/8　の回です。
自分は、夜な夜な産業用通信規格であるEtherCATを研究開発していますが、
ついこの間、Arduino用のEtherCATシールドを発売しましたので、そのご紹介を。

#EtherCATとは

産業用通信規格です。
サーボモータやロボットアームへPCから制御信号を送る仕組みです。
古くはRS-232CやRS-485などの通信を行っていたシーケンサや工作機器が、
今はEthernet（LANケーブル）を使ったものが増えてきました。
Ethernetを使った産業用通信規格は何種類かありますが、
**業務に関係のない時間に触れられた通信規格**としてEtherCATをよく触っています。

EtherCATは、Ethernetの通信を使ったネットワークプロトコルです。
PCからLANケーブルを使い、EtherCAT機器(スレーブ)に接続します。
接続されたEtherCAT機器は、次のEtherCAT機器へ数珠つなぎのように連結していく事が出来ます。
特に、スイッチングハブやルーターが不要なので、機器を繋いでいく際はとても簡単で便利です。

ただ、EtherCATを制御するPC（マスター）は曲者で、EtherCATの売りの一つである**低ジッタ**を実現するためにかなりの無理を強制します。
そのため、PC側のプログラムは実現するために大変苦労します。

今回は、EtherCATの動作を把握するために**簡単なプログラム**を使って動作の確認を行います。
実際のマスターに関しましては、専門で開発を行う方々の知見を頼りにしていただければと思います。

#準備するもの

## Arduino UNO
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12499/75bb10bc-8102-427f-b351-38a48d9285ce.png)
https://www.switch-science.com/catalog/789/

## AN-203 EtherCATシールド評価基板【5V用】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12499/8755e2c9-140b-ca27-e1e7-d8ddd418a208.png)

 https://www.switch-science.com/catalog/6658/

#ArduinoUNOのプログラム

ArduinoにEtherCATシールドを取り付けます。
ピンが曲がりやすく、ソケットに刺さらずに出来たように見える事があるので、注意が必要です。
AedunoにUSBケーブルを接続し、EtherCATシールドのPOWER-LEDが点灯することを確認します。

Arduinoのプロジェクト書き込みは、Windows及びMac等通常通り行っていただければと思います。

サンプルスケッチは以下の方法で取得します。

    git clone https://github.com/ArtifactNoise/Arduino-EtherCAT-Slave

Gitをロードしたフォルダーより

Arduino-EtherCAT-Slave\example\EtherCAT01

に行き、EtherCAT01.ino　を開きArduinoを立ち上げます。

#Arduinoソースの解説

##インクルード
    #include "LAN9252.h"
    #include "LAN925X_SPI.h"
使うのはこの二つ。お手製です。
LAN925X_SPIには、SPI通信用の関数が入っています。
LAN9252には、EtherCAT用のLAN9252のアクセス関数が入ってます。

##初期化
    LAN925X_SPI_Init();
    // RESET
    //LAN9252_RESET();
SPIの初期化（設定）を行います。
RESETはコメントアウトしてあります。起動時にリセットを行い起動を待つ際はこの関数を使用します。

##チップID及びリビジョンの確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12499/b736ebf2-9d96-b2e6-3e5a-da1be8d6816b.png)

    addr = ID_REV;
    rdata = LAN925X_SPI_READ(addr);
    sprintf(S1,"ID_REV[0x%04X]: 0x%08lX \n\r",addr,rdata);
    UART_TX_Stringth(S1);

とりあえず、指定のアドレスからデータが読めだせるかのテスト。    

##バイトオーダテストレジスタ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12499/d5b2c9d8-8268-0b3c-3248-964b3f58421b.png)

    addr = BYTE_TEST;
    rdata = LAN925X_SPI_READ(addr);
    sprintf(S1,"BYTE_TEST[0x%04X]: 0x%08lX \n\r",addr,rdata);
    UART_TX_Stringth(S1);

とりあえず、指定のアドレスからデータが読めだせるかのテスト。    

##フリーランニング25 MHz カウンタレジスタ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12499/223a2dcc-8242-f84c-f241-b661a837e2a6.png)

    addr = FREE_RUN;
    rdata = LAN925X_SPI_READ(addr);
    sprintf(S1,"FREE_RUN[0x%04X]: 0x%08lX \n\r",addr,rdata);
    UART_TX_Stringth(S1);

とりあえず、指定のアドレスからデータが読めだせるかのテスト。   
        
##製品IDレジスタ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12499/e12bffa8-53c5-c38a-7db5-141c070fe601.png)

    addr = Product_ID;
    rdata = LAN9252_EtherCAT_CSR_READ(CSR_SIZE_32bit,addr);
    sprintf(S1,"Product_ID[0x%04X]: 0x%08lX \n\r",addr,rdata);
    UART_TX_Stringth(S1);

##製造者ID レジスタ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12499/d115e0c0-e3e3-39fb-80ab-4bb2cfc4feaa.png)

    addr = Vendor_ID;
    rdata = LAN9252_EtherCAT_CSR_READ(CSR_SIZE_32bit,addr);
    sprintf(S1,"Vendor_ID[0x%04X]: 0x%08lX \n\r",addr,rdata);
    UART_TX_Stringth(S1);


##RUN LED オーバーライド レジスタ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12499/2da72675-40e7-6b58-be0f-f1f4e81e2118.png)

    addr = RUN_LED_Override;
    LAN9252_EtherCAT_CSR_WRITE(CSR_SIZE_32bit,addr,1<<4 | 0x0D);
    addr = 0x1000;

単純にLチカを試す際は、基板上にありますRUN-LEDを強制的に点滅させます。
レジスタに書き込みテストを行う際に便利なのでおすすめです。

#要約すると・・・

ってな感じで、
     LAN9252_EtherCAT_CSR_READ(CSR_SIZE_32bit,addr);
を用いることで、指定したアドレスレジスタのデータを読むことができます。
また、
     LAN9252_EtherCAT_CSR_WRITE(CSR_SIZE_32bit,addr,deta);
で、書き込みを行うことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12499/4a9ad736-1f21-aded-7fdc-9e34fe25e8ab.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12499/a31886d4-b9a0-e03c-2264-188df8a0d9b2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12499/2e813f1a-3f9d-048b-6aad-73e2775bb6a0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12499/c6d8ee8e-9c5a-3e66-f967-ed383d94c6fa.png)

って感じで、レジスタマップがありますので、気になったレジスタを叩いてみれば確認ができます。

##終わりに
ひとまずこんな感じでArduinoでEtherCATスレーブ開発ができると思います。
詳しいレジスタの内容に関しては、以下のデーターシートを読んでいきましょう。
http://ww1.microchip.com/downloads/jp/DeviceDoc/00001909A_JP.pdf

スレーブチップのレジスタが叩けるからとEtherCATが使用できるとはまた別の話ですが、
ErherCATを動かすにはさらにマスターの動作を理解し、スレーブのプログラムを組む必要があります。
その話はまた次回に（同人誌等で）したいと思います。

**それでは！　良きEtherCATライフを！！**


【総まとめ】EtherCATについて語る Advent Calendar 2019
https://qiita.com/nonNoise/items/889515508fc8f90c0611
去年のアドベントカレンダーも貼っておきます。