- RS-485 직렬 통신
- RS-485를 Arduino와 연결
- USB to RS-485 변환기 모듈
- 간단히 Modbus 마스터 소프트웨어
- 필요한 도구
- 회로도
- RS-485 MODBUS 슬레이브 용 Arduino UNO 프로그래밍
- Arduino UNO를 Rs485 Modbus 슬레이브로 테스트
Modbus는 1979 년 Modicon에서 발견 한 직렬 통신 프로토콜 로 산업용 전자 장치간에 직렬 회선을 통해 데이터를 전송하는 데 사용됩니다. RS-485 Modbus는 전송 라인에 RS-485를 사용합니다. 주목해야한다 모드 버스는 소프트웨어 프로토콜 및 아닌 하드웨어 프로토콜. Modbus Master와 Modbus Slave의 두 부분으로 나뉩니다. RS-485 Modbus 네트워크에는 1에서 127까지 고유 한 주소를 가진 마스터 1 개와 슬레이브 127 개가 있습니다.이 MAX485 Arduino 프로젝트에서는 Arduino Uno를 직렬 통신을위한 슬레이브로 사용합니다.
Modbus는 주로 PLC (Programmable Logic Controllers)에서 사용됩니다. 이 외에도 Modbus는 의료, 운송, 가정 자동화 등에서도 사용됩니다. Modbus에는 255 개의 기능 코드가 있으며 주로 세 가지 인기있는 Modbus 버전이 있습니다.
- MODBUS RTU
- MODBUS ASCII
- MODBUS / TCP
Modbus ASCII와 Modbus RTU의 차이점은 무엇입니까?
Modbus RTU 및 Modbus ASCII 는 동일한 프로토콜을 사용합니다. 유일한 차이점은 유선을 통해 전송되는 바이트가 RTU에서는 바이너리로, Modbus RTU에서는 읽을 수있는 ASCII로 표시된다는 것입니다. 이 자습서에서는 Modbus RTU를 사용 합니다.
이 튜토리얼은 RS-485 Modbus 통신을 Arduino UNO와 슬레이브로 사용하는 방법에 관한 것입니다. 여기에서는 Simply Modbus Master Software 를 PC에 설치 하고 RS-485를 전송선으로 사용하여 2 개의 LED와 서보 모터를 제어합니다. 이 LED와 서보 모터는 Slave Arduino와 연결되며 Master Modbus Software를 사용하여 값을 전송하여 제어됩니다. 이 튜토리얼은 RS-485를 사용하므로 먼저 Arduino Uno와 Arduino Nano 간의 RS485 직렬 통신을 수행하는 것이 좋습니다. RS485는 직렬 통신을 위해 다른 컨트롤러와 함께 사용할 수도 있습니다.
- Raspberry Pi와 Arduino UNO 간의 RS-485 직렬 통신
- RS-485를 사용한 STM32F103C8과 Arduino UNO 간의 직렬 통신
RS-485 및 Modbus에 대한 배경 지식부터 살펴 보겠습니다. 또한 여기에서 다양한 직렬 통신 프로토콜에 대해 자세히 알아보십시오.
RS-485 직렬 통신
RS-485는 클럭이 필요없는 비동기식 직렬 통신 프로토콜 입니다. 차동 신호 라는 기술을 사용하여 한 장치에서 다른 장치로 이진 데이터를 전송합니다.
그렇다면이 차동 신호 전송 방법은 무엇입니까 ??
차동 신호 방법은 양극 및 음극 5V를 사용하여 차동 전압을 생성하는 방식으로 작동합니다. 2 선 사용시 Half-Duplex 통신을 제공 하며 Full-Duplex 는 4 선 4 선이 필요합니다.
이 방법을 사용하면:
- RS-485는 최대 30Mbps의 더 높은 데이터 전송 속도를 지원합니다.
- 또한 RS-232 프로토콜에 비해 최대 데이터 전송 거리를 제공합니다. 최대 1200 미터까지 데이터를 전송합니다.
- RS-232에 비해 RS-485의 주요 장점은 단일 마스터가있는 다중 슬레이브이며 RS-232는 단일 슬레이브 만 지원한다는 것입니다.
- RS-485 프로토콜에 최대 32 개의 장치를 연결할 수 있습니다.
- RS-485의 또 다른 장점은 전송시 차동 신호 방식 을 사용하므로 노이즈에 영향을받지 않습니다.
- RS-485는 I2C 프로토콜에 비해 빠릅니다.
RS-485를 Arduino와 연결
RS-485 모듈은 직렬 포트가있는 모든 마이크로 컨트롤러에 연결할 수 있습니다. 마이크로 컨트롤러와 함께 RS-485 모듈을 사용 하기 위해서는 1,200 미터의 장거리 직렬 통신이 가능하기 때문에 Maxim MAX485 IC 기반의 5V MAX485 TTL to RS485 라는 모듈 이 필요합니다. 양방향 및 반이중이며 데이터 전송 속도가 2.5Mbps입니다. 이 모듈에는 5V의 전압이 필요합니다.
RS-485의 핀아웃:
핀 이름 |
핀 설명 |
VCC |
5V |
ㅏ |
비 반전 수신기 입력 비 반전 드라이버 출력 |
비 |
수신기 입력 반전 드라이버 출력 반전 |
GND |
GND (0V) |
R0 |
수신기 출력 (RX 핀) |
레 |
수신기 출력 (LOW-Enable) |
DE |
드라이버 출력 (HIGH 활성화) |
DI |
드라이버 입력 (TX 핀) |
USB to RS-485 변환기 모듈
WIN7, XP, Vista, Linux, Mac OS를 지원하는 USB to RS485 Converter Adapter 모듈로 컴퓨터의 COM 포트를 이용하여 사용하기 쉬운 RS485 인터페이스를 제공합니다 . 이 모듈은 플러그 앤 플레이 장치 입니다. 명령 구조가 없으며 가상 COM 포트로 전송되는 모든 항목은 자동으로 RS485로 변환되며 그 반대의 경우도 마찬가지입니다. 모듈은 USB 버스에서 완전히 자체 전원을 공급받습니다. 따라서 작동을 위해 외부 전원 공급이 필요하지 않습니다.
직렬 / COM 포트로 표시되며 응용 프로그램 또는 하이퍼 터미널에서 액세스 할 수 있습니다. 이 변환기는 반이중 RS-485 통신을 제공합니다. 전송 속도 범위는 75bps ~ 115200bps이며 최대 6Mbps입니다.
이 장치를 사용하기 위해 인터넷에서 사용할 수있는 다양한 Modbus 소프트웨어가 있습니다. 이 튜토리얼에서는 Simply Modbus Software라는 소프트웨어가 사용됩니다.
간단히 Modbus 마스터 소프트웨어
COM을 통해 슬레이브 Modbus RS-485 Arduino 장치로 데이터 를 전송 하려면 Modbus Master Software 응용 프로그램이 필요합니다.
Simply Modbus Master는 데이터 통신 테스트 소프트웨어입니다. 해당 링크에서 Simply Modbus Master를 다운로드하고 소프트웨어 매뉴얼을 참조하여 자세히 알아볼 수 있습니다.
소프트웨어를 사용하기 전에 다음 용어를 숙지하는 것이 중요합니다.
슬레이브 ID:
네트워크의 각 슬레이브에는 1부터 127까지의 고유 한 장치 주소가 할당됩니다. 마스터가 데이터를 요청할 때 보내는 첫 번째 바이트는 슬레이브 주소입니다. 이렇게하면 각 슬레이브는 첫 번째 바이트 이후 메시지를 무시할지 여부를 알 수 있습니다.
기능 코드:
마스터가 보낸 두 번째 바이트는 기능 코드입니다. 이 번호는 슬레이브에게 액세스 할 테이블과 테이블에서 읽거나 쓸 것인지 여부를 알려줍니다.
지원되는 레지스터 기능 코드:
기능 코드 |
동작 |
테이블 이름 |
04 (04 육각) |
읽다 |
아날로그 입력 레지스터 |
03 (03 hex) |
읽다 |
아날로그 출력 홀딩 레지스터 |
06 (헥스 06) |
단일 쓰기 |
아날로그 출력 홀딩 레지스터 |
16 (16 진수 10) |
여러 쓰기 |
아날로그 출력 홀딩 레지스터 |
지원되는 코일 기능 코드:
기능 코드 |
동작 |
테이블 이름 |
02 (02 hex) |
읽다 |
이산 입력 접점 |
01 (16 진수 01) |
읽다 |
이산 출력 코일 |
05 (헥스 05) |
단일 쓰기 |
이산 출력 코일 |
15 (16 진수 0F) |
여러 쓰기 |
이산 출력 코일 |
CRC:
CRC는 Cyclic Redundancy check의 약자입니다. 오류 감지를 위해 모든 Modbus 메시지 끝에 2 바이트가 추가됩니다.
필요한 도구
하드웨어
- Arduino UNO
- MAX-485 TTL to RS-485 컨버터 모듈
- USB to RS-485 변환기 모듈
- LED (2)
- 1k 저항기 (2)
- 16x2 LCD 디스플레이
- 10k 전위차계
- 서보 모터 SG-90
소프트웨어
- 단순히 Modbus 마스터
회로도
MAX-485 TTL-RS-485 변환기 모듈과 Arduino UNO 간의 회로 연결:
Arduino UNO |
MAX-485 TTL to RS-485 컨버터 모듈 |
0 (RX) |
RO |
1 (TX) |
DI |
4 |
DE & RE |
+ 5V |
VCC |
GND |
GND |
MAX-485 TTL-RS-485 모듈과 USB-RS-485 컨버터 간의 회로 연결:
MAX-485 TTL-RS-485 변환기 모듈 |
USB to RS-485 모듈 PC와 연결 |
ㅏ |
ㅏ |
비 |
비 |
Arduino UNO와 16x2 LCD 디스플레이 간의 회로 연결:
16x2 LCD |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
16x2 LCD의 명암 / 밝기 제어를위한 전위차계 핀 제어 |
RS |
8 |
RW |
GND |
이자형 |
9 |
D4 |
10 |
D5 |
11 |
D6 |
12 |
D7 |
13 |
ㅏ |
+ 5V |
케이 |
GND |
2 개의 LED, 서보 모터 및 Arduino UNO 간의 회로 연결:
Arduino UNO |
LED1 |
LED2 |
서보 모터 |
2 |
1k 저항을 통한 양극 |
- |
- |
5 |
- |
1k 저항을 통한 양극 |
- |
6 |
- |
- |
PWM 핀 (주황색) |
+ 5V |
- |
- |
+ 5V (빨간색) |
GND |
음극 GND |
음극 GND |
GND (브라운) |
RS-485 MODBUS 슬레이브 용 Arduino UNO 프로그래밍
Arduino UNO는 Modbus Slave 로 구성됩니다. 또한 Arduino UNO에는 2 개의 LED와 1 개의 서보 모터가 부착되어 있습니다. 따라서 슬레이브 Arduino는 마스터 Modbus 소프트웨어에서 제어됩니다. Arduino UNO와 Modbus 마스터 소프트웨어 간의 통신은 RS-485 모듈을 사용하여 수행됩니다. PC와 연결하기 위해 USB to RS-485 컨버터 모듈을 사용합니다. MAX-485 TTL to RS-485 변환기 모듈이 있는 Arduino UNO 의 전체 설정은 다음과 같습니다.
Arduino UNO에서 Modbus를 사용하려면 라이브러리
처음에는 필요한 라이브러리를 포함합니다. ModbusRTU 라이브러리는 RS-485 Modbus 통신을 사용하기위한 것이고, 액정 라이브러리는 Arduino UNO와 함께 LCD를 사용하기위한 것이고, 서보 라이브러리는 Arduino UNO와 함께 서보 모터를 사용하기위한 것입니다.
#포함
이제 Arduino 핀 2 및 5와 연결된 LED 양극 핀은 LED1 및 LED2로 정의됩니다.
#define led1 2 #define led2 5
다음으로 Arduino UNO에 연결된 LCD 핀 (RS, E, D4, D5, D6, D7)으로 Liquid Crystal 클래스에 액세스하기위한 객체를 선언합니다.
LiquidCrystal lcd (8,9,10,11,12,13);
LCD가 완료되면 Servo 클래스의 서보 오브젝트를 초기화합니다. 또한 Modbus 클래스에 대한 버스 개체를 초기화합니다.
서보 서보; Modbus 버스;
다음으로 Modbus 통신에 대한 값을 저장하기 위해 배열이 0으로 초기화 된 세 값으로 선언됩니다.
uint16_t modbus_array = {0,0,0};
에서 설정 기능, 먼저 LCD는 16 × 모드로 설정하고 환영 메시지가 표시 및 삭제됩니다.
lcd.begin (16,2); // 16x2 모드로 설정된 LCD lcd.print ("RS-485 Modbus"); // 환영 메시지 lcd.setCursor (0,1); lcd.print ("Arduino 슬레이브"); 지연 (5000); lcd.clear ();
그 후 LED1 및 LED2 핀이 출력 핀으로 설정됩니다.
pinMode (led1, OUTPUT); pinMode (led2, OUTPUT);
Arduino의 PWM 핀 6에 연결된 서보 펄스 핀이 부착되어 있습니다.
servo.attach (6);
이제 Modbus 통신을 위해 다음 매개 변수가 설정됩니다. 첫 번째 '1'은 Slave ID를, 두 번째 '1'은 RS-485를 사용하여 데이터를 전송 함을, '4'는 Arduino UNO에 연결된 RS-485 DE & RE 핀을 나타냅니다.
버스 = Modbus (1,1,4);
Modbus 슬레이브는 9600 전송 속도로 설정됩니다.
루프는 버스 폴의 정의로 시작되며 bus.poll () 은 마스터 Modbus에서 값을 쓰고 수신하는 데 사용됩니다.
bus.poll (modbus_array, sizeof (modbus_array) / sizeof (modbus_array));
이 방법은 직렬 포트에 사용 가능한 데이터가 있는지 확인하는 데 사용됩니다.
직렬 포트에 사용 가능한 데이터가있는 경우 Modbus RTU 라이브러리는 메시지를 확인 (장치 주소, 데이터 길이 및 CRC 확인)하고 필요한 작업을 수행합니다.
예를 들어, 마스터에서 값을 쓰거나 읽으려면 ModbusRTU는 마스터 Modbus에서 부호없는 16 비트 정수 배열과 길이를 수신해야합니다. 이 어레이는 마스터에서 기록 된 데이터를 전달합니다.
이 튜토리얼에는 LED1, LED2 및 서보 모터 각도에 대한 세 가지 어레이 가 있습니다 .
먼저 LED1을 켜거나 끄려면 modbus_array 가 사용됩니다.
if (modbus_array == 0) // 마스터가 작성한 modubus_array의 값에 따라 다릅니다. Modbus { digitalWrite (led1, LOW); // 0 이면 LED 꺼짐 lcd.setCursor (0,0); lcd.print ("L1: OFF"); } else { digitalWrite (led1, HIGH); // 0이 아닌 값이면 LED 켜짐 lcd.setCursor (0,0); lcd.print ("L1: ON"); }
켜기 또는 끄기 옆에 LED2 modbus_array 가 사용됩니다.
if (modbus_array == 0) // 마스터가 작성한 modbus_array의 값에 따라 다릅니다. Modbus { digitalWrite (led2, LOW); // 0 이면 LED 꺼짐 lcd.setCursor (8,0); lcd.print ("L2: OFF"); } else { digitalWrite (led2, HIGH); // 0이 아닌 값이면 LED 켜짐 lcd.setCursor (9,0); lcd.print ("L2: ON"); }
서보 모터의 각도를 설정하기 위해 사용 된 modbus_array 와 값이 16x2 LCD 디스플레이에 인쇄됩니다.
int pwm = modbus_array; servo.write (pwm); lcd.setCursor (0,1); lcd.print ("서보 각도:"); lcd.print (pwm); 지연 (200); lcd.clear ();
이것으로 MODBUS 슬레이브로 작동하도록 Arduino UNO 프로그래밍이 완료됩니다. 다음 단계는 Modbus Slave로 테스트하는 것입니다.
Arduino UNO를 Rs485 Modbus 슬레이브로 테스트
회로 연결이 완료되고 코드가 Arduino UNO에 업로드 되면 Simple Modbus Master 소프트웨어가 설치된 PC에서 USB를 RS-485 모듈 에 연결할 시간 입니다.
장치 관리자를 열고 USB to RS-485 모듈이 연결된 PC에 따라 COM 포트를 확인한 후 Simply Modbus Master 8.1.1 소프트웨어를 엽니 다.
1. Simply Modbus 소프트웨어 가 열린 후 쓰기 옵션을 엽니 다.
2. Simply Modbus Master Write가 열린 후. 매개 변수 설정
RTU의 모드, PC에 따른 COM 포트 (내가 COM6), Baud at 9600, Data Bits 8, Stop bit 1, Parity None 및 Slave ID as 1
3. 그 후 첫 번째 레지스터를 40001로 설정하고 쓸 값은 3이고 기능 코드는 16 (Write Holding Register)으로 설정합니다.
그 후 1 ~ 40001 (LED1 켜짐) 및 1 ~ 40002 (LED2 켜짐) 및 90 ~ 40003 (서보 모터 각도)을 쓰고 SEND 버튼을 클릭합니다.
LED 상태가 모두 90도에서 서보 각도 인 것을 볼 수 있습니다.
4. 그 후 40001을 1로, 40002를 0으로, 40003을 180으로 입력하고 SEND 버튼을 클릭합니다.
5. 이제 135를 40003으로, 40001을 0으로, 40002를 1로 씁니다.
RS-485 Modbus를 슬레이브로 Arduino UNO와 직렬 통신으로 사용할 수있는 방법 입니다. 다음 튜토리얼에서는 Arduino Uno를 MODBUS commination의 마스터로 사용합니다.
아래에서 전체 코드와 데모 비디오를 찾으십시오.