Master và Slave đều là Vi điều khiển CC1010
Master giao tiếp với máy tính trung tâm qua đƣờng RS232.
Các Slave giao tiếp với nhau hoặc với Master qua đƣờng truyền không dây
Master và Slave đều phải chứa toàn bộ topology của mạng, qua đó mỗi nút sẽ biết đƣờng đi để truyền gói tin đến đích.
Topology của mạng đƣợc xây dựng ngay từ lúc viết chƣơng trình. Khi một nút nhận đƣợc lệnh truyền từ nút cha, nó sẽ xem địa chỉ đích: - Nếu địa chỉ đích chính là nó, nó sẽ gửi dữ liệu về cho nút cha. - Nếu không, nó sẽ tìm trong bảng địa chỉ:
o Nếu tồn tại một đƣờng đi từ nó tới nút đích, nó sẽ chuyển tiếp gói tin tới chặng tiếp theo. Chặng tiếp theo chính là nút con của nó có khả năng tới đích.
o Nếu không tồn tại đƣờng đi thì không làm gì cả.
5.2.1 Biểu diễn cây trong bộ nhớ
Biểu diễn cây bằng danh sách các con của mỗi đỉnh
Với mỗi đỉnh của cây, ta thành lập một danh sách các đỉnh con của nó theo thứ tự từ trái sang phải. Ở đây ta sử dụng một mảng để lƣu giữ các đỉnh của cây. Mỗi thành phần của mảng là một tế bào chứa thông tin gắn với mỗi đỉnh và danh sách các đỉnh con của nó. Danh sách các đỉnh con của một đỉnh có thể biểu diễn bởi mảng hoặc bởi danh sách liên kết. Tuy nhiên, vì số con của mỗi đỉnh có thể thay đổi nhiều nên ta sẽ sử dụng danh sách liên kết. Nhƣ vậy mỗi tế bào mô tả của cây là một bản ghi gồm 2 trƣờng: trƣờng id là địa chỉ của nút mạng, trƣờng next là con trỏ trỏ tới danh sách các con của đỉnh đó. Giả sử các đỉnh của cây đƣợc đánh số từ 1 đến N. Với cách cài đặt này, ta có thể khai báo cấu trúc dữ liệu biểu diễn cây nhƣ sau:
#define N 11
{
int id;
node *next;
}
node tree[N];
Trong khai báo trên, Member biểu diễn các thành phần của danh sách các con, còn Node biểu diễn các đỉnh của cây. Với cách cài đặt này, cấu trúc dữ liệu biểu diễn cây trong hình trên đƣợc minh hoạ nhƣ sau:
1 2 3 4 . 5 6 . 7 8 . 9 . 10 . 11 . 2 3 . 4 5 . 6 7 . 9 10 . 11 id next id next
Ta có nhận xét rằng, trong cách cài đặt này, với mỗi đỉnh k ta xác định đƣợc ngay con trƣởng của nó. Chẳng hạn, với cây trong hình trên, con trƣởng của đỉnh 3 là đỉnh 6, con trƣởng của đỉnh 5 là đỉnh 9, còn đỉnh 6 không có con. Phép toán tìm con trƣởng EldestChild(k) có thể đƣợc mô tả nhƣ sau:
int EldestChild(int k, Tree T)
{ node *p; if(T[k]) { p = T[k].next; return pid; }
else return -1; //không tìm thấy con }
Tuy nhiên trong cách cài đặt này, việc tìm cha và em liền kề của mỗi đỉnh lại không đơn giản. Chẳng hạn, để tìm cha của đỉnh k, ta phải duyệt các danh sách các con của mỗi đỉnh. Nếu phát hiện ra trong danh sách các con của đỉnh m có chứa k thì Parent(k) = m. Hàm Parent(k) đƣợc xác định nhƣ sau:
int Parent(int k, Tree T)
{ node *p; int i; BOOL found; i = 0; while(i<N)
{ p = T[i].next; while(p) { if(pid = = k) return i else p = pnext; } i++; }
return -1; //không tìm thấy cha
}
Một cách tƣơng tự (duyệt danh sách các con), ta cũng có thể tìm đƣợc em liền kề của mỗi đỉnh. Hàm tìm em liền kề NextSibling(k) nhƣ sau:
int NextSibling(int k, Tree T)
{ node *p; int i; i = 0; while(i < N) { p = T[i].next; while(p) { if(pid = = k)
{
p = pnext; if(p) return pid;
else return -1; //không có em liền kề } else p = pnext; } i++; } return -1; }
Khi Master muốn gửi thông tin cho một nút k nào đó, ta phải tìm đƣờng đi từ Master tới nút k. Muốn vậy, từ nút k trong topology của mạng lƣu trong Master, ta tìm nút cha của nó, sau đó cứ tìm ngƣợc lên trên cho tới Master. Toàn bộ các nút tìm đƣợc chính là đƣờng đi từ Master tới nút k. Các nút tìm đƣợc này sẽ đƣợc lƣu trong một mảng để từ Master, thông qua mảng đó có thể tới đƣợc nút k. Mảng này đƣợc khai báo nhƣ sau:
int RoutingTable[N];
Ví dụ trong sơ đồ hình cây trên, đƣờng đi từ Master tới nút 11 đƣợc lƣu trong bảng nhƣ sau: [1, 3, 7, 11, -1, -1, -1, -1, -1, -1, -1]
Hàm xây dựng bảng định tuyến RoutingTable nhƣ sau:
//Hàm này tìm đƣờng đi từ Master tới nút k, Master có địa chỉ là 1 void FindHops(int k, Tree T)
{
for(i=0; i<N; i++) RoutingTable [i] = -1; i = 0; j = k; do { par = Parent(j, T);
RoutingTable [i] = par;
j = par;
i++;
}while ( par != 1)
}
5.2.2 Định dạng dữ liệu truyền
Truyền dữ liệu từ Master tới Endpoint:
Định dạng dữ liệu truyền từ Master qua các chặng trung gian cho Endpoint nhƣ sau: Len + NextHop + DestAddress + Command + CRC
Truyền dữ liệu về Master:
Định dạng dữ liệu của Endpoint truyền về trung tâm nhƣ sau:
Len + ParentAddress + DestAddress + Command + ADC0 + ADC1 + ADC2 + P + CRC
Trong đó:
Endpoint: là nút mạng cuối cùng mà Master muốn gửi gói tin đến.
Len: độ dài gói tin, 1byte
NextHop: Địa chỉ của nút kế tiếp có thể tới đích
ParentAddress: địa chỉ của nút cha của nút hiện thời, 1 byte.
Command: lệnh gửi cho Endpoint phải thi hành, 1 byte
ADC0, ADC1, ADC2: các giá trị nhiệt độ đọc từ 3 kênh này, 2 byte
P: giá trị áp suất đọc từ cảm biến áp suất MS5535, 2 byte
CRC: Mã dƣ vòng, 2 byte
5.3 Kết luận
Việc thử nghiệm đƣợc tiến hành từ xây dựng mạng gồm hai nút mạng đến xây dựng mạng có nhiều nút mạng. Phần xây dựng mạng có 2 nút mạng đã tiến hành các thử nghiệm nhƣ: khảo sát quan hệ độ cao cột nƣớc - áp suất, khảo sát độ ổn định của phép đo áp suất theo nhiệt độ, khảo sát khí áp tại Hà nội và kiểm tra vấn đề tiết kiệm năng lƣợng. Kết quả thử nghiệm còn cho thấy độ chính xác và tính tuyến tính của cảm biến áp suất MS5535. Một kết quả cũng rất quan trọng của việc thử nghiệm là vi điều khiển CC1010 tiêu thụ năng lƣợng thấp, một tiêu chí quan trọng của WSN.
Phần xây dựng mạng gồm nhiều nút mạng đƣợc tiến hành trên 3 nút mạng, 2 nút là Slave, 1 nút Master. Các nút mạng đều dùng vi điều khiển CC1010 của hãng Chipcon. Mạng đƣợc xây dựng theo dạng adhoc, bảng định tuyến dạng cây đƣợc nhớ cố định trong các nút mạng. Theo chu kỳ, cứ 2 giây nút Master lại gửi yêu cầu lấy dữ liệu tại một nút mạng. Gói tin yêu cầu lấy dữ liệu từ nút Master tới nút Slave sẽ đi qua các nút trung gian để tới nút cần gửi. Khi nút Slave nhận đƣợc yêu cầu từ Master, nó sẽ thu thập thông tin môi trƣờng nhƣ nhiệt độ, áp suất rồi gửi về Master cũng theo đƣờng đi vừa rồi. Việc thăm dò của Master đƣợc thực hiện vòng tròn cho tới nút mạng cuối cùng.
Kết quả các thực nghiệm cho thấy việc truyền nhận dữ liệu ổn định và tin cậy, không bị xung đột.
KẾT LUẬN
Bản luận văn đã đƣa ra kiến trúc tổng quát và chỉ ra các yêu cầu chủ yếu cần đạt đƣợc khi xây dựng một WSN, đó là: năng lƣợng tiêu thụ, kích thƣớc, tính mềm dẻo, độ chính xác theo thời gian. Những đặc điểm này cần đƣợc thể hiện trong hệ thống WSN. Hệ thống phải có khả năng mềm dẻo để thích hợp với dải rộng các yêu cầu của ứng dụng. Các dạng ứng dụng chủ yếu của WSN là: thu thập dữ liệu môi trường, mạng an ninh, và theo dõi đối tượng. Mỗi dạng ứng dụng có sự khác nhau căn bản về truyền thông và các giao thức cần đƣợc hỗ trợ bởi kiến trúc phần cứng.
Yêu cầu quan trọng của một nút mạng là có kích thƣớc bé, tiêu thụ năng lƣợng thấp và có tích hợp truyền nhận không dây, từ đó đã chọn loại vi điều khiển CC1010 do hãng Chipcon-NaUy chế tạo có độ tích hợp cao, truyền nhận RF, tiêu thụ năng lƣợng thấp để làm nút mạng và xây dựng hệ thống thực nghiệm.
Bản luận văn cũng đã giới thiệu về phần mềm nhúng, các yêu cầu về phần mềm nhúng cho các nút mạng và vấn đề gỡ lỗi cho phần mềm nhúng. Gỡ lỗi sẽ làm cho phần mềm trở nên ổn định và tin cậy, dễ bảo trì. Trong lĩnh vực phần mềm nhúng có ba phƣơng pháp gỡ lỗi, đó là: Giám sát ROM, Mô phỏng trên mạch và Gỡ lỗi Onchip.
Hai chức năng quan trọng nhất của một nút mạng trong WSN là chức năng
mạng và chức năng cảm nhận. Chức năng cảm nhận của nút mạng đòi hỏi một nút mạng phải có khả năng ghép nối đƣợc với nhiều loại cảm biến. Điều đó cho phép một nút mạng có thể thu thập đƣợc nhiều thông tin khác nhau theo nhiều cách khác nhau. Một nút mạng nhƣ vậy có khả năng thích nghi cao với nhiều dạng ứng dụng. Từ các nghiên cứu lý thuyết tổng quát về cảm biến, bản luận văn đã đƣa ra các phƣơng pháp ghép nối VĐK với các loại cảm biến tƣơng tự cũng nhƣ cảm biến số.
Phần thực nghiệm đã tiến hành các thử nghiệm ở mức hệ thống mạng WSN và xây dựng phần mềm nhúng cho các nút mạng. Các thử nghiệm chức năng mạng đã đƣợc thực hiện bao gồm:
- Xây dựng đƣợc mạng không dây gồm 2 nút mạng sử dụng vi điều khiển CC1010 nối với đầu đo áp suất MS5535. Kết quả thử nghiệm cho thấy hệ thống làm việc chính xác, ổn định.
- Xây dựng mạng gồm 2 nút mạng để đánh giá khả năng tiết kiệm năng lƣợng của nút mạng. Kết quả nút mạng hoạt động liên tục, có thể sống trong nhiều ngày.
- Xây dựng mạng gồm nhiều nút mạng truyền theo dạng multihop. Bảng định tuyến đƣợc tổ chức theo dạng cây, đƣợc nhớ trong tất cả các nút, qua đó mỗi nút trung gian sẽ biết đƣợc nút tiếp theo của gói tin hiện thời để có thể đến đích.
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 CC1010EM cho thấy rằng việc dùng vi điều khiển CC1010 cho WSN là hoàn toàn khả thi.
Áp dụng các công nghệ cho WSN vào thực tế nhƣ: đa truy cập, định tuyến, truyền thông multihop đã đƣợc tích hợp sẵn trong TinyOS là hƣớng nghiên cứu tiếp theo của đề tài.
TÀI LIỆU THAM KHẢO Tài liệu Tiếng Việt
[1] Đinh Mạnh Tƣờng (2002), “Cấu trúc dữ liệu và thuật toán”, Nhà xuất bản khoa học và kỹ thuật.
[2] 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
[3] 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
[4] Vũ Duy Lợi (2002), “Mạng thông tin máy tính”, Nhà xuất bản Thế giới.
Tài liệu Tiếng Anh
[5] Alec Woo and David Culler, “A transmission control scheme for media access in sensor networks,” in Proceedings of the ACM/IEEE International Conference on Mobile Computing and Networking, Rome, Italy, July 2001, ACM.
[6] Chipcon, CC1010 DataSheet, www.chipcon.com
[7] Chipcon, CC1010 IDE Manual, www.chipcon.com
[8] David Gay, Philip Levis, Robert von Behren, “The nesC Language: A Holistic Approach to Networked Embedded Systems”, University of California, Berkeley, http://webs.cs.berkeley.edu
[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] MS5534 DataSheet, http://www.intersema.ch
[14] MS5535 DataSheet, http://www.intersema.ch
[15] 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
[16] 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”
[17] 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
[18] Wei Ye, John Heidemann, Deborah Estrin (2002), “An Energy-Efficient MAC Protocol for Wireless Sensor Networks”, University of California, Berkeley
PHỤ LỤC
Phụ lục 1: Chƣơng trình khảo sát quan hệ độ cao cột nƣớc-áp suất
Phần mềm viết cho Master bao gồm các file: Common.h, Master.c
Phần mềm viết cho Slave bao gồm các file: Common.h, Slave.c, Slave.h, MS5535.c, MS5535.h
1. Common.h
#ifndef common_h
#define common_h// Only include this header file once
#include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> #include <chipcon/reg1010.h> #include <chipcon/cc1010eb.h> #include <chipcon/hal.h>
#define CLKFREQ CC1010EB_CLKFREQ
#define PREAMBLE_BYTE_COUNT 18 #define PREAMBLE_BITS_SENSE_INIT 81 #define PREAMBLE_BITS_SENSE 16 #define CMD_GET_PARAMS 1 void RFSetup(void); void setupTimer0(); void InitRF(void);
void PrepareRX(RF_RXTXPAIR_SETTINGS* RF_SETTINGS); void Wait1sec (void);
void SelectClockMode(char iMode); #endif 2. MS5535.h #ifndef __MS5535_H__ #define __MS5535_H__ #include <chipcon/reg1010.h> #include <chipcon/hal.h> #include <chipcon/cc1010eb.h> sbit P_MSCLK = P2^3; sbit P_SCLK = P1^0; sbit P_DIN = P1^1; sbit P_DOUT = P0^3;
#define CLKFREQ CC1010EB_CLKFREQ //18432
#define DUTY_CYCLE 128 //MS5535 #define MS5535_W1 0x0157 #define MS5535_W2 0x00d7 #define MS5535_W3 0x0137 #define MS5535_W4 0x00b7 #define MS5535_P 0x002f #define MS5535_T 0x004f #define SCLK_W 1 #define true 1 #define false 0
void reset();
void SerialSendLsbFirst(char pattern, char nbr_clock); word SerialGet16();
word getW (word index); // 1 to 4 word getD1 (word *error_pt);
word ConvertWtoC5535 (int ix, word W1, word W2, word W3, word W4); void WaitOnePulse();
void setSCLK(bit status); void setDIN(bit status); bit getDOUT();
word waitOnDoutFall();
void calcPT5535 (word *pressure, word *temperature, word d1_arg, word d2_arg); word readMS5535param1(word type);
void readMS5535Values(word *p,word *t); void readMS5535Coefficients();
void InitMS5535(); void wait(word t_wait);
//void setupTimer0(word timeout); void SetupCounter0(); word GetCounter(); #endif 3. MS5535.c #include "MS5535.h" word xdata w1,w2,w3,w4; word xdata c1,c2,c3,c4,c5,c6; void InitMS5535() {
PORTDIRBIT(1, 0, POUT); //for SCLK MS5535 PORTDIRBIT(1, 1, POUT); //for DIN MS5535 PORTDIRBIT(0, 3, PIN); //for DOUT MS5535 PORTDIRBIT(2, 3, POUT); //for MSCLK MS5535
// Setup PWM2 pin direction PORTDIRBIT(3, 4, POUT);
P_SCLK = 0; P_DIN = 0;
halWait (20, CLKFREQ); //delay 20ms
// Configure timer 2 as a PWM timer, max timeout interval halConfigTimer23(TIMER2 | TIMER23_PWM, 0, CLKFREQ); PWM2_SET_PERIOD(1); PWM2_SET_DUTY_CYCLE(DUTY_CYCLE); TIMER2_RUN(FALSE); readMS5535Coefficients(); } //reset sequence void resetMS5535() { byte xdata i; P_SCLK = 0; P_DIN = 0; wait(2);
for(i=0;i<21;i++) {
if(i<16) P_DIN = !P_DIN; P_SCLK = 0; wait(2); P_SCLK = 1; wait(2); }
P_SCLK = 0;
halWait (SCLK_W, CLKFREQ); //delay 1ms halWait (SCLK_W, CLKFREQ); //delay 1ms return;
}
word readMS5535param(word type) {
word xdata d; byte xdata i,n;
if((type==MS5535_P) || (type==MS5535_T)) n=9; else n=11; resetMS5535(); P_SCLK = 0; wait(2); //setup for(i=0;i<=n;i++) {
P_DIN = type & 0x1; type = type >> 1; P_SCLK = 0; wait(2); P_SCLK = 1; wait(2); } P_SCLK = 0; wait(2); P_SCLK = 1; wait(2); P_SCLK = 0; wait(2); P_SCLK = 1; wait(2); P_SCLK = 0;
halWait (50, CLKFREQ); //delay 1ms
//read data d = 0; for(i=0;i<16;i++) { P_SCLK = 1; wait(2); P_SCLK = 0; d = (d<<1) | P_DOUT; wait(2); }
P_SCLK = 1; wait(2); P_SCLK = 0; wait(2); return d;
}
void readMS5535Values(word *p,word *t) {
double xdata dt, off, sens, pressure1,temperature1; double xdata fd1, fd2, x;
word xdata d1_arg, d2_arg;
d1_arg = readMS5535param(MS5535_P); d2_arg = readMS5535param(MS5535_T);
d1_arg = d1_arg & 0xFFFF; d2_arg = d2_arg & 0xFFFF; fd1 = (double) d1_arg; fd2 = (double) d2_arg;
dt = -10000.0 + fd2 - (8.0 * c5);
off = 10000.0 + c2 + ( ( ( c4-250.0) * dt ) / 4096.0); sens = 3000.0 + (c1 / 2.0) + ( ( ( c3+200.0) * dt ) / 8192.0);
pressure1 = 1000.0 + (( sens * (fd1- off)) / 4096.0); temperature1 = ( 200 + (( dt * (c6+100.0) ) / 2048.0)); *p = (word)pressure1; *t = (word)temperature1; } void readMS5535Coefficients() { w1 = readMS5535param1(MS5535_W1); w2 = readMS5535param1(MS5535_W2); w3 = readMS5535param1(MS5535_W3); w4 = readMS5535param1(MS5535_W4); c1 = w1 >> 3;