12
กกกกกกกกกกกกก กกกกกกกกกกกกก กกกกก กกกกก MCU MCU กกกกกกกกก กกกกกกกกก USB USB ปปปปปปปปปปปปปปปปปปป ปปปปปปปปปปปปปปปปปปป ปปปปปปปปปปปปปปปปปปป ปปปปปปปปปปปปปปปปปปป (01204223) (01204223) ปป.ปป.ปปปปป ปปปปปปปปปปปปปปปปปปปป ปปปปปปปปปปปปปปปปป ปปปปปปปปปปปปปปปป

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

Embed Size (px)

DESCRIPTION

การสื่อสารกับบอร์ด MCU ผ่านพอร์ต USB. ปฏิบัติการเกี่ยวกับวิศวกรรมคอมพิวเตอร์ (01204223). ผศ.ดร.ชัยพร ใจแก้ว ภาควิชาวิศวกรรมคอมพิวเตอร์ คณะวิศวกรรมศาสตร์ มหาวิทยาลัยเกษตรศาสตร์. สถาปัตยกรรม USB. อุปกรณ์ด้านหนึ่งทำหน้าที่เป็นโฮสท์ (Host) อีกด้านหนึ่งทำหน้าที่เป็นดีไวซ์ (Device) - PowerPoint PPT Presentation

Citation preview

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