查看: 6597|回复: 5

[高级教程] 利用XBee实现Arduino点对点无线通信

[复制链接]
本帖最后由 Robert_Shuai 于 2017-4-21 14:52 编辑

新人来发帖了,望各位大神多多指教。

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

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

XBee的型号有很多种,这次我使用的是1mWS1,就是这货
IMG_1177.JPG
具体的选型可以参考网站http://mc.dfrobot.com.cn/thread-10088-1-1.html

使用XBee需要使用扩展模块连接到Arduino上,或者使用带有XBeeWiFi Bee插口的Arduino, 我选了一块DFRobotRomeo V2.2 Leonardo V1.2(如图)
IMG_1181.JPG
需要注意的是,如上面所说,XBee是通过串口通信(即TXRX口)实现与单片机的通信,同时Arduino与电脑之间的通信也是通过串口,因此如果条件允许,使用带2个串口的板子会容易一些(如我用的RomeoLeonardo),如果使用只有1个串口的板子(如UNO),那串口会被占用,导致XBeeArduino之间不能通信,除非你再设置一个软串口,软串口的设置可以参考网站http://mc.dfrobot.com.cn/thread-2685-1-1.html

好了,可以开始做我的无线遥控开关了

首先,给两块板子烧录以下代码,实现2个串口之间的通信

voidsetup()      
{   
  Serial.begin(9600);  //初始化usb串口并设置波特率为9600  
  Serial1.begin(9600);  //初始化xbeeWIFI Bee串口并设置波特率为9600     
}
void loop()   
{   
  if(Serial1.available()>0)//串口1有数据测发送到串口0   
  {
      Serial.write(Serial1.read());
  }   
    if(Serial.available()>0)//串口0有数据则发送到串口1  
  {
      Serial1.write(Serial.read());   
  }  
}

然后我们要在XCTU上对XBee进行配置
1.点击搜索
1.png
2. Next
2.png
3. 注意选择的波特率,Finish
3.png
4.然后就可以看到添加的两个模块
4.png
5.png

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

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

配置完XBee就差不多了,
把按键插在引脚7
IMG_1185.JPG
现在可以把两端代码分别烧录在RomeoLeonardo上了

/*此代码实现按键控制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);
      }
   }
}

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

IMG_1182.JPG
中间的那两个就是引脚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

支持
回复 支持 反对

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
wifi气象站

硬件清单

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

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

mail