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
아래 코드는 엔코더 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 06, 2020
* @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(8, 1);
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,0x00, true);
slave.write_reg_value(3,0x00, true);
slave.write_reg_value(4,0x00, true);
slave.write_reg_value(5,0x00, true);
slave.write_reg_value(6,0x00, true);
slave.write_reg_value(7,0x00, true);
printf("enc2: %d\n", Angle_encoder1);
printf("enc2: %d\n", Angle_encoder2);
wait_us(10000);
}
}
|
cs |
'STM32 > Mbed' 카테고리의 다른 글
Eigen Library 와 Simple Kalman Filter (0) | 2021.04.14 |
---|---|
Mbed Studio X HAL Library (0) | 2020.11.03 |
BufferedSerial 과 Ticker (0) | 2020.09.19 |
STM32 ARM에서 ROS와 연동하기(2, subscriber) (0) | 2020.09.13 |
STM32 ARM에서 ROS와 연동하기(1, publisher) (0) | 2020.09.13 |