JLCPCBにEtherCATマスタを発注してみた 



豊橋技術科学大学情報・知能工学課程に所属するhoriです。

私は、「豊橋技術科学大学ロボコン同好会」に所属しており、主にロボットのための回路設計や配線などを担当する「回路班」としての役割を担っています。

今回は、産業用フィールドバス規格である「EtherCAT」のマスタとして動作する基板をJLCPCBで発注・動作確認をしてみました。


# 基板について

EtherCATマスタというと、なにか特殊なICが必要なのかと思うかもしれませんが、ハードウェア的には普通のEthernet基板で動いてくれます。

   <table>
      <caption>使用したIC</caption>
        <thead>
            <tr>
                <th>カテゴリ</th> <th>IC名</th>
            </tr>
        <thread>
        <tr>
            <td>MCU</td> <td>STM32H743VGT6</td>
        </tr>
        <tr>
            <td>EthernetPHY</td> <td>DP83826E</td>
        </tr>
        <tr>
            <td>PDController</td> <td>CH224K</td>
        </tr>
    </table>

![Screenshot from 2023-04-07 23-45-33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820414/0c922823-cf74-127b-b223-6740050fd60f.png)



# JLCPCBへの発注の流れ

JLCPCBのURL >>> https://jlcpcb.com/

発注の流れに関しては、弊部の先輩であるForestさんのQiita記事にて詳しく解説していますので、是非そちらをご覧ください。

[https://qiita.com/Forest1717/items/ae2914ec7ff8c6206441](https://qiita.com/Forest1717/items/ae2914ec7ff8c6206441)



# 基板到着・ファームウェアの実装

届いた基板がこちらです。
MouserやDigikey,秋月等の電子パーツショップでは、取り扱いがなかったり、在庫切れ中だったりするパーツも割と手に入ったりするので、JLCPCBのPCBAssemblyサービスには本当に助かってます。(チップ部品の実装の手間も省ける！！！)
![IMG_20230407_220716.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820414/de178636-98b9-60f4-3f0a-f8830391cb80.jpeg)

実装後
特に実装不良もなく正常に動いてくれました。PCBAssemblyが便利すぎて今後も使っていきたいと思いました。
![IMG_1021.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820414/d8446f5f-8e98-e432-b47b-959d31e1e281.jpeg)


ファームウェアに関しては、STM32CubeIDEを用いて開発しました。ここでは簡単に、使用した技術について紹介したいと思います。

今回は、雑にHALのEthernet送信・受信関数及び構造体を直接使いましたが、産業用Ethernetという特性上、FreeRTOSを用いてタスク管理したほうがいいのかなと思いました。(ロボコンの使い道なら多分要らない)

CubeIDEの自動生成ツールで楽に導入できるlwipの中にEtherType(UDP,TCPとか)などを自己定義できる構造体などが用意されてようなので、それを使っていけばきれいにかけそうです。

```c

int EthWrPacket(uint8_t *pBuff, uint16_t Len)
{
	struct pbuf *p;
   p = pbuf_alloc(PBUF_TRANSPORT,Len,PBUF_RAM);
   p->tot_len = Len;
   p->len = Len;
   p->payload = pBuff;
   p->next = NULL;
   uint32_t i = 0U;
   struct pbuf *q;
   ETH_BufferTypeDef Txbuffer[ETH_TX_DESC_CNT] = {0};

   memset(Txbuffer, 0, ETH_TX_DESC_CNT * sizeof(ETH_BufferTypeDef));


   for (q = p; q != NULL; q = q->next)
   {

      Txbuffer[i].buffer = (uint8_t*)q->payload;
      Txbuffer[i].len = q->len;

      if (i > 0)
      {
         Txbuffer[i - 1].next = &Txbuffer[i];
      }

      if (q->next == NULL)
      {
         Txbuffer[i].next = NULL;
      }
      i++;
   }
   TxConfig.Length = p->tot_len;
   TxConfig.TxBuffer = Txbuffer;
   TxConfig.pData = p;

   SCB_CleanInvalidateDCache();
   HAL_ETH_Transmit(&heth, &TxConfig, p->tot_len);

   pbuf_free(p);
   HAL_Delay(1);
   return Len;
}

int EthRdPacket(uint8_t* pBuff)
{
   int Len;
   HAL_StatusTypeDef state;

   struct pbuf *p = NULL;
   state = HAL_ETH_ReadData(&heth, (void **)&p);

   Len = heth.RxDescList.RxDataLength;

   memcpy(pBuff,( uint8_t * )(p->payload),Len);

   pbuf_free(p);

   return Len;
}

```


ちなみに、EtherCatマスタの実装は、OpenEtherCATSocietyのSOEMを使わせて頂きました。

https://github.com/OpenEtherCATsociety/SOEM

# 動作確認

![Screenshot from 2023-04-07 21-20-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820414/da05ece8-6c8b-381f-3973-141380621087.png)

Wiresharkというネットワークアナライザを用いてEtherCatマスタ基板から流れてくるパケットを監視してみました。
今回はデバッグのため、PCを接続しているのでEtherCATスレーブと通信している様子は確認できませんが、ハードウェア面では、しっかり動いてそう。

# おわりに

今回は、JLCPCBでEtherCATマスタ基板を発注してみた所感について書いてみました。
リーズナブルにサクッとPCBAssemblyを試してみたい方にはとてもおすすめです。
初めてBlogを書いているので、読みにくい・分かりにくいところがあるかと思いますが、ご容赦ください。