Xbee API Mode Tutorial And LAB

Basic XBee API

     จากบทความก่อนๆ หน้านี้เป็นบทความที่กล่าวถึง XBee ในด้านต่างๆมากมายทั้งการเลือกใช้ และ วิธีเซตค่า XBee ให้ทำงานในรูปแบบต่างๆ ซึ่งจะใช้ AT Command เป็นหลัก ซึ่ง XBee ยังสามารถทำงานได้ในอีกโหมดหนึ่งนั่นก็คือ API Mode

  API Mode จะมีรูปแบบการใช้งานที่ค่อนค่างจะยุ่งยากมากว่า AT Command แต่สามารถใช้งานได้ยืดหยุ่นกว่า เช่น การใช้งานคำสั่ง Remote และ การควบคุม I/O ก่อนจะเริ่มการทดลอง ใช้  API ผมจะขอ แนะนำให้รู้จักกับ API Mode ที่เราจะใช้กันก่อนครับ

API ใน 1 ชุดคำสั่งจะแบ่งออกเป็น 4 กลุ่มด้วยกันคือ 
1) Start Delimiter เป็นส่วนเริ่มต้นของ API จะใช้ 0X7E เป็นตัวคั่นเพื่อบอกให้รู้ว่านี่คือจุดเริ่มต้นของ API มีขนาด 1 Byte
2) Length คือ จำนวน Byte ของ Frame Data มีขนาด 2 Byte 
3) Frame Data คือ คำสั่ง และ Data ที่ต้องการส่ง หรือ ที่รับมา Frame Data จะมีรายละเอียดแตกต่างกันไป ตาม Frame Type ที่ใช้ซึ่งจะอธิบายในหัวข้อต่อไปอีกที  
4) Checksum เป็นตัวที่เอาไว้ตรวจเช็คความถูกต้องของ Data ที่ได้รับมาว่าถูกต้องหรือไม่ มีขนาด 1 Byte

ตัวอย่างการหา Length และ Checksum
ผมขอยกตัวอย่าง Protocol API ที่ใช้ส่ง Data ขึ้นมาหนึ่ง Protocol ก่อนนะครับ ในส่วนนี้ยังไม่ต้องเข้าใจในส่วนของ Frame Data ก็ได้ครับ เพียงแค่ต้องการให้เข้าใจวิธีหา Length และ Checksum ก่อน

ตัวอย่าง API  => “7E 00 16 10 01 00 13 A2 00 40 3D 8A 28 FF FE 00 00 54 78 44 61 74 61 30 41 56”

สามารถแยกออกตามกลุ่ม 4 กลุ่มได้ดังนี้


Length = จำนวน Byte ที่อยู่ในกลุ่มของ Frame Data ซึ่งจากตัวอย่างสามารถนับได้ 22 Byte (เมื่อแปลง 22 เป็น Hex  จะได้เท่ากับ 0x16  เนื่องจาก Length มีขนาด 2 Byte ที่  เหลือจึงเป็น 00)
Checksum = 0xFF – (ค่าของแต่ละ Byte ในFrame Data บวกกัน) ยกตัวอย่างเช่น
0x6A9 =10+01+ 00+ 13+ A2+ 00+ 40+ 3D+ 8A+28 +FF+ FE+ 00+ 00+ 54+ 78+ 44+ 61+ 74+ 61+ 30+ 41  
นำ 0xFF – 0x06A9 = FFFFFA56 
Checksum =  0x56

วิธี Set Firmware XBee (Series 1) ให้เป็น API

วิธี Set Firmware XBee (Series 2) ให้เป็น API

