18240浏览
查看: 18240|回复: 5

[进阶] 利用XBee实现Arduino点对点无线通信

[复制链接]
新人来发帖了,望各位大神多多指教。

最近在尝试使用XBee的通信,被各种概念各种绕,稍稍理解一些,做了个小小的试验,也把自己理解的拿出来一起交流。主要是通过XBee来实现两个Arduino之间的点对点通信。试验的功能是通过按键无线控制LED的开关。

XBee是一块由美国DigiInternational 公司开发的实现无线传输的模块,采用的是ZigBee无线通信技术,它的原理可以简单理解为单片机与XBee通过串口通信和XBee之间的通信,这样实现单片机之间的信息传递,XBee模块既可以实现点对点的通信即两块XBee之间的通信,也可以实现点对多点的网络通信,即类似于有一个主XBee模块和多个从XBee模块组成的网络。XBee的优点是传输误码率底,耗能低。传输距离相对较短。

XBee的型号有很多种,这次我使用的是1mWS1,就是这货
利用XBee实现Arduino点对点无线通信图1
具体的选型可以参考网站https://mc.dfrobot.com.cn/thread-10088-1-1.html

使用XBee需要使用扩展模块连接到Arduino上,或者使用带有XBeeWiFi Bee插口的Arduino, 我选了一块DFRobotRomeo V2.2 Leonardo V1.2(如图)
利用XBee实现Arduino点对点无线通信图13
需要注意的是,如上面所说,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.点击搜索
利用XBee实现Arduino点对点无线通信图2
2. Next
利用XBee实现Arduino点对点无线通信图3
3. 注意选择的波特率,Finish
利用XBee实现Arduino点对点无线通信图4
4.然后就可以看到添加的两个模块
利用XBee实现Arduino点对点无线通信图5
利用XBee实现Arduino点对点无线通信图6

5.单击一个模块可以显示它的详细资料
我们需要先点击Default,把所有项目设为默认值,然后点Write,把默认值写入XBee,之后我们要确认两个XBee的Channel,PA ID相同,这样它们就可以相互通信了,也可以把按键所在的XBee写为主站点,把CE那项改为Coordinator[1],要控制的XBee写为从站点,把CE改为 End Device[0]
利用XBee实现Arduino点对点无线通信图7
利用XBee实现Arduino点对点无线通信图8
好了,两个XBee配对成功!
可以打开工作间看看两者可不可以通信
利用XBee实现Arduino点对点无线通信图9
两个模块都得打开
利用XBee实现Arduino点对点无线通信图10利用XBee实现Arduino点对点无线通信图11利用XBee实现Arduino点对点无线通信图12

可以看到两个模块间的“交流”

配置完XBee就差不多了,
把按键插在引脚7上
利用XBee实现Arduino点对点无线通信图15
现在可以把两端代码分别烧录在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]

好啦,一个无线遥控开关做完了,希望大家多多指正

利用XBee实现Arduino点对点无线通信图14
中间的那两个就是引脚13对应的LED


参考资料

hnyzcj  版主

发表于 2017-4-21 15:15:22

顶起
回复

使用道具 举报

iooops  中级技匠

发表于 2017-4-30 23:54:13

反正我只知道XBEE炒鸡贵。。
回复

使用道具 举报

iooops  中级技匠

发表于 2017-4-30 23:54:57

楼主居然试验成功了 可喜可贺
回复

使用道具 举报

DFrJLXvrlGV  学徒

发表于 2019-1-7 11:34:24

LZ,我用XCTU连接两个XBEE,一个设置为协调器,一个设置为路由器,互相给了对方的地址。但是协调器发送数据,路由器收不到,写完数据之后是还要点发送什么的吗?好像也没有这个按键
回复

使用道具 举报

gada888  版主

发表于 2019-1-10 12:21:57

支持
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
关于楼主
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail