2. LÝ THUYẾT
1.4.2. Module Xbee:
Tổng quan về module XBee
Hình21 Module Xbee và Xbee Pro trong thực tế
Bảng 2 Tên gọi và chức năng các chân của module Xbee
Hoạt động của module Xbee
Serial communications
UART Data Flow
Thiết bị có giao tiếp UART có thể kết nối trực tiếp với module Xbee như hình dưới.
Hình23 Hệ thống sơ đồ dòng data qua giao tiếp UART
Serial Data
Dữ liệu truyền vào module UART thông qua chân DI (pin 3) như một tín hiệu liên tục không đồng bộ. Tín hiệu phải idle hight khi không có dữ liệu được truyền.
Mỗi byte dữ liệu bao gồm một start bit (low), 8 dữ liệu bits và 1 stop bit (hight). Hình vẽ dưới đây minh họa cho mô hình chuỗi bit dữ liệu truyền vào module.
Hình24 Gói dữ liệu UART 0x1F truyền qua RF module
Module UART làm nhiệm vụ định thời và kiểm tra chẵn lẻ, đây là điều cần thiết cho việc truyền thông tin. Chuỗi thông tin dựa vào 2 UARTs được cấu hình với các thiết lập tương thích (baud rate, parity, start bit, stop bit, data bits).
Flow Control
Hình25 Sơ đồ luồng dữ liệu nội bộ
DI (Data In) Buffer
Khi chuỗi dữ liệu truyền vào RF module thông qua DI pin (pin 3), dữ liệu sẽ được lưu trữ trong DI buffer cho đến khi có thể xử lý.
Hardware Flow Control (𝑪𝑻𝑺 ): Khi DI buffer còn 17 bytes trống; mặc định, module sẽ de-assert 𝐶𝑇𝑆 (hight) để ra tín hiệu cho host device ngừng gởi dữ liệu. 𝐶𝑇𝑆 sẽ re-asserted sau khi DI buffer đã có đủ 34 bytes trống.
o Gửi dữ liệu nhỏ hơn so với độ lớn của DI buffer
o Giao diện UART có tốc độ truyền thấp hơn tốc độ dữ liệu
Trƣờng hợp DI buffer có thể đầy hay tràn:
Nếu module nhận một chuỗi dữ liệu liên tục, một vài dữ liệu gửi đến chân DI sẽ được lưu ở DI buffer. Và dữ liệu ở DI buffer sẽ được truyền over-the-air khi module không còn nhận dữ liệu RF trong mạng.
DO Buffer (Data out)
Khi dữ liệu RF được nhận, dữ liệu vào DO buffer và được gửi ra khỏi serial port đến host device. Một khi DO buffer đã đầy thì bất kỳ dữ liệu nào truyền vào đều mất.
Hardware flow control (𝑹𝑻𝑺 ): Nếu 𝑅𝑇𝑆 cho phép flow control (D6 (DIO6 Configuration) Parameter = 1), dữ liệu sẽ không thể truyền ra khỏi DO buffer khi mà 𝑅𝑇𝑆 (pin 16) là de-asserted (hight)
Hai trƣờng hợp mà DO buffer đầy hay tràn:
o Nếu tốc độ dữ liệu RF cao hơn tốc độ dữ liệu cấu hình của
module, module sẽ nhận dữ liệu từ transmitting module nhanh hơn so với tốc độ nó có thể truyền dữ liệu đến host.
o Nếu host không cho phép module truyền dữ liệu ra khỏi DO
buffer, việc này cũng có thể làm cho DO buffer của module bị đầy hay tràn.
Xbee/Xbee-Pro addressing
Mỗi gói dữ liệu RF đều chứa đựng Source address và Destination address ở vùng header của nó. Xbee hỗ trợ cả 64 bit address và 16bits address. 64 bits address là duy nhất và được quy định bởi nhà sản xuất và có thể đọc thông qua SL (Serial number low) và SH (Serial number hight). Module sẽ sử dụng 64bits address của nó như là source address nếu như MY (16bits address) của nó có giá trị là “0xFFFF” hay “0xFFFE”.
Để gởi một gói dữ liệu đến một module sử dụng 64bits address: ta phải thiết lập Destination address (DL+DH) bằng với (SL+SH) của module đó.
Để gởi một gói dữ liệu đến một module sử dụng 16bits address: ta phải thiết lập giá trị DH = 0 và DL bằng với giá trị MY của module đó.
Chế độ Unicast:
Ở mặc định thì xbee sẽ hoạt động ở chế độ Unicast. Unicast hỗ trợ retries. Khi đang ở mode này, receiving module sẽ gởi ACK cho transmitting module khi nhận được gói dữ liệu từ transmitter này. Nếu như transmitting module không nhận được gói ACK này thì nó sẽ tiến hành gởi lại 3 lần hoặc cho đến khi nhận được gói ACK.
Short 16bits address. Module có thể được cấu hình để sử dụng 16 bits address như một source address (bằng cách thiết lập giá trị MY < 0xFFFE). Thiết lập DH = 0 và DL <0xFFFE thì destination address sẽ sử dụng 16bits address. Và để 2 module có thể truyền phát cho nhau thì destination address của transmitter phải bằng MY của receiver.
Bảng 3 Ví dụ về đặt địa chỉ cho 2 module
Long 64bits address. Module sẽ sử dụng Long 64 bits address như là source address khi mà giá trị MY của nó bằng 0xFFFF hay 0xFFFE. Và Long 64bits address được lưu trữ trong giá trị SH và SL. Khi đó để 2 module truyền được cho nhau thì Destination address (DL và DH) của transmitter phải bằng với Source address (SL và SH) của receiver.
Chế độ Broadcast:
Khi thiết lập chế độ Broadcast thì receiver sẽ không gởi gói ACK cũng như transmitter sẽ không tự động re-send gói tin như Unicast. Để gởi một gói tin Broadcast thì ta cần thiết lập giá trị cho DH và DL như sau:
- DL (Destination low address) = 0x0000FFFF
- DH (Destination hight address) = 0x00000000 (giá trị mặc định).
Các mode hoạt động của Xbee
Module Xbee hoạt động ở 5 mode như hình dưới:
Hình26 Các mode hoạt động của Xbee
Idle Mode:
Khi không truyền hay nhận dữ liệu, module RF sẽ ở chế độ Idle mode. Module sẽ chuyển sang hoạt động ở các mode khác trong những trường hợp sau đây:
- Transmit mode (Serial data được nhận ở DI buffer)
- Receiver mode (RF data hợp lệ nhận được bởi anten)
- Sleep mode (Điều kiện để vào sleep mode được đáp ứng)
- Command mode (Command Mode Sequence được ban hành)
Transmit/Receive mode:
RF data Packets Mỗi gói tin đều chứa một trường source address và destination address.
Truyền trực tiếp và gián tiếp (direct and indirect transmission): có 2 phương pháp đã truyền dữ liệu:
- Trực tiếp – Dữ liệu sẽ được truyền ngay cho destination address
- Gián tiếp – Một gói dữ liệu sẽ duy trì trong một khoảng thời gian và chỉ truyền
tại ở coordinator. Chế độ truyền gián tiếp này rất hữu dụng khi để chắc chắn rằng gói tin được giao cho một sleeping node. Coordinator có thể lưu trữ 2 thông tin gián tiếp.
Giá trị SP (cyclic sleep period) của coordinator phải được thiết lập bằng với khoảng thời gian ngủ của end device nào có khoảng thời gian ngủ dài nhất. Giá trị SP của coordinator xác định khoảng thời gian mà nó sẽ giữ lại một indirect message trước khi loại bỏ nó.
Trong mạng NonBeacon, một End device sẽ phải hỏi coordinator mỗi khi nó thức dậy từ chế độ sleep để xem coordinator có indirect message cho nó không. Việc này được thực hiện tự động mỗi khi module thức dậy (sau khoảng thời gian SP)
Acknowledgement: Nếu một gói tin (không phải broadcast) được gởi đi, module sẽ mong chờ nhận được một ACK từ destination node. Nếu không nhận được ACK, nó sẽ truyền lại 3 lần hay cho đến khi nào nhận được ACK.
Sleep mode:
Sleep mode sẽ cho phép module vào trạng thái tiêu thụ ít công suất khi module này không được sử dụng. Để vào sleep mode thì một trong các điều kiện dưới đây phải thỏa (giá trị SM của module phải khác 0):
- Sleep_RQ (pin 9) phải ở mức cao
- Module đang ở trạng thái Idle (không truyền nhận dữ liệu) trong một khoảng
thời gian được xác định bởi giá trị ST (Time before sleep). (Lưu ý rằng ST chỉ có giá trị khi SM bằng 4 hoặc 5)
Bảng 4 Cấu hình Sleep Mode
Thiết lập chế độ sleep mode Sự thay đổi để vào Sleep Mode Sự thay đổi để ra khỏi Sleep Mode Đặc tính Lệnh liên quan Công suất tiêu thụ Pin Hibernate (SM=1) Assert (high) Sleep_RQ (pin 9) De-assert (low) Sleep_RQ Pin/Hostcontrolled/ Nonbeacon systems only/ Lowest Power
(SM) < 10 μA (@3.0 VCC) Pin Doze (SM=2) Assert (high) Sleep_RQ (pin 9) De-assert (low) Sleep_RQ Pin/Hostcontrolled/ Nonbeacon systems only/ fastest
wake-up Cycle Sleep (SM =4-5) Tự động vào Sleep mode, được xác định bởi giá trị SM và ST (hoặc quá trình chuyển đổi cạnh xuống của pin 9 khi SM=5) Sự chuyển đổi xảy ra sau thời gian ngủ (được xác định bởi SP) RF module wakes in pre-determined time intervals to detect if RF data is present/ When SM = 5, NonBeacon systems only) (SM), SP, ST < 50 μA when sleeping
Pin/Host-controlled sleep mode
Pin Hibernate (SM=1)
o Pin/Host-controlled
o Dòng <10µA (tại VCC=3V)
o Wake-up time: 13.2 msec
Chế độ pin hibernate tối thiểu tiêu hao năng lượng cho module khi ở trong trạng thái nghỉ ngơi hay không hoạt động. Khi chân Sleep_RQ được đặt mức cao thì module sẽ ngưng tất cả các hoạt động thu phát, truyền nhận dữ liệu để vào trạng thái Idle và sau đó đi vào trạng thái ngủ. Trong khi ngủ nó sẽ không thực hiện bất cứ việc gì.
Để thoát khỏi trạng thái Sleep mode thì ta cần thiết lập mức thấp cho chân Sleep_RQ. Sau đó Module sẽ sẵn sàng để thực hiện việc truyền nhận dữ liệu khi CTS ở mức thấp. Khi module thức dậy, chân 9 phải được de-asserted một khoảng thời gian ít nhất bằng thời gian 2 byte sau khi CTS xuống mức thấp. Điều này để đảm bảo rằng có khoảng thời gian để dữ liệu có thể đi vào DI buffer.
Pin Doze (SM=2):
o Pin/Host-controlled
o Typical power-down current: <50µA (When asleep)
Chức năng Pin Doze giống như chế độ Pin Hibernate. Tuy nhiên trong chế độ này module sẽ tiêu thụ công suất nhiều hơn và Wake-up time nhanh hơn.
Cyclic Sleep mode
Cyclic sleep Remote (SM=4)
o Typical Power-down current: <50µA
o Wake-up time: 2msec
Chế độ này cho phép module kiểm tra tín hiệu RF một cách định kỳ. Mỗi lần thức dậy, module sẽ gởi thăm dò đến coordinator hỏi xem có dữ liệu gởi cho nó không tại thời điểm cụ thể được thiết lập bởi thông số SP. Nếu coordinator có dữ liệu thì nó sẽ truyền cho module remote này. Remote sẽ duy trì trạng thái wake để nhận xong dữ liệu và sẽ trở về trạng thái sleep mode sau khi hết thời gian ST. Nếu không có dữ liệu cho remote, coordinator sẽ không truyền và remote sẽ trở về trạng thái sleep.
Lưu ý: 𝐶𝑇𝑆 luôn xuống mức thấp mỗi khi remote thức dậy.
Cyclic Sleep Remote with Pin Wake-up (SM=5)
Sử dụng mode này để đánh thức sleeping remote module bằng cả RF interface hoặc bằng cách de-asserted of Sleep_RQ. Hoạt động của Cyclic sleep Remote hoạt động như mô tả ở phần trên, thêm vào đó là chức năng Pin-controlled wake-up ở remote module. Chân Sleep_RQ là edge-triggered, không phải là level-triggered. Module sẽ thức dậy khi nó xác định được cạnh xuống ở chân Sleep_RQ và nó sẽ thiết lập trạng thái mức logic thấp cho chân 𝐶𝑇𝑆 ngay khi module sẵn sàng truyền và nhận dữ liệu.
Bất kỳ hoạt động nào xảy ra cũng đều làm reset ST timer do đó module sẽ trở về trạng thái sleep mode khi không thực hiện bất kỳ hoạt động gì trong khoảng thời gian ST.
Command mode:
Để sửa đổi và đọc các thông số RF của module, đầu tiên module cần phải vào chế độ command mode. Có 2 lựa chọn cho Command mode được hỗ trợ là: AT command mode và API Command mode.
AT Command Mode:
Để vào AT command mode: Gởi 3 ký tự “+++” và quan sát khoảng thời gian
bảo vệ trước và sau ký tự lệnh. Tham khảo “Default AT Command Mode Sequence”
dưới đây:
- Không có ký tự nào gởi trong vòng 1giây. (Guard time (GT)=0x3E8).
- Nhập 3 ký tự “+++” trong vòng 1 giây. (CC (Command sequence
character)=0x2B).
- Không có ký tự nào gởi trong vòng 1 giây. (Guard time (GT)=0x3E8).
Sau khi thực hiện những yêu cầu trên, module sẽ gởi “OK/r” ra chân DOUT. Khi đã vào chế độ Command mode, bộ timer sẽ khởi động (CT), và module có thể nhận AT command mode ở chân DIN.
Để gởi AT Command: để gởi 1 AT command và thông số thì ta thực hiện theo cấu trúc sau:
Hình27 Cú pháp để gửi một lệnh AT
Để đọc thông số của module được lưu trong thanh ghi thì ta sẽ bỏ phần Parameter.
Phản hồi từ hệ thống: Khi nhận được AT command thì module sẽ tiến hành phân tích và thực hiện lệnh đó. Sau khi thực hiện thành công, module sẽ gởi thông điệp “OK”. Nếu quá trình thực hiện xãy ra lỗi, module sẽ gởi thông điệp “ERROR”
- Gởi lệnh ATCN cho module
- Nếu module không nhận bất kỳ lệnh AT command nào hợp lệ trong khoảng
thời gian được xác định bởi giá trị CT (Command mode timeout), module sẽ tự động trở lại chế độ Idle.
API Command Mode
API command mode có những ưu điểm sau:
- Acknowledgement và Retried
- Nhận gói RX, chứa đựng source address của transmitting module
- Dễ dàng truyền unicast với nhiều địa chỉ khác nhau và broadcast
- Gói tin được kiểm tra bởi bit checksum.
API Frame: Ta có hai chế độ API mode được hỗ trợ bởi module, ta có thể sử dụng thông số AP để thiết lập chế độ của API mode như sau:
- AP=0 (default): Transparent Operation (UART Serial line replacement)
- AP =1: API hoạt động
- AP =2: API hoạt động (character escaped)
API Operation (API=1): Khi chế độ API này được thiết lập, cấu trúc khung dữ liệu UART sẽ được xác định như hình dưới:
Hình28 Cấu trúc khung dữ liệu UART (AP=1)
API Operation – with Escape Characters (AP =2): Khi API mode hoạt động với AP=2, cấu trúc khung dữ kiệu UART sẽ được xác định như hình dưới đây:
Hình29 Cấu trúc khung dữ liệu UART (AP=2)
API Type: API mode có nhiều kiểu lệnh với mục đích sử dụng khác nhau.
Khung dữ liệu của khung dữ liệu UART tạo thành một cấu trúc API cụ thể như sau:
Hình30 Khung dữ liệu UART & cấu trúc API cụ thể
Mỗi loại API mode sẽ được phân biệt bởi giá trị API Identifier và đồng thời có cấu trúc khác nhau. Ta có thể thống kê các API Identifier cùng với công dụng của chúng trong bảng bên dưới:
Bảng 5 Các loại API Identifier và công dụng của chúng
ID Gói tin
Gói tin mà bạn có thể gửi 0x00
0x01
TX request with 64-bit destination address TX request with 16-bit destination address 0x08
0x09
Local AT command, immediate action Local AT command, queued action
0x17 Remote AT command with 64-bit destination address
Gói tin mà bạn có thể nhận 0x80
0x81
RX with 64-bit source address RX with 16-bit source address 0x82
0x83
Input line states with 64-bit source address Input line states with 16-bit source address
0x88 Local AT response
0x97 Remote AT response
Ta sẽ trình bày cụ thể cấu trúc 2 API Identifier dùng trong đề tài, đó là 0x01 và 0x81 - 0x01: TX (Transmit) Request: 16-bit address
Hình31 Khung TX Packet (16‐bit address)
- 0x81: RX (Receive) Packet: 16-bit Address