การใช้งาน Arduino ผ่านการสื่อสารรูปแบบ RS485

                    RS485 คือ  หนึ่งในรูปแบบของมาตรฐานการ รับ-ส่ง ข้อมูล ซึ่งระยะทางในการรับส่งมูลสามารถรับส่งใด้มากกว่า 1 กิโลเมตร การต่อใช้งานจะเป็นการต่อแบบ Multi-Drop ซึ่งจะมีอุปกรณ์ 1 ตัวเท่านั้นที่เป็น Master ส่วนอุปกรณ์ ตัวที่เหลือจะเป็น Slave คอยรอการร้องขอจาก Master แล้วส่งข้อมูลกลับไปยัง Master ซึ่งตัว Slave สามารถต่อเข้ากับ DataBus 485 ใด้มากกว่า 32 อุปกรณ์ด้วยกัน ระบบการสื่อสาร RS485 ใช้สายเชื่อมต่อเพียงแค่ 2 เส้นเท่านั้น โดย อาศัยความต่างศักย์ของแรงดันระหว่างสาย A และ B เป็นการกำหนดสถานะของข้อมูล สรุปแล้วระบบการสื่อสาร RS485 เป็น 1 ในระบบที่มีการใช้งานกันอย่างกว้างขวาง เนื่องจากสามารถรองรับอุปกรณ์ใด้มากกว่า 32 ตัวโดยใช้สายไฟเพียง 2 เส่น และ เป็นที่นิยมใช้งานในอุตสาหกรรม

ตัวอย่าง การใช้งานมี Hardware และ Software ดังนี้ด้าน Hardware
1. USB to RS485
2. Arduino Mega2560
3. UART TTL to RS485
4. Module Relay 4 Channel

ด้าน Software
1. โปรแกรม Arduino IDE
2. โปรแกรม Hercules

1. ทำการต่อวงจร Arduino Mega2560 กับ Module Relay

Arduino Mega2560 Module Relay 4 Channel
+5V Vcc
ขา 22 IN1
ขา 24 IN2
ขา 26 IN3
ขา 28 IN3
GND GND

2. ทำการต่อวงจร Arduino Mega2560 กับ  UART TTL To RS485

Arduino Mega2560 UART TTL To RS485
5V Vcc
TX TXD
RX RXD
GND GND

3. การต่อใช้งาน RS485 ต่อสาย A และ B ตามรูป

นำสาย A ของ RS485 ของแต่ละฝั่งมาต่อร่วมกัน
นำสาย B ของ RS485 ของแต่ละฝั่งมาต่อร่วมกัน

 

4. ตัวอย่างโปรแกรมดังนี้

สำคัญ
Arduino Mega2560 ของ Station0 เปลี่ยนตัวแปร Station = ‘0’ ;
Arduino Mega2560 ของ Station1 เปลี่ยนตัวแปร Station = ‘1’ ;

//—————————————————————————————————————————-

/*
  ประยุกต์ใช้ตัวอย่าง Serial Event ใน Arduino IDE
  ขอบคุณตัวอย่าง Serial Event จากคุณ #Tom Igoe
*/
int output[] = {22,24,26,28};
// Protocol @SXXXX\n —> X = 0 or 1 , S = Station , \n = Newline
char Station = ‘0’ ;
String inputString = “”;         // a string to hold incoming data
boolean stringComplete = false;  // whether the string is complete
void setup()
{
  Serial.begin(9600);
  inputString.reserve(200);
  for(int n = 0 ; n<= 3 ; n++)
  {
    pinMode(output[n],OUTPUT);
    digitalWrite(output[n],HIGH);
  }
}
void loop() {
  if (stringComplete)
  {
    //Protocol @SXXXX\n —> X
    if((inputString.charAt(0)==’@’)&&((inputString.charAt(1)==Station)))
    {
        Serial.println(“Station ” + String(Station) + ” Config Relay “);
        digitalWrite(output[0],(inputString.charAt(2) == ‘1’)? LOW : HIGH);
        digitalWrite(output[1],(inputString.charAt(3) == ‘1’)? LOW : HIGH);
        digitalWrite(output[2],(inputString.charAt(4) == ‘1’)? LOW : HIGH);
        digitalWrite(output[3],(inputString.charAt(5) == ‘1’)? LOW : HIGH);
        for(int n = 0 ; n <= 3 ; n++)
        {
          Serial.print((digitalRead(output[n])==LOW)? “ON ” : “OFF “);
        }
          Serial.println();
    }
    inputString = “”;
    stringComplete = false;
    Serial.flush();
  }
}
void serialEvent() {
  while (Serial.available())
  {
    char inChar = (char)Serial.read();
    inputString += inChar;
    if (inChar == ‘\n’)
    {
      stringComplete = true;
    }
  }
}

//—————————————————————————————————————————-

5. เปิดโปรแกรม Hercules เชื่อมต่อ USB to RS485 ดังรูป

จากนั้น พิมพ์ @11111 แล้วกดปุ่ม Send จากนั้น Arduino Mega2560 Station1 จะส่งข้อมูลกลับมายังโปรแกรม คือ Station 1 ตั้งค่า Relay ON ON ON ON  คือ สถานะของ Relay ตัว 1 ถึงตัวที่ 4

ซึ่งรูปแบบในการรับส่งข้อมูล จากโค้ดผมใด้กำหนดใว้ดังนี้ คือ

@SBBBB

@ คือ ตัวแรกคือ Header ของข้อมูลเพื่อเช็คความถูกต้อง
S  คือ Station ของอุปกรณ์ ซึ่งในที่นี้คือ Arduino Mega2560 ซึ่งเลข       ที่ใช้ใด้ คือ 0-9 สำหรับโปรแกรมนี้

BBBB คือ ข้อมูลในการควบคุม Relay 4 Channel ซึ่งใช้ค่า 0 หรือ 1                   แทนสถานะ
B ตัวแรก คือ ค่าที่ใช้สั่งการ Relay Channel 1 ใส่ค่า 1 หรือ 0
B ตัวสอง คือ ค่าที่ใช้สั่งการ Relay Channel 2 ใส่ค่า 1 หรือ 0
B ตัวสาม คือ ค่าที่ใช้สั่งการ Relay Channel 3 ใส่ค่า 1 หรือ 0
B ตัวสี่     คือ ค่าที่ใช้สั่งการ Relay Channel 4 ใส่ค่า 1 หรือ 0
คือเว้นบรรทัด ใช้เช็คการจบข้อความ

6. ผลลัพธ์ที่ใด้จากการส่งข้อมูล



7. ลองส่งค่า @01111 แล้วใด้ผลลัพท์ดังนี้

8. ทาง Arduino Mega2560 ใด้ผลลัพท์ ดังรูป

9. พิมข้อความ @00000 ส่งแล้วตามด้วย@10000

10. จะเห็นใด้ว่า Relay ทั้ง Station1 และ Station2 OFF ทุก Channel

เป็นที่เรียบร้อยครับสำหรับตัวอย่างการใช้งาน RS485 กับ Arduino หวังว่าจะเป็นประโยชน์แก่ผู้อื่นไม่มากก็น้อยนะครับ ผมขอจบบทความไว้เพียงเท่านี้ครับ ขอบคุณครับ