(Xbee ที่ใช้ทดสอบเป็น รุ่น Series 2จาก บทความก่อนหน้านี้ได้พูดถึงการสร้างเครือข่ายแบบต่างๆไปแล้ว และ โครงข่ายหนึ่งโครงข่ายจะต้องประกอบไปด้วย XBee อย่างน้อยสองตัวคือ Coordinator (1ตัว) และ Router หรือ End Device (ได้มากกว่า 1 ตัว) เพราะฉะนั้นเราจึงต้อง Write Firmware กำหนดหน้าที่ให้กับ XBee แต่ละตัวตามหน้าที่ของมัน ดังนี้

Write Firmware Coordinator API

Write Firmware Router/End Device API

เมื่อ Write Firmware เสร็จเรียบร้อยแล้ว ผมก็จะขอเริ่มต้นการใช้งานแบบ API กันเลย

การทดลองที่ 1 Send Data


การทดลองนี้จะเป็นการทดลอง รับส่ง Data ง่ายๆระหว่าง XBee 2 ตัวโดยให้ Coordinator ส่ง Data ไปยัง Router โดยใช้ Program XBee API Demo ที่เขียนขึ้นมาเพื่อช่วยในการคำนวณหา Length และ Checksum (Xbee ที่ใช้ทดสอบเป็น รุ่น Series 2)

Download โปรแกรม >> XBee API Demo (ZIP) โปรแกรมยังไม่สมบูรณ์ครับ กรุณารอตัวสมบูรณ์เร็ว ๆ นี้)

โปรแกรมนี้ดูแนวคิดมาจากเว็บไซด์ http://www.rogercom.com/ZigBee/ZigBeePag04.htm แล้วนำมาดัดแปลงเขียนเป็น C# ครับ (เว็บต้นฉบับเป็นภาษาโปรตุเกส ต้องใช้ google translate แปลอีกทีครับ)

(เนื่องจาก XBee Series 1 มี Protocol ที่แตกต่างกับ Series 2 อยู่เยอะครับ ทำให้ไม่สามารถใช้งาน กับโปรแกรมของผมได้ทั้งหมดนะครับ จะใช้งานได้แค่ Remote I/O และ ในส่วนของ Local command เท่านั้นนะครับ ในส่วนของ ADC กับรับส่ง Data ไม่สามารถใช้งานได้ครับ)

Coordinator  SH = 0013A200 , SL  = 403DC71E , MY = 0000
Router  SH = 0013A200 , SL  = 403DC728 , MY = 32A9

1) เปิดโปรแกรม XCTU เลือกComport ที่เชื่อมอยู่กับ XBee ตัวที่เป็น Router 
2) ตั้ง  Baud rate และค่าอื่น ๆ ดังรูป  
3) เลือกหัวข้อ Terminal

เมื่อเปิดโปรแกรม  XBee API Demo ขึ้นมาแล้วให้ทำการ Set ค่าต่างดังนี้

1) เลือกCom port ที่เชื่อมต่อ อยู่กับXBee ที่เป็น ตัว Coordinator และเลือกค่า Baud rate ให้ตรงกับค่าที่ตั้งไว้ใน X-CTU (ปรกติอยู่ที่ 9600)
2) กำหนดค่า Destination ที่เราต้องการจะส่งค่าออก ในที่นี้เป้าหมายที่เราจะส่งค่าไปคือ Router ซึ่งมี 
Serial Number High (SH) =   0013A200   Serial Number Low (SL) = 403DC728 และ MY = 32A9
(ค่าต่างๆเหล่านี้สามารถ Read Firmware ขึ้นมาดูได้จาก X-CTU) จากนั้น Click Button SET ค่าต่างๆจะถูกเก็บและนำไปแสดงที่ ตำแหน่ง ต่างๆใน Protocol
3) ใส่ Data ที่เราต้องการส่งลงใน Textbox จะเห็นว่า โปรแกรมจะทำการคำนวณหา Length และ Checksum 
4) Click ที่ Button SEND 
5) ที่ TextBox Send จะปรากฏ Data จริงที่ส่งออก ไปยังตัว XBee ที่เป็นRouter และเมื่อไปดูที่ โปรแกรม X – CTU จะปรากฏ Data ที่ได้รับมาจาก XBee ตัว Coordinator และเมื่อเรา Click ที่ Button Show HEX โปรแกรมจะแสดง Hex โปรแกรมจะแสดง Hex data ที่ได้รับมาดังรูป

ต่อไปเรามาดูความหมายของ Data ที่ Coordinator ส่งออกไป และ ความหมายของ Data ที่ Router ได้รับมากันนะครับ

Data ที่ Coordinator ส่งออกไปคือ

7E 00 1A 10 00 00 13 A2 00 40 3D C7 28 32 A9 00 00 54 68 61 69 45 61 73 79 45 6C 65 63 62

ถ้าหากเราแยก Data ออกเป็นกลุ่ม 4 กลุ่ม ดังที่กล่าวไปในข้างต้นของบทความแล้วจะสามารถแบ่งออกได้ดังนี้

