Tag Archives: remote zigbee

Zigbee API Frame (Zigbee API Packet)

วันนี้ขอมาบันทึกอะไรนิดๆหน่อยๆแล้วกัน จะถือว่าเป็นประโยชน์ให้กับคนอื่น เพราะว่าเห็นคนทำน้อยเหลือเกิน

ไหนๆก็ทำโปรเจ็กต์เรื่องนี้โดยตรง อยู่แล้ว แบ่งปันให้คนอื่นรู้มั่ง…

ของผมเป็น โมดูล Xbee Series2 จำนวน 3 ตัว และ Xbee-Pro Series2 จำนวน 1 ตัว

เรื่องแรกวันนี้ ของการเซ็ตค่า API

สำหรับโปรเจ็กต์ครึ่งปีแรกนี้ คือในโปรเจ็กต์ จะมี xbee ตอนนี้อยู่ 4 ตัว

1. ทำหน้าที่เป็น Coordinator 1 ตัว ต่ออยู่กับ ARM7 Cortex-M3

2. ทำหน้าที่เป็น Router 3 ตัว

ในส่วนของ Router นั้น สามารถแบ่งออกเป็น 3 แบบดังนี้

1. ไม่ได้ทำอะไรเลย เป็นทางผ่านส่งข้อมูลเฉยๆ 1 ตัว

2. เซ็ตค่า Pin Change Detection จำนวน 1 ตัว หน้าที่ของโหนดนี้คือ ต่ออยู่กับ PIR Sensor เวลามีอะไรผ่านหน้าเลนส์ จะยก logic ให้เป็น High เมื่อ logic เปลี่ยนก็จะทำการส่งข้อมูล API Frame ผ่าน Router ข้อ 1 ไปยัง Coordinator

3. รับค่าค่า Analog Input ทุกๆ 20 วินาที เพื่อส่งเป็น API Frame กลับไปยัง Coordinator

ในส่วนของ Coordinator นั้น ต่อกับ ARM7 ผ่านทาง UART (RS232) เมื่อรับค่าเข้ามาเป็น Packet หลักการของโปรแกรมใน ARM ทำดังนี้

หลักการเช็คข้อมูล Packet ที่ได้รับจาก Zigbee API Frame

1. รับค่า UART แล้วทำการเก็บใน DMA เพื่อหาจำนวน Bytes ทั้งหมด ว่ามีทั้งหมดกี่ bytes

2. ตรวจสอบ byte แรก ต้องเป็น 0x7E

3. byte 2-3 นั้นจะเป็นค่าความยาว Length ของขบวนข้อมูลที่รับมา ซึ่งจะสัมพันธ์กับ Bytes ทั้งหมด ที่อยู่กับด้านบน

4.ทำการตรวจสอบ byte ที่ 4 ว่าเป็น 0×92 รึเปล่า ถ้าใช่ จะเป็น Zigbee IO Data Sample RX Indicator ซึ่งเป็นการแซมปลิ้งค่าจาก Digital Input ทุกขา ของ โมดูล Xbee ซึ่งอาจจะเป็นเลขรหัสอื่น ซึ่งการตีความใน API Frame ก็จะแตกต่างกันไป แต่ในโครงงานนี้ ตีความโดย 0×92

5. ทำการบวกเลขทั้งหมด ตั้งแต่ byte ที่ 4 จนถึง byte ก่อน checksum ทั้งหมด แล้วหักด้วย 0xFF ซึ่งค่าที่ได้ byte low จะอยู่ในส่วนของ checksum (เวลาคำนวณให้ตัด byte high ออกไปได้เลย)

6. ถ้าถูกต้องทั้งหมดใน 5 ข้อที่กล่าวมาข้างต้น แสดงว่า ส่งข้อมูลรูปแบบ API Frame ถูกต้องแล้ว ให้ไปทำอะไรก็ได้หลังจากนี้

ตัวอย่าง ซึ่งเช่นข้อมูลเป็นดังนี้ (รับค่า Pin Change Detection อย่างเดียว ถูกส่งจากโหนด มายัง Coordinator) ถ้าเป็น Analog ด้วย Packet จะยาวกว่านี้ แต่สามารถส่งรวมกันได้เลยนะ

7E 00 12 92 00 13 A2 00 40 3D C7 1D 40 CB 01 01 FF FF 00 00 01 4B

เวลาตีความ จะสามารถตตีความได้ดังนี

0x7E คือ byte start ของข้อมูลขบวนรถไฟที่ถูกส่งมา

0×00 0×12 คือ จำนวน bytes ทั้งหมดตั้งแต่ byte ที่ 4 จนถึง byte ก่อนหน้า checksum ซึ่ง 0×12 แปลงเป็นฐานสิบได้ 18 ซึ่งถูกต้อง ลองนับดู (ตัวอักษรสีฟ้า)

7E 00 12 92 00 13 A2 00 40 3D C7 1D 40 CB 01 01 FF FF 00 00 01 4B

ได้ครบ 18 ตัวจริงๆด้วยอ่ะนะ…

0×92 คือ API Frame นี้ถูกส่งมาโดยข้อมูลที่ตามมาเป็น Zigbee IO Data Sample RX Indicator

0×00 0×13 0xA2 0×00 0×40 0x3D 0xC7 0x1D คือ 0013A200 403DC71D ซึ่งเป็น DH และ DL Address 64bit ของโหนดปลายทางที่ส่งข้อมูลมา (ระบุตัวตนของโหนดที่ส่งข้อมูลมา)

0×40 0xCB คือ 16bit Address อันนี้ไม่ต้องสนใจ เนื่องจากเราเช็คผ่าน 64 bit address ไปแล้ว

0×01 (byte ที่ 15) คือ Packet ACK คือ ปรกติจะมี ACK กะ NACK อ่ะนะ แปลง่ายๆ Acknowledge นั่นเอง

0×01 (byte ที่ 16) คือ Number sample sets โดยปกติแล้วจะเป็นค่านี้ตลอด

0xFF 0xFF คือ Digital Channel Mask ก็คือถ้า สอง byte นี้ มีค่าเป็น FF FF แสดงว่ามีการส่งค่าดิจิตอล Input มา ถ้าเป็น 00 00 ก็แสดงว่าไม่มีการส่งค่าดิจิตอล Input มา

0×00 (byte ที่ 19) Analog Channel Mask คือถ้าเป็น 00 แสดงว่าไม่มีการส่งค่า analog มา ถ้ามีการส่งค่า analog มา มันจะมีค่าเป็น FF

0×00 0×01 (byte ที่ 20 และ 21) อันนี้เป็น RAW Data จริงๆ คือ มันมีทั้งหมด 2byte (รองรับ 16bit) สำหรับดิจิตอล แต่จริงๆ โมดูล xbee มีไม่ถึงนะ ปกติมีแค่ 12bit โดยเรียงขาดังนี้

bit12         bit11         bit10         bit9         bit8         bit7         bit6         bit5         bit4         bit3         bit2         bit1         bit0

DIO12      DIO11      DIO10       N/A        N/A       DIO7      DIO6      DIO5      DIO4      DIO3      DIO2      DIO1       DIO0

เช่นค่าที่ได้มา 00 01 ก็จะเป็น

0             0               0               0              0              0              0               0             0               0               0              0              1

แสดงค่า DIO0 ที่ต่ออยู่กับ PIR Sensor Detect ค่าได้ว่าเป็น 1 นั่นเอง…

ต่อมา…

0x4B คือค่า Check Sum ซึ่งหาได้จาก

Check Sum = 0xFFFF – ( 0×92 + 0×00 + 0×13 + 0xA2 + 0×00 + 0×40 + 0x3D + 0xC7 + 0x1D + 0×40 + 0xCB + 0×01 + 0×01 + 0xFF + 0xFF + 0×00 + 0×00 + 0×01 )

Check Sum = 0xFFFF – 0x5B4

Check Sum = 0xFA4B ซึ่ง byte high เราไม่เอา เอาแต่ byte low ก็จะได้ 4B ดัง Packet สุดท้ายที่มันส่งมา

จบแล้ว ง่ายมั๊ย ศึกษามา 3-4 เดือน = =’ โปรเจ็กต์ยังไม่ไปไหน ฮ่าๆ

วันนี้ขอแค่นี้ก่อนละกัน รู้สึกเมื่อยๆ ^^

เมื่อคืนได้เข้าไปที่บล๊อก http://www.10logic.com/ มา พอดีสนในเรื่อง gsm module เลยไปขอวงจรจากพี่เค้ามาครับ

ไม่ถึงวัน พี่เค้าส่งให้เลย ต้องขอขอบคุณพี่ B.Uthen มากๆเลยนะครับ ที่อนุเคราะห์ให้

ซาบซึ่งๆ ^^

Zigbee API Mode with AT Mode Project

ในที่สุดดด…

โปรเจ็กต์ครึ่งเทอมแรก ก็น่าจะเริ่มต้นไปได้ด้วยดี

หลังจากที่ ใช้เวลางมกับ Zigbee API Packet มาเป้นเวลา 3 อาทิตย์เต็มๆ

อันนี้คือภาพรวมของระบบที่ออกแบบไว้ เอา Xbee มาทำงานเป็นลักษณะระบบควบคุมอะไรซักอย่าง ซึ่งเป็นลักษณะ Prototype แน่นอนว่า จากในรูปปลายภาคจะต้องมี GUI ซึ่งจะต้องพึ่ง C# อีกแน่นอน = =’

แต่เทอมแรกนี้ ก็เป็นการส่งข้อมูลจาก Zigbee จาก Router ทั้งหลาย ส่งกลับมาที่ Coordinator อ่ะนะ แล้วทำ Packet ที่ได้ เนื่องจากใช้พวกพอร์ต GPIO และ ADC ของ Xbee อ่ะ ก็เลยใช้เวลานานมาก ในการอ่านข้อความ Packet ศึกษาเรื่องนี้ประมาณ 1 อาทิตย์เต็มๆอ่ะนะ

ก็ถ้า Coordinator ได้ข้อมูล Packet ขนาด 22-30 bytes ที่ตัว Zigbee Router แต่ละโหนดส่งมาให้ ก็เขียน ARM7 ให้แปรความหมายต่างๆใน Packet เหล่านั้น ซึ่งจะต้องผ่านขบวนการแปลงเช็คต่างๆ เช่นเช็ค Length หรือพวก Checksum ว่าข้อมูลที่ได้รับมานั้นถูกรึเปล่า แค่ส่วนนี้ก็เสียเวลาไปประมาณ 2-3 วันได้อีกอ่ะนะ

ในที่สุดก็ทำได้ซะที คือ การทดลองจะเป็นลักษณะ Coordinator เชื่อมต่อ Xbee Router 3 ตัว ซึ่งคุยกันแบบ API Command ทั้งหมดอ่ะนะ เวลาได้รับ Package ออกมาแล้วก็ให้มันมาโชว์ที่ ARM7 อ่ะ ซึ่ง xbee ตัวแรกต่อกับ PIR Sensor ของ Inex ต่อกับขา DIO0 ซึ่งถูกตั้งค่าเอาไว้ว่า เมื่อมีการเปลี่ยนแปลง Logic ให้ส่งข้อมูล Packet กลับมาที่ Coordinator ทันที ส่วนอีกอันนึงจะเป็นการต่อกับ R ปรับค่าได้ เปลี่ยนแปลง Analog 0-1.2V ซึ่งจะได้ค่า Analog ตั้งแต่ 0×0000 จนถึง 0x03FF อ่ะนะ ทั้งหมดก็ 10 bit ทำการส่งข้อมูลกลับมาที่ Coordinator ทุกๆ 30 วินาที

รูปข้างบนนี้เป็นส่วนของที่ทำในเทอมนี้อ่ะนะ

