新しくAN製EtherCATを始める方法

# はじめに
この記事は、一部（ほぼ）著者が販売している商品の宣伝(PR)になります。
他のデバイスでも同様な処理を行う事が可能だと思いますが、本記事は著者の商品をテーマとしております。
予めご了承くださいませ。


# EtherCATの始め方

本記事は、先日発売開始したArduino用EtherCATシールドの使い方をまとめていきます。
今までは「EtherCATを仕事で触り始めなければ」や「次の開発はEtherCATを使うから入門機が欲しい」といった使われ方をしたと思いますが、
今回発売したArduinoシールドは、いよいよ「初めて使う」方が増えてくるだろうと思い、**開発手順や評価方法**についてまとめていきます。


# 用意する機材

**・Raspberry Pi 3もしくは4**
**・Arduino UNO(互換機でも可)**
**・AN-203 EtherCATシールド評価基板【5V用】**
  https://www.switch-science.com/catalog/6658/
  スイッチサイエンス様　販売価格： 12,100 円（税込)
**・AN-206 7セグx5搭載・シールド**
  https://www.switch-science.com/catalog/6660/
  スイッチサイエンス様　販売価格： 4400円　（税込)

# 準備

RaspberryPiに標準のOS（Rasbian)をSDカードに入れ、起動することを確認します。
ディスプレイを用いて操作もできますし、SSHから試すこともできます。
SSHを用いる際は、Wi-Fiからログインしてください。（有線はEtherCATで使用します）

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

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f31323439392f30653338323462372d356331342d376233632d333862662d3939663733343436336135332e6a706567.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12499/b7e08225-1ff2-3235-7411-4afda7546fb8.jpeg)


■　接続する

Raspberry Pi に電源が入り、OSが立ち上がっている状態で進めます。

ArduinoにUSBケーブルを接続し、LEDが点灯することを確認します。

EtherCATシールドのA側にLANケーブルを接続します。

RaspberryPiの有線LANにLANケーブルを接続します。

無事に接続ができると、EtherCATシールド上のACK-LEDが点滅します。
　　　
この状態で通信か可能になります。

![DSC_0186.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12499/fd9b19a3-14c0-82e0-5dd9-fe5fcec4af01.jpeg)

# RaspberryPi側の設定

■　ライブラリとサンプルプログラムのダウンロード

    git clone https://github.com/pyEtherCAT/Test-Source

    cd Test-Source/


# Arduino UNO 側の設定

■　サンプルスケッチを書き込む

    git clone https://github.com/ArtifactNoise/AN-7SEGx5-Shield-V1

フォルダー内の　
/example/EtherCAT_7SEG/

にあるスケッチをArduinoに書き込めば同動作します。

７セグに数字が表示されたらOK！

![DSC_0187.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12499/98dcef5b-3843-0aad-95f6-f731e6314160.jpeg)

最初に表示される数字は、EtherCATチップが持つRAMの値で、初期値は不定です。

Arduinoのシリアルでは、以下のような表示がされます。

    ===============================================
    EtherCAT Testing.
    ===============================================
    ID_REV[0x0050]: 0x92520001 
    BYTE_TEST[0x0064]: 0x87654321 
    FREE_RUN[0x009C]: 0x3A3F29D9 
    Type_Register[0x0000]: 0x000002C0 
    Product_ID[0x0E00]: 0x92520001 
    Vendor_ID[0x0E08]: 0x000004D8 
    Process_Data_RAM[0x1000]: 0x000BCBE3 

上記の内容は、EtherCATシールドに搭載されたLAN9252のレジスタ内容です。


# 実行してみる

■ Raspberry Piでプログラムを実行

このプログラムは、EtherCATスレーブ１台目のプロセスRAMに数値が書き込まれ、その値を7セグに表示します。

    sudo python3 pdetatest.py

sudoは必須です。

    pi@raspberrypi:~/Github/Test-Source$ sudo python3 pdetatest.py
    [0x0120]= 0x0002
    [0x0120]= 0x0002
    [0x0120]= 0x0004
    [0x0120]= 0x0008
    [0x1000]= 0x1234
    [0x1010]= 0x466A86C8



# 動作原理！

ひとまず、EtherCATがどういう仕組みなのかは、今後作成予定の同人誌を読んでもらうとして、
ここで注目すべき点だけを説明します。

今回、Raspberry PiとArduinoをつなげるのに「プロセスRAM」という領域を使用して、情報の行き来を行っています。

まず、EtherCATのスレーブには、**4Kbyteの領域**が付与されます。
スレーブ機器は、この4KByteを使用して、データの受け渡しをしていきます。
この4KByteは、DPRAMを使用しており、EtherCATでの書き換えとマイコンからの書き換えが干渉しないようにできてます。
その為、マイコン側は非同期特有の処理（ロック待ちやWE/REフラグ処理）を行わず、マイコンは好きなタイミングでプロセスRAMへ書き込みを行う事ができます。

また、4KByteは最大サイズですので、通信量の削減を考慮し、必要最小限のサイズで通信を行います。
本来は、この辺りの容量やアドレス等はXMLファイルやEEPROMに記載する必要がありますが、安直な動作確認ではパスして話を進めます。

例えば、4KByteのうち、最初の32ビットを7セグ表示用の数値とするなら、
マスター側のRaspberryPiでは、

    ADDR = 0x1000
    DATA[0] = 0xFF & (cnt>>0)
    DATA[1] = 0xFF & (cnt>>8)
    DATA[2] = 0xFF & (cnt>>16)
    DATA[3] = 0xFF & (cnt>>32)
    cat.APWR(IDX=0x00, ADP=cat.ADP, ADO=ADDR, DATA=DATA)

Arduinoではサンプルのようなデーターセットになります。

    addr = Process_Data_RAM;
    rdata = LAN9252_EtherCAT_CSR_READ(CSR_SIZE_32bit,addr);
    sprintf(S1,"%05lu",rdata);
    SEG7_DATA(S1);

Process_Data_RAM は0x1000番で共通です。

もちろん、8bitでも16bitでも、8bit x40の配列でも4KByteの中に収まれば問題ありません。
スレーブが自由に使える空間ですので、自由に設計しましょう。

さて、スレーブで4KbyteのプロセスRAM領域の使い方が決まったら、次はマスター側です。
先に話した通り、本来は操作するアドレスがXMLファイルとEEPROMで管理されている為、マスターは設定ファイルを読み込めばパッと済むでしょ？って話ですが、
今回は説明のため、手で記述していきます。

まず、RaspberryPiに接続した１台目へは、以下のようにアクセスする事ができます。


試しに、スレーブのEtherCATチップに記述されてる　〜番地のデータをみにいきます。


この調子で、プロセスRAMの先頭から32bitにデータを書き込みます。

どうですか？　7セグに同じ数字が表示されませんか？

★動画を撮ったので、よろしければご覧くださいませ！
https://www.youtube.com/watch?v=y9F-PaW4kj4



# 今後の話

さて、サンプルは動きましたが・・・
改造したい！アレやコレに連動したい！
そう思うでしょう。

２０２０年の締め原稿として、EtherCAT用自作ライブラリの参考書を作成しようと思います。

流れで告知をしていますが、お楽しみくださいませ。

それでは。
@nonNoise