20643| 5
|
[进阶] 利用XBee实现Arduino点对点无线通信 |
新人来发帖了,望各位大神多多指教。 最近在尝试使用XBee的通信,被各种概念各种绕,稍稍理解一些,做了个小小的试验,也把自己理解的拿出来一起交流。主要是通过XBee来实现两个Arduino之间的点对点通信。试验的功能是通过按键无线控制LED的开关。 XBee是一块由美国DigiInternational 公司开发的实现无线传输的模块,采用的是ZigBee无线通信技术,它的原理可以简单理解为单片机与XBee通过串口通信和XBee之间的通信,这样实现单片机之间的信息传递,XBee模块既可以实现点对点的通信即两块XBee之间的通信,也可以实现点对多点的网络通信,即类似于有一个主XBee模块和多个从XBee模块组成的网络。XBee的优点是传输误码率底,耗能低。传输距离相对较短。 XBee的型号有很多种,这次我使用的是1mWS1,就是这货 使用XBee需要使用扩展模块连接到Arduino上,或者使用带有XBee或WiFi Bee插口的Arduino, 我选了一块DFRobot的Romeo V2.2和 Leonardo V1.2(如图) 需要注意的是,如上面所说,XBee是通过串口通信(即TX,RX口)实现与单片机的通信,同时Arduino与电脑之间的通信也是通过串口,因此如果条件允许,使用带2个串口的板子会容易一些(如我用的Romeo和Leonardo),如果使用只有1个串口的板子(如UNO),那串口会被占用,导致XBee和Arduino之间不能通信,除非你再设置一个软串口,软串口的设置可以参考网站https://mc.dfrobot.com.cn/thread-2685-1-1.html 好了,可以开始做我的无线遥控开关了 首先,给两块板子烧录以下代码,实现2个串口之间的通信 [mw_shl_code=applescript,true]voidsetup() { Serial.begin(9600); //初始化usb串口并设置波特率为9600 Serial1.begin(9600); //初始化xbee或WIFI Bee串口并设置波特率为9600 } void loop() { if(Serial1.available()>0)//串口1有数据测发送到串口0 { Serial.write(Serial1.read()); } if(Serial.available()>0)//串口0有数据则发送到串口1 { Serial1.write(Serial.read()); } }[/mw_shl_code] 然后我们要在XCTU上对XBee进行配置 1.点击搜索 2. Next 3. 注意选择的波特率,Finish 4.然后就可以看到添加的两个模块 5.单击一个模块可以显示它的详细资料 我们需要先点击Default,把所有项目设为默认值,然后点Write,把默认值写入XBee,之后我们要确认两个XBee的Channel,PA ID相同,这样它们就可以相互通信了,也可以把按键所在的XBee写为主站点,把CE那项改为Coordinator[1],要控制的XBee写为从站点,把CE改为 End Device[0] 好了,两个XBee配对成功! 可以打开工作间看看两者可不可以通信 两个模块都得打开 可以看到两个模块间的“交流” 配置完XBee就差不多了, 把按键插在引脚7上 现在可以把两端代码分别烧录在Romeo和Leonardo上了 [mw_shl_code=applescript,true] /*此代码实现按键控制LED亮暗同时往串口发送亮暗信号*/ int LED =13; // LED 所在引脚 int BUTTON =7; // 按键所在引脚 int val =0; // 存储 LED 高低电平值 int old_val =0; // val 之前的值 int state =0; // LED 状态,1亮 0暗 void setup(){ pinMode(LED, OUTPUT); // LED 为输出 pinMode(BUTTON, INPUT); // BUTTON 为输入 Serial1.begin(9600); // 此处用串口Serial1通信 } void loop() { val = digitalRead(BUTTON); // 读取并存储按键引脚的值 // 按键按下代表输入值为 HIGH if ((val == HIGH) && (old_val ==LOW)) { state = 1 - state; delay(10); } old_val = val; // 消抖 if (state == 1) { digitalWrite(LED, HIGH); // LED 亮 Serial1.write('H'); } else { digitalWrite(LED, LOW); // LED 暗 Serial1.write('L'); } } ************************************************************************************************ /*此代码为接收串口信号值并控制LED亮暗*/ int LED =13; // 设置 LED 引脚 void setup(){ pinMode(LED, OUTPUT); // LED 为输出 Serial1.begin(9600); // 串口Serial1通信 } void loop(){ // 当串口有收到信号时 if (Serial1.available()) { char c = Serial1.read(); // 定义串口读数 if (c == 'H') { digitalWrite(LED, HIGH); } else { digitalWrite(LED, LOW); } } }[/mw_shl_code] 好啦,一个无线遥控开关做完了,希望大家多多指正 中间的那两个就是引脚13对应的LED 参考资料 |
LZ,我用XCTU连接两个XBEE,一个设置为协调器,一个设置为路由器,互相给了对方的地址。但是协调器发送数据,路由器收不到,写完数据之后是还要点发送什么的吗?好像也没有这个按键 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed