
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
บทความน่าสนใจอื่น ๆ