Transcript
Page 1: การสื่อสารกับบอร์ด  MCU ผ่านพอร์ต  USB

การสื่��อสื่ารก�บบอรด การสื่��อสื่ารก�บบอรด MCUMCU

ผ่�านพอรต ผ่�านพอรต USBUSB

ปฏิ�บั�ติ�การเก��ยวก�บัว�ศวกรรมปฏิ�บั�ติ�การเก��ยวก�บัว�ศวกรรมคอมพิ�วเติอร�คอมพิ�วเติอร�

(01204223)(01204223)ผศ.ดร.ชั�ยพิร ใจแก�ว

ภาคว�ชัาว�ศวกรรมคอมพิ�วเติอร�คณะว�ศวกรรมศาสติร� มหาว�ทยาลั�ยเกษติรศาสติร�

Page 2: การสื่อสารกับบอร์ด  MCU ผ่านพอร์ต  USB

2

สื่ถาปั�ตยกรรม สื่ถาปั�ตยกรรม USBUSBอ%ปกรณ�ด�านหน'�งท)าหน�าท��เป*นโฮสท� อ%ปกรณ�ด�านหน'�งท)าหน�าท��เป*นโฮสท� (Host) (Host)

อ�กด�านหน'�งท)าหน�าท��เป*นด�ไวซ์�อ�กด�านหน'�งท)าหน�าท��เป*นด�ไวซ์� (Device)(Device)

ไม/ว/าจะเขี�ยนขี�อม1ลัไปย�งด�ไวซ์� หร2ออ/านขี�อม1ลัไม/ว/าจะเขี�ยนขี�อม1ลัไปย�งด�ไวซ์� หร2ออ/านขี�อม1ลัจากด�ไวซ์� ฝั่4� งโฮสท�ติ�องม�การส/งค)าร�องขีอ จากด�ไวซ์� ฝั่4� งโฮสท�ติ�องม�การส/งค)าร�องขีอ (request) (request) ไปก/อนเสมอไปก/อนเสมอ

USB Host

USBDevice

USB Cable

Request

Response

PC - Notebook -

- Flash drive- Mouse- Game controller- etc.

DeviceDriverApp

Page 3: การสื่อสารกับบอร์ด  MCU ผ่านพอร์ต  USB

3

โครงสื่ร�างของค�าร�องขอโครงสื่ร�างของค�าร�องขอประกอบัด�วยขี�อม1ลั ประกอบัด�วยขี�อม1ลั 5 5 ส/วนส/วน

RequestType (1 ไบัท� ) – ท�ศทางการส/งขี�อม1ลั

Request (1 ไบัท�) – หมายเลัขีค)าร�องขีอValue (2 ไบัท�) – พิาราม�เติอร�ประกอบัค)าร�อง

เพิ��มเติ�มIndex (2 ไบัท�) – พิาราม�เติอร�ประกอบัค)าร�อง

เพิ��มเติ�มLength (2 ไบัท� ) – จ)านวนไบัท�ขีองขี�อม1ลัท��

ติ�องการส/งให�หร2อร�บัจากด�ไวซ์�

Page 4: การสื่อสารกับบอร์ด  MCU ผ่านพอร์ต  USB

4

โค�ดต�วอย�างโค�ดต�วอย�างดาวน�โหลัดได�จากดาวน�โหลัดได�จาก

http://www.cpe.ku.ac.th/~cpj/204223/usb-example.tgz

แติกไฟลั�ไว�ในเคร2�องขีองตินโดยเร�ยกค)าส��งเชัลัลั�แติกไฟลั�ไว�ในเคร2�องขีองตินโดยเร�ยกค)าส��งเชัลัลั�

ในไฟลั�ติ�วอย/างประกอบัด�วยในไฟลั�ติ�วอย/างประกอบัด�วยไลับัราร� V-USBmain.c –ติ�วอย/างเฟ6ร�มแวร�ฝั่4� งด�ไวซ์�practicum.py – ไพิธอนมอด1ลัส)าหร�บัฝั่4� งโฮสท�peri.py – ไฟลั�เร��มติ�นส)าหร�บัท)าแบับัฝั่8กห�ดtest-usb.py – โค�ดส)าหร�บัทดสอบัแบับัฝั่8กห�ดMakefile

$ tar zxf usb-example.tgz

Page 5: การสื่อสารกับบอร์ด  MCU ผ่านพอร์ต  USB

5

เฟิ รมแวรฝั่�� งด#ไวซ์ เฟิ รมแวรฝั่�� งด#ไวซ์ ((บอรด บอรด MCU)MCU)อาศ�ยไลับัราร� อาศ�ยไลับัราร� V-USB V-USB จ)าลัองกลัไก จ)าลัองกลัไก USB USB ด�วยด�วย

