บทความ ESPino32 ตอนที่ 7 การสื่อสารอนุกรมแบบ UART

สารบัญ บทความ ESPino32

บทความ ESPino32 ตอนที่ 7 การสื่อสารอนุกรมแบบ UART

            บทความ ESPino32 ตอนที่ 7 การสื่อสารอนุกรมแบบ UART เป็นการใช้งานบอร์ดไมโครคอนโทรเลอร์เพื่อรับส่งข้อมูลระหว่างบอร์ดไมโครคอนโทรเลอร์กับอุปกรณ์ภายนอกอื่นๆที่เกี่ยวข้อง โดยอาศัยรูปแบบการรับส่งข้อมูลแบบอนุกรม UART ในแบบอะซิงโครนัส ซึ่งปัจจุบันมีไมโครคอนโทรเลอร์และอุปกรณ์อีกหลายชนิดที่ใช้การสื่อสารอนุกรมแบบ UART ดังรูป การสื่อสารระหว่างบอร์ด ESPino32 กับอุปกรณ์ที่ใช้การสื่อสารแบบ UART ตัวอย่างเช่น การสื่อสารระหว่างบอร์ด ESPino32 กับคอมพิวเตอร์ การสื่อสารระหว่างบอร์ด ESPino32 กับบอร์ดไมโครคอนโทรเลอร์ตัวอื่นๆ การสื่อสารระหว่างบอร์ด ESPino32 กับเซ็นเซอร์ต่างๆที่มีรูปแบบการสื่อสารอนุกรมแบบ UART การสื่อสารระหว่างบอร์ด ESPino32 กับโมดูลการสื่อสารที่มีรูปแบบการสื่อสารอนุกรมแบบ UART เป็นต้น

การสื่อสารระหว่างบอร์ด ESPino32 กับอุปกรณ์ที่ใช้การสื่อสารแบบ UART

พื้นฐานการรับส่งข้อมูล

        การรับส่งข้อมูลในระบบคอมพิวเตอร์หมายถึง การรับส่งข้อมูลเป็นจำนวนไบต์ ระหว่างอุปกรณ์คอมพิวเตอร์หรือไมโครคอนโทรเลอร์กับอุปกรณ์อื่นๆที่เกี่ยวข้อง ซึ่งแบ่งเป็นประเภทใหญ่ๆได้ 2 ประเภท คือ

1. การสื่อสารแบบขนาน (Parallel Communication) สามารถทำได้โดยการส่งข้อมูลจากตัวส่ง (Transmitter) ไปยังตัวรับ (Receiver) ครั้งละ 1 ไบต์ ซึ่งจำเป็นต้องใช้สายสัญญาณ 1 เส้น ในการส่งข้อมูล 1 บิต ดังนั้นการส่งข้อมูลจำนวน 1 ไบต์ จำเป็นต้องใช้สายสัญญาณอย่างน้อย 9 เส้น ดังรูป การสื่อสารแบบขนาน คือต้องใช้สายสัญญาณ 8 สาย สำหรับการส่งข้อมูล และ 1 สาย สำหรับกราวน์ ในการส่งข้อมูล ข้อดีของการสื่อสารแบบขนานคือมีความเร็วในการส่งข้อมูลสูง ข้อเสียคือใช้สายสัญญาณในการส่งข้อมูลจำนวนมาก

การสื่อสารแบบขนาน

2. การสื่อสารแบบอนุกรม (Serial Communication) สามารถทำได้โดยการส่งข้อมูลจากตัวส่ง (Transmitter) ไปยังตัวรับ (Receiver) ครั้งละ 1 ไบต์ ดังนั้นการส่งข้อมูลจำนวน 1 ไบต์ จำเป็นต้องใช้สายสัญญาณอย่างน้อย 2 เส้น ในการส่งข้อมูล คือต้องใช้สายสัญญาณ 1 สาย สำหรับการส่งข้อมูล และ 1 สาย สำหรับกราวน์ สามารถแบ่งการสื่อสารแบบอนุกรมออกเป็น 2 ประเภท ได้แก่

– แบบซิงโครนัส (Synchronous) เป็นรูปแบบหนึ่งของวิธีการส่งข้อมูล โดยใช้สัญญาณ Clock มาเป็นตัวกำหนดจังหวะในการรับส่งข้อมูล การส่งข้อมูลแบบนี้ เป็นการรับส่งที่ค่อนข้างมีเสถียรภาพ และส่งได้ที่ความเร็วสูง มีโอกาสที่ข้อมูลจะสูญหายระหว่างการส่งน้อย ตัวอย่างการส่งข้อมูลลักษณะนี้เช่น I2C, I2S, SPI

รูปแบบการรับส่งข้อมูลแบบซิงโครนัส

– แบบอะซิงโครนัส (Asynchronous) เป็นการส่งข้อมูลที่ไม่ต้องใช้สัญญาณ Clock มาเป็นตัวกำหนดจังหวะการรับส่งข้อมูล แต่ใช้วิธีกำหนดรูปแบบการรับส่งข้อมูลขึ้นมาแทน และ อาศัยการกำหนดอัตราเร็วของการรับ และส่งที่เท่ากันทั้งฝั่งรับและฝั่งส่ง ข้อดีของการใช้ Asynchronous คือสามารถสื่อสารแบบ Full Duplex รับ และ ส่งได้ในเวลาเดียวกัน แต่การสื่อสารแบบ Asynchronous มีโอกาสที่ข้อมูลจะสูญหายขณะรับหรือส่งข้อมูลมากกว่าแบบ Synchronous

รูปแบบการรับส่งข้อมูลแบบอะซิงโครนัส

UART

        UART ย่อมาจากคำว่า Universal Asynchronous Receiver Transmitter หมายถึงอุปกรณ์ทางคอมพิวเตอร์ที่ทำหน้าที่สื่อสารข้อมูลอนุกรมแบบอะซิงโครนัส โดยผู้ใช้สามารถกำหนดรูปแบบที่ใช้ในการรับส่งข้อมูล กำหนดอัตราเร็วในการรับส่งข้อมูลในหน่วยบิตต่อวินาทีหรือบอดเรท (Baud rate) ให้แก่อุปกรณ์ที่จะติดต่อสื่อสารกันให้มีค่าตรงกันจึงจะสามารถสื่อสารกันได้ สายสัญญาณที่ใช้จะใช้สาย 2 เส้น คือ Tx ในการส่งข้อมูล และ Rx ในการรับข้อมูล ระดับของสัญญาณดิจิทัลที่ใช้ในการรับ-ส่งข้อมูลของ UART มีอยู่ 2 แบบ คือ

– TTL (Transistor-Transistor Logic) เป็นระดับแรงดันที่ถูกกำหนดขึ้นในยุคแรกๆเพื่อใช้ในการสื่อสารระหว่าง Transistor กับ Transistor ภายในวงจรรวม ระดับแรงดันของสัญญาณ TTL จะมีค่าอยู่ที่ 0 – 5 V แต่ในปัจจุบันมีอุปกรณ์หลายชนิดที่ทำงานในช่วง 0 – 3.3 V หรือเรียกอีกอย่างว่า LVTTL (Low Voltage TTL) ตัวอย่างบอร์ดที่ใช้แรงดันสัญญาณระดับนี้ เช่น บอร์ดต่างๆที่ใช้โมดูล ESP32, บอร์ดต่างๆที่ใช้โมดูล ESP8266, Arduino DUE, Raspberry Pi เป็นต้น

– RS232 (Recommended Standard 232) คือ มาตรฐานการเชื่อมต่อข้อมูลแบบอนุกรมใช้เพื่อเพิ่มระยะทางในการส่งข้อมูลแบบอนุกรมให้สามารถส่งได้ระยะทางที่มากขึ้น โดยมีการเปลี่ยนระดับแรงดัน ของ Logic จากเดิมที่จะอยู่ในช่วง 0-5 V หรือ 0-3.3 V เป็นช่วง -15 ถึง 15 V โดยมีรายละเอียดดังนี้

– Logic 0 ของ RS232 จะอยู่ในช่วง 3 ถึง 15V

– Logic 1 ของ RS232 จะอยู่ในช่วง -3 ถึง -15V

TTL เทียบกับ RS232

บอร์ด ESPino32 จะมีพอร์ทสำหรับใช้งานการสื่อสารแบบอนุกรม UART อยู่ทั้งหมด 3 ช่อง ได้แก่

