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) โดยในการทดลองนี้จะเป็นการศึกษาเบื้องต้น สำหรับรูปแบบการสื่อสารและการนำไปควบคุมความสว่างให้กับแอลอีดีด้วยสัญญาณพัลซ์วิดธ์มอดูเลตชั่น


ในรูปที่ 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);
}

ในรูปที่ 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);
}
}

รูปที่ 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);
}

รูปที่ 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);
}
}

รูปที่ 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);
}



ในรูปที่ 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));
}
}



ในรูปที่ 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
- https://www.electroniclinic.com/serial-communication-between-two-arduino-boards/
- https://deepbluembedded.com/serial-communication-between-two-arduino-boards/
- https://www.martyncurrey.com/arduino-serial-part-3-getting-started-with-serial-communication/
- https://robotclass.ru/tutorials/arduino-uart/
- https://www.tinkercad.com/things/dPemnou0diO-serial-communication-between-two-arduino
- https://theorycircuit.com/esp32-projects/arduino-and-esp32-serial-data-communication-setup/