Proto Knowledge
Module by : Noomnamon
XBee-PRO
ฝูงผึ้งสื่อสารไรสาย 2.4GHz สําหรับระบบสมองกลฝงตัว ตอนที่ 2
มาตอกันดวยตัวอยางการสื่อสารขอมูลไรสายผานโมดูล XBee-PRO ระหวาง ATmega16 ไมโครฯ AVR ตัวเกง กับคอมพิวเตอร เพื่อสรางระบบควบคุมจากคอมพิวเตอรแบบ ไรสายอยางงาย หลังจาก ได้ แนะน�าตัว ให้ รู้จัก หน้า ค่า ตา ไป แล้ว ใน TPE#7 มาถึง บทความ ใน ตอนที่ 2 ซึ่ง จะ ว่า กัน ถึง การ สื่อสาร ข้อมูล ไร้สาย ผ่าน XBee-PRO ระหว่าง คอมพิวเตอร์ กับ ระบบ สมองกล ฝงตัว ซึ่ง ในที่ นี้ เลือก ใช้ ไมโคร คอนโทรลเลอร์ ATmega16 มา เป็น ตัวแทน
เตรียมยุทโธปกรณ ก็ว่ากันเอามันหน่อยครับ จริงๆก็คือการตระเตรียมเครื่องมือ และอุปกรณ์เพื่อท�าการทดลอง และทดสอบกันครับ ประกอบด้วย 1. โมดูล XBee-PRO 2 ตัว
2. บอร์ด เชื่อม ต่อ XBee-PRO กับค อมพิวเตอร์ (จาก TPE #7 ก็ค ือ บอร์ด ZX-XBee)
3. บอร์ด เชื่อม ต่อ XBee-PRO กับ ไมโคร คอนโทรลเลอร์ ในที่นี้ ใช้ บอร์ด ADX-XBee จาก INEX มี วงจร และ หน้าตา ของ บอร์ด แสดง ใน รูป ที่ 1 4. บอร์ด ไมโคร คอนโทรลเลอร์ ATmega16 จะ ใช้ ของ ค่าย ไหน อย่างไร หรือ อยาก ท�า เอง ก็ ดู วงจร ได้ จาก รูป ที่ 2 5. เครื่อง โปรแกรม ไมโคร คอนโทรลเลอร์ AVR แบบ ISP ในที่นี้ ใช้ รุ่น PX-4000 จาก INEX มี หน้าตา ใน รูป ที่ 3
The Prototype Electronics
37
RF Module : XBee PRO
ภาระกิจ ต้องการ เชื่อม ต่อ คอมพิวเตอร์ กับ ไมโคร คอนโทรลเลอร์ ATmega16 ผ่าน โมดูล XBee-PRO โดย คอมพิวเตอร์ สามารถ ควบคุม การ ติด ดับ ของ LED ที่ต่อ กับ ขา พอร์ต ของ ไมโคร คอนโทรลเลอร์ ATmega16 ได้ จาก การ กด แปน คีย์ บอร์ด โดย มี เงื่อนไข คือ ทุกครั้ง ที่ กด คีย์ a ทาง ฝง คอมพิวเตอร์ LED ที่ ฝง ไมโคร คอนโทรลเลอร์ จะ ถูก กลับ สถานะ การ ติด ดับ พร้อมกัน นั้น ทาง ฝง ไมโคร คอนโทรลเลอร์ จะ ส่งข้อความ บอก สถานะ ของ LED กลับ มา แสดงผล ที่ หน้าต่าง โปรแกรม เทอร์ มินอล ใน รูป ที่ 4 แสดง ไดอะแกรม เชื่อม ต่อ ระหว่าง คอมพิวเตอร์ กับ ไมโคร คอนโทรลเลอร์ ATMega16 ผ่าน โมดูล XBee-PRO RSSI ASS. ON
RESET
- RxTx + RxD
OUT R1 22k
ADX-Xbee TxD S
+
+
S
IN IC1 LM1117-3.3 GND
1
K1 TxD
S
Vcc
K2 RxD
+
RST
S1 RESET
SK1 XBee socket
C2 10/16V
RSSI 6 R2 510
ON
2 TxD 3 RxD R6 20k
R5 10k
ASS.
13 15 R3 R4 510 510 LED3 ASS.
LED1 RSSI
+
5
S
C1 0.1/50V
+5V TxD RxD GND
รูปที่ 2 วงจรไมโครคอนโทรลเลอร์ ATmega16 ซึ่งใช้ในการติดต่อ กับโมดูล XBee-PRO เพื่อควบคุมอุปกรณ์เอาต์พุต
K3 XBee-BUS
LED2 ON
รูปที่ 1 หน้าตาและวงจรของ ADX-XBee5V บอร์ดเชื่อมต่อ Xbee กับ ไมโครคอนโทรลเลอร์
การเตรียมการ การเตรียมการฝงคอมพิวเตอรและโมดูล XBee-PRO (1) ติดตั้ง โมดูล XBee-PRO ลง บน บอร์ด ZX-XBee (ก�าหนด เป็น โมดูล XBee-PRO ตัว ที่ 1) แล้ว ต่อ สาย เข้า พอร์ต อนุกรม ของ คอมพิวเตอร์ (หรือ ผ่าน ตัว แปลง USB เป็น พอร์ต อนุกรม ใน กรณีที่ ต้องต่ กับ พอร์ต USB) จ่ายไฟ +9Vdc ให้แ ก่ บอร์ด ZX-XBee (2) เปิด โปรแกรม X-CTU แล้ว ท�าการ ก�าหนด ค่า ดังนี้ MY = 05 DH = 00 DL = AB12 (3) จากนั้น ปิดไฟ เลี้ยง แล้ว ถอด โมดูล XBee-PRO ตัว ที่ 1 ออก เพื่อ น�าไป ต่อ กับ ไมโคร คอนโทรลเลอร์ ATmega16 จากนั้น น�า โมดูล XBeePRO ตัว ที่ 2 มา ติดตั้ง บน บอร์ด ZX-XBee แทน 4) จ่ายไฟแก่บอร์ด ZX-XBee ใช้โปรแกรม X-CTU ก�าหนดค่าของ โมดูล XBee-PRO ตัวที่ 2 ให้มีค่าดังนี้ MY = AB12 DH = 00 DL = 05 จากนั้นปิดไฟเลี้ยง 38
The Prototype Electronics
รู ป ที่ 3 PX-4000 เครื่ อ ง โปรแกรม ไมโคร คอนโทรลเลอร์ AVR แบบ ISP ขนาดเล็กกระทัดรัด เชื่อมต่อกับพอร์ต USB
การเตรียมการฝงไมโครคอนโทรลเลอร (1) สร้ า ง ไ ฟล์ โ ปร เ จ็ ก ต์ ข อง โ ปรแกรม ภ าษา C จาก AVR studio โดย ตั้งชื่อ เป็น xbee_01 และ พิมพ์ โปรแกรม ภาษา C ตาม ตัวอย่าง ไฟล์ xbee_01.c (2) คอมไพล์ และ ดาวน์โหลด โปรแกรม ไป ยัง ไมโคร คอนโทรลเลอร์ ATmega16 โดย ใช้ เครื่อง โปรแกรม ภายนอก ซึ่ง ต้อง ก�าหนด บิต ฟิวส์ ใน การ โปรแกรม ให้ ถูกต้อง ด้วย ดัง แสดง ใน รูป ที่ 5 จากนั้น ปิดไฟ เลี้ยง ปลด เครื่อง โปรแกรม ออก (3) ติดตั้ง โมดูล XBee-PRO ตัว ที่ 1 ที่ ก�าหนด ค่า MY,DH และ DL จาก ขั้น ตอนที่ (2) ใน หัวข้อ การ เตรียมการ ฝง คอมพิวเตอร์ ลง บน บอร์ด ADXXBee5V ต่อ สาย จาก จุด ต่อ RxD และ TxD เข้ากับ พอร์ต PD1 และ PD0 ของ ไมโคร คอนโทรลเลอร์ ATmega16 ตามล�าดับ ส่วน พอร์ต PB0 ต่อ LED และ ตัว ต้านทาน จ�ากัด กระแส
ต่อไป ยัง พอร์ต อนุกรม ของ คอมพิวเตอร์ หรือ ต่อ พอร์ต USB ผ่าน ตัว แปลง USB เป็น พอร์ต อนุกรม
รูปที่ 4 ไดอะแกรมการเชื่อมต่อระหว่างคอมพิวเตอร์กับไมโคร คอนโทรลเลอร์ ATmega16 ผ่านโมดูล XBee-PRO
รูปที่ 7 แสดงข้อความ Status: ON ที่ไมโครคอนโทรลเลอร์ส่งมายัง คอมพิวเตอร์
รูปที่ 6 แสดงข้อความ MCU Ready! ที่ไมโครคอนโทรลเลอร์ส่งมายังฝง คอมพิวเตอร์ +V
RSSI ASS. ON
RESET
- RxTx + RxD
10
+12V 0.1µF
IC2
IC1
ULN2003
ATmega16
PB0
LED RY
220Vac 50Hz
NO C
1
IN1
OUT1
16
1.8k
NC
RY1 RELAY12V
ADX-Xbee TxD
GND
OUTLET 220Vac 600W
S
+
+
S
รูปที่ 5 หน้าต่างกําหนดบิตฟวส์ของ AVRProg ที่ใช้ในการโปรแกรม ATmega16 ด้วยเครื่องโปรแกรม PX-4000
XBee-TxD
PD0
XBee-RxD
PD1
รูปที่ 8 แนวทางในการต่อยอดวงจรสื่อสารข้อมูลอนุกรม ไร้สายผ่าน โมดูล XBee-PRO ทางฝงไมโครคอนโทรลเลอร์เพื่อใช้ควบคุมหลอดไฟ หรือเครื่องใช้ไฟฟาที่ใช้ไฟบ้าน
The Prototype Electronics
39
RF Module : XBee PRO
โปรแกรมที่ 1ไฟล xbee_01.cโปรแกรมภ าษาCส� า หรั บ ไมโคร คอนโทรลเลอร ATmega16 เพื่อสื่อสารขอมูลกับคอมพิวเตอรผาน โมดูลXBee-PRO //---------------------------------------------// // Header file for AVR MCU #include <avr/io.h> #include <avr/interrupt.h>// Header file for use sei()function #include <avr/signal.h> // Header file for use define vector interrupt
#include <avr/delay.h> // For used _delay_ms function #define F_OSC 16000000 // Constant for Crystal frequency in Hz #define UART_BAUD_CALC(x,F_OSC) ((F_OSC)/((x)*16l)-1) // Equation for calculate baudrate //---------------------------------------------------// //------------- Function for initial USART -------------// //------------------------------------------------------// void uart_init(unsigned int baud) { UBRRH = (unsigned int)(UART_BAUD_CALC(baud,F_OSC)>>8); // Keep baudrate high byte
UBRRL = (unsigned int)UART_BAUD_CALC(baud,F_OSC); // Keep baudrate low byte
// Enable receiver and transmitter, enable RX interrupt
UCSRB |= (1 << RXEN) | (1 << TXEN) | (1 << RXCIE);
// Asynchronous 8N1
UCSRC |= (1 << URSEL) | (1 << UCSZ1)| (1 << UCSZ0); // enable interrupts sei();
} //-------------------------------------------------------// //----------- Function for send 1 character -------------// //-------------------------------------------------------// void uart_putc(unsigned char c) { // Wait for transmit Ready while(!(UCSRA & (1 << UDRE))); UDR = c; // send character } //-------------------------------------------------------// //-------------- Function for send string ---------------// //-------------------------------------------------------// void uart_puts(char *s) { // Loop for send string while (*s) { // Send character uart_putc(*s); s++; // Point to next character } } //-------------------------------------------------------// //-------------- Function for send string ---------------// //-------------------------------------------------------// SIGNAL(SIG_UART_RECV) { char key=0; // For Keep character key = UDR; // Keep character if(key=='a' || key=='A') { // Toggle LED PORTB ^= 0x01; if(PORTB & 0x01) // Get status LED { uart_puts("Status: ON \r\n");// Send message LED ON } else { uart_puts("Status: OFF \r\n");// Send message LED OFF } } } //------------------------------------------------------// //-------------- Function for send string --------------// //------------------------------------------------------// void main() { // PB0 as output for LED DDRB |= 0x01; uart_init(9600); // Initial UART uart_puts("MCU Ready!\r\n");// Send message to terminal program while(1); // Break program }
40
The Prototype Electronics
ขั้นตอนการทดสอบ
(1) เปิด โปรแกรม X-CTU แล้ว เลือก แถบ Terminal เลือก ใช้ โปรแกรม
เทอร์ มินอล ของ X-CTU เพื่อ แสดงผล การ ท�างาน ของ ฝง คอมพิวเตอร์ (2) จ่ายไฟ ให้ กับ ไมโคร คอนโทรลเลอร์ หรือ การ รี เซต เริ่มต้นการ ท�างาน หลังจากนั้น ที่ หน้าต่าง โปรแกรม เทอร์ มินอล ของ X-CTU จะ ได้รับ ข้อความ MCU Ready! ที่ ส่ง มาจาก ไมโคร คอนโทรลเลอร์ เพื่อ แสดง ความ พร้อม ใน การ ท�างาน ตาม รูป ที่ 6 โดย ใน ขณะนี้ LED จะ ดับ เป็น สภาวะ เริ่มต้น (3) ทดสอบ กดปุม a ที่ คีย์ บอร์ด 1 ครั้ง และ สังเกต ว่า LED จะ ติด สว่าง (ถูก กลับ สถานะ ใน แบบ ท็อกเกิล) พร้อมกั นั้น ที่ หน้าต่าง โปรแกรม เทอร์ มินอล ของ X-CTU จะ ได้รับ ข้อความ ล่าสุด เป็น “Status: ON” ตาม รูป ที่ 7 (4) ทดสอบ กด คีย์ a หลายๆ ครั้ง จะ พบ ว่า ทุกครั้ง ที่ มี การ กด คีย์ ที่ ฝ ง ค อมพิ ว เตอร์ LED จะ ก ลั บ ส ถานะ ก าร ติ ด ดั บ พร้ อ มกั น นั้ น ไ มโคร คอนโทรลเลอร์ ATmega16 ส่งข้อความ แสดง สถานะ ล่าสุด กลับ มา แสดง ยัง หน้าต่าง เทอร์ มินอล ของ X-CTU
สรุปผลการปฏิบัติภารกิจ ใน ภารกิจ นี้ เป็นการ ทดสอบ การ สื่อสาร ข้อมูล อย่าง ง่ายๆ เพื่อ ให้คุณ ผู้อ่าน ได้ เห็น แนวทาง การ ก�าหนด คุณสมบัติ การ ท�างาน เพื่อ ใช้ ใน การ สื่อสาร กัน ระหว่าง กัน ของ โมดูล XBee-PRO คุณ ผู้อ่าน สามารถ ใช้งาน โมดูล XBee-PRO ร่วมกับ ไมโคร คอนโทรลเลอร์ ตระกูล ใดๆ ก็ได้ต าม ความ ถนัด ใน การ พัฒนา โปรแกรม โดย ไม่จ�ากัด อยู่ที่ ไมโคร คอนโทรลเลอร์ AVR เบอร์ ATmega16 เท่านั้นค รับ นอกจากนั้น ภาษา ที่ ใช้ ใน การ พัฒนา โปรแกรม ก็ สามารถ เลือก ได้ ตาม ความ ถนัด เช่น เดียวกัน ไม่ว่า จะ เป็น แอสเซมบลี, เบสิก หรือ C ส่วน การ พัฒนา โปรแกรม เชื่อม ต่อ ทาง ฝง คอมพิวเตอร์ ใน กรณีที่ ไม่ ต้องการ ให้ แสดง เพียง ข้อความ อย่างเดียว ก็ สามารถ พัฒนา โปรแกรม ประเภท GUI (Graphic User Interface) ขึ้น มา รับ ส่ง ข้อมูล ผ่าน พอร์ต อนุกรม แทน การ ใช้ โปรแกรม เทอร์ มินอล ก็ได้ โดย ใช้ ซอฟต์แวร์ ใน กลุ่ม Visual Studio จาก ไมโคร ซอฟต์ ( VB, VC#, VC++เป็นต้น) โดย ใน ส่วน นี้ ก็ พอ มี หนังสือ แนะน�า การ พัฒนา โปรแกรม จ�าหน่าย ใน ร้านหนังสือ
ภารกิจตอเนื่อง จาก ตัวอย่างที้ น�าเสนอ ใน ตอนนี้ สามารถ น�าไป ต่อ ยอด เพื่อ ใช้งาน จริง ได้ โดย แทนที่จะ ควบคุม การ ติด ดับ ของ LED ธรรมดาๆ หาก ต้องการ ควบคุม การ ปิด เปิด หลอดไฟ ใน บ้าน หรือ ไฟ สนามหญ้า หน้าบ้าน ที่ ไกลออกไป ก็ สามารถ ท�าการ ปรับ วงจร ทาง ฝง ไมโคร คอนโทรลเลอร์ โดย น�า สัญญาณ ไป ต่อ เข้ากับ วงจร ขับ รีเลย์ เพื่อ ใช้งาน รีเลย์ ใน การ ตัดต่อ การ ท�างาน ของ อุปกรณ์ ไฟฟา 220Vac อีก ทอด หนึ่ง ดัง ใน รูป ที่ 8 ทั้ง ยัง สามารถ เพิ่มจ�านวน ช่อง ใน การ ควบคุ ม ได้ ด้วย การ แก้ไข โปรแกรม เพียง เล็กน้อย
www.tpemagazine.com