การสื่อสารผ่านพอร์ตอนุกรม
มาตรฐานการสื่อสาร
ในปัจจุบันมีการนำไมโครคอนโทรลเลอร์ไปเชื่อมต่อกับอุปกรณ์ต่าง
ๆ มากมาย (ดูรูปที่ 5.1) โดยการเชื่อมต่อนั้นก็มีอยู่ด้วยกันหลายรูปแบบ
โดยการเชื่อมต่อแบบหนึ่งที่ได้รับความนิยมก็คือการเชื่อมต่อแบบอนุกรม (Serial
Communication) การทำความเข้าใจเกี่ยวกับการสื่อสารข้อมูลแบบอนุกรม
เราจำเป็นต้องทราบศัพท์ที่เกี่ยวข้องดังนี้
· TTL
(Transistor-Transistor Logic)
· UART
(Universal Asynchronous Receiver Transmitter)
· USB (Universal Serial Bus)
รูปที่
5.1
ตัวอย่างการสื่อสารแบบอนุกรมระหว่างไมโครคอนโทรลเลอร์กับอุปกรณ์อื่น ๆ
ระดับสัญญาณ
TTL
(Transistor-Transistor Logic)
TTL
เป็นระดับแรงดันที่ถูกกำหนดขึ้นในยุคแรก ๆ
ของการเชื่อมต่อสื่อสารเพื่อใช้ในการกำหนดการเชื่อมต่อระหว่างขาของทรานซิสเตอร์ที่อยู่ภายในไอซี
(วงจรรวม, Integrated Circuit, IC) ระดับสัญญาณ TTL จะใช้ระดับแรงดัน อยู่ที่ 0 ถึง +5 V (รูปที่ 5.2) แต่ในปัจจุบันมีอุปกรณ์หลายอย่างและไอซีจำนวนมากที่ทำงานในช่วงระดับแรงดัน
0 ถึง 3.3 V ซึ่งเรียกแรงดันระดับนี้ว่าระดับแรงดันต่ำ (Low
Voltage TTL, LVTTL) ซึ่งผู้ใช้ควรตรวจสอบจากแผ่นข้อมูล (Datasheet)
ของอุปกรณ์ที่จะนำมาใช้เสียก่อนว่าใช้กับระดับแรงดันใด เพราะหากใช้ผิดประเภทจะทำให้อุปกรณ์เสียหาย
ดังนั้นสำหรับ NodeMCU ที่ใช้ระดับแรงดัน 3.3 V ในการส่งข้อมูล
เราจะต้องตรวจสอบอุปกรณ์ที่นำมาต่อพ่วงว่าใช้กับระดับแรงดัน 3.3 V ได้หรือไม่
รูปที่ 5.2 ระดับแรงดัน TTL (ก) แบบดั้งเดิม และ (ข)
แบบแรงดันต่ำ
UART
(Universal Asynchronous Receiver-Transmitter)
UART
หมายถึงอุปกรณ์ที่ทำหน้าที่รับและส่งข้อมูลแบบอะซิงโครนัส (asyn-chronous) ซึ่งมักใช้กับการสื่อสารแบบอนุกรม
โดยการสื่อสารแบบอนุกรมอาจจะแบ่งได้เป็น 2 แบบ คือ
1)
ซิงโครนัส
(Synchronous)
เป็นการส่งข้อมูลเป็นบล็อก ครั้งละหลายไบต์
โดยจะมีสัญญาณนาฬิกา (CLK,
CLocK) ที่ช่วยในการทำงานของตัวส่งและตัวรับสอดคล้องกัน
โดยสัญญาณที่ส่งอาจจะถูกเข้ารหัสร่วมกันอยู่ในชุดข้อมูลนั้นหรือแยกอิสระออกเป็นสายต่างหากก็ได้
รูปที่ 5.3 แสดงลักษณะแนวคิดพื้นฐานในการส่งข้อมูลแบบซิงโครนัส
รูปที่
5.3
การสื่อสารแบบซิงโครนัส
2)
อะซิงโครนัส
(Asynchronous)
การส่งข้อมูลแบบอะซิงโครนัสเป็นการสื่อสารแบบที่ใช้มากในการสื่อสารในไมโครคอนโทรลเลอร์
รูปแบบการสื่อสารจะเป็นการรับส่งข้อมูลครั้งละ 1 ไบต์ ดังรูปที่ 5.4
โดยมีรูปแบบของข้อมูลดังแสดงในรูปที่ 5.5
รูปที่
5.4
การสื่อสารแบบอะซิงโครนัส
รูปที่
5.5
รูปแบบข้อมูลที่ใช้ในการสื่อสารอนุกรมแบบอะซิงโครนัส
ในรูปที่ 5.5 ข้อมูลจะประกอบด้วย
-
บิตเริ่มต้น (Start Bit) บอกจุดเริ่มต้นข้อมูล
มีขนาด 1 บิต
-
บิตข้อมูล (Data Bit) คือค่าข้อมูลมีได้ระหว่าง
5 ถึง 8 บิต
-
พาริตี้บิต (Parity Bit) คือบิตที่ใช้สำหรับตรวจสอบความผิดพลาดของข้อมูล
อาจไม่มีหรือมี 1 บิต
- บิตหยุด (Stop Bit)
บิตที่บอกจุดสิ้นสุดข้อมูล มีได้ 1, 1.5 หรือ 2 บิต
USB
(Universal Serial Bus)
USB
เป็นมาตรฐานการเชื่อมต่อสำหรับการรับ-ส่งข้อมูลแบบอนุกรมสำหรับคอมพิวเตอร์และอุปกรณ์ต่อพ่วงต่าง
ๆ ในระยะสั้น ๆ ไม่เกิน 2-5 เมตร โดย USB ได้ถูกเริ่มนำมาใช้ครั้งแรกในปี
ค.ศ. 1996 (เรียก USB 1.0) และได้มีการพัฒนาต่อเนื่องมา
โดยเน้นการพัฒนาด้านความเร็วในการส่งข้อมูล ปัจจุบัน มาตรฐาน USB ที่ใช้อย่างแพร่หลาย จะเป็น USB 2.0 และ USB 3.x (x = 0, 1 หรือ 2) โดย USB 2 จะมีความเร็วสูงสุดในการส่งข้อมูลอยู่ที่
480 Mbit/s และพอร์ต USB 3
ถูกออกแบบมาให้มีลักษณะหน้าตาคล้ายกับ USB 2 เพื่อให้เราสามารถใช้งานอุปกรณ์ที่ใช้
USB 2 ร่วมกับพอร์ต USB 3 ได้ โดย USB
3 มีความเร็วสูงสุดสูงถึง 10 Gbit/s (USB
3.2) และเราสามารถสังเกตพอร์ต USB 3 ได้ง่าย
จากสีของแกนพลาสติกภายในคือ USB 3.0 จะใช้แกนด้านในสีฟ้า
รูปที่ 5.6 แสดงภาพหัวต่อ USB 2 แบบมาตรฐาน Type A และแบบไมโคร B ซึ่งพอร์ตแบบไมโคร B นี้ ถูกนำมาใช้ในบอร์ด NodeMCU
สาย USB ทั่วไป
จะประกอบด้วยสาย 4 เส้น คือ แรงดันไฟตรง +5 V, Data, Data+ และ
กราวด์ โดยข้อมูลจะส่งแบบอนุกรมผ่านสาย Data และ
Data+ เท่านั้น สำหรับแรงดันไฟตรง +5 V จะสามารถนำมาใช้ส่งพลังงานไฟฟ้าได้ด้วย
โดยส่งกระแสได้สูงสุด 0.5 A สำหรับ USB 2 และ 0.9 A สำหรับ USB 3 ดังนั้นในการใช้งานพอร์ต
USB เป็นแหล่งพลังงานให้กับไมโครคอนโทรลเลอร์
ผู้ใช้จะต้องคำนึงถึงข้อจำกัดด้านการจ่ายกระแสนี้ด้วย
รูปที่
5.6 ลักษณะของพอร์ต USB แบบ (ก) มาตรฐาน Type A และ (ข)
ตัวรับแบบไมโคร B
อัตราการส่งข้อมูล
อัตราการส่งข้อมูลหรือ บอดเรท (Baud Rate) คือความเร็วของการรับ-ส่งข้อมูล เป็นจำนวนบิตต่อวินาที (bit per
second, bps) เช่น 300, 1200, 2400, 4800, 9600,
19200, 38400, 57600, 74880, 115200 bps เป็นต้น การเลือกอัตราการส่งข้อมูลขึ้นอยู่กับ ชนิดของสายสัญญาณ, ระยะทาง และปริมาณสัญญาณรบกวน โดยการส่งข้อมูลระหว่างไมโครคอนโทรลเลอร์และอุปกรณ์อื่น
ๆ นั้น จะทำได้ก็ต่อเมื่อเรากำหนดให้อัตราการส่งข้อมูลมีค่าตรงกันเท่านั้น
ไอซีเบอร์
CH340
ในการแปลงข้อมูลที่รับ-ส่งผ่านพอร์ต USB นั้น NodeMCU (ESP8266)
จะใช้ไอซีเบอร์ CH340 ในการแปลงระดับสัญญาณแรงดัน
ซึ่งบางครั้งจะเรียกว่า USB-UART Interface IC โดยในการใช้งานชิปนี้
เราอาจต้องลงไดรเวอร์ให้กับระบบปฏิบัติการวินโดว์ก่อน
รูปที่
5.7
การเชื่อมต่อระหว่างคอมพิวเตอร์ (ระดับสัญญาณ USB)
และ NodeMCU (ระดับสัญญาณ LVTTL) ผ่าน CH340
การเขียนโปรแกรมติดต่อสื่อสาร
ในการสื่อสารแบบอนุกรม
ระหว่าง NodeMCU
และคอมพิวเตอร์ เราสามารถทำได้โดยการเชื่อมต่อผ่านพอร์ต USB ดังที่เราได้ทดลองกันไปแล้วในบทที่ 3 และ 4 สำหรับฟังก์ชันในภาษา Arduino
ที่ใช้ในการสื่อสารแบบอนุกรมนี้ จะอยู่ภายในวัตถุชื่อ Serial และมีดังนี้
·
ฟังก์ชันกำหนด Buad
rate
-
Serial.begin(int baud)
โดย
baud
คือ อัตราเร็วที่ใช้ในการสื่อสาร มีค่าที่ใช้บ่อยคือ 9600 และ 115200
·
ฟังก์ชันตรวจสอบข้อมูลที่ส่งมายังพอร์ตอนุกรม
-
Serial.available()
ฟังก์ชันนี้จะส่งค่าคืนเป็นจำนวนไบต์ของข้อมูล
(เป็นค่าจำนวนเต็ม) ที่ส่งผ่านพอร์ตอนุกรมมายังด้านรับ
·
ฟังก์ชันอ่านค่าจากพอร์ตอนุกรม
-
Serial.read()
ฟังก์ชันนี้จะส่งค่าคืนเป็นข้อมูลที่ส่งมายังด้านรับ
·
ฟังก์ชันส่งข้อมูลออกไปยังพอร์ตอนุกรม
-
Serial.print(data), Serial.write(data) และ Serial.println(data)
ฟังก์ชันนี้จะส่งค่าให้แก่พอร์ตอนุกรมโดย
Serial.print
จะส่งรหัสตัวอักษรแบบแอสกี (ASCII)
ซึ่งสามารถอ่านทำความเข้าใจได้ง่าย Serial.write มักจะใช้ส่งค่าไบนารี
และ Serial.println จะเหมือนกันกับ Serial.print แต่จะมีการเพิ่มตัวอักขระขึ้นบรรทัดใหม่ (newline character, \n) หลังส่งค่าตัวอักษรตามคำสั่งนี้เสร็จ
การทดลองสื่อสารผ่านพอร์ตอนุกรม
วัตถุประสงค์
1.
สามารถเขียนโปรแกรมให้ NodeMCU ส่งค่าไปแสดงผลบนคอมพิวเตอร์ได้
2.
สามารถเขียนโปรแกรมให้ NodeMCU
รับค่าจากคอมพิวเตอร์มาควบคุมรีเลย์ได้
อุปกรณ์ที่ใช้ในการทดลอง
1. เครี่องคอมพิวเตอร์ที่มีระบบปฏิบัติการ
Windows
(ตั้งแต่ Windows 7 ขึ้นไป)
พร้อมติดตั้งโปรแกรม Arduino IDE 1.8.8 IoT 1
เครื่อง
2. NodeMCU v.3 1
บอร์ด
3. NodeMCU Base Ver
1.0 1
บอร์ด
4. บอร์ดรีเลย์ชนิด 4 ช่อง 1
บอร์ด
5. สาย USB 1
เส้น
6. สายต่อวงจร (สายจัมพ์
เมีย-เมีย) 6
เส้น
วิธีการทดลอง
ตอนที่
1 การเขียนโปรแกรมเพื่อแสดงผลผ่านพอร์ตอนุกรม
1.
เขียนโค้ดโปรแกรมแสดงข้อความผ่านพอร์ตอนุกรมดังแสดงด้านล่างนี้
จากนั้นจึงอัปโหลดลงสู่บอร์ด NodeMCU โดยเมื่อรันโค้ดโปรแกรมนี้ NodeMCU
จะส่งค่าที่คำนวณได้ ไปแสดงผลยังพอร์ตอนุกรมของคอมพิวเตอร์ทุก ๆ 2
วินาที
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// Basic Serial Communication with NodeMCU ESP8266 // Temperature Conversion float Celsius = 23.32; float Fahrenheit = 0; void setup() { Serial.begin(9600); } void loop() {
Serial.print("Temperature");
Serial.print("\t"); Serial.print(Celsius); Serial.print(" C -> \t"); Serial.print((9/5)*Celsius+32); Serial.println("
F"); delay(2000); } |
2.
เปิด Serial Monitor (ในเมนู Tools) เพื่อสังเกตผลลัพธ์ที่ได้
3.
หากลองคำนวณค่าอุณหภูมิที่แสดงด้วยสมการในบรรทัดที่ 16 ด้วยเครื่องคิดเลข จะพบว่า
ค่าที่ได้ไม่ตรงกับค่าที่แสดงด้วยคอมพิวเตอร์ นั่นคือ
การคำนวณด้วยโปรแกรมมีข้อผิดพลาดหรือบัค (bug) อยู่
ขอให้แก้ไขโดยการเปลี่ยนชนิดตัวเลขที่ใช้คำนวณเป็นเลขทศนิยมโดยการเพิ่มจุดทศนิยมและศูนย์ลงในโค้ดที่คำนวณ
คือ แก้ไขโค้ดบรรทัดที่ 16 เป็น
16 |
Serial.print((9.0/5.0)*Celsius+32); |
จากนั้นจึงอัปโหลดใหม่แล้วสังเกตผลลัพธ์ที่ได้
ตอนที่
2 การเขียนโปรแกรมเพื่อควบคุมรีเลย์ผ่านพอร์ตอนุกรม
ในการทดลองตอนนี้ เป็นการใช้คีย์บอร์ดควบคุมการทำงานของรีเลย์ผ่านการส่งข้อมูลผ่านพอร์ตอนุกรม
โดยการกำหนดให้กดปุ่มบนคีย์บอร์ด เพื่อให้รีเลย์เปิดหรือปิดวงจร
1.
ต่อวงจรดังรูปที่ 5.9
รูปที่
5.9
วงจรควบคุมการทำงานอุปกรณ์ไฟฟ้าผ่านการสื่อสารแบบอนุกรม
2.
เขียนโค้ดโปรแกรมควบคุมการทำงานของรีเลย์ทั้ง 4 ตัว
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
// Control Relays via Serial with
NodeMCU ESP8266 #define ON LOW #define OFF HIGH char buff; int Relay1 = D3; int Relay2 = D4; int Relay3 = D5; int Relay4 = D6; void setup() { Serial.begin(9600); pinMode(Relay1, OUTPUT); pinMode(Relay2, OUTPUT); pinMode(Relay3, OUTPUT); pinMode(Relay4, OUTPUT); } void loop() { buff = Serial.read(); if(buff == '1') {
digitalWrite(Relay1, ON); } if(buff == '5') {
digitalWrite(Relay1, OFF); } if(buff == '2') {
digitalWrite(Relay2, ON); } if(buff == '6') {
digitalWrite(Relay2, OFF); } if(buff == '3') {
digitalWrite(Relay3, ON); } if(buff == '7') {
digitalWrite(Relay3, OFF); } if(buff == '4') {
digitalWrite(Relay4, ON); } if(buff == '8') {
digitalWrite(Relay4, OFF); } } |
3.
ทดสอบการควบคุม โดยการป้อนข้อมูลจากคีย์บอร์ดเข้าทางพอร์ตอนุกรม
แบบฝึกหัดท้ายการทดลอง
จงเขียนโปรแกรมเพิ่มเติมจากโปรแกรมในการทดลองตอนที่
2 โดยกำหนดเงื่อนไขว่า หากเรากดปุ่ม 0
บนคีย์บอร์ดแล้วรีเลย์ทุกตัวจะ OFF และหากเรากดปุ่ม 9
แล้วรีเลย์ทุกตัวจะ ON