7E  =  Start Delimiter 

00 1A  = Length

10 00 00 13 A2 00 40 3D C7 28 32 A9 00 00 54 68 61 69 45 61 73 79 45 6C 65 63 = Frame Data ของ ZigBee Transmit Request เราจะแยกพิจารณา ซึ่งประกอบไปด้วย

10  =   Frame Type  เป็น Byte ที่บอกว่า เป็น  ZigBee Transmit Request

00  =   Frame ID  เป็นตัวกำหนดว่า การส่ง Data ครั้งนี้ต้องการการตอบกลับจากตัวรับเพื่อยืนยันว่าการส่งสำเร็จหรือไม่ โดย 00 คือ ไม่ต้องการการตอบกลับ และ 01 คือต้องการการตอบกลับ

00 13 A2 00 40 3D C7 28   = 64 bit Destination Address ก็คือค่า SH SL ของตัวรับ

32 A9 = 16-bit Destination Network Address ก็คือ MY ของตัวรับ

00   =   Broadcast Radius   ค่า จำนวน Hop สูงสุดซึ่ง 00 คือ set เป็นค่าสูงสุด

00   =   Options   ตั้งค่า option ที่ใช้ในการส่งเช่น ถ้าหากตั้งเป็น
             0x00 – ไม่ใช้ Option 
             0x01 – Disable ACK   
             0x20 – Enable APS encryption (if EE=1)
             0x40 – Use the extended transmission timeout for this destination

54 68 61 69 45 61 73 79 45 6C 65 = Data ที่ส่งออกไปในที่นี้ถ้าหากเราเปิดตาราง Ascii Code ดูจะพบว่าก็คือคำว่า ThaiEasyElec ที่เราพิมพ์เข้าไปนั่นเอง

63 = ค่า Checksum 

Data ที่ Router ได้รับ

7E 00 18 90 00 13 A2 00 40 3D C7 1E 00 00 01 54 68 61 69 45 61 73 79 45 6C 65 63 C6

ถ้าหากเราแยก Data ออกเป็นกลุ่ม 4 กลุ่ม ดังที่กล่าวไปในข้างต้นของบทความแล้วจะสามารถแบ่งออกได้ดังนี้ฅ

7E = Start Delimiter

0018 = Length 

90 00 13 A2 00 40 3D C7 1E 00 00 01 54 68 61 69 45 61 73 79 45 6C 65 63  =  Frame Data ของ Zigbee Receive Packet ซึ่งประกอบไปด้วย

90 =  Frame Type  เป็น Byte ที่บอกว่า เป็น  Zigbee Receive Packet

00 13 A2 00 40 3D C7 1E  =  64-bit Source Address ก็คือ SH SL ของตัวส่ง

00 00 = 16-bit Destination Network Address  ก็คือ MY ของตัวส่ง

01   =  Receive Options                
            0x01 – Packet Acknowledged 
            0x02 – Packet was a broadcast packet
            0x20 – Packet encrypted with APS encryption 
            0x40 – Packet was sent from an end device (if known)

54 68 61 69 45 61 73 79 45 6C 65 63  =  Data คำว่า ThaiEasyElec ที่เราส่งมา

C6 = ค่า Checksum

ทดลอง ส่งคำว่า ThaiEasyElec โดย กำหนดFrame ID เป็น 0x01

จะพบว่ามีการตอบ ACK มาจากตัวรับเพื่อยืนยันการส่งData

7E 00 70 8B 01 32 A9 00 00 00 98

แยก Data ออกเป็นกลุ่ม 4 กลุ่ม 

7E    =  Start Delimiter

0070     =    Length 

8B 10 32 A9 00 00 00  =  Frame Data ของ ZigBee Transmit Status ประกอบด้วย

8B  =  Frame Type ของ ZigBee Transmit Status

01           = Frame ID

32 A9     =  16-bit Network Address MY ของตัวรับ

00         =  Transmit Retry Count  จำนวนครั้งที่เกิดการ Retry

00    =  Delivery Status สถานะของการส่ง     
               0x00 = Success 
               0x01 = MAC ACK Failure 
               0x02 = CCA Failure
               0x15 = Invalid destination endpoint 
               0x21 = Network ACK Failure 
               0x22 = Not Joined to Network
               Etc…

98   =   ค่า Checksum

การทดลองที่ 2 Remote I/O