– UART0 พอร์ทนี้จะอยู่ที่ขา GPIO01 สำหรับขา Tx และขา GPIO03 สำหรับขา Rx ทั้งสองขาสัญญาณจะเชื่อมต่ออยู่กับชิป CP210x ซึ่งทำหน้าที่แปลงข้อมูลจากฝั่ง USB ที่ต่อกับคอมพิวเตอร์เป็นสัญญาณ UART ในฝั่งของบอร์ด ESPino32 ใช้ในการ Upload Program ลงบนบอร์ดหรือส่งข้อมูลระหว่างตัวบอร์ดกับคอมพิวเตอร์

– UART1 พอร์ทอนุกรมนี้จะอยู่ที่ขา GPIO10 สำหรับขา Tx และขา GPIO09 สำหรับขา Rx แต่เนื่องจากขา GPIO ของโมดูล ESP32 ถูกต่ออยู่กับ SPI Flash ทำให้พอร์ทนี้ไม่สามารถใช้งานได้ แต่สามารถกำหนดให้ขา GPIO อื่นๆมาใช้งานฟังก์ชันนี้แทนได้

– UART2 พอร์ทอนุกรมนี้จะอยู่ที่ขา GPIO17 สำหรับขา Tx และขา GPIO18 สำหรับขา Rx

พอร์ทอนุกรมทั้งหมดบนบอร์ดสามารถใช้งานเพื่อสื่อสารข้อมูลกับอุปกรณ์อื่นๆที่มีรูปแบบการใช้งานเป็นอนุกรม UART ในระดับสัญญาณของ LVTTL ได้ สามารถดูตำแหน่งของพอร์ทการสื่อสารแบบอนุกรมเพิ่มเติมได้จากแถบ UART สีม่วง ในรูป ESPino32 Pinout

ESPino32 Pinout

Frame ของข้อมูล

        สำหรับข้อมูลต่างๆที่บอร์ด ESPino32 หรือบอร์ดไมโครคอนโทรเลอร์ชนิดอื่นๆในขณะที่ทำการสื่อสารแบบอนุกรมกับอุปกรณ์อื่นๆนั้นข้อมูลจะถูกแบ่งเป็นส่วนๆ เรียกว่า Frame ของข้อมูล ส่วนใหญ่ในหนึ่ง Frame ของข้อมูลจะมีบรรจุด้วยข้อมูลขนาด 1 ไบต์ และภายใน Frame ของข้อมูลนั้นจะประกอบไปด้วย Synchronization bit, Data bit และ Parity bit ดังรูป Frame ของข้อมูล

Frame ของข้อมูล

– Synchronization bit คือ บิตเริ่มต้น (Start bit)  และ บิตสิ้นสุด (Stop bit) ของข้อมูล
– Data bit คือ ชุดของข้อมูล สามารถกำหนดได้ตั้งแต่ 5-9 บิตโดยมาตรฐานมีค่าเท่ากับ 8 บิต
– Parity bit คือ บิตที่ใช้ในการตรวจสอบข้อมูลว่าข้อมูลที่ได้รับมีความผิดพลาดหรือไม่

บอร์ด ESPino32 สามารถกำหนดอัตราเร็ว Baud rate และโปรโตคอลที่ใช้ในการสื่อสารได้ดังนี้

– อัตราเร็ว Baud rate ที่รองรับ:  300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200,256000, 512000, 962100

– โปรโตคอลที่รองรับ:                 SERIAL_5N1     5-bit No parity 1 stop bit
                                          SERIAL_6N1     6-bit No parity 1 stop bit
                                          SERIAL_7N1     7-bit No parity 1 stop bit
                                          SERIAL_8N1      8-bit No parity 1 stop bit  (default)
                                          SERIAL_5N2     5-bit No parity 2 stop bits
                                          SERIAL_6N2     6-bit No parity 2 stop bits
                                          SERIAL_7N2     7-bit No parity 2 stop bits
                                          SERIAL_8N2     8-bit No parity 2 stop bits
                                          SERIAL_5E1      5-bit Even parity 1 stop bit
                                          SERIAL_6E1      6-bit Even parity 1 stop bit
                                          SERIAL_7E1      7-bit Even parity 1 stop bit
                                          SERIAL_8E1      8-bit Even parity 1 stop bit
                                          SERIAL_5E2      5-bit Even parity 2 stop bit
                                          SERIAL_6E2      6-bit Even parity 2 stop bit
                                          SERIAL_7E2      7-bit Even parity 2 stop bit 
                                          SERIAL_8E2      8-bit Even parity 2 stop bit 
                                          SERIAL_5O1     5-bit Odd  parity 1 stop bit 
                                          SERIAL_6O1     6-bit Odd  parity 1 stop bit  
                                          SERIAL_7O1     7-bit Odd  parity 1 stop bit 
                                          SERIAL_8O1     8-bit Odd  parity 1 stop bit  
                                          SERIAL_5O2     5-bit Odd  parity 2 stop bit  
                                          SERIAL_6O2     6-bit Odd  parity 2 stop bit   
                                          SERIAL_7O2     7-bit Odd  parity 2 stop bit   
                                          SERIAL_8O2     8-bit Odd  parity 2 stop bit