ซ์อฟติ�แวร�ซ์อฟติ�แวร�แก�ไขีการติ�9งค/าในไฟลั� แก�ไขีการติ�9งค/าในไฟลั� usbconfig.husbconfig.h

เปลั��ยน USB_CFG_DEVICE_NAME ให�เป*น Practicum Group XX

โดย XX เป*นหมายเลัขีกลั%/ม (อย/าลั2มระบั%ความยาวสติร�งให�ถู1กติ�อง)

โค�ดในเมนลั1ปม�การเร�ยกฟ4งก�ชั�น โค�ดในเมนลั1ปม�การเร�ยกฟ4งก�ชั�น usbPoll() usbPoll() เพิ2�อเพิ2�อติรวจสอบัค)าร�องขีอจากฝั่4� งโฮสท�ติรวจสอบัค)าร�องขีอจากฝั่4� งโฮสท�

เม2�อได�ร�บัค)าร�องขีอ ไลับัราร� เม2�อได�ร�บัค)าร�องขีอ ไลับัราร� V-USB V-USB จะเร�ยกจะเร�ยกฟ4งก�ชั�น ฟ4งก�ชั�น usbFunctionSetup() usbFunctionSetup() โดยอ�ติโนม�ติ�โดยอ�ติโนม�ติ�ติ�องเขี�ยนฟ4งก�ชั�นน�9ขี'9นมาเอง

Page 6: การสื่อสารกับบอร์ด  MCU ผ่านพอร์ต  USB

6

ต�วอย�างฟิ�งกชั�น ต�วอย�างฟิ�งกชั�น usbFunctionSetupusbFunctionSetupusbMsgLen_t usbFunctionSetup(uint8_t data[8]){ usbRequest_t *rq = (void *)data; static uint16_t returnedData;

if (rq->bRequest == 0) { /* Do something */ return 0; } else if (rq->bRequest == 1) { /* Do something */ usbMsgPtr = (uchar*) &returnedData; return sizeof(returnedData); }

return 0;}

ตอบสื่นองค�าร�องขอที่#�ไม�ขอข�อม(ลค�น- ให้�ฟิ�งกชั�นค�นค�า 0

ตอบสื่นองค�าร�องขอที่#�ต�องการข�อม(ลค�น- ให้�ต�วแปัร usbMsgPtr ชั#,ที่#�ต�าแห้น�งของ ข�อม(ลที่#�ต�องการสื่�งให้�โฮสื่ที่- ให้�ฟิ�งกชั�นค�นค�าจำ�านวนไบที่ที่#�ต�องการ สื่�งให้�โฮสื่ที่

ตรวจำสื่อบห้มายเลขค�าร�อง

Page 7: การสื่อสารกับบอร์ด  MCU ผ่านพอร์ต  USB

7

โครงสื่ร�างค�าร�องขอโครงสื่ร�างค�าร�องขอม�ขีนาด ม�ขีนาด 8 8 ไบัท� น�ยามไว�แลั�วในสติร�ค ไบัท� น�ยามไว�แลั�วในสติร�ค usbRequest_tusbRequest_t ( (ในใน

ไฟลั� ไฟลั� usbdrv/usbdrv.husbdrv/usbdrv.h) ) ด�งน�9ด�งน�9

uchar uchar ถู1กน�ยามให�เป*นชัน�ดขี�อม1ลั ถู1กน�ยามให�เป*นชัน�ดขี�อม1ลั unsigned char unsigned char ((ซ์'�งเท�ยบัเท/าก�บั ซ์'�งเท�ยบัเท/าก�บั uint8_tuint8_t) ) ส/วน ส/วน usbWord_tusbWord_t น�ยามเป*นน�ยามเป*นชัน�ดชัน�ด union union ด�งน�9ด�งน�9

typedef struct usbRequest{ uchar bmRequestType; /* 1 ไบัท� */ uchar bRequest; /* 1 ไบัท� */ usbWord_t wValue; /* 2 ไบัท� */ usbWord_t wIndex; /* 2 ไบัท� */ usbWord_t wLength; /* 2 ไบัท� */ }usbRequest_t;

typedef union usbWord{ unsigned word; uchar bytes[2];}usbWord_t;

Page 8: การสื่อสารกับบอร์ด  MCU ผ่านพอร์ต  USB

8

โปัรแกรมฝั่�� งโฮสื่ที่โปัรแกรมฝั่�� งโฮสื่ที่ ((ไพธอนไพธอน))อาศ�ยไลับัราร� อาศ�ยไลับัราร� PyUSBPyUSB

ทดสอบัโดยเร�ยกค)าส��ง import usb ในไพิธอน(Linux) หากไม/พิบัให�ติ�ดติ�9งโดยใชั�ค)าส��ง