สิ่งที่ได้ความรู้เพิ่มขึ้นเกี่ยวกะ ARM ตอนนี้คือ สามารถใช้ไอตัวลำโพงมันได้หละ คือตอนแรกไม่รู้เว้ยว่ามันใช้อะไรยังไง แต่พอปรึกษาอาจารย์ว่าลำโพงแบบนี้ทำงานยังไง ก็ทำจนออกเลย คือต้องใช้ PWM ส่ง Pulse ออกไปที่ตัว IC drive ลำโพงของบอร์ด ARM อ่ะ ซึ่งความถี่ที่มันใช้ Support ในการส่ง Pulse ออกไปนั้นอ่ะ รองรับตั้งแต่ 100Hz จนถึง 10kHz รู้สึกว่าลำโพงแบบนี้ใช้เปิดเพลงพวก MP3 ไม่ได้อ่ะนะ มันเป็นพวกเปียโซ ธรรมดานี่เองแหละ

มาดูชิ้นงานกันดีกว่า

รูปแรกนี่เป็น Coordinator ตัวนึงที่ต่ออยู่กับ ARM7 แสดงผลผ่านจอ LCD ซึ่งก็จะมีข้อมูลส่งมาจาก Xbee โหนดต่างๆอ่ะนะ เห็นได้จากไฟแวบๆ

อุปกรณ์ที่ทำออกมาทั้งหมด สำหรับเทอมนี้

ก็ใช้ Xbee ทั้งหมด 4 ตัวอะนะ มีเยอะกว่านี้ได้จนแน่ๆ 55+

จริงๆมันมีฝาปิดด้านบนอีกนะ รู้สึกว่าอาจารย์บอกว่าปิดได้เลยไม่เป็นไร การลดทอนของมันไม่ค่อยมีผลกับพวกพลาสติดเท่าไหร่ เพราะว่ามันเป็นไดอิเล็กตริกอะนะ สนามไฟฟ้าผ่านได้สบายๆ

อะไรจะเยอะแยะ ขนาดเน้

ถ้าถามว่า ทำออกมายากที่อะไร

บอกได้เลยว่า ยากที่ Zigbee API เนี่ยแหละ แต่พอได้ทำจริงๆแล้วสนุกดีอ่ะนะ

คือข้อมูลที่ได้มามันจะยาวเป็นขบวนรถไฟจริงๆ มีหลายๆส่วน ทั้งเชค ทั้งบอกหน้าที่ ทั้งบอก address ทั้งหมดข้อมูล อะไรแบบนี้ ซึ่งจะเป็นหน้าที่ของ ARM7 ที่จะรับค่าข้อมูลเหล่านี้มาตีความ ปลอกเปลือก ให้เหลือเฉพาะ Raw Data จริงๆ เพื่อที่จะนำไปตีความและแสดงผลอีกทีนึง

ปัญหาต่อไปที่เจอแน่ๆก็คือ เทอมสอง ต้องมีการโต้ตอบระหว่าง GUI กับ ARM กับ Xbee แต่ละโหนด ซึ่งตอนนี้จาก PC ส่งไปคุยกับ Xbee ได้แล้วในรูปแบบ API Packet Frame แต่ว่า ยังคิดไม่ออกว่า จะให้มันเป็นทางผ่าน ส่งไปที่ ARM7 ก่อนยังไง ต้องมีปัญหาในเรื่อง function ของ ARM อ่ะนะ function uart ของมันส่งเป็นพวก char กับ string แต่ที่เราจะส่งเนี่ย เป็นข้อมูล 8 บิตล้วนๆเลย ซึ่งจะส่งในรูปแบบของ เลขฐาน 16 อ่ะ

คงไม่น่ายากมาก อาจจะกังวลไปเอง คงทำได้แหละ ไม่น่ามีปัญหา

คนไทย ไม่ค่อยมีคนทำ API Packet เลย ที่เป็นของ Xbee Series2 หาไม่ได้เลยอ่ะ ต้องไปอ่านจากหลายๆเวบ แต่ก็ไม่ค่อยมีเท่าไหร่ ต้องอ่านเองใน datasheet ของมันเลย เซงมากๆ กว่าจะแกะได้ เหอๆ นั่งงมหลายวันเลย = =’

วันนี้อัพแค่นี้แหละ ไว้ถ้ามีอะไรเพิ่มเติมจะมาอัพเพิ่ม