UART Master-Slave Serial Communication between two Arduino board

โครงงานนี้เป็นอีก 1 แบบของการสื่อสารแบบอนุกรม (Serial Communication) จากที่เคยนำเสนอมาก่อนหน้านี้คือ I2C (Inter-Integrated Circuit) และแบบ SPI (Serial Peripheral Interface) ซึ่งบอร์ดควบคุม Arduino สามารถรองรับการใช้งานได้ทั้ง 3 แบบ ทั้งนี้อีกแบบหนึ่งคือ การสื่อสารแบบ UART Serial Communication ซึ่งเป็นการสื่อสารเบื้องต้นของไมโครคอนโทรลเลอร์ทุกแบรนด์ และเป็นเครื่องมือสำคัญของนักพัฒนา นักออกแบบ ในการค้นหาและแก้ไขข้อผิดพลาดหรือเรียกดีบักเกอร์ (Debuger) โดยในการทดลองนี้จะเป็นการศึกษาเบื้องต้น สำหรับรูปแบบการสื่อสารและการนำไปควบคุมความสว่างให้กับแอลอีดีด้วยสัญญาณพัลซ์วิดธ์มอดูเลตชั่น

UART Master-Slave Serial Communication between two Arduino board
รูปที่ 1 การต่อวงจรสำหรับการทดลองด้วยโปรแกรม tinkercad
UART Master-Slave Serial Communication between two Arduino board
รูปที่ 2 การต่อวงจรให้กับบอร์ด Arduino สำหรับทดลองการทำงาน

ในรูปที่ 1 และรูปที่ 2 แสดงการต่อวงจรสำหรับการทดลองด้วยโปรแกรม tinkercad ที่เว็บไซต์ www.tinkercad.com ซึ่งสามารถจำลองการทำงานของการต่อวงจรและการเขียนโปรแกรมคำสั่งในเบื้องต้น จากนั้นจะเป็นการต่อวงจรให้กับบอร์ด Arduino จริงในดังในรูปที่ 2 สำหรับทดลองการทำงานอีกครั้ง

// UART Serial Communication  LAB1 [Master]

void setup() {
  Serial.begin(9600);
}
void loop() {
  Serial.println("Arduino Tx");
  delay(1000);
}
UART Master-Slave Serial Communication between two Arduino board
รูปที่ 3 การทดลองที่ 1 บอร์ด Master แสดงข้อความที่ส่งออกไป

ในรูปที่ 3 เป็นการทดลองที่ 1 ด้วยการให้บอร์ด Master แสดงข้อความ Arduino Tx (ในกรอบสีแดง) ที่ส่งออกไปยังบอร์ด Slave ทุกๆ 1 วินาที ด้วยอัตราบอดเรตเท่ากับ 9600 สำหรับการทดลองส่งข้อความจากบอร์ด Master ไปยังบอร์ด Slave เท่านั้น  

// UART Serial Communication  LAB1 [Slave]

void setup() {
  Serial.begin(9600);  
}
void loop() {
  if (Serial.available() > 0) {  
    String receivedMessage = Serial.readStringUntil('\n'); 
    Serial.println("Received: " + receivedMessage);  
  }
}
UART Master-Slave Serial Communication between two Arduino board
รูปที่ 4 การทดลองที่ 1 บอร์ด Slave แสดงข้อความที่รับเข้ามาได้

รูปที่ 4 แสดงผลการทดลองที่ 1 เมื่อบอร์ด Slave แสดงข้อความที่รับเข้ามาได้ (ในกรอบสีแดง) โดยโปรแกรมจะใช้คำสั่ง Serial.available()>0 สำหรับตรวจสอบการส่งข้อความเข้ามา โดยเมื่อเงื่อนไขเป็นจริง ก็จะทำคำสั่ง String receivedMessage = Serial.readStringUntil(‘\n’); สำหรับรับข้อความที่ได้ จากนั้นก็จะนำข้อความมาแสดงผลอีกครั้ง ด้วยคำสั่ง Serial.println(“Received: ” + receivedMessage); ที่หน้าต่าง Serial Monitor

// UART Serial Communication  LAB2 [Master] 

const int trimpotPin = A0;  
int trimpotValue = 0;     

void setup() {
  Serial.begin(9600);  
}
void loop() {
  trimpotValue = analogRead(trimpotPin);  
  Serial.println(trimpotValue); 
  delay(500); 
}
UART Master-Slave Serial Communication between two Arduino board
รูปที่ 5 การทดลองที่ 2 บอร์ด Master แสดงการส่งข้อมูลตัวเลขออกไป

รูปที่ 5 เป็นการทดลองที่ 2 ด้วยการให้บอร์ด Master ส่งข้อมูลตัวเลข (ในกรอบสีแดง 500) ที่ได้จากขารับสัญญาณอะนาลอก A0 ไปยังบอร์ด Slave ทุกๆ 0.5 วินาที โดยในการทดลองนี้จะศึกษาการส่งข้อมูลตัวเลขและนำข้อมูลที่รับได้มาแสดงผลให้ทราบอีกครั้ง

// UART Serial Communication  LAB2 [Slave]

void setup() {
  Serial.begin(9600);    
}
void loop() {
  if (Serial.available() > 0) {  
    String trimpotValue = Serial.readStringUntil('\n');  
    Serial.println("Trimpot Value: " + trimpotValue); 
  }
}
UART Master-Slave Serial Communication between two Arduino board
รูปที่ 6 การทดลองที่ 2 บอร์ด Slave แสดงข้อมูลที่รับเข้ามาได้

