Trong sơ đồ hoạt động này khỏc sơ đồ trước ở chỗ, mỗi nỳt cảm nhận (nỳt slave) chỉ hoạt động trong phiờn làm việc của nú, cũn tất cả cỏc nỳt cảm nhận khỏc ngủ. Tại chu kỳ hoạt động đầu tiờn của mỗi nỳt cảm nhận :
Ta xõy dựng trong mạng một thủ tục điểm danh: nỳt Master sẽ hỏi từng nỳt Slave một, với cỏc địa chỉ từ 0 đến 100 chẳng hạn, nếu con Slave nào cú mặt nú sẽ trả lời, và được Master ghi nhận.
Sau khi điểm danh hết, Master sẽ hỏi nỳt Slave cú địa chỉ bộ nhất, nỳt đú trả lời xong và ngủ luụn với thời gian t_sleep. Rồi Master lại hỏi luụn nỳt Slave tiếp theo, sau khi trả lời nú ngủ luụn với t_sleep....cứ tiếp tục cho đến hết cỏc Slave mà Master ghi nhận được.
Sau khi hỏi hết cỏc Slave, Master sẽ ngủ một thời gian là (t_sleep - N*t_active) với N là số Slave mà Master ghi nhận được.
Khi Master thức cũng chớnh là lỳc nỳt Slave đầu tiờn thức... và tiếp tục một chu kỳ làm việc mới.
Mỗi khi thờm, bớt Slave hoặc hoạt động bị lỗi, vớ dụ như khi Master hỏi 1 Slave mà khụng thấy Slave đú trả lời thỡ ta sẽ cho Master điểm danh lại (tự động hoặc bấm 1 nỳt nào đú trờn mạch Master).
Nếu muốn Master tự động nhận diện nỳt mới thỡ ta sẽ cho Master thức trước nỳt Slave đầu tiờn một khoảng thời gian (chắc chắn lỳc đú chỉ cú Master và cỏc nỳt Slave mới đang thức). Trong khoảng thời gian đú Master sẽ ghi nhận được Slave mới và sắp xếp khe thời gian cho nú hoạt động.
Do thời gian thực hiện luận văn hạn chế, tỏc giả chỉ đưa ý tưởng cải tiến phương phỏp lập lịch tập trung, khụng đủ thời gian nghiờn cứu thực hiện. Trong tương lai, tỏc giả sẽ nghiờn cứu và hoàn thiện.
KẾT LUẬN
Khi nghiờn cứu mạng cảm nhận khụng dõy và thủ tục thõm nhập mụi trường, một trong những đặc điểm quan trọng và then chốt đú là thời gian sống của cỏc nỳt cảm biến hay chớnh là sự giới hạn về năng lượng của chỳng. Cỏc nỳt cảm biến này yờu cầu tiờu thụ cụng suất thấp. Cỏc nỳt cảm biến hoạt động cú giới hạn và khú cú thể thay thế được nguồn cung cấp. Do đú, trong khi mạng truyền thụng tập trung vào đạt được cỏc dịch vụ chất lượng cao, thỡ cỏc giao thức mạng cảm biến phải tập trung đầu tiờn vào tiết kiệm năng lượng.
Bản luận văn cũng đó giới thiệu về cỏc phương phỏp thõm nhập mụi trường trong mạng cảm nhận. Sau đú tỏc giả đó đi sõu nghiờn cứu phương phỏp thõm nhập mụi trường bằng phương phỏp lập lịch tập trung một trong những phương phỏp tiết kiệm được năng lượng cho nỳt mạng, dễ triển khai trờn thực tế.
Phần thực nghiệm đó tiến hành xõy dựng phần mềm nhỳng cho cỏc nỳt mạng đo và tớnh toỏn năng lượng tiờu thụ của nỳt mạng thời điểm mạng làm việc và ngủ, đú đưa ra một số kết luận sau :
Cụng suất của nỳt mạng C1010 truyền trong khoảng cỏch D<100m thỡ cỏc nỳt mạng nhận được tớn hiệu.
Thời gian xử lý dữ liệu truyền nhận của nỳt mạng chủ yếu là thời gian xử lý và kiểm tra đa thức CRC.
Năng lượng tiờu thụ của nỳt mạng khi ngủ rất nhỏ (dũng tiờu thụ cỡ 0.25mA nhỏ hơn nhiều so với dũng tiờu thụ khi truyền là 37mA ) nờn trong quỏ trỡnh lập lịch, nếu ta tăng tối đa thời gian ngủ thỡ nỳt mạng sẽ tiết kiệm được năng lượng.
Khi mạng tăng về quy mụ, số nỳt mạng N lớn thỡ tuổi năng lượng sống của nỳt mạng sẽ giảm theo hàm 38 . 0 62 . 0 1 N T
Đưa ra được ý tưởng hoàn thiện phương phỏp thực hiện thuật toỏn lập lịch tập trung trong tương lai.
Từ cỏc kết quả thực nghiệm trờn cho thấy: Việc xõy dựng một WSN bước đầu đó đạt được một số kết quả mang tớnh cơ bản, cho phộp tiếp tục phỏt triển và đi sõu nghiờn cứu theo hướng đó xỏc lập. Việc theo dừi cỏc thụng số mụi trường trở nờn dễ dàng và tiện lợi, người sử dụng chỉ cần ngồi tại một chỗ cũng cú thể giỏm sỏt cỏc thụng số đú nhằm phục vụ cỏc cụng việc của mỡnh như: dự bỏo thời tiết, phũng chống chỏy rừng, cỏc ứng dụng trong nụng nghiệp… Cỏc thử nghiệm dựng module CC1010 cho thấy rằng việc dựng vi điều khiển CC1010 cho WSN là hoàn toàn khả thi.
TÀI LIỆU THAM KHẢO
Tài liệu Tiếng Việt
[1] Nguyễn Thế Sơn, “Thiết kế chế tạo, vận hành và đo thử nghiệm mạng cảm nhận khụng dõy (wireless sensor network) trờn cơ sở sử dụng chip vi điều khiển cú mật độ tớch hợp cao làm nỳt mạng và xõy dựng phần mềm nhỳng nạp trong cỏc vi điều khiển này”
[2] Đỗ Thị Tuyết, “nghiờn cứu và mụ phỏng giao thức định tuyến Pagasis trong mạng
cảm biến”
[3]Vương Đạo Vy, Mạng truyền dữ liệu, Nhà xuất bản đại học quốc gia Hà Nội
[4] Vương Đạo Vy, Nguyễn Thế Sơn, Phựng Cụng Phi Khanh, Hũa Quang Dự, “Xõy dựng hệ tự động đo khớ ỏp sử dụng cảm biến ỏp suất MEMS và cỏc thớ nghiệm kiểm tra”, túm tắt cỏc bỏo cỏo Hội thảo Quốc gia lần thứ VIII, Hải Phũng 25-27/08/2005,
Một số vấn đề chọn lọc của cụng nghệ thụng tin và truyền thụng, Chủ đề Mó nguồn mở, tr. 79, Hải phũng 08/2005
[5] Vương Đạo Vy, Nguyễn Thế Sơn, “Hệ tự động đo thụng số mụi trường theo thời
gian thực, truyền dữ liệu khụng dõy liờn tục, dài ngày cú kớch thước nhỏ, giỏ thành thấp, tiờu thụ năng lượng ớt”, túm tắt cỏc bỏo cỏo Hội nghị Vật lý toàn quốc lần thứ
VI, tr. 297, Hà nội 11/2005
Tài liệu Tiếng Anh
[6] Bhaskar Krishnamachari, Networking Wireless Sensors [7] Chipcon, CC1010 DataSheet, www.chipcon.com [8] Chipcon, CC1010 IDE Manual, www.chipcon.com
[9] E. Jason Riedy, Robert Szewczyk (2000), “Power and Control in Networked
Sensors”
[10] Hugh O’Keeffe, R&D Director, Ashling Microsystems Ltd (2006), “Embedded
Debugging”
[11] Jason Hill (2000), “A Software Architecture Supporting Networked Sensors”, University of California, Berkeley
[12] Jason Lester Hill (2000), “System Architecture for Wireless Sensor Networks”, University of California, Berkeley
[13] Nikolay Kirianaki, Sergey Yurish, Nestor Shpak, Vadim Deynega (2001), “Smart
sensors for electrical and non-electrical, physical and chemical variables: tendencies and perspectives”, John Wiley & Sons Ltd
[14] Patrick Kinney, Kinney Consulting LLC - Chair of IEEE 802.15.4 Task Group, Secretary of ZigBee BoD, Chair of ZigBee Building Automation Profile WG (2 october 2003), “ZigBee Technology: Wireless Control that Simply Works”
[15] Vuong Dao Vy, Nguyen The Son, Phung Cong Phi Khanh, College of Technology VNU (December 2005), “The automatic measure system contains the pieszoresistive pressure sensor in MEMS architecture and the experiment for checking”, International conference on Mecha-Electronic, Malaixia
[16] Wei Ye, John Heidemann, Deborah Estrin (2002), “An Energy-Efficient MAC
Protocol for Wireless Sensor Networks”, University of California, Berkeley
[17] ZigBee Specification, www.zigbee.org
PHỤ LỤC
Chương trỡnh khảo sỏt đo nhiệt độ mụi trường trong mạng WSN
Phần mềm viết cho Master bao gồm cỏc file: CC1010MB.h, MainMaster.c Phần mềm viết cho Slave bao gồm cỏc file: Slave.c
1.CC1010MB.h // File thƣ viện định nghĩa cỏc chõn I/O
#ifndef CC1010EB_H #define CC1010EB_H
#include <Chipcon/reg1010.h> // Include register definitions
//********** Constants ************ #define CC1010EB_CLKFREQ 14746 //********** LED macros *********** #define RLED P3_2 #define YLED P3_3 #define GLED P3_4 #define BLED P3_5 #define LED_ON 0 #define LED_OFF 1
// LED pin output enable macros
#define RLED_OE(x) {P3DIR=(x) ? P3DIR&~0x04 : P3DIR|0x04;} #define YLED_OE(x) {P3DIR=(x) ? P3DIR&~0x08 : P3DIR|0x08;} #define GLED_OE(x) {P3DIR=(x) ? P3DIR&~0x10 : P3DIR|0x10;} #define BLED_OE(x) {P3DIR=(x) ? P3DIR&~0x20 : P3DIR|0x20;} //********** Switch macros ***********
#define SW1_PRESSED (!P1_7) #define SW2_PRESSED (!P3_2)
#define SW3_PRESSED (!P3_3) #define SW4_PRESSED (!P2_4)
//********** Misc macros ************ #define DCLK P0_2
#define DIO P0_1
#define DCLKIO_OE(b) {P0DIR=(P0DIR&~0x06)|((b)?0x00:0x06);}
// PUT IN EXAMPLE RF_RXTXPAIR STRUCTURES FOR 434/868/915 !!! #endif //CC1010EB_H 1. MainMaster.c #include <chipcon/reg1010.h> #include "CC1010MB.h" #include "PACKET.H" #include <chipcon/hal.h> #include <stdio.h> #include <stdlib.h> #include <math.h> //LCD define #define LCDPORT P2 sbit _RS=LCDPORT^0; sbit _RW=LCDPORT^1; sbit _E =LCDPORT^2; #include "lcd.h" // Protocol constants #define Node_ID 0xFF #define Node1 0x01 #define Node2 0x02 #define Node3 0x03
#define Node4 0x04 #define max 5 #define N 30 #define tx 2 #define tactive 20 #define sleep 20 #define PREAMBLE_BYTE_COUNT 7 #define PREAMBLE_BITS_SENSE 16 #define CRC16_POLY 0x1021 #define CRC16_INIT 0xFFFF #define CRC_OK 0
PACKET xdata txDataBuffer; PACKET xdata rxDataBuffer;
void halRFSendPacket2(byte numPreambles, byte* packetData, byte length); byte halRFReceivePacket2(byte timeOut, byte* packetData, byte maxLength);
void main(void) { unsigned int n; byte result;
unsigned int node; char so[20];
// X-tal frequency: 14.745600 MHz
// RF frequency A: 868.277200 MHz Rx // RF frequency B: 868.277200 MHz Tx // RX Mode: Low side LO
// Frequency separation: 64 kHz // Data rate: 2.4 kBaud
// Data Format: Manchester // RF output power: 4 dBm // IF/RSSI: RSSI Enabled
RF_RXTXPAIR_SETTINGS code RF_SETTINGS = {
0x4B, 0x2F, 0x15, // Modem 0, 1 and 2: Manchester, 2.4 kBaud //0x43, 0x2F, 0x15, // Modem 0, 1 and 2: NRZ, 2.4 kBaud //0xA1, 0x2F, 0x29, // Modem 0, 1 and 2: NRZ, 38.4 kBaud //0xA0, 0x2F, 0x52, // Modem 0, 1 and 2: NRZ, 76.8 kBaud 0x75, 0xA0, 0x00, // Freq A
0x58, 0x32, 0x8D, // Freq B 0x01, 0xAB, // FSEP 1 and 0 0x40, // PLL_RX 0x30, // PLL_TX 0x6C, // CURRENT_RX 0xF3, // CURRENT_TX 0x32, // FREND 0xFF, // PA_POW 0x00, // MATCH 0x00, // PRESCALER }; // Calibration data
RF_RXTXPAIR_CALDATA xdata RF_CALDATA; // Initialize peripherals WDT_ENABLE(FALSE); RLED_OE(TRUE); YLED_OE(TRUE); GLED_OE(TRUE); BLED_OE(TRUE); BLED = LED_OFF; RLED = LED_OFF; GLED = LED_OFF; YLED = LED_OFF;
// Set optimum settings for speed and low power consumption MEM_NO_WAIT_STATES();
FLASH_SET_POWER_MODE(FLASH_STANDBY_BETWEEN_READS); // ADC setup //halConfigADC(ADC_MODE_SINGLE | ADC_REFERENCE_INTERNAL_1_25, CC1010EB_CLKFREQ, 0); //ADC_SELECT_INPUT(ADC_INPUT_AD0); //ADC_POWER(TRUE);
UART0_SETUP(57600, 14746, UART_NO_PARITY | UART_RX_TX | UART_POLLED);
// config timer0 mode 1
TMOD = (TMOD&0xF0)|0x01;
INT_ENABLE(INUM_TIMER0, INT_ON); INT_GLOBAL_ENABLE(TRUE);
// Calibration
halRFCalib(&RF_SETTINGS, &RF_CALDATA); P2DIR=0x00; // LCD port is output lcd_init(); lcd_com(15); lcd_goto(1,1); lcd_puts("Coltech WSN Group"); lcd_goto(2,1); lcd_puts("Coltech WSN Group"); lcd_goto(3,1); lcd_puts("Coltech WSN Group"); lcd_goto(4,1); lcd_puts("Coltech WSN Group"); // Build packet
// first 2bytes is Source of packet (here is Master) // next 2 bytes is Destination of packet (target node)
// next 2 bytes is type of data or command (temperature or pressure...) // next 2 bytes is real data or command.
// the transmiting function will add 2 byte CRC16(packet) at the end of packet txDataBuffer.packet.source = Node_ID; txDataBuffer.packet.target = 0x00; txDataBuffer.packet.type = 0x00; txDataBuffer.packet.dat = 0x00; t3 = (int)sppGetTime(); do{ for(i=1;i<max;i++) { tbcTransmit(i,0xFF); t2 = (int) sppGetTime(); do{ tbcReceive();
}while((RXI.status != SPP_RX_FINISHED)&&( ((int) sppGetTime()- t2)<80)); tbcPrintTable(); sleep(tsleep); if(((int)sppGetTime()-t3)>time_active) break; }
}while( ((int)sppGetTime()-t3) < time_active ); } // end of main()
// Flash interrupt handler (do nothing)
// We need to handle the interrupt even though we do not do anything. // If not, the program will not run correctly except under the debugger, // which has its own Flash interrupt handler
void FlashIntrHandler(void) interrupt INUM_FLASH { INT_SETFLAG(INUM_FLASH, INT_CLR); return;
}
byte halRFReceivePacket2(byte timeOut, byte* packetData, byte maxLength) { byte receivedBytes, pkgLen, crcData, i;
word crcReg; halConfigTimer23(TIMER3|TIMER23_NO_INT_TIMER, 10000, CC1010EB_CLKFREQ); INT_SETFLAG(INUM_TIMER3, INT_CLR); TIMER3_RUN(TRUE); RF_SET_PREAMBLE_COUNT(16); RF_SET_SYNC_BYTE(RF_SUITABLE_SYNC_BYTE);
MODEM1=(MODEM1&0x03)|0x24; // Make sure avg filter is free-running + 22 baud settling time
INT_ENABLE(INUM_RF, INT_OFF); INT_SETFLAG(INUM_RF, INT_CLR); RF_START_RX();
while (1) {
// Check if 10 ms have passed
if (INT_GETFLAG(INUM_TIMER3)) {
// Clear interrupt flag and decrement timeout value INT_SETFLAG(INUM_TIMER3, INT_CLR);
if (timeOut && !--timeOut) { timeOut=255;
break; // Timeout }
}
// Check if sync byte received if (INT_GETFLAG(INUM_RF)) { EXIF &= ~0x10; // Clear the flag break;
} }
receivedBytes=0;
// Timeout or sync byte received? if (timeOut!=255) {
// Lock average filter and perform RSSI reading if desired RF_LOCK_AVERAGE_FILTER(TRUE);
// Get length of package
RF_WAIT_AND_RECEIVE_BYTE( pkgLen ); pkgLen+=2; // Add the two CRC bytes // Initialize CRC-16
crcReg=CRC16_INIT;
// Receive as many bytes as packet specifies + 2 crc bytes while (pkgLen--) {
RF_WAIT_AND_RECEIVE_BYTE( crcData );
// If there is space in the buffer at _packetData_ and we're not // currently receiving CRC, store the byte
if ( pkgLen>=2 && maxLength ) { *packetData++=crcData;
receivedBytes++; maxLength--; }
// Calculate CRC-16 (CCITT) for (i=0; i<8; i++) {
if ( ((crcReg&0x8000)>>8) ^ (crcData&0x80) ) crcReg=(crcReg<<1)^CRC16_POLY; else crcReg=(crcReg<<1); crcData<<=1; } }
// Check if CRC is OK if (crcReg != CRC_OK) receivedBytes=0; } TIMER3_RUN(FALSE); RF_SET_PREAMBLE_COUNT(RF_PREDET_OFF); return receivedBytes; } 2. Slave.c #include <chipcon/reg1010.h> #include "CC1010MB.h" #include "PACKET.H" #include <chipcon/hal.h> #include <stdio.h> #include <stdlib.h> #include <math.h> //LCD define #define LCDPORT P2 sbit _RS=LCDPORT^0; sbit _RW=LCDPORT^1; sbit _E =LCDPORT^2; #include "lcd.h" // Protocol constants #define Node_ID 0xFF #define Node1 0x01 #define Node2 0x02
#define Node3 0x03 #define Node4 0x04 #define N 30 #define node_max 10 #define tx 2 #define tactive 20 #define sleep 20 #define PREAMBLE_BYTE_COUNT 7 #define PREAMBLE_BITS_SENSE 16 #define CRC16_POLY 0x1021 #define CRC16_INIT 0xFFFF #define CRC_OK 0
PACKET xdata txDataBuffer; PACKET xdata rxDataBuffer;
void halRFSendPacket2(byte numPreambles, byte* packetData, byte length); byte halRFReceivePacket2(byte timeOut, byte* packetData, byte maxLength);
/********************************************************************* ******** MAIN PROGRAM ********************************************************************* ********/ void main(void) { unsigned int n; byte result;
unsigned int node;
char so[20];
// X-tal frequency: 14.745600 MHz
// RF frequency A: 868.277200 MHz Rx // RF frequency B: 868.277200 MHz Tx // RX Mode: Low side LO
// Frequency separation: 64 kHz // Data rate: 2.4 kBaud
// Data Format: Manchester // RF output power: 4 dBm // IF/RSSI: RSSI Enabled
RF_RXTXPAIR_SETTINGS code RF_SETTINGS = {
0x4B, 0x2F, 0x15, // Modem 0, 1 and 2: Manchester, 2.4 kBaud //0x43, 0x2F, 0x15, // Modem 0, 1 and 2: NRZ, 2.4 kBaud //0xA1, 0x2F, 0x29, // Modem 0, 1 and 2: NRZ, 38.4 kBaud //0xA0, 0x2F, 0x52, // Modem 0, 1 and 2: NRZ, 76.8 kBaud 0x75, 0xA0, 0x00, // Freq A
0x58, 0x32, 0x8D, // Freq B 0x01, 0xAB, // FSEP 1 and 0 0x40, // PLL_RX 0x30, // PLL_TX 0x6C, // CURRENT_RX 0xF3, // CURRENT_TX 0x32, // FREND 0xFF, // PA_POW 0x00, // MATCH 0x00, // PRESCALER }; // Calibration data
RF_RXTXPAIR_CALDATA xdata RF_CALDATA; // Initialize peripherals
WDT_ENABLE(FALSE);
RLED_OE(TRUE); YLED_OE(TRUE); GLED_OE(TRUE); BLED_OE(TRUE); BLED = LED_OFF; RLED = LED_OFF; GLED = LED_OFF; YLED = LED_OFF;
// Set optimum settings for speed and low power consumption MEM_NO_WAIT_STATES(); FLASH_SET_POWER_MODE(FLASH_STANDBY_BETWEEN_READS); // ADC setup //halConfigADC(ADC_MODE_SINGLE | ADC_REFERENCE_INTERNAL_1_25, CC1010EB_CLKFREQ, 0); //ADC_SELECT_INPUT(ADC_INPUT_AD0); //ADC_POWER(TRUE);
UART0_SETUP(57600, 14746, UART_NO_PARITY | UART_RX_TX | UART_POLLED);
// config timer0 mode 1
TMOD = (TMOD&0xF0)|0x01;
INT_ENABLE(INUM_TIMER0, INT_ON); INT_GLOBAL_ENABLE(TRUE);
// Calibration
halRFCalib(&RF_SETTINGS, &RF_CALDATA); P2DIR=0x00; // LCD port is output lcd_init(); lcd_com(15); lcd_goto(1,1); lcd_puts("Coltech WSN Group"); lcd_goto(2,1); lcd_puts("Coltech WSN Group");
lcd_goto(3,1);
lcd_puts("Coltech WSN Group"); lcd_goto(4,1);
lcd_puts("Coltech WSN Group");
// Build packet
// first 2bytes is Source of packet (here is Master) // next 2 bytes is Destination of packet (target node)
// next 2 bytes is type of data or command (temperature or pressure...) // next 2 bytes is real data or command.
// the transmiting function will add 2 byte CRC16(packet) at the end of packet txDataBuffer.packet.source = Node_ID; txDataBuffer.packet.target = 0x00; txDataBuffer.packet.type = 0x00; txDataBuffer.packet.dat = 0x00; n=0; node = 1; do{ tbcReceive(); }while(RXI.status != SPP_RX_FINISHED); while (TRUE) { do{ halRFReceivePacket2(50, rxDataBuffer.buffer, PACKET_LENGTH); if(RXI.status != SPP_RX_FINISHED) { if(i==0) t1 = (int)sppGetTime();
i++; }
}while((RXI.status != SPP_RX_FINISHED)&&(((int)sppGetTime()- t1)<1000));
i=0;
tbcPrintTable(); //xu lý, neu dỳng yờu cau thỡ goi du lieu. if( ( (int)sppGetTime()-t1 )>1000 ) { t2 = (int)sppGetTime(); do{}while( ((int)sppGetTime()-t2)<1000); //tsl = 10s for(i=1;i<30;i++) //N = 30 { t1 = (int)sppGetTime(); do { t2 = (int)sppGetTime(); do { tbcReceive(); }while((RXI.status != SPP_RX_FINISHED)&&(((int)sppGetTime()-t2)<80)); tbcPrintTable(); }while(((int)sppGetTime()-t1)<2000); //tactive = 20s t2 = (int)sppGetTime();
do{}while( ((int)sppGetTime()-t2)<2000); //tsleep = 20s }
} }
} // end of main()
// Flash interrupt handler (do nothing)
// We need to handle the interrupt even though we do not do anything. // If not, the program will not run correctly except under the debugger, // which has its own Flash interrupt handler
void FlashIntrHandler(void) interrupt INUM_FLASH { INT_SETFLAG(INUM_FLASH, INT_CLR); return;
}
void TIMER0_ISR() interrupt INUM_TIMER0 { // Reset the timer to generate another interrupt