ตัวอย่างการส่งข้อมูลด้วย 115200 8N1

        ตัวอย่างการสื่อสารแบบอนุกรม ตัวอย่างนี้เป็นโปรโตคอลที่ค่อนข้างจะใช้บ่อยในโมดูล ESP32 โดย115200 8N1 คือ อัตราเร็วการถ่ายโอนข้อมูล 115200 บิตต่อวินาที ในเฟรมมีบิตข้อมูลจำนวน 8 บิต ไม่กำหนดบิตตรวจสอบข้อมูล และ บิตสิ้นสุดคือ 1 มีตัวอย่างดังนี้

        ยกตัวอย่างการใช้งาน เช่น ให้โมดูล ESP32 ส่งข้อมูล ASCII ที่เป็นตัวอักษร ‘H’ และ ‘I’ ออกไป โดยตัวอักษร ‘H’ นั้นมีค่า 48 ในเลขฐานสิบหกหรือมีค่าเท่ากับ 01001000 ในเลขฐานสอง และตัวอักษร ‘I’ มีค่า 49 ในเลขฐานสิบหกหรือมีค่า 01001001 ในเลขฐานสอง ส่วนที่เหลือจะเป็นซิงโครไนเซชันบิตที่เริ่มก่อนแพ็กเกจและปิดท้ายแพ็กเกจในแต่ละเฟรม ตัวอย่างนี้จะเป็นการเรียงลำดับแบบบิตที่มีนัยสำคัญต่ำสุดหรือ LSB ดังรูป การส่งข้อมูลด้วยโปรโตคอลแบบ 8N1

การส่งข้อมูลด้วยโปรโตคอลแบบ 8N1

อัตราเร็วในการเร็วในการถ่ายโอนข้อมูลในตัวอย่างนี้อยู่ที่ 115200 บิตต่อวินาที ดังนั้นในการส่งข้อมูล 1 บิตจะใช้เวลาเท่ากับ 1/(115200 bps) หรือใช้เวลา 8.68 µs ต่อวินาที

สำหรับการส่งข้อมูลทุกๆไบต์ ตัวอย่างเช่นส่งตัวอักษร ASCII 1 ตัว (ASCII 1 ตัวอักษร มีหน่วยขนาด 8 บิต) เมื่อรวมซิงโครไนเซชันบิตจะมีการส่งข้อมูล 10 บิตในการส่งข้อมูล 1 ไบต์ประกอบไปด้วยบิตเริ่มต้น บิตข้อมูล 8 บิต และบิตสิ้นสุด ดังนั้นที่อัตราเร็วในการถ่ายโอนข้อมูล 115200 บิตต่อวินาที จะสามารถส่งข้อมูลได้จำนวน 115200 บิตหรือ 11520 (115200/10) ไบต์ต่อวินาที

ฟังก์ชันการใช้งานการสือสารอนุกรม UART Port ต่างๆ

– serial.begin(baud);              ฟังก์ชันสำหรับตั้งค่าความเร็ว Baud rate ที่ใช้ในการสื่อสารข้อมูล

– serial.available();                ฟังก์ชันสำหรับตรวจเช็ค serial ว่ามีข้อมูลอยู่ในบัฟเฟอร์หรือไม่

– serial.read();                     ฟังก์ชันสำหรับอ่านข้อมูลจากบัฟเฟอร์ Serial

– serial.flush();                      ฟังก์ชันสำหรับล้างข้อมูลในบัฟเฟอร์ Serial