(MacOS) หากไม/พิบัให�ดาวน�โหลัด libusb1.0 จาก SourceForge

มอด1ลั มอด1ลั practicum.py practicum.py เติร�ยมคลัาส เติร�ยมคลัาส McuBoard McuBoard ไว�ให�ใชั�งานได�สะดวกขี'9นไว�ให�ใชั�งานได�สะดวกขี'9น

$ sudo apt-get install python-usb

>>> from practicum import McuBoard>>> b = McuBoard()>>> help(b)

Page 9: การสื่อสารกับบอร์ด  MCU ผ่านพอร์ต  USB

9

ต�วอย�างการสื่�งค�าร�องต�วอย�างการสื่�งค�าร�อง>>> from practicum import McuBoard>>> b = McuBoard()

# สื่��งให้� LED สื่#เข#ยว (ห้มายเลข 2) บน Peripheral board ต0ด>>> b.usb_write(0, index=2, value=1)

# อ�านสื่ถานะสื่ว0ตชับน Peripheral board>>> b.usb_read(1, length=1)

Page 10: การสื่อสารกับบอร์ด  MCU ผ่านพอร์ต  USB

10

แบบฝั่2กห้�ดแบบฝั่2กห้�ดแก�ไขีเฟ6ร�มแวร�แก�ไขีเฟ6ร�มแวร� (main.c) (main.c) เพิ2�อเพิ��มค)าร�องขีอหมายเลัขี เพิ2�อเพิ��มค)าร�องขีอหมายเลัขี 22

ส/งค/าแสง 10 บั�ติกลั�บัมาย�งโฮสท� (2 ไบัท�)ค/าใน tuple ท��ส/งค2นค2อ (ไบัท�ติ)�า, ไบัท�ส1ง)

แก�คลัาส แก�คลัาส PeriBoard PeriBoard ในมอด1ลั ในมอด1ลั peri.py peri.py ท��ส2บัเชั29อสายมาท��ส2บัเชั29อสายมาจากคลัาส จากคลัาส McuBoardMcuBoard ใน ใน practicum.py practicum.py โดยให�ม�เมท;โดยให�ม�เมท;อดด�งน�9อดด�งน�9setLed(self, led_no, led_value) – เซ์;ติสถูานะ LED

ติามหมายเลัขี led_no ท��ระบั%ให�เป*นไปติาม led_value (0 = ด�บั , 1 = ติ�ด)

setLedValue(self, value) – น)า 3 บั�ติลั/างขีอง value แสดงผลับัน LED โดยให�ส�แดงเป*นบั�ติขีวาส%ด เขี�ยวเป*นบั�ติซ์�ายส%ด

getSwitch(self) – ค2นค/า True เม2�อสว�ติชั�ถู1กกด False เม2�อปลั/อย

getLight(self) – ค2นค/าแสงในชั/วง 0-1023

Page 11: การสื่อสารกับบอร์ด  MCU ผ่านพอร์ต  USB

11

โปัรแกรมสื่�าห้ร�บที่ดสื่อบ โปัรแกรมสื่�าห้ร�บที่ดสื่อบ (test-usb.py)(test-usb.py)

from peri import PeriBoardfrom time import sleep

b = PeriBoard()count = 0while True: b.setLedValue(count) sw = b.getSwitch() light = b.getLight()

if sw is True: state = "PRESSED" else: state = "RELEASED"

print "LEDs set to %d | Switch state: %-8s | Light value: %d" % ( count, state, light)

sleep(0.25) count = (count + 1) % 8

Page 12: การสื่อสารกับบอร์ด  MCU ผ่านพอร์ต  USB

12

โครงงานปัลายภาคโครงงานปัลายภาคแติ/ลัะกลั%/มพิ�ฒนาโครงงานขีนาดเลั;กแติ/ลัะกลั%/มพิ�ฒนาโครงงานขีนาดเลั;ก

เพิ��มฮาร�ดแวร�จาก peripheral board ท��ม�อย1/ หร2อท)าบัอร�ดใหม/หากติ�องการ

พิ�ฒนาเฟ6ร�มแวร�ส)าหร�บั MCUเชั2�อมติ/อก�บัซ์อฟติ�แวร�บันฝั่4� งพิ�ซ์�ผ/านพิอร�ติ USB

ก)าหนดส/งแลัะน)าเสนอก)าหนดส/งแลัะน)าเสนอ: : แจำ�งให้�ที่ราบภายแจำ�งให้�ที่ราบภายห้ล�งห้ล�ง

ด1ติ�วอย/างโครงงานขีองร% /นพิ��ได�จากเว;บัด1ติ�วอย/างโครงงานขีองร% /นพิ��ได�จากเว;บัhttp://cloud3.cpe.ku.ac.th/practic

um