ผลต่างระหว่างรุ่นของ "การสื่อสารผ่านพอร์ทอนุกรม"
Chaiporn (คุย | มีส่วนร่วม) |
Chaiporn (คุย | มีส่วนร่วม) |
||
แถว 32: | แถว 32: | ||
อุปกรณ์สองฝั่งของการเชื่อมต่อจะสามารถสื่อสารกันได้นั้นต้องมีการกำหนดความเร็วในการรับส่งข้อมูลให้สอดคล้องกัน ในงานทั่ว ๆ ไปที่ไม่ต้องการการแลกเปลี่ยนข้อมูลในปริมาณมาก ๆ มักจะมีการกำหนดความเร็วไว้ที่ 9,600 บิตต่อวินาที เฟิร์มแวร์ที่พัฒนาด้วยภาษาซีตรง ๆ ต้องมีการตั้งค่าให้กับรีจีสเตอร์ที่เกี่ยวข้องได้แก่ UBRR0H, UBRR0L และ UCSR0C แล้วจึงค่อยป้อนข้อมูลที่จะส่ง<u>ทีละไบท์</u>ให้กับรีจีสเตอร์ UDR0 รายละเอียดสามารถดูเพิ่มเติมได้จากดาต้าชีตของไมโครคอนโทรลเลอร์เบอร์ ATMega168 และโค้ดตัวอย่างจากอินเทอร์เน็ต | อุปกรณ์สองฝั่งของการเชื่อมต่อจะสามารถสื่อสารกันได้นั้นต้องมีการกำหนดความเร็วในการรับส่งข้อมูลให้สอดคล้องกัน ในงานทั่ว ๆ ไปที่ไม่ต้องการการแลกเปลี่ยนข้อมูลในปริมาณมาก ๆ มักจะมีการกำหนดความเร็วไว้ที่ 9,600 บิตต่อวินาที เฟิร์มแวร์ที่พัฒนาด้วยภาษาซีตรง ๆ ต้องมีการตั้งค่าให้กับรีจีสเตอร์ที่เกี่ยวข้องได้แก่ UBRR0H, UBRR0L และ UCSR0C แล้วจึงค่อยป้อนข้อมูลที่จะส่ง<u>ทีละไบท์</u>ให้กับรีจีสเตอร์ UDR0 รายละเอียดสามารถดูเพิ่มเติมได้จากดาต้าชีตของไมโครคอนโทรลเลอร์เบอร์ ATMega168 และโค้ดตัวอย่างจากอินเทอร์เน็ต | ||
− | กรณีที่พัฒนาเฟิร์มแวร์ด้วย Arduino เราสามารถเรียกใช้คำสั่ง <code>Serial.begin</code> ในการตั้งอัตราการส่งข้อมูล และคำสั่ง <code>Serial.print</code> เพื่อส่งข้อมูลที่ต้องการได้ทันทีโดยไม่ต้องวุ่นวายกับการตั้งค่ารีจีสเตอร์ด้วยตนเอง โค้ดตัวอย่างด้านล่างแสดงการตั้งค่าพอร์ทอนุกรมให้ใช้ความเร็วในการส่งข้อมูลที่ 9,600 บิตต่อวินาที และให้ส่งข้อความ <code>Hello, Serial</code> ออกไปยังพอร์ทอนุกรมทุก ๆ | + | กรณีที่พัฒนาเฟิร์มแวร์ด้วย Arduino เราสามารถเรียกใช้คำสั่ง <code>Serial.begin</code> ในการตั้งอัตราการส่งข้อมูล และคำสั่ง <code>Serial.print</code> เพื่อส่งข้อมูลที่ต้องการได้ทันทีโดยไม่ต้องวุ่นวายกับการตั้งค่ารีจีสเตอร์ด้วยตนเอง โค้ดตัวอย่างด้านล่างแสดงการตั้งค่าพอร์ทอนุกรมให้ใช้ความเร็วในการส่งข้อมูลที่ 9,600 บิตต่อวินาที และให้ส่งข้อความ <code>Hello, Serial</code> ออกไปยังพอร์ทอนุกรมทุก ๆ ครึ่งวินาที |
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
แถว 45: | แถว 45: | ||
{ | { | ||
Serial.println("Hello, Serial"); | Serial.println("Hello, Serial"); | ||
− | delay( | + | delay(500); |
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
แถว 57: | แถว 57: | ||
[[Image:serial-mon-port.jpg|center|262px|thumb|การเปิดโปรแกรม Serial Monitor]] | [[Image:serial-mon-port.jpg|center|262px|thumb|การเปิดโปรแกรม Serial Monitor]] | ||
− | ให้แน่ใจว่าอัตราการส่งข้อมูลถูกตั้งไว้ที่ 9600 baud (หมายถึง 9600 บิตต่อวินาที) หน้าจอ Serial Monitor ควรปรากฏผลลัพธ์เป็นข้อความ <code>Hello, | + | ให้แน่ใจว่าอัตราการส่งข้อมูลถูกตั้งไว้ที่ 9600 baud (หมายถึง 9600 บิตต่อวินาที) หน้าจอ Serial Monitor ควรปรากฏผลลัพธ์เป็นข้อความ <code>Hello, Serial</code> ทุก ๆ ครึ่งวินาที |
[[Image:serial-mon.jpg|center|295px|thumb|ผลลัพธ์จากหน้าจอของ Serial Monitor]] | [[Image:serial-mon.jpg|center|295px|thumb|ผลลัพธ์จากหน้าจอของ Serial Monitor]] |
รุ่นแก้ไขเมื่อ 17:11, 18 ตุลาคม 2557
ไมโครคอนโทรลเลอร์ส่วนใหญ่ (รวมถึงเบอร์ ATMega168 ที่ใช้ในรายวิชา) มีความสามารถในการรับส่งข้อมูลระหว่างอุปกรณ์อื่นและคอมพิวเตอร์ผ่านพอร์ทอนุกรม (serial port) เราจึงสามารถนำคุณสมบัตินี้มาใช้ในการแสดงผลลัพธ์การทำงานของบอร์ดไมโครคอนโทรลเลอร์ที่ให้รายละเอียดมากกว่าการแสดงผลผ่าน LED เพียงอย่างเดียวได้ อีกทั้งสภาพแวดล้อมของ Arduino ยังมีคำสั่งจำพวก Serial.print
ที่นำไปใช้ในการส่งข้อความมาแสดงผลบนหน้าจอคอมพิวเตอร์ได้ทันที การสื่อสารแบบอนุกรมนั้นต้องการใช้สายสัญญาณเพียงเส้นเดียวต่อการส่งสัญญาณหนึ่งทิศทาง ดังนั้นการเชื่อมต่ออุปกรณ์เข้าด้วยกันจึงต้องการสายไฟเพียง 3 เส้น เป็นสายสัญญาณสองเส้นเพื่อรับส่งข้อมูลสองทิศทาง และสายอ้างอิงศักย์ไฟฟ้า (หรือกราวนด์) อีกหนึ่งเส้น ตามภาพ
คอมพิวเตอร์รุ่นใหม่โดยเฉพาะอย่างยิ่งคอมพิวเตอร์แบบโน้ตบุ๊กในปัจจุบันมักไม่มีพอร์ทอนุกรมติดมาให้ จึงต้องอาศัยอุปกรณ์เสริมที่เรียกว่า USB to serial adapter หรือ USB-Serial dongle ที่เพิ่มพอร์ทอนุกรมให้กับคอมพิวเตอร์ ตามมาตรฐานการสื่อสารผ่านพอร์ทอนุกรมนั้นมีการใช้หัวเชื่อมต่อแบบ DE-9 ที่มีลักษณะดังภาพ
ในรายวิชานี้ เราจะใช้อะแดปเตอร์ USB-Serial ชนิดที่รับข้อมูลจากพอร์ท USB แล้วแปลงเป็นสัญญาณแบบ TTL โดยตรง ทำให้นำไปใช้เชื่อมต่อกับบอร์ดไมโครคอนโทรลเลอร์ได้ทันทีโดยไม่ต้องผ่านหัวเชื่อมต่อแบบ DE-9 ดังภาพ
การเชื่อมอะแดปเตอร์เข้ากับบอร์ดไมโครคอนโทรลเลอร์
ตามหลักการแล้วการเชื่อมต่ออุปกรณ์สองชิ้นเข้าด้วยกันผ่านการสื่อสารแบบอนุกรมนั้นทำได้โดยการเชื่อมขา TX (Transmit) เข้ากับขา RX (Receive) ของอุปกรณ์ตรงข้ามให้ครบทั้งสองทิศทางดังรูปด้านบน กรณีที่เราต้องการส่งข้อมูลจากบอร์ดไมโครคอนโทรลเลอร์ไปยังคอมพิวเตอร์เพียงทิศทางเดียวนั้นจะใช้สายเชื่อมเพียงสองเส้น คือ
- ขา Tx จากบอร์ดไมโครคอนโทรลเลอร์ (ขาเดียวกับ PD1) เชื่อมกับขา Rx ของอะแดปเตอร์
- ขา GND จากบอร์ดไมโครคอนโทรลเลอร์ เชือมกับขา GND ของอะแดปเตอร์
สังเกตว่าขา Tx และ Rx ของไมโครคอนโทรลเลอร์เป็นขาเดียวกับ PD1 และ PD0 ตามลำดับ จึงต้องมีการบัดกรีคอนเน็คเตอร์แบบ 5x2 ลงไปที่ตำแหน่งพอร์ท D ก่อนจึงจะใช้งานได้
อย่างไรก็ตาม อะแดปเตอร์รุ่นสีแดงจะมีการใช้ขา Tx เป็นขารับสัญญาณ จึงต้องต่อขา Tx (PD1) จากบอร์ดไมโครคอนโทรลเลอร์เข้ากับขา Tx ของอะแดปเตอร์แทน ดังรูป
จากนั้นเสียบทั้งบอร์ดไมโครคอนโทรลเลอร์และอะแดปเตอร์ USB-Serial เข้ากับพอร์ท USB ของคอมพิวเตอร์ดังภาพ
โค้ดเฟิร์มแวร์สำหรับส่งข้อมูลสู่พอร์ทอนุกรม
อุปกรณ์สองฝั่งของการเชื่อมต่อจะสามารถสื่อสารกันได้นั้นต้องมีการกำหนดความเร็วในการรับส่งข้อมูลให้สอดคล้องกัน ในงานทั่ว ๆ ไปที่ไม่ต้องการการแลกเปลี่ยนข้อมูลในปริมาณมาก ๆ มักจะมีการกำหนดความเร็วไว้ที่ 9,600 บิตต่อวินาที เฟิร์มแวร์ที่พัฒนาด้วยภาษาซีตรง ๆ ต้องมีการตั้งค่าให้กับรีจีสเตอร์ที่เกี่ยวข้องได้แก่ UBRR0H, UBRR0L และ UCSR0C แล้วจึงค่อยป้อนข้อมูลที่จะส่งทีละไบท์ให้กับรีจีสเตอร์ UDR0 รายละเอียดสามารถดูเพิ่มเติมได้จากดาต้าชีตของไมโครคอนโทรลเลอร์เบอร์ ATMega168 และโค้ดตัวอย่างจากอินเทอร์เน็ต
กรณีที่พัฒนาเฟิร์มแวร์ด้วย Arduino เราสามารถเรียกใช้คำสั่ง Serial.begin
ในการตั้งอัตราการส่งข้อมูล และคำสั่ง Serial.print
เพื่อส่งข้อมูลที่ต้องการได้ทันทีโดยไม่ต้องวุ่นวายกับการตั้งค่ารีจีสเตอร์ด้วยตนเอง โค้ดตัวอย่างด้านล่างแสดงการตั้งค่าพอร์ทอนุกรมให้ใช้ความเร็วในการส่งข้อมูลที่ 9,600 บิตต่อวินาที และให้ส่งข้อความ Hello, Serial
ออกไปยังพอร์ทอนุกรมทุก ๆ ครึ่งวินาที
#include <Practicum.h>
void setup()
{
Serial.begin(9600);
}
void loop()
{
Serial.println("Hello, Serial");
delay(500);
}
คอมไพล์และอัพโหลดเฟิร์มแวร์เข้าสู่ไมโครคอนโทรลเลอร์ เชื่อมสายสัญญาณจากบอร์ดไมโครคอนโทรลเลอร์เข้ากับอะแดปเตอร์ USB-Serial และเสียบอะแดปเตอร์เข้ากับพอร์ท USB ของเครื่องคอมพิวเตอร์ จากนั้นเลือกเมนู Tools -> Serial Port และเลือกชื่อพอร์ทที่ปรากฏขึ้นมา (บนลินุกซ์มักปรากฏเป็นชื่อ /dev/ttyUSB0
)
เลือกเมนู Tools -> Serial Monitor ดังแสดง
ให้แน่ใจว่าอัตราการส่งข้อมูลถูกตั้งไว้ที่ 9600 baud (หมายถึง 9600 บิตต่อวินาที) หน้าจอ Serial Monitor ควรปรากฏผลลัพธ์เป็นข้อความ Hello, Serial
ทุก ๆ ครึ่งวินาที