안녕하세요 땜블리의 공작소에 땜블리 입니다.
오늘 새로운 제품을 소개해 드리고자 합니다.
4채널 릴레이를 I2C 또는 RS485 통신을 이용하여 제어를 하는 제품 입니다.
제품 소개를 위해서 아두이노 보드를 이용하여 두 가지 통신 방식을 이용하여 제어하는 방법을 기준으로 제품을 소개해 드리겠습니다.
제품은 아래와 같은 외형을 가지고 있습니다.
1. 제품설명
1) 외형 및 구성
2) ID 설정 방법
id는 0x08 ~ 0x17 까지 변경 사용 가능 하며 변경 방법은 2진수 계산에 8을 더하면 됩니다.
0000 => 0x08
0001 => 0x09
0010 => 0x0A
...
1110 => 0x16
1111 => 0x17
예)
딘 레일 커넥터 내장
35mm Din 레일 브래킷 내장되어있어 레일에 장착할 수 있습니다.
2. 연결 방법
I2C 통신과 RS485 통신 보드 상단 중앙의 슬라이드 스위치를 이용하여 선택을 합니다.
(1) i2c 버전 케이블 연결 방법
슬라이드 스위치 오르쪽으로 이동(I2C 실크 확인)
A 라인에 I2C SDA 연결 / B 라인에 I2C SCL 연결
(2) RS485 to 릴레이 제어방법
슬라이드 스위치 왼쪽으로 이동(RS485 실크 확인)
케이블 연결 방법
양쪽 중 한쪽 연결 연결하면 됩니다.
485통신 A 라인을 A 단자에 485통신 B 라인을 B 단자 연결
3. 사용방법
(1) 릴레이 제어 프로토콜
4채널 릴레이보드를 제어하기 위한 프로토콜 입니다.
릴레이보드 내에 32bit MCU가 내장 되어 있습니다.
프로토콜 설명 ID 설정에 따른 설명
CRC는 헤더부터 릴레이4 까지 포함 하여 CRC-16 모더버스 형식으로 함
polynome => 0x8005
startmask => 0xFFFF
endmask => 0x0000
reverseIn => true
reverseOut => true
(2) 코드작성
아래의 코드는 아두이노와 RS485보드를 연동하여 4채널 릴레이 보드를 RS485 / I2C 통신을 이용하여 제어 하는 기본 프로그램 입니다.
#include"CRC16.h"
#include"CRC.h"
byte nodeID =0x00;
byte CRCTemp[] = {0x00, 0x00};
byte Relay_state[] = {0x00, 0x00, 0x00, 0x00};
#include<Wire.h>
#include<SoftwareSerial.h>
constint buttonPin =2;
int buttonState =0;
SoftwareSerial mySerial(10, 11); // RX, TX
void setup() {
Serial.begin(9600);
mySerial.begin(9600);
pinMode(buttonPin, INPUT);
Wire.begin(); // join I2C bus (address optional for master)
}
//88 08 16 04 00 00 00 00 3B 33
//88 08 16 04 ff ff ff ff AF 32
void loop() {
if (mySerial.available()) {
Serial.write(mySerial.read());
}
// I2C 통신 방식
I2c_All_on();
delay(1000);
i2c_All_off();
delay(1000);
// 485통신 방식
relay_All_on();
delay(1500);
relay_All_off();
delay(1500);
buttonState = digitalRead(buttonPin);
// check if the pushbutton is pressed. If it is, the buttonState is HIGH:
if (buttonState == HIGH) {
return;
} else {
relay_manual(1, 0, 0, 0);
delay(1500);
relay_manual(1, 1, 0, 0);
delay(1500);
relay_manual(1, 1, 1, 0);
delay(1500);
relay_manual(1, 1, 1, 1);
delay(1500);
relay_All_off();
delay(1500);
relay_manual(1, 0, 0, 0);
delay(1500);
relay_manual(0, 1, 0, 0);
delay(1500);
relay_manual(0, 0, 1, 0);
delay(1500);
relay_manual(0, 0, 0, 1);
delay(1500);
relay_manual(0, 0, 0, 0);
delay(1500);
}
}
void relay_manual(int ch1, int ch2, int ch3, int ch4) {
byte send_Length[10];
uint16_t crc_temp =0;
send_Length[0] =byte(0x88);
send_Length[1] =byte(0x08);
send_Length[2] =byte(0x16);
send_Length[3] =byte(0x04);
if (ch1 ==1) {
send_Length[4] =byte(0xff);
} else {
send_Length[4] =byte(0x00);
}
if (ch2 ==1) {
send_Length[5] =byte(0xff);
} else {
send_Length[5] =byte(0x00);
}
if (ch3 ==1) {
send_Length[6] =byte(0xff);
} else {
send_Length[6] =byte(0x00);
}
if (ch4 ==1) {
send_Length[7] =byte(0xff);
} else {
send_Length[7] =byte(0x00);
}
crc_temp = crc16((uint8_t *) send_Length, 8, 0x8005, 0xFFFF, 0, true, true);
send_Length[8] =byte(crc_temp /256);
send_Length[9] =byte(crc_temp % 256);
Serial.println("");
for (int i =0; i <10; i++) {
mySerial.write(send_Length[i]);
Serial.print(send_Length[i], HEX);
Serial.print(' ');
}
Serial.println("");
}
void relay_All_on() {
byte send_Length[10];
uint16_t crc_temp =0;
send_Length[0] =byte(0x88);
send_Length[1] =byte(0x08);
send_Length[2] =byte(0x16);
send_Length[3] =byte(0x04);
send_Length[4] =byte(0xff);
send_Length[5] =byte(0xff);
send_Length[6] =byte(0xff);
send_Length[7] =byte(0xff);
crc_temp = crc16((uint8_t *) send_Length, 8, 0x8005, 0xFFFF, 0, true, true);
send_Length[8] =byte(crc_temp /256);
send_Length[9] =byte(crc_temp % 256);
Serial.println("");
for (int i =0; i <10; i++) {
mySerial.write(send_Length[i]);
Serial.print(send_Length[i], HEX);
Serial.print(' ');
}
Serial.println("");
}
void relay_All_off() {
byte send_Length[10];
uint16_t crc_temp =0;
send_Length[0] =byte(0x88);
send_Length[1] =byte(0x08);
send_Length[2] =byte(0x16);
send_Length[3] =byte(0x04);
send_Length[4] =byte(0x00);
send_Length[5] =byte(0x00);
send_Length[6] =byte(0x00);
send_Length[7] =byte(0x00);
crc_temp = crc16((uint8_t *) send_Length, 8, 0x8005, 0xFFFF, 0, true, true);
send_Length[8] =byte(crc_temp /256);
send_Length[9] =byte(crc_temp % 256);
for (int i =0; i <10; i++) {
mySerial.write(send_Length[i]);
Serial.print(send_Length[i], HEX);
Serial.print(' ');
}
Serial.println("");
}
void i2c_All_on() {
Serial.println("I2c on");
Wire.beginTransmission(0x08); // transmit to device #8
Wire.write(byte(0x00));// 0x00 데이터를 먼저 전송후 프로토콜 전송
Wire.write(byte(0x88));
Wire.write(byte(0x08));
Wire.write(byte(0x16));
Wire.write(byte(0x04));
Wire.write(byte(0xff));
Wire.write(byte(0xff));
Wire.write(byte(0xff));
Wire.write(byte(0xff));
Wire.write(byte(0xaf));
Wire.write(byte(0x32));
Wire.endTransmission(); // stop transmitting
}
void i2c_All_off() {
Serial.println("I2c off");
Wire.beginTransmission(0x08); // transmit to device #8
Wire.write(byte(0x00));// 0x00 데이터를 먼저 전송후 프로토콜 전송
Wire.write(byte(0x88));
Wire.write(byte(0x08));
Wire.write(byte(0x16));
Wire.write(byte(0x04));
Wire.write(byte(0x00));
Wire.write(byte(0x00));
Wire.write(byte(0x00));
Wire.write(byte(0x00));
Wire.write(byte(0x3b));
Wire.write(byte(0x33));
Wire.endTransmission(); // stop transmitting
}
(3) 동작결과
첨부된 프로그램의 동작은 아래와 같습니다.
i2c로 동작 시 릴레이 4개가 1초 간격으로 온오프 됩니다.
485 통신 으로 동작 시 릴레이가 명령어에 따라 1.5초 간격으로 변경 됩니다
아두이노 2번핀에 5v 인가시 릴레이가 전체 온 오프 되며 그라운드로 인가 시
개별 제어가 됩니다.
'제품소개' 카테고리의 다른 글
아두이노 초음파센서 제어(HC-SR04) (0) | 2023.06.19 |
---|---|
인두기 팁 클리너 스펀지 (0) | 2023.06.19 |
USB to RS485 / Arduino Download / ESP32 Download (0) | 2023.06.19 |
멀티컬러 LED(전원 인가시 멀티컬러 변경) (0) | 2023.03.03 |
라즈베리파이 피코 베이직 트레이닝보드 구성 (2) | 2023.02.22 |
댓글