รูปที่ 6 แสดงผลการทดลองที่ 2 เมื่อบอร์ด Slave แสดงข้อมูลตัวเลขที่รับเข้ามาได้ (ในกรอบสีแดง 500) โดยโปรแกรมจะใช้คำสั่ง Serial.available()>0 สำหรับตรวจสอบการส่งข้อมูลตัวเลข โดยเมื่อเงื่อนไขเป็นจริง ก็จะทำคำสั่ง String trimpotValue = Serial.readStringUntil(‘\n’); สำหรับรับข้อตัวเลขที่ได้ จากนั้นก็จะนำมาแสดงผลอีกครั้ง ด้วยคำสั่ง Serial.println(“Trimpot Value: ” + trimpotValue); ที่หน้าต่าง Serial Monitor

// UART Serial Communication  LAB3 [Master] 

const int trimpotPin = A0;  
int trimpotValue = 0;      

void setup() {
  Serial.begin(9600);  

}
void loop() {
  trimpotValue = analogRead(trimpotPin); 
  Serial.println(trimpotValue);  
  delay(500);  
}
UART Master-Slave Serial Communication between two Arduino board
รูปที่ 7 การทดลองที่ 3 บอร์ด Master แสดงการส่งข้อมูลตัวเลขออกไป (130)
UART Master-Slave Serial Communication between two Arduino board
รูปที่ 8 การทดลองที่ 3 บอร์ด Slave แสดงข้อมูลตัวเลขที่รับเข้ามาได้
UART Master-Slave Serial Communication between two Arduino board
รูปที่ 9 แสดงความสว่างของแอลอีดีเมื่อส่งค่า ADC = 132 (10bit) หรือเท่ากับ 12 (8bit)

ในรูปที่ 7 ถึงรูปที่ 9 เป็นการทดลองที่ 3 โดยในส่วนของโปรแกรมสำหรับบอร์ด Master จะยังใช้เหมือนกับการทดลองที่ 2 จากนั้นจะทดลองปรับค่า VR ให้ค่าบอร์ด Master ส่งข้อมูลตัวเลข 130 ไปยังบอร์ด Slave ดังแสดงในรูปที่ 7 ในรูปที่ 8 เมื่อบอร์ด Slave รับข้อมูลตัวเลขแล้วให้จะแสดงข้อมูลที่รับเข้ามาอีกครั้ง จากนั้นโปรแกรมจะทำการเปลี่ยนข้อมูลเดิม ซึ่งเป็นกลุ่มของตัวอักษร (String) ให้เป็นตัวเลขจำนวนเต็ม (Integer) ด้วยคำสั่ง myInt = trimpotValue.toInt(); และนำค่าที่ได้ไปกำหนดความสว่างของแอลอีดีดังในรูปที่ 9 ด้วยคำสั่ง analogWrite(9,(myInt/4)); ที่ขา D9

// UART Serial Communication  LAB3 [Slave]

void setup() {
  Serial.begin(9600); 
  pinMode(9,OUTPUT);
}

void loop() {
  if (Serial.available() > 0) { 
    String trimpotValue = Serial.readStringUntil('\n'); 
    Serial.println("Received: " + trimpotValue);  
    int myInt;  
    myInt = trimpotValue.toInt();
    Serial.println(myInt/4); 
    analogWrite(9,(myInt/4));
  }
}
UART Master-Slave Serial Communication between two Arduino board
รูปที่ 10 การทดลองที่ 3 บอร์ด Master แสดงการส่งข้อมูลตัวเลขออกไป (850)
UART Master-Slave Serial Communication between two Arduino board
รูปที่ 11 การทดลองที่ 3 บอร์ด Slave แสดงข้อมูลตัวเลขที่รับเข้ามาได้
UART Master-Slave Serial Communication between two Arduino board
รูปที่ 12 แสดงความสว่างของแอลอีดีเมื่อส่งค่า ADC = 850 (10bit) หรือเท่ากับ 213 (8bit)

ในรูปที่ 10 ถึงรูปที่ 12 เช่นเดียวกับการทดลองที่ 3 ที่ผ่านมา โดยในส่วนของโปรแกรมสำหรับบอร์ด Master จะยังใช้เหมือนกับการทดลองที่ 2 จากนั้นจะปรับค่า VR ให้ค่าบอร์ด Master ส่งข้อมูลตัวเลข 850 ไปยังบอร์ด Slave ดังแสดงในรูปที่ 10 ในรูปที่ 11 เมื่อบอร์ด Slave รับข้อมูลตัวเลขแล้วให้จะแสดงข้อมูลที่รับเข้ามาอีกครั้ง จากนั้นโปรแกรมจะทำการเปลี่ยนข้อมูลเดิม ซึ่งเป็นกลุ่มของตัวอักษร (String) ให้เป็นตัวเลขจำนวนเต็ม (Integer) ด้วยคำสั่ง myInt = trimpotValue.toInt(); และนำค่าที่ได้ไปกำหนดความสว่างของแอลอีดีดังในรูปที่ 12 ด้วยคำสั่ง analogWrite(9,(myInt/4)); ที่ขา D9 และสำหรับการทดลองโครงงานนี้คงเป็นไอเดียให้ผู้อ่านสามารถนำบอร์ดควบคุม Arduino ไปใช้งานสื่อสารระหว่างกันกับโครงงานต่างๆ ต่อไปครับ.

Reference

  1. https://www.electroniclinic.com/serial-communication-between-two-arduino-boards/
  2. https://deepbluembedded.com/serial-communication-between-two-arduino-boards/
  3. https://www.martyncurrey.com/arduino-serial-part-3-getting-started-with-serial-communication/
  4. https://robotclass.ru/tutorials/arduino-uart/
  5. https://www.tinkercad.com/things/dPemnou0diO-serial-communication-between-two-arduino
  6. https://theorycircuit.com/esp32-projects/arduino-and-esp32-serial-data-communication-setup/