การทดลองนี้เป็นการทดลองใช้คำสั่ง Remote เพื่อ เปลี่ยนแปลงค่าแก้ไข Parameter ต่างๆ ของ XBee ตัวอื่นเช่น เปลี่ยนค่า Baud rate ,DH,DL , IO port  ฯลฯ แต่ในการทดลองนี้ผมจะขอยกตัวอย่างการ Remote IO Port เพื่อเป็นแนวทางในการใช้งาน XBee เพื่อไปสั่งงาน ON/OFF อุปกรณ์ต่างๆโดยไม่ต้องใช้ Microcontroller อีกตัวเข้ามาช่วยจัดการ (Xbee ที่ใช้ทดสอบเป็น รุ่น Series 2)

Download โปรแกรม >> XBee API Demo (ZIP) โปรแกรมยังไม่สมบูรณ์ครับ กรุณารอตัวสมบูรณ์เร็ว ๆ นี้)

โปรแกรมนี้ดูแนวคิดมาจากเว็บไซด์ http://www.rogercom.com/ZigBee/ZigBeePag04.htm แล้วนำมาดัดแปลงเขียนเป็น C# ครับ (เว็บต้นฉบับเป็นภาษาโปรตุเกส ต้องใช้ google translate แปลอีกทีครับ)

(เนื่องจาก XBee Series 1 มี Protocol ที่แตกต่างกับ Series 2 อยู่เยอะครับ ทำให้ไม่สามารถใช้งาน กับโปรแกรมของผมได้ทั้งหมดนะครับ จะใช้งานได้แค่ Remote I/O และ ในส่วนของ Local command เท่านั้นนะครับ ในส่วนของ ADC กับรับส่ง Data ไม่สามารถใช้งานได้ครับ)

วงจรที่ใช้ทดลอง

การทดลองนี้จะเป็นการทดลองให้ Coordinator ซึ่งต่ออยู่กับ Computer ส่งค่าไป Remote สถานะ ของ D2 และ D3 ของตัว Router เพื่อควบคุมการ ON/OFF  LED ทั้ง 2 ตัว

เมื่อต่อวงจรทั้งหมดเรียบร้อยแล้วให้เปิด โปรแกรม XBee API Demo ขึ้นมาแล้วเลือก Port ที่เชื่อมต่ออยู่กับ XBee ตัวที่เป็น Coordinator จากนั้น Click OPEN Com port กำหนด Destination และ MY ไปยัง ตัวRouter (ตัวที่ต้องการจะเข้าไป Remote ค่า) แล้ว Click SET สังเกตที่ Group Remote API ในส่วนของ Destination และ MY จะถูกกำหนดค่าตามที่เราได้ Set ค่าไว้ จากนั้นเลือก AT Command ที่เราต้องการ Remote ในตัวอย่างนี้เราจะยกตัวอย่างเป็นการ ON/OFF LED ซึ่งต่ออยู่ที่ Pin D2 และ D3 จากนั้นใส่ parameter เพื่อควบคุม I/O ซึ่ง Pin D2 และ D3 สามารถกำหนด Parameter ได้ 6 รูปแบบคือ 

0x00  = Disabled     
0x01  = NA               
0x02  = ADC             
0x03  = DI  
0x04  = DO Low
0x05  = DO High

เพราะฉะนั้นจากวงจร ถ้าหากเราต้องการให้หลอด LED ติดเราจะต้องเลือกใช้ 0x05 คือ output High  และ หากต้องการให้ LED ดับต้องใช้ 0x04 output Low จากนั้น Click Send และสังเกตผล

ที่ Textbox Send จะปรากฏ Data ที่ถูกส่งออกไปยัง Router ดังนี้

7E 00 10 17 01 00 13 A2 00 40 3D C7 28 32 A9 02 44 33 05 6D

แบ่งออกเป็นกลุ่ม 4 กลุ่ม ได้ดังนี้

7E  = Start Delimiter

0010 = Length

17 01 00 13 A2 00 40 3D C7 28 32 A9 02 44 33 05  =  Frame Data ของ Remote AT Command Request ประกอบด้วย

17  =  Frame Type  ของ Remote AT Command Request

01    = Frame ID

00 13 A2 00 40 3D C7 28   = 64-bit Destination Address

32 A9  =  16-bit Destination Network Address

