개발/기술문의

LabVIEW/STM32 등 개발문의 -> jexe0716@gmail.com 으로 연락부탁드립니다.

STM32/Mbed

EtherCAT통신하기

jexe 2021. 2. 28. 13:14
반응형

 

 

Ethernet보다는 훨씬 빠른 속도가 요구되는 환경에서는 EtherCAT이 많이 사용되고 있다.

 

이 통신을 (Slave 역할로)STM32에서 사용하기 위한 방법을 인터넷을 검색해보면,

(1)특정회사에서 만든 EtherCAT모듈을 탑재하거나 (2)RJ45 포트가 포함된 STM32보드로 직접 연결한다.

(2)의 경우는 Master or Slave로 동작을 하는데 이부분은 EtherCAT 스택을 직접 짜서 넣은 것으로 보이는데,

이 부분에 대해서는 공부가 많이 필요할 것 같다. 오늘은 (1) 경우에 대한 것을 소개하고자 한다.

 

Esmacat 이라는 회사에서는 ROS에 관한 Master와 Slave의  다양한 솔루션을 제공한다.

이중에 EtherCAT Arduino Shield by Esmacat(EASE) 라는 제품이 있다. 이 제품은 EtherCAT 통신을 지원하는 모듈인데, 아두이노 핀 배열에 맞췄기 때문에 Nucleo B/D에 그대로 사용할 수 있다.

 

EASE 모듈과 STM보드 간에 SPI통신을 하여 원하는 데이터 통신을 EtherCAT으로 할 수 있다.

(기존 EtherCAT?과의 차이점은 24V를 네트워크 케이블 상으로 공급해야 한다는 점이 있다) 

 

이 제품의 편리한 점은 Mbed에 라이브러리를 제공하기 때문에 엄청 쉽고 빠르게 EhterCAT 통신을 이용할 수 있다.

개발 과정중에 EtherCAT 통신을 통해 디버깅이나 제어가 빠르게 필요할 경우에 사용하면 좋을 것이다.

 

EsmacatShield - EsmacatShield - Library for EtherCAT Arduino Shie… | Mbed

 

EsmacatShield - EsmacatShield - Library for EtherCAT Arduino Shie… | Mbed

This site uses cookies to store information on your computer. By continuing to use our site, you consent to our cookies. If you are not happy with the use of these cookies, please review our Cookie Policy to learn how they can be disabled. By disabling coo

os.mbed.com

아래 코드는 엔코더 2개를 EtherCAT으로 전달하는 코드이다.

 

slave.write_reg_value() 를 통해 EASE 모듈로 데이터를 전달할 수 있다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/**
 ******************************************************************************
 * @file    main.cpp
 * @date    February 062020
 * @brief   mbed test application - Esmacat Shield(EASE) working together with 
 *          Base Board with Arduino UNO form factor as EtherCAT slave.
 *          With the successful execution of this code the LED on EASE should
 *          blink. It should also estabilish data transfer between the EtherCAT
 *          Master of Esmacat on the PC.
 *          For further information please refer to the tutorials at
 *          https://www.esmacat.com/tutorials 
 ******************************************************************************
 
  Copyright (c) 2020 https://www.esmacat.com/
 
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at
 
    http://www.apache.org/licenses/LICENSE-2.0
 
  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
 
  EsmacatShield.h - Library for using EtherCAT Arduino Shield by Esmacat(EASE).
  Created by Esmacat, 01/22/2020
  
*******************************************************************************
* @file EsmacatShield.h
*******************************************************************************
*/
#include "mbed.h"
#include <EsmacatShield.h> //Include EsmacatShield Library
 
 
int counter;
int16_t v[8];              //an array of integer is declared for reading the 
                           //data packet of EtherCAT from EASE 8 registers
//Serial pc(USBTX, USBRX);   // Configuring the serial port to host PC
Ticker tick1;
 
 
 
SPI spi(D11, D12, D13);    // Infineon <->ARM mosi, miso, sclk
SPI spi2(PB_15, PB_14, PB_13);
SPI spi3(PC_12, PC_11, PC_10);      // Encoder <->ARM mosi, miso, sclk
 
DigitalOut selectPin(D10);          // D10 is used to drive chip enable low
DigitalOut CS1(PA_8);               // Encoder CS
DigitalOut CS2(PC_0);              
uint8_t  Hbyte_enc1 = 0;
uint8_t  Lbyte_enc1 = 0;
uint16_t Angle_encoder1 = 0;
uint8_t  Hbyte_enc2 = 0;
uint8_t  Lbyte_enc2 = 0;
uint16_t Angle_encoder2 = 0;
 
uint32_t presentT = 0;
uint32_t previousT = 0;
uint32_t DeltaT = 0;
 
uint16_t TestData = 0;
 
////////////////////////////////////////////////////////////////////////////////
void SetSPI(SPI&spi)
{
  spi.format(81);
  spi.frequency(500000); //500 kHz    
}
 
void ReadEncoder(SPI&spi, uint8_t &low, uint8_t &high, DigitalOut& CS, uint16_t &angle)
{
  CS = 0;
  high = spi.write(0x00);
  low = spi.write(0x00);
  CS = 1;
 
  uint16_t Data = ((uint16_t)high << 2+ ((uint16_t)low >>6); 
  high = Data >> 8;
  low = Data & 0xff;
  //angle = (float)Data * (360.0 / 1024.0);
  angle = (uint16_t) Data; //rawdata
}
 
 
////////////////////////////////////////////////////////////////////////////////
int main() 
{
 
    EsmacatShield slave(spi, selectPin);  //Create an Esmacat slave object with defined
                                          // spi and chip SelectPin
    slave.setup_spi();                    //Setup SPI for EASE
    
    SetSPI(spi2); 
    SetSPI(spi3); 
    
    //tick1.attach(MeasureEncoder, 0.01);
    
    while(1)
    {
      TestData++;
      if(TestData == 10000) {
        TestData = 0;    
      }
      ReadEncoder(spi2, Lbyte_enc1, Hbyte_enc1, CS1, Angle_encoder1);
      ReadEncoder(spi3, Lbyte_enc2, Hbyte_enc2, CS2, Angle_encoder2);
      slave.write_reg_value(0,Angle_encoder1, true);
      slave.write_reg_value(1,Angle_encoder2, true);
      slave.write_reg_value(2,0x00true);
      slave.write_reg_value(3,0x00true);
      slave.write_reg_value(4,0x00true);
      slave.write_reg_value(5,0x00true);
      slave.write_reg_value(6,0x00true);
      slave.write_reg_value(7,0x00true);
    
      printf("enc2: %d\n", Angle_encoder1);
      printf("enc2: %d\n", Angle_encoder2);
      
      wait_us(10000);
 
    }
 
}
 
cs
반응형