4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Posted at

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

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

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

基板について

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

使用したIC
カテゴリ IC名
MCU STM32H743VGT6
EthernetPHY DP83826E
PDController CH224K

Screenshot from 2023-04-07 23-45-33.png

JLCPCBへの発注の流れ

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

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

https://qiita.com/Forest1717/items/ae2914ec7ff8c6206441

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

届いた基板がこちらです。
MouserやDigikey,秋月等の電子パーツショップでは、取り扱いがなかったり、在庫切れ中だったりするパーツも割と手に入ったりするので、JLCPCBのPCBAssemblyサービスには本当に助かってます。(チップ部品の実装の手間も省ける!!!)
IMG_20230407_220716.jpg

実装後
特に実装不良もなく正常に動いてくれました。PCBAssemblyが便利すぎて今後も使っていきたいと思いました。
IMG_1021.JPG

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

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

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


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を使わせて頂きました。

動作確認

Screenshot from 2023-04-07 21-20-27.png

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

おわりに

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

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?