02  =  Remote Command Options      
             0x01 – Disable ACK
             0x02 – Apply changes on remote
             0x40 – Use the extended transmission timeout for this destination.

44 33  =   AT Command  ในที่นี้คือ D3

05      =   Command Parameter

6D         =Checksum

จาก คำสั่งที่เราสั่ง Remote นั้นจะเห็นว่าเรากำหนด Frame ID =  1 เอาไว้ทำให้ มีการตอบกลับมาจาก Router ซึ่งถ้าหากเรากำหนดเป็น 0 ก็ไม่มีการตอบกลับ

Textbox  Receive จะปรากฏ Data ที่ตอบกลับมาดังนี้

7E 00 F0 97 10 00 13 A2 00 40 3D C7 28 32 A9 44 33 00 F4

7E  = Start Delimiter

00 F0 = Length 

97 10 00 13 A2 00 40 3D C7 28 32 A9 44 33 00 =  Frame Data ของ Remote AT Command Request ประกอบด้วย

97  =   Frame Type   Remote Command Response

01    =  Frame ID  This is the same value passed in to the request

00 13 A2 00 40 3D C7 28  =  64-bit Source (remote) Address

32 A9 = 16-bit Source (remote) Address

44 33 = AT Commands 

00   =  Command Status      
             0 = OK
             1 = ERROR 
             2 = Invalid Command 
             3 = Invalid Parameter
             4 = Remote Command Transmission Failed

F4    =Checksum

การทดลองที่ 3 ทดลองรับค่า input จากสวิตช์

จากรูปวงจรที่ใช้ใน การทดลองที่ 2 จะเห็นวามีการต่อ สวิตช์ เข้ากับ ขา D4 อยู่ การทดลองนี้จะเป็นการทดลองตรวจจับ input ที่ขา D4 โดยเมื่อมีการเปลี่ยนแปลงสถานะที่ ขา D4 จะให้ส่งค่าไปไปยัง Coordinator เพื่อแสดงผล เปิดโปรแกรม XBee API Demo  เลือก Comport ที่ต่ออยู่กับ Coordinator กำหนด DH,DL,MY ไปยังตัวที่ต้องการ Remoteและทำตามขั้นตอนด้านล่าง (Xbee ที่ใช้ทดสอบเป็น รุ่น Series 2)

Download โปรแกรม >> XBee API Demo (ZIP) โปรแกรมยังไม่สมบูรณ์ครับ กรุณารอตัวสมบูรณ์เร็ว ๆ นี้)

โปรแกรมนี้ดูแนวคิดมาจากเว็บไซด์ http://www.rogercom.com/ZigBee/ZigBeePag04.htm แล้วนำมาดัดแปลงเขียนเป็น C# ครับ (เว็บต้นฉบับเป็นภาษาโปรตุเกส ต้องใช้ google translate แปลอีกทีครับ)

(เนื่องจาก XBee Series 1 มี Protocol ที่แตกต่างกับ Series 2 อยู่เยอะครับ ทำให้ไม่สามารถใช้งาน กับโปรแกรมของผมได้ทั้งหมดนะครับ จะใช้งานได้แค่ Remote I/O และ ในส่วนของ Local command เท่านั้นนะครับ ในส่วนของ ADC กับรับส่ง Data ไม่สามารถใช้งานได้ครับ)

ขั้นตอนที่ 1 กำหนดให้ Pin D4 ของ Router เป็น DI

Data ที่ส่งออกไป => 7E 00 10 17 01 00 13 A2 00 40 3D C7 28 32 A9 02 44 34 03 6E

Data ที่ตอบกลับมา => 7E 00 F0 97 10 00 13 A2 00 40 3D C7 28 32 A9 44 34 00 F3

ขั้นตอนที่ 2 กำหนดให้ XBee ตัว Router ส่ง Data กลับมายัง Coordinator
วิธีการที่จะทำให้ Router ส่งค่ากลับมามีอยู่ 2 วิธีคือ 
1) กำหนด IR (IO Sampling Rate) คือกำหนด ให้อ่านค่า จาก Port I/O ทั้งหมดแล้ว ส่งค่าออกมาตามเวลาที่ได้ตั้งค่าไว้มีหน่วยเป็น millisecond