– serial.print();                     ฟังก์ชันสำหรับส่งข้อมูล ASCII ออกทาง Serial Port

– serial.println();                   ฟังก์ชันสำหรับส่งข้อมูล ASCII ออกทาง Serial Port และขึ้นบรรทัดใหม่

– serial.write(uint8_t);           ฟังก์ชันสำหรับส่งข้อมูล Binary เป็น Byte ออกทาง Serial Port

ตัวอย่างการสื่อสารระหว่างบอร์ด ESPino32 กับคอมพิวเตอร์ผ่านทาง UART0

เนื่องจากพอร์ทอนุกรม UART0 ของบอร์ด ESPino32 ต่ออยู่กับชิป USB to Serial เพื่อสื่อสารระหว่างตัวบอร์ด ESPino32 กับคอมพิวเตอร์ ตัวอย่างนี้จึงเป็นตัวอย่างที่ทดสอบส่งข้อมูลจากคอมพิวเตอร์ไปยังบอร์ด ESPino32 และส่งข้อมูลกลับจากบอร์ด ESPino32 กลับไปยังคอมพิวเตอร์ ดังรูป การสื่อสารระหว่างบอร์ด ESPino32 และคอมพิวเตอร์

การสื่อสารระหว่างบอร์ด ESPino32 และคอมพิวเตอร์

ตัวอย่างโปรแกรมที่ใช้

บรรทัดที่ 1         สร้างฟังก์ชัน setup()
บรรทัดที่ 2         เปิดฟังก์ชัน setup()
บรรทัดที่ 3         ใช้งานฟังก์ชัน Serial โดยตั้งค่าอัตราเร็ว Baud rate อยู่ที่ 115200 บิตต่อวินาที
บรรทัดที่ 4         ปิดฟังก์ชัน setup()
บรรทัดที่ 5         สร้างฟังก์ชัน loop()
บรรทัดที่ 6         เปิดฟังก์ชัน loop()
บรรทัดที่ 7         ตรวจสอบบัฟเฟอร์ Serial ว่ามีข้อมูลอยู่หรือไม่ และเปิดฟังก์ชันถ้ามีข้อมูลอยู่ในบัฟเฟอร์ Serial
บรรทัดที่ 8         ประกาศตัวแปร c ชนิด character และ อ่านข้อมูลในบัฟเฟอร์ Serial ครั้งละ 1 ไบต์แล้วเก็บข้อมูลใส่ในตัวแปร c
บรรทัดที่ 9         แสดงค่าในตัวแปร c ออกมาทาง Serial Monitor
บรรทัดที่ 10        ปิดฟังก์ชันตรวจสอบถ้ามีข้อมูลอยู่ในบัฟเฟอร์ Serial
บรรทัดที่ 11        ปิดฟังก์ชัน loop()

หลังจากอัพโหลดโปรแกรม ลงบนบอร์ด ESPino32 เปิด Serial Monitor เพื่อทดสอบการทำงานของโปรแกรมโดยในแถบตัวเลือก จะมีรายละเอียดดังนี้

– No line ending         ขณะส่งข้อมูลจะมีเพียงข้อมูลที่ถูกส่งออกไป
– Newline                   ขณะส่งข้อมูลจะมีข้อมูลและเพิ่มการขึ้นบรรทัดใหม่
– Carriage Return       ขณะส่งข้อมูลจะมีข้อมูลและเพิ่ม Carriage Return
– Both NL & CR          ขณะส่งข้อมูลจะมีข้อมูล เพิ่มด้วยการขึ้นบรรทัดใหม่และเพิ่ม Carriage Return

ตัวอย่างโปรแกรมนี้ในแถบตัวเลือก ให้เลือก No line ending ดังรูป เลือก No line ending เพื่อให้มีแต่ข้อมูลที่พิมพ์ถูกส่งจากทาง Serial monitor ไปยังบอร์ด ESPino32 โดยไม่มีการขึ้นบรรทัดใหม่ หรือ Carriage Return ดังรูป ทดสอบรันโปรแกรมโดยพิมพ์ “HELLO WORLD”

เลือก No line ending
ทดสอบรันโปรแกรมโดยพิมพ์ HELLO WORLD

ผลการทดลอง

        เมื่อบอร์ด ESPino32 เริ่มทำงาน โปรแกรมจะวนรอบตรวจสอบข้อมูลในบัฟเฟอร์ Serial ว่ามีข้อมูลอยู่หรือไม่ หากยังไม่ได้ส่งข้อมูลผ่านทาง Serial Monitor ตัวโปรแกรมวนรอบตรวจสอบข้อมูลในบัฟเฟอร์ Serial ต่อไป เมื่อทดสอบส่งคำว่า “HELLO WORLD” ผ่านทาง Serial Monitor ไปยังบอร์ด ESPino32 โปรแกรมจะทำการอ่านค่าจากบัฟเฟอร์ Serial ไปไว้ในตัวแปร c แล้วแสดงค่าในตัวแปร c ไปแสดงผลบน Serial Monitor ในฝั่งของคอมพิวเตอร์ จากนั้นก็วนรอบการทำงานในฟังชัน loop() ต่อไป

ตัวอย่างการสั่งงาน GPIO บนบอร์ด ESPino32 จากคอมพิวเตอร์ผ่านทาง UART0

        จากตัวอย่างการสื่อสารระหว่างบอร์ด ESPino32 กับคอมพิวเตอร์ผ่านทาง UART0 จะเห็นได้ว่าบอร์ด ESPino32 สามารถสื่อสารกับคอมพิวเตอร์ทั้งรับข้อมูล-ส่งข้อมูลไปยังตัวบอร์ด ในตัวอย่างนี้จะต่อยอดจากการรับ-ส่งข้อมูลเป็นการส่งข้อมูลไปยังบอร์ด ESPino32 เพื่อควบคุมขา GPIO16 ที่ต่ออยู่กับ LED_BUILTIN บนบอร์ด ESPino32 ดังรูป ควบคุม GPIO บนบอร์ด ESPino32 จากคอมพิวเตอร์

ควบคุม GPIO บนบอร์ด ESPino32 จากคอมพิวเตอร์

ตัวอย่างโปรแกรมที่ใช้

บรรทัดที่ 1         ประกาศตัวแปร text ชนิด string
บรรทัดที่ 2         สร้างฟังก์ชัน setup()
บรรทัดที่ 3         เปิดฟังก์ชัน setup()
บรรทัดที่ 4         กำหนดให้ LED_BUILTIN ที่อยู่ขา GPIO16 เป็น OUTPUT
บรรทัดที่ 5         ใช้งานฟังก์ชัน Serial โดยตั้งค่าอัตราเร็ว Baud rate อยู่ที่ 115200 บิตต่อวินาที
บรรทัดที่ 6         ปิดฟังก์ชัน setup()
บรรทัดที่ 7         สร้างฟังก์ชัน loop()
บรรทัดที่ 8         เปิดฟังก์ชัน loop()
บรรทัดที่ 9         ตรวจสอบบัฟเฟอร์ Serial ว่ามีข้อมูลอยู่หรือไม่ และเปิดฟังก์ชันถ้ามีข้อมูลอยู่ในบัฟเฟอร์ Serial
บรรทัดที่ 10        อ่านข้อมูลในบัฟเฟอร์ Serial จนกระทั่งพบ ‘\n’ หรือ new line มาเก็บไว้ในตัวแปร text
บรรทัดที่ 11        ตรวจสอบตัวแปร text ว่ามีค่าเท่ากับ “LEDON” หรือไม่ และเปิดฟังก์ชันถ้าตัวแปร text ว่ามีค่าเท่ากับ “LEDON”
บรรทัดที่ 12        ให้ LED_BUILTIN มีสถานะเป็น LOW ทำให้ LED ติด
บรรทัดที่ 13        แสดงคำว่า “LED ON” และขึ้นบรรทัดใหม่ออกทาง Serial Monitor
บรรทัดที่ 14        ปิดฟังก์ชันถ้าตัวแปร text ว่ามีค่าเท่ากับ “LEDON” และเปิดฟังก์ชันถ้าตัวแปร text ไม่เท่ากับ “LEDON”
บรรทัดที่ 15        ให้ LED_BUILTIN มีสถานะเป็น HIGH ทำให้ LED ดับ
บรรทัดที่ 16        แสดงคำว่า “LED OFF” และขึ้นบรรทัดใหม่ออกทาง Serial Monitor
บรรทัดที่ 17        ปิดฟังก์ชันถ้าตัวแปร text ไม่เท่ากับ “LEDON”
บรรทัดที่ 18        ปิดฟังก์ชันการตรวจสอบบัฟเฟอร์ Serial ว่ามีข้อมูลอยู่หรือไม่
บรรทัดที่ 19        ปิดฟังก์ชัน loop()

หลังจากอัพโหลดโปรแกรม ลงบนบอร์ด ESPino32 เปิด Serial Monitor เพื่อทดสอบการทำงานของโปรแกรม
โดยในแถบตัวเลือกให้เลือก Newline ดังรูป เลือก Newline เพื่อให้ข้อมูลที่พิมพ์ถูกส่งจากทาง Serial monitor ไปยังบอร์ด ESPino32 ประกอบด้วยข้อมูลบวกกับการบรรทัดใหม่ ตัวอย่างเช่น พิมพ์ “LEDON” ข้อมูลที่บอร์ด ESPino32 ได้รับจะเป็น “LEDON+\n” เป็นต้น

เลือก Newline
ทดสอบรันโปรแกรมโดยพิมพ์ LEDON และ LEDOFF

ผลการทดลอง

            เมื่อบอร์ด ESPino32 เริ่มทำงาน โปรแกรมจะวนรอบตรวจสอบข้อมูลในบัฟเฟอร์ Serial ว่ามีข้อมูลอยู่หรือไม่ หากยังไม่ได้ส่งข้อมูลผ่านทาง Serial Monitor ตัวโปรแกรมวนรอบตรวจสอบข้อมูลในบัฟเฟอร์ Serial ต่อไป เมื่อทดสอบส่งคำว่า “LEDON” ผ่านทาง Serial Monitor ข้อมูลคำว่า “LEDON” จะเพิ่ม ‘\n’ ต่อท้ายตามแถบตัวเลือกที่เราเลือกมา ข้อมูลที่ได้จึงกลายเป็น “LEDON\n” แล้วทำการส่งข้อมูลไปยังบอร์ด ESPino32 จากนั้นโปรแกรมในบอร์ด ESPino32 จะทำการอ่านค่าจากบัฟเฟอร์จนถึง ‘\n’ ไปใส่ในตัวแปร text แล้วตรวจสอบว่าค่าในตัวแปร text นั้นมีค่าเท่ากับ “LEDON” หรือไม่ ถ้าใช่โปรแกรมจะสั่งให้ LED ติดและแสดงคำว่า “LED ON” ไปแสดงผลบน Serial Monitor แต่ถ้าไม่ใช่ โปรแกรมจะสั่งให้ LED ดับและแสดงคำว่า “LED OFF” ไปแสดงผลบน Serial Monitor จากนั้นก็วนรอบการทำงานในฟังก์ชัน loop() ต่อไป

ตัวอย่างการสื่อสารระหว่างบอร์ด ESPino32 กับ GPS module

        หลังจากทดลองใช้งานการสื่อสารผ่านช่องทาง UART0 ระหว่างตัวบอร์ดกับคอมพิวเตอร์แล้ว ตัวอย่างนี้จะเพิ่มการต่อใช้งานพอร์ทอนุกรม UART เชื่อมต่อกับอุปกรณ์ภายนอกตัวอื่นๆ ตัวอย่างนี้เลือกใช้ GPS Module ซึ่งเป็นอุปกรณ์ที่มีเอาต์พุตแบบ UART เมื่อต่อใช้งานตัว GPS Module จะส่ง NMEA Data (ข้อมูลตำแหน่งสถานที่ ณ ตำแหน่งนั้น) ออกมาตลอดเวลา เพิ่มเข้ามาทางช่อง UART2 ของตัวบอร์ด ESPino32 และให้ตัวบอร์ดรับข้อมูลจาก GPS Module เพื่อให้ไปแสดงผลที่คอมพิวเตอร์ ดังรูป บอร์ด ESPino32 อ่านค่าจาก GPS ไปแสดงผลบนคอมพิวเตอร์

บอร์ด ESPino32 อ่านค่า NMEA String จาก GPS ไปแสดงผลบนคอมพิวเตอร์

ตัวอย่างโปรแกรมที่ใช้

