索引:
- 总体概述和初始化
- 两块XBee之间的AT模式简单通信
- API模式:远程传感器数字量传输
- API模式:远程传感器模拟量传输
- API模式:发送数字量输出到远程XBEE
第一部分 总体概述和初始化
XBee S2是一块搭载了Zigbee(IEEE802.14.5)通讯协议的微信控制器。使用的电压是2.1-3.6V,电流是40mA@3.3V,室内的传输距离是40米,室外直线传输是120米。数字量引脚是11,模拟量引脚是4,使用的firmware是ZB ZigBee。ZigBee的连接需要使用转接板来连接arduino或者raspberry Pi因为引脚比正常的引脚较小。
ZigBee网络:在一个ZigBee的网络中角色有:
- 协调器Coordinator:每个网络中必须有且只有一个,用于网络的设置,不能够休眠。
- 路由Router:每个网络中可以存在多个,能够作为信号中继器的作用,不能够休眠。
- 端点End Point:每个网络中可以存在多个,不能够作为信号中继器使用,可以休眠来节电。
XBee有两个模式:
- AT模式:数据通过ZigBee进行传输。
- API模式:可以与Xbee进行交互,可以发送指令或者直接接受数据。
使用arduino来连接XBee的方法:
- 用一根线将RESET pin接地
- tx连接tx,
- rx连接rx(平时是交叉连接的,这是唯一这样连的时刻)
- 5v连接5v
- GND连接GND
- 最后把arduino连上电脑就可以使用XCTU了。
XCTU参数配置:
- PAN ID:可以是任意值,但是确保同个网络中的PAN ID一致
- DH 和 DL:如果只想要发送数据到特定的ZigBee,那么就使用DH和DL的值(就是后面的序列号前部和后部)来指定
- DH:0 ,DL:FFFF就是把数据广播给网络中的所有设备
- DH:0,DL:0代表字发送数据给协调器
在I/O设置中可以设置pin是adc还是数字输入、数字输出高位还是低位。
第二部分:两块XBee之间的AT模式简单通讯
设置步骤:
第一块:
- function set: ZIGBEE ROUTER AT
- PAN ID:7779
- JV:ENABLE
- DH:0,DL:0
第二块:
- function set:COORDINATOR AT
- PAN ID:7779
- DH:0,DL:FFFF
然后就可以使用XCTU里面的terminal来进行通讯了。
协调器一秒闪烁一次,路由一秒闪烁量词,发送或接受数据的时候都会闪烁红灯。
接下来加上arduino,这里对xbee保持刚才的设置就可以了,只是加上了arduino使用arduino的串口进行通讯,这里使用的是直接连接的方式,其实如果直接加上转接板也是可以的。
连接路由的arduino(发送数据)
1 2 3 4 5 6 7 8 |
void setup() { Serial.begin(9600); } void loop() { Serial.println("Hello World"); delay(5000); } |
连接协调器的arduino(接受数据)
第三部分:API模式:远程传感器数字量传输
这里使用的例子是在门上安装一个传感器,合上的时候关远程的led,打开的时候亮远程的led。数字量就是0或1,也就是描述开关的状态的量。
修改协调器设置:
- 修改成COORDINATOR API
- PAN ID:17
修改路由设置:
- PAN ID:17
- JV:ENABLE
- I/O D4:DIGITAL INPUT
- IO SAMPLE RATE:3e8(多久读一次)
路由器(发送信息):
1 2 3 4 5 6 7 8 9 10 11 12 13 |
void setup() { } void loop() { if(Serial.avalable()>21){ for(int i=0;i<22;i++){ Serial.print(Serial.read(),HEX); Serial.print(","); } Serial.println(); } } |
这样接受到的就是一大堆数字,需要根据表转换成可读的信息,这是是在协调器的程序中进行过滤接收的。
协调器(接收信息):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
int readValue = 0; void setup() { Serial.begin(9600); } void loop() { if(Serial.available() > 21){ if(Serial.read() == 0x7E){ for(int i=0;i<19;i++){ byte discard = Serial.read(); } readValue = Serial.read(); Serial.print("Door is:"); if(readValue == 0){ Serial.println("open"); }else if(readValue == 16){ Serial.println("closed"); } } } } |
第四部分:API模式:远程传感器模拟量传输
在这一部分我们将传输模拟量(温度),使用的是MCP 9700温度传感器,使用什么传感器不重要,原理都是一样的。
COORDINATOR API MODE
PAN ID:885
ROUTER AT MODE
PAN ID :885
JV:ENABLE
I/O->D3:ADC
SAMPLING Rate:1388
协调器代码思路:路由器直接读取温度,收到的还是一系列的16进制数字,还是需要做数字的选取才能够接收。
第5部分:API模式:发送数字量输出到远程XBEE
协调器代码思路:
每5秒读一次数,发数据用的是Serial.write,要拼接成发送数据的格式。