2) ใช้ IC (Digital IO Change Detection) กำหนดให้มีการ Detect Port ที่เราต้องการเอาไว้เมื่อ Logic ที่ Port นั้นมีการเปลี่ยนแปลงให้ให้ส่ง Data ออกมา

ในการทดลองนี้ เราจะตรวจจับการเปลี่ยนแปลง Logic ของ DIO4
เพราะฉะนั้น IC  =  0 X 10

(คลิ๊กที่รูปเพื่อขยาย)

Data ที่ได้รับจาก Router

7E 00 12 92 00 13 A2 00 40 3D C7 28 32 A9 01 01 00 10 00 00 10 4F

7E    =    Start Delimiter

00 12     =    Length 

92 00 13 A2 00 40 3D C7 28 32 A9 01 01 00 10 00 00 10  =  Frame Data ของ ZigBee IO Data Sample Rx Indicator

92   =   Frame Type     ZigBee IO Data Sample Rx Indicator

00 13 A2 00 40 3D C7 28 =  64-bit Source Address

32 A9  =  16-bit Source Network Address

01 = Receive Options       
                    0x01 – Packet Acknowledged 
                    0x02 – Packet was a broadcast packet

01 =  Number of Samples
00 10 = Digital Channel Mask 
00 =  Analog Channel Mask
0010 = Digital Samples   

**ถ้าหากมีการกำหนดให้ มีการอ่านค่า ADC  จะมี Data ที่เพิ่มขึ้นมาอีก2 Byte ซึ่งเป็นส่วนของค่า ADC ที่อ่านได้

4F  = Checksum

การทดลองที่ 4 การอ่านค่า ADC

จากวงจรในการทดลองที่ 2 จะเห็นว่า XBee ได้ต่ออยู่กับ IC LM35 ซึ่งเป็น IC ที่ใช้สำหรับวัด อุณหภูมิ   LM35 ให้ Output เป็นสัญญาณ Analog ที่ อุณหภูมิ  1 C  = 10 mV  จากวงจร LM35 ได้ต่อ อยู่กับ XBee  ที่ขา  D1 (Xbee ที่ใช้ทดสอบเป็น รุ่น Series 2)

Download โปรแกรม >> XBee API Demo (ZIP) โปรแกรมยังไม่สมบูรณ์ครับ กรุณารอตัวสมบูรณ์เร็ว ๆ นี้)

โปรแกรมนี้ดูแนวคิดมาจากเว็บไซด์ http://www.rogercom.com/ZigBee/ZigBeePag04.htm แล้วนำมาดัดแปลงเขียนเป็น C# ครับ (เว็บต้นฉบับเป็นภาษาโปรตุเกส ต้องใช้ google translate แปลอีกทีครับ)

(เนื่องจาก XBee Series 1 มี Protocol ที่แตกต่างกับ Series 2 อยู่เยอะครับ ทำให้ไม่สามารถใช้งาน กับโปรแกรมของผมได้ทั้งหมดนะครับ จะใช้งานได้แค่ Remote I/O และ ในส่วนของ Local command เท่านั้นนะครับ ในส่วนของ ADC กับรับส่ง Data ไม่สามารถใช้งานได้ครับ)
** ข้อควรระวัง ที่ขา ADC ของ XBee สามารถรับแดงดันได้สูงสุดเพียง 1.2V เท่านั้น

ทดลองอ่านค่า ADC  

ขั้นตอนที่ 1 ใช้ Coordinator Remote เข้าไปตั้งค่า Pin DIO1ของ Router ให้เป็น ADC

ขั้นตอนที่ 2 Remote เข้าไป Set   IR (IO Sampling Rate) ให้ส่งค่าที่อ่านได้ ออกมาทุก 1 วินาที

เมื่อ Remote เข้าไปกำหนดค่า IR เรียบร้อยแล้วจะเห็นว่า Router จะส่ง Data กลับมายัง Coordinator ทุกๆ 1 วินาที และจะเห็นว่าสามารถอ่านค่า Temp ออกมาได้แล้ว 
Data  ที่ได้รับมาจาก Router ก็จะเป็น  ZigBee IO Data Sample Rx Indicator เช่นเดียวกับ ในการทดลองที่ 3 แต่จะเพิ่ม Data ในส่วนที่เป็น ADC ตามท้ายมาดังที่ได้กล่าวไปแล้วในการทดลองที่ 3

บทความน่าสนใจอื่น ๆ