Hình 3.4 Sơ đồ thực nghiệm mạng WSN
Nút CC1010 nối trực tiếp với máy tính qua cổng RS232 (gọi là nút cơ sở) nhận kết quả từ nút cảm nhận (có thể di động xa nút cơ sở). Nút cơ sở sẽ phát tín hiệu yêu cầu thu thập dữ liệu từ các nút cảm nhận theo nguyên tắc hỏi vòng, các nút cảm nhận sau khi nhận được yêu cầu từ nút cơ sở sẽ gửi trả lời
Thí nghiệm tiến hành các phép đo sau :
1.Khoảng cách D lớn nhất có để nút cảm nhân và nút cơ sở còn có thể truyền tín hiệu được cho nhau.
2.Thời gian truyền nhận dữ liệu giữa nút cảm nhận và nút cơ sở.
3.Đo cường độ dòng điện của các nút mạng các trạng thái : ngủ, truyền, nhận dữ liệu ở chế độ lập lịch tập trung.
3.4.1.1 Xác định khoảng cách D lớn nhất giữa các nút mạng để chúng còn có thể truyền nhận có hiệu quả :
a. Chuẩn bị thí nghiệm :
- Địa điểm đo : tại sân trường Đại Học Công Nghệ - Nạp phần mềm nhúng cho các nút mạng.
- Chuẩn bị các phụ kiện : thước dây, máy ảnh…
2 1 3 4 Nút cơ sở Master RS232 Các nút cảm nhận (Slave) Các nút cảm nhận (Slave) Các nút cảm nhận (Slave) Các nút cảm nhận (Slave)
Hình 3.5 Nạp phần mềm cho nút mạng WSN
b. Mô tả quá trình đo đạc : Dùng thước dây để xác định các mốc cần đo, khởi động các nút mạng. Nút cơ sở phát tín hiệu tại một vị trí cố định, sau đó ta di chuyển nút mạng cảm nhận trên các mốc xác định trước, quan sát kết quả trên màn hình LED của nút mạng cơ sở.
c. Kết quả đo :
Lần đo thứ Khoảng cách (M)
Số gói yêu cầu nút cơ sở truyền đi Số gói trả lời nút cơ sở nhận được Tỉ lệ % nhận được 50 100 100 100% 90 100 100 100% 95 100 80 80% 1 110 100 0 0% 50 100 100 100% 90 100 100 100% 95 100 80 80% 96 100 77 77% 97 100 74 74% 100 100 70 70% 2 105 100 5 5% 94 100 100 100 100 100 79 79% 3 102 100 0 0%
Bảng 3.1 Bảng số liệu đo khoảng cách truyền tín hiệu giữa các nút mạng
d. Kết luận :
Đo ngoài trời khoảng cách D giữa nút cơ sở và nút cảm nhận : D < 95m : nhận 100%
95m < D < 100m : nhận 70% - 80%
Công suất phát của chip C1010 với nguồn nuôi 3.3V truyền với khoảng cách D<100 các nút mạng còn nhận được tín hiệu.
3.4.1.2 Xác định thời gian truyền nhận dữ liệu giữa nút cảm nhận và nút cơ sở của mạng WSN trên cơ sở CC1010.
a. Các bước chuẩn bị thí nghiệm: - Nạp phần mềm cho các nút mạng
- Nối nút mạng cơ sở giao tiếp với máy tính qua cổng RS232 - Chạy phần mềm .. để đón kết quả
b. Mô tả thí nghiệm và quá trình đo
- Sử dụng bộ định thời tích hợp sẵn trong vi điều khiển CC1010.
- Cấu trúc của gói dữ liệu đã được sử dụng trong chương trình có dạng như sau:
7 byte 2 byte 2 byte 2 byte 2 byte 2 byte Preamble NútID Data Target Type CRC
Trong đó:
Preamble : các byte dẫn đường dùng để đồng bộ ngưỡng cho bộ thu RF NútID: Địa chỉ của nút truyền.
Data: Thông tin dữ liệu truyền về. Target: Địa chỉ nút nhận.
Type: Loại gói dữ liệu (điều khiển/dữ liệu).
CRC : Byte chứa thông tin kiểm tra lỗi dư thừa vòng.
. Quy trình truyền nhận : bao gồm hai pha Phase 1: pha truyền
Truyền 7 byte dẫn đường
Truyền từng byte và tính CRC cho hết 8 byte
Truyền 2 byte CRC Phase 2 : Pha nhận
Nhận 8 byte dữ liệu
Nhận 2 byte CRC
Kiểm tra CRC
Các bước sử dụng timer để đo, ở đây sử dụng timer0
Khởi tạo timer0 chạy ở chế độ định thời, bộ đếm timer0 sẽ tăng lên mỗi chu kỳ máy(0.2713µs, với tần số thạch anh là 14,746Mhz). Với CC1010 thì một chu kỳ máy = 4 chu kỳ thạch anh
Gọi hàm truyền, đồng thời kích hoạt timer0 bắt đầu đếm.
Khi hàm truyền kết thúc thì cho timer0 dừng đếm.
Giá trị đếm được của timer0 được lưu lại, nhân với 0.2713µs và hiển thị lên màn hình.
Làm tương tự với các phép đo khác (như đo thời gian nhận, tính CRC…)
Chương trình khởi tạo timer0: // Khởi tạo timer0 mode 1
TMOD = (TMOD&0xF0)|0x01;
INT_ENABLE(INUM_TIMER0, INT_ON); INT_GLOBAL_ENABLE(TRUE);
// Các biến đếm
byte xdata counter = 0; ulong xdata timeout; word xdata tCounter;
unsigned int xdata value = 0;
//Reset biến đếm và cho timer chạy tại thời điểm bắt đầu đo counter = 0;
TH0 = 0x00; TL0 = 0x00; TF0 = 0;
TIMER0_RUN(TRUE);
// Dừng timer khi kết thúc đo và in ra thông báo về thời gian đếm được TIMER0_RUN(FALSE);
value = TH0;// thanh ghi đếm của Timer 0 value <<= 8;
value |= TL0;
fTemp = (value*0.2713 + 65535*counter); //
printf("\n\nThoi gian đếm được là: %4.1f us", fTemp); // Hàm ngắt timer0 để tăng biến đếm mỗi khi tmer0 tràn
// Timer0 sẽ đếm từ 0, giá trị đếm tăng lên mỗi 0.2713us, giá trị đếm đạt 65535 thì timer0 tràn, báo ngắt
void TIMER0_ISR() interrupt INUM_TIMER0 { // Reset the timer to generate another interrupt INT_SETFLAG (INUM_TIMER0, INT_CLR);
TIMER0_RUN(FALSE); TH0 = 0x00; TL0 = 0x00; TIMER0_RUN(TRUE); counter++; } // TIMER0_ISR
Chương trình đo thời gian từ nút truyền đến nút nhận
counter = 0; TH0 = 0x00; TL0 = 0x00; TF0 = 0;
TIMER0_RUN(TRUE);
// Tổng thời gian từ lúc bắt đầu truyền đến lúc hết hàm truyền
halRFSendPacket2(PREAMBLE_BYTE_COUNT, txDataBuffer.buffer, PACKET_LENGTH);
TIMER0_RUN(FALSE); value = TH0;
value <<= 8; value |= TL0;
fTemp = (value*0.2713 + 65535*counter);
printf("\n\nThoi gian truyen het 7 byte preamale + 8 byte data + 2 byte CRC16: %4.1f us", fTemp);
Kết quả đo : thời gian truyền hết 137ms
Hình 3.7 Thời gian truyền hết 17 byte dữ liệu từ nút truyền đến nút nhận
Xác định thời gian nhận và xử lý dữ liệu tại nút nhận
counter = 0; TH0 = 0x00;
TL0 = 0x00; TF0 = 0;
TIMER0_RUN(TRUE);
// Tổng thời gian từ lúc bắt đầu nhận đến lúc hết hàm nhận
halRFReceivePacket2(byte timeOut, byte* packetData, byte maxLength);
TIMER0_RUN(FALSE); value = TH0;
value <<= 8; value |= TL0;
fTemp = (value*0.2713 + 65535*counter);
printf("\n\nThoi gian nhan het 7 byte preamale + 8 byte data + 2 byte CRC16: %4.1f us", fTemp);
Kết quả đo thời gian nút nhận và phân tích dữ liệu: 138ms
d. Kết luận
Vậy Tổng thời gian thời gian nút truyền bắt đầu gửi dữ liệu 17 byte cho đến khi nút nhận nhận và phân tích xong dữ liệu là : 137 + 138 = 275 ms
3.4.1.3 Đo cường độ dòng điện của các nút mạng các trạng thái : ngủ, truyền, nhận
dữ liệu ở chế độ lập lịch tập trung.
a. Chế độ lập lịch tập trung
Lập lịch tập trung là một trong nhiều cách tổ chức hoạt động của các nút mạng trong mạng WSN. Với lập lịch tập trung, hoạt động của mạng sẽ do nút cơ sở điều khiển. Tất cả các nút cảm nhận khác trong mạng sẽ hoạt động theo yêu cầu của nút mạng cơ sở, các yêu cầu điều khiển này đã được nút mạng cơ sở sắp xếp cố định và trở thành một lịch trình hoạt động cho mạng đó.
Hoạt động:
Nút cơ sở: Sẽ lần lượt yêu cầu từng nút mạng gửi dữ liệu truyền về. Mỗi nút mạng khi nhận được yêu cầu sẽ phải gửi dữ liệu phản hồi về cho nút cơ sở.
Ban đầu, nút cơ sở gửi yêu cầu tới một nút cảm nhận n (NútID=n). Sau khi gửi gói tin yêu cầu nút n ra ngoài môi trường thì các nút mạng khác cũng đều nhận được yêu cầu đó chứ không riêng nút n nhận được. Tiếp theo nút mạng cơ sở chuyển sang chế độ nhận dữ liệu từ nút mạng cảm nhận truyền về. Lúc này, nút mạng cơ sở sẽ nhận dữ liệu, nếu nhận không thành công thì nhận lại lần nữa. Tuy nhiên, quá trình nhận lại này sẽ được giới hạn về mặt thời gian. Tức là với mỗi một nút cảm nhận, nút cơ sở chỉ dành cho một lượng thời gian nhất định, nếu sau khoảng thời gian đó mà vẫn không nhận được gói dữ liệu truyền về thì tức là nút mạng được yêu cầu đó đã không nhận được yêu cầu hoặc là gói dữ liệu truyền vễ đã gặp phải lỗi truyền nào đó ngoài môi trường dẫn tới nút cơ sở không thể nhận được. Lúc này nút cơ sở sẽ phải bỏ qua nút đó để chuyển tiếp sang yêu cầu nút khác. Nếu trong thời gian đó mà nút cơ sở nhận được thành công gói dữ liệu của nút cảm nhận truyền về thì sẽ tiến hành xử lý gói tin và hiển thị hoặc lưu trữ dữ liệu nhận được đó. Sau khi xử lý xong gói tin, trước khi chuyển sang yêu cầu nút tiếp theo (n+1) thì nút cơ sở sẽ trễ một khoảng tdelay. Lý do phải có khoảng trễ này sẽ được giải thích tại phần hoạt động của nút cảm nhận. Như vậy là nút cơ sở đã hoàn thành việc yêu cầu và nhận gói tin từ một nút cảm nhận trong mạng. Sau đó nút cơ sở sẽ tăng thêm 1 vào địa chỉ của nút sẽ yêu cầu, tức là sẽ yêu cầu nút cảm nhận tiếp theo. Quá trình được lặp lại liên tục, nút cơ sở yêu cầu và nhận dữ liệu của lần lượt từng nút trong mạng, sau khi hết một lượt lại tiến hành quay lại với nút đầu
tiên.
while (TRUE) {
for(i=1;i<max;i++) // max là số nút mạng {
tbcTransmit(i,0xFF);// gửi yêu cầu cho nút I, loại gói tin điều khiển t = (int) sppGetTime(); // lấy thời gian trước khi nhận
do{ //Nếu nhận không thành công sẽ nhận lại cho //toi khi hết 800ms thì thôi.
tbcReceive();
}while((RXI.status != SPP_RX_FINISHED)&&( ((int) sppGetTime()-t)<80)); tbcPrintTable(); // xử lý gói tin
delay(10000);//Thời gian Master đợi các Slave tính toán, xử lý dữ liệu }
}
Giải thuật của nút cơ sở:
Hình 3.9 Giải thuật nút cơ sở
Khởi tạo
Addr = 1 Gửi yêu cầu
Nhận dữ liệu Nhận ok? & tRx<0.8s Xử lý Trễ Addr++ Addr>max? Đ S S Đ
Nút cảm nhận: Luôn ở trạng thái sẵn sàng nhận yêu cầu của nút cơ sở. Ngay sau khi nhận được yêu cầu sẽ tiến hành gửi dữ liệu trở về.
Ban đầu, nút cảm nhận sẽ luôn ở trong trạng thái nhận dữ liệu, nếu nhận không thành công thì nhận lại cho tới khi nhận được gói dữ liệu thành công. Sau khi nhận được gói, nút cảm nhận tiến hành tách từng trường dữ liệu của gói đã nhận được và kiểm tra xem đó có phải nút cơ sở yêu cầu chính nó hay không. Nếu đúng thì nút cảm nhận sẽ trễ một khoảng thời gian ngắn rồi mới tiến hành gửi dữ liệu trở về cho nút cơ sở. Rồi sau đó lại quay trở lại quá trình nhận yêu cầu để chờ tín hiệu yêu cầu lần tiếp theo. Nếu gói tin nhận được không phải gói yêu cầu nó gửi dữ liệu thì có 2 khả năng: hoặc đó là gói tin yêu cầu của nút cơ sở tới một nút khác, hoặc đó là gói tin dữ liệu của một nút cảm nhận khác đang truyền về. Khi đó, nó sẽ quay trở lại việc nhận dữ liệu từ môi trường. Nhưng sau mỗi quá trình nhận thì nút cảm nhận lại phải tiến hành tách các trường dữ liệu trong gói tin nhận được và kiểm tra các trường đó. Các công việc này sẽ tốn một khoảng thời gian và khiến cho nút cảm nhận quay trở lại quá trình nhận yêu cầu muộn hơn nút cảm nhận vừa nhận được yêu cầu và đã gửi dữ liệu đi. Và cũng chính vì quá trình xử lý mất một khoảng thời gian nên nút cơ sở phải trễ đi một khoảng để khi gửi tin yêu cầu thì các nút cảm nhận khác có thể nhận được. Giải thuật nút cảm nhận: Hình 3.10 Giải thuật nút cảm nhận Đ Khởi tạo Nhận yêu cầu Nhận ok?
Kiểm tra địa chỉ
Trễ Truyền dữ liệu
Đ
S
while (TRUE) { do{ tbcReceive(); }while(RXI.status != SPP_RX_FINISHED); if((nútTarget[n]==1)&& (nútType[n]==0xFF)) { delay(20000); // Trễ để tbcTransmit(0xFFFF,0xFF00); } } Ơ b. Lập lịch tập trung kết hợp với lịch ngủ:
Trên thực tế, mạng cảm nhận không dây là mạng có tần suất truyền nhận thấp. Các gói tin truyền trong mạng không đòi hỏi phải có tốc độ nhanh. Trong một số ứng dụng như theo dõi thông tin từ môi trường thì thậm chí còn được sắp xếp một lịch hoạt động và lịch ngủ đều đặn theo chu kỳ. Việc đưa lịch ngủ vào quá trình hoạt động với
2 1 3 4 Nút cơ sở Master RS232 Các nút cảm nhận (Slave) Các nút cảm nhận (Slave) Các nút cảm nhận (Slave) Các nút cảm nhận (Slave)
thời gian hợp lý sẽ giải quyết được vấn đề tiết kiệm năng lượng mà lại không ảnh hưởng tới việc giám sát thông tin môi trường của mạng.
Ý tưởng cho mô hình này như sau: Nút cơ sở sẽ có một lịch hoạt động và lịch nghỉ đan xen nhau và cố định về mặt thời gian. Các nút cảm nhận khác sẽ phải có biện pháp nào đó để có thể hoạt động và nghỉ gần như trùng khớp với lịch hoạt động và lịch nghỉ của nút cơ sở. Như vậy thì toàn mạng sẽ có một khoảng thời gian hoạt động và thơi gian nghỉ tương đối là đều đặn. Trong thời gian hoạt động, mạng sẽ hoạt động dựa trên cơ chế lập lịch tập trung mà ta đã giới thiệu ở trên. Trên thực tế, khoảng thời gian hoạt động và nghỉ của các nút mạng sẽ phụ thuộc vào các yếu tố: yêu cầu đòi hỏi của ứng dụng cho phép thời gian nghỉ là bao lâu, số lượng nút mạng cảm nhận là bao nhiêu sẽ yêu cầu một khoảng thời gian hoạt động tối thiểu đủ để nút cơ sở thu thập dữ liệu có thể thu thập dữ liệu từ tất cả các nút trong mạng.
Giải quyết bài toán: Ta thấy, nút cơ sở sẽ một quá trình hoạt động khá đơn giản, đan xen giữa làm việc và nghỉ. Vấn đề khó khăn ở đây đó là làm sao để các nút cảm nhận có thể cùng làm việc và cùng nghỉ với nút cơ sở một cách tương đối chính xác. Các nút cảm nhận hoàn toàn tách biệt với nút cơ sở và chỉ có thể giao tiếp bằng truyền nhận không dây khiến cho việc đồng bộ thời gian giữa các nút mạng ở đây gặp nhiều khó khăn. Giản đồ mô tả quá trình hoạt động của các nút trong mạng như sau sẽ giải quyết được vấn đề khó khăn đó:
Hình 3.11. Thời gian hoạt động và ngủ của nút mạng Master và Slaver
- Quá trình làm việc của nút cơ sở: nút cơ sở sẽ hoạt động đều đặn với thời gian làm việc là tactive và sẽ nghỉ một khoảng tsleep. Sau đó lại lặp lại quá trình làm việc và nghỉ. Trong quá trình làm việc, nút cơ sở sẽ hoạt động với cơ chế lập lịch tập trung như đã đưa ra ở trên.
Giải thuật cho nút cơ sở:
N tx tsl tactive tsleep T Master Slaver
Hình 3.12 Giải thuật nút cơ sở trong lập lịch tập trung kết hợp với lịch ngủ
Đoạn chương trình viết cho chu trình hoạt động, sau chu trình này là chuyển sang chế độ nghỉ: Thời gian nhận tối đa dành cho một nút là không quá 800ms, tổng số nút cảm nhận là max, tổng thời gian làm việc là time_active.
t3 = (int)sppGetTime(); do{ for(i=1;i<max;i++) { tbcTransmit(i,0xFF); Đ Khởi tạo Addr = 1 Gửi yêu cầu Nhận dữ liệu Nhận ok? & tRx<0.8s Xử lý Trễ Addr++ S Đ Addr > N Nghỉ tsleep S
t2 = (int) sppGetTime(); do{
tbcReceive();
}while((RXI.status != SPP_RX_FINISHED)&&( ((int) sppGetTime()- t2)<80)); tbcPrintTable(); delay(10000); if(((int)sppGetTime()-t3)>time_active) break; }
}while( ((int)sppGetTime()-t3) < time_active );
-Nút cảm nhận: cũng sẽ có khoảng thời gian làm việc và khoảng nghỉ đan xen lẫn nhau. Tuy nhiên để có thể đồng bộ thời gian với hoạt động của nút cơ sở thì nút cảm nhận sẽ phải mất một khoảng thời gian làm việc nhiều hơn chu kỳ làm việc bình thường để xác định điểm làm việc trùng với nút cơ sở.
Ngay sau khi được khởi động, nút cơ sở sẽ tiến hành việc bám vào chu trình làm việc của nút cơ sở. Nút cảm nhận sẽ tiến hành nhận gói tin, nếu nhận lỗi thì nhận lại,