บรรทัดที่ 1         สร้างฟังก์ชัน setup()
บรรทัดที่ 2         เปิดฟังก์ชัน setup()
บรรทัดที่ 3         ใช้งานฟังก์ชัน Serial โดยตั้งค่าอัตราเร็ว Baud rate ของ Serial อยู่ที่ 115200 บิตต่อวินาที
บรรทัดที่ 4         ใช้งานฟังก์ชัน Serial โดยตั้งค่าอัตราเร็ว Baud rate ของ Serial2 อยู่ที่ 9600 บิตต่อวินาที (ตั้งอัตราเร็ว Baud rate ให้เท่ากับโมดูล GPS ส่วนใหญ่มีอัตราเร็ว Baud rate อยู่ที่ 9600)
บรรทัดที่ 5         ปิดฟังก์ชัน setup()
บรรทัดที่ 6         สร้างฟังก์ชัน loop()
บรรทัดที่ 7         เปิดฟังก์ชัน loop()
บรรทัดที่ 8         ตรวจสอบบัฟเฟอร์ Serial2 ว่ามีข้อมูลอยู่หรือไม่ และเปิดฟังก์ชันถ้ามีข้อมูลอยู่ในบัฟเฟอร์ Serial2
บรรทัดที่ 9         ประกาศตัวแปร c ชนิด character และอ่านข้อมูลในบัฟเฟอร์ Serial2 ครั้งละ 1 ไบต์จากนั้นเก็บข้อมูลใส่ในตัวแปร c
บรรทัดที่ 10        แสดงค่าในตัวแปร c ออกมาทาง Serial Monitor
บรรทัดที่ 11        ปิดฟังก์ชันถ้ามีข้อมูลอยู่ในบัฟเฟอร์ Serial2
บรรทัดที่ 12        ปิดฟังก์ชัน loop()

หลังจากอัพโหลดโปรแกรม ลงบนบอร์ด ESPino32 เปิด Serial Monitor เพื่อดูผลลัพธ์การทำงานของโปรแกรม ดังรูป ข้อมูลค่า NMEA จาก GPS Module

ข้อมูล NMEA จาก GPS Module

ผลการทดลอง

        เมื่อบอร์ด ESPino32 เริ่มทำงาน โปรแกรมจะวนรอบตรวจสอบข้อมูลในบัฟเฟอร์ Serial2 ที่ต่ออยู่กับ GPS Module ว่ามีข้อมูลเข้ามาหรือไม่ หากยังไม่มีข้อมูลเข้ามาทางพอร์ท UART2 ตัวโปรแกรมวนรอบตรวจสอบข้อมูลในบัฟเฟอร์ Serial2 ต่อไป เมื่อมีข้อมูล NMEA Data จาก GPS Module มายังพอร์ท UART2 ของบอร์ด ESPino32 โปรแกรมในบอร์ดจะทำการอ่านค่าจากบัฟเฟอร์ใส่ตัวแปร c ทีละตัวแล้วแสดงค่าที่โปรแกรมสามารถอ่านได้กลับไปแสดงผลบน Serial Monitor ในฝั่งของคอมพิวเตอร์ จากนั้นก็วนรอบการทำงานในฟังชัน loop() ต่อไป

        สำหรับบทความ ESPino32 ในตอนที่ 7 การใช้งานการสื่อสารอนุกรม UART จะเป็นพื้นฐานส่วนหนึ่งสำหรับการสื่อสารระหว่างตัวบอร์ด ESPino32 ที่เป็นบอร์ดไมโครคอนโทรเลอร์กับอุปกรณ์ภายนอกชนิดอื่นๆที่มีเอาต์พุต UART ที่มีระดับสัญญาณแบบ LVTTL หวังว่าผู้อ่านจะมีความรู้ความเข้าใจเกี่ยวกับการสื่อสารอนุกรมแบบ UART มากขึ้นและสามารถประยุกต์การใช้งานตัวบอร์ด ESPino32 เข้ากับเซ็นเซอร์หรือบอร์ดต่างๆที่มีเอาต์พุตแบบเดียวกัน เพื่อสร้างสรรค์นวัตกรรมใหม่ๆขึ้นมาได้

ขอขอบคุณข้อมูลอ้างอิงจาก

– https://learn.sparkfun.com/tutorials/serial-communication/rules-of-serial

สารบัญ บทความ ESPino32