การติดต่อกับบอร์ด MCU ผ่าน USB ด้วย Arduino
- วิกินี้เป็นส่วนหนึ่งของรายวิชา 01204223
ที่ผ่านมานั้นเราใช้พอร์ท USB เป็นเพียงแหล่งจ่ายพลังงานและโปรแกรมเฟิร์มแวร์เท่านั้น วิกินี้อธิบายถึงขั้นตอนและตัวอย่างการพัฒนาเฟิร์มแวร์ภายใต้สภาพแวดล้อมของ Arduino เพื่อให้บอร์ดไมโครคอนโทรลเลอร์จำลองตัวเองเป็นอุปกรณ์ USB ความเร็วต่ำ สำหรับสื่อสารกับแอพลิเคชันที่ทำงานบนเครื่องคอมพิวเตอร์ได้
เนื้อหา
ไลบรารีและเครื่องมือที่จำเป็น
ให้แน่ใจว่าได้ติดตั้งไลบรารีและเครื่องมือที่จำเป็นตามที่ได้อธิบายไว้ในวิกิด้านล่าง ก่อนเริ่มทำตามขั้นตอนในวิกินี้
การใช้งานไลบรารี V-USB
การเขียนโค้ดเพื่อเรียกใช้งานไลบรารี V-USB ภายใต้สภาพแวดล้อมของ Arduino มีขั้นตอนหลัก ๆ ดังนี้
- สร้างไฟล์ usbconfig.h เพื่อบอกไลบรารี V-USB ถึงคุณลักษณะของอุปกรณ์ USB ที่เราต้องการให้บอร์ด MCU จำลองตัวเองขึ้นมา เนื่องจากการตั้งค่าต่าง ๆ ถูกระบุไว้ในรูปมาโครเป็นจำนวนมาก วิธีที่สะดวกและเสี่ยงต่อความผิดพลาดน้อยที่สุดคือคัดลอกเนื้อหามาจากไฟล์ usbconfig-prototype.h ที่อยู่ในไดเรคตอรี usbdrv ที่ได้จากการติดตั้ง V-USB ตามขั้นตอนก่อนหน้านี้ การตั้งค่าหลัก ๆ ที่สำคัญได้แก่
USB_CFG_VENDOR_ID
และUSB_CFG_DEVICE_ID
ใช้กำหนดค่า Vendor ID (VID) และ Product ID (PID) ให้กับอุปกรณ์ USB ตัวเลขคู่นี้จะถูกตีความโดยระบบปฏิบัติการว่าเป็นอุปกรณ์ USB ประเภทใด เช่นเครื่องพิมพ์ เมาส์ คียบอร์ด ฯลฯ เพื่อที่ตัวระบบปฏิบัติการจะได้จัดหาตัวขับเคลื่อนอุปกรณ์ (device driver) มาใช้งานได้อย่างเหมาะสม ในตัวอย่างนี้มีการกำหนดค่า VID และ PID ให้เป็น 0x16c0 และ 0x05dc ตามลำดับ ซึ่งเป็นการไม่ระบุประเภทอุปกรณ์ ดูข้อมูลเพิ่มเติมจากหัวข้อ #เกี่ยวกับหมายเลข VID/PIDUSB_CFG_VENDOR_NAME
ใช้กำหนดชื่อผู้ผลิตอุปกรณ์ที่จะปรากฏให้เห็นผ่านระบบปฏิบัติการ ระบุในรูปรายการอักขระคั่นด้วยคอมม่า พร้อมทั้งระบุความยาวชื่อให้กับมาโครUSB_CFG_VENDOR_NAME_LEN
ในที่นี้เราจะกำหนดชื่อผู้ผลิตเป็น cpe.ku.ac.th เพื่อให้สอดคล้องกับแนวปฏิบัติของไลบรารี V-USBUSB_CFG_DEVICE_NAME
ใช้กำหนดชื่อของอุปกรณ์ที่จะปรากฏให้เห็นผ่านระบบปฏิบัติการ ระบุในรูปรายการอักขระคั่นด้วยคอมม่า พร้อมทั้งระบุความยาวชื่อให้กับมาโครUSB_CFG_DEVICE_NAME_LEN
ในที่นี้ให้กำหนดชื่อในรูป ID xxxxxxxxxx โดยที่ xxxxxxxxxx แทนรหัสนิสิตของตน
- สร้าง Arduino Sketch ขึ้นมาใหม่ แล้วพิมพ์คำสั่งต่อไปนี้ที่ส่วนหัวของไฟล์
extern "C" {
#include "usbdrv.h"
}
- คำสั่งข้างต้นเป็นการเรียกไลบรารี V-USB มาใช้งาน แต่เนื่องจากไลบรารี V-USB ออกแบบไว้ใช้กับภาษา C ในขณะที่โค้ด Arduino เป็นภาษา C++ จึงต้องครอบไว้ด้วยคำสั่ง extern ดังที่เห็น
- นิยามฟังก์ชัน void setup() เพื่อกำหนดหน้าที่ของขาอินพุทเอาท์พุทตามปกติ และเพิ่มโค้ดสำหรับสั่งไลบรารี V-USB ให้เตรียมการเบื้องต้นลงไปด้วยดังนี้
void setup()
{
// ตั้งค่าอินพุท/เอาท์พุทตามปกติ
// :
// สั่งให้ V-USB เตรียมตัวขั้นต้น
usbInit();
usbDeviceDisconnect();
delay(300);
usbDeviceConnect();
}
ตัวอย่างโปรแกรม
ดาวน์โหลดตัวอย่างโปรแกรม usb_generic.tgz แล้วแตกเอาไว้ในไดเรคตอรีที่เก็บ sketch ของ Arduino
เฟิร์มแวร์สำหรับฝั่งดีไวซ์
ซอร์สโค้ดหลัก
แอพลิเคชันฝั่งโฮสท์
เกี่ยวกับหมายเลข VID/PID
ชุดตัวเลข VID/PID ที่กำหนดให้กับอุปกรณ์ USB ไม่ควรตั้งเอาเองตามใจชอบเนื่องจากระบบปฏิบัติการจะอาศัยตัวเลขคู่นี้ในการเลือกซอฟต์แวร์ไดรเวอร์ที่จะมาควบคุมอุปกรณ์ โดยทั่วไปการจะได้มาซึ่งเลข VID/PID เพื่อใช้กับอุปกรณ์ที่เราสร้างขึ้นจำเป็นต้องสมัครเป็นสมาชิกของ USB Implementers Forum (ค่าสมาชิกปีละ 4,000 เหรียญสหรัฐ) หรือซื้อตัวเลข VID มาจากผู้ที่เป็นสมาชิกอีกทีหนึ่ง
อย่างไรก็ตาม Object Development ผู้พัฒนาไลบรารี V-USB ได้เตรียมชุดตัวเลข VID/PID ไว้ให้เราใช้งานโดยไม่เสียค่าใช้จ่าย ค่า 16C0:xxxx ที่เราเลือกนำมาใช้งานก็ได้มาจากตัวเลขในชุดดังกล่าว รายละเอียดเพิ่มเติมเกี่ยวกับการกำหนดค่า VID และ PID ให้กับอุปกรณ์ USB รวมถึงหลักเกณฑ์การปฏิบัติในการผลิตอุปกรณ์ USB สู่สาธารณะ สามารถศึกษาเพิ่มเติมได้จากเนื้อหาในไฟล์ USB-ID-FAQ.txt และไฟล์ USB-IDs-for-free.txt ในไดเรคตอรี usbdrv ที่ได้จากการติดตั้งไลบรารี V-USB รวมถึงเอกสาร How to obtain an USB VID/PID for your project