2013年4月11日 星期四

Arduino + XBee







美国DIGI公司的XBee模块无线通讯实验  2012-08-26 10:34
        Zigbee是一种短距离、低功耗的无线通信技术名称。这一名称来源于蜜蜂的八字舞,由于蜜蜂(bee)是靠飞翔和“嗡嗡”(zig)地抖动翅膀的“舞蹈”来与同伴传递花粉所在方位信息,也就是说蜜蜂依靠这样的方式构成了群体中的通信网络。其特点是近距离、低复杂度、自组织、低功耗、低数据速率、低成本。主要适合用于自动控制和远程控制领域,可以嵌入各种设备。简而言 之,ZigBee就是一种便宜的,低功耗的近距离无线组网通讯技术。
    DIGI旗下的MaxStream公司是一家非常有名的无线通信元件制造商,其ZigBee产品上加了一个很贴切的名称XBee,XBee小型但却是一个功能完善的ZigBee收发器(即接收器/发射器),它是双向操作,可交替地发射或接收数据(半双工式)。
    DIGI提供有两种版本,XBee和XBee PRO两版本都是有相同的功能和引脚兼容,唯一的差异是发射功率,XBee为最大2mW,而XBeePRO则最大60mW。我这次实验采用的是发射功率是1mW,传输距离为100米的XBee模块,比较XBee PRO模块肯定便宜些,也不耽误体验ZigBee技术。可以在DFRobot公司网站支付宝购买,网址:http://www.dfrobot.com.cn/                 XBee/XBeePRO模块是一款内置协议栈的ZigBee模块,它通过串口使用AT命令集方式设置模块的参数,并通过串口来实现数据的传输。为了缩短客户的开发期,提供了X-CTU配置软件,用它可以方便地配置XBee模块的所有参数。    XBee模块具有各个国家地区认证,在国外应用非常广泛, 包括智能家居,远程控制,无线抄表,传感器,无线检测,资产管理等,同时还有对应的iDigi平台,提供各种常用的接入方式,更加方便远程控制。
   XBee模块与Arduino之间其实就是通过串行接口(即Tx和Rx引脚)进行通信。对于简单的点对点通信来讲,只需要通过串行接口向XBee模块写数据就可以实现数据的发送;当XBee模块通过无线通道接收到数据时,通过读串行接口可以很方便地获得这些数据,使用方式和APC220以及DF-Bluetooth蓝牙模块雷同。用X-CTU软件一次配置好参数后,两个插上XBee模块的Arduino控制器就可以像有线RS232串口通信一样相互传送数据了!那么如何配置XBee模块参数?需要:一:安装X-CTU软件并更新为最新版;二、XBee适配器并安装FIDI驱动。
     通过DIGI官方网址下载X-CTU软件,网址:http://www.digi.com/support/productdetail?pid=3352&type=firmware。 
 
   DFRobot公司出品的XBee适配器驱动就是Arduino Duemilanove控制器的驱动,因为它们都是采用了FIDI USB驱动,如果您已经安装了Arduino Duemilanove控制器的驱动,就不用安装了,如果您使用的是Arduino UNO控制器,可以在Arduino官网下载一个Arduino 0018版编程软件,它里面的drivers目录里就可以找到这个驱动。如图:(所有图片双击,都可以放大看!
     PC机通过USB线直接与XBee适配器连接,方便对XBee模块进行配置,把XBee模块按照正确方向,插到XBee适配器上,然后,用USB电缆把XBee适配器与PC机连接好之后, 运行X-CTU软件。
    首先我们在“PC Settings”中里选择XBee适配器映射出来的串口通信端口(我实验中映射出的串口号为COM4),并设置好波特率9600b/s等参数。XBee模块出厂里默认的设置为9600,8N1。
 
    点击“Test/Query”按钮,测试XBee模块是否能连接上。如果一切正常,我们将看到如下图中的Com test对话框,会显示模块型号及版本号。
   测试通过后,转到“Modem Configuration”选项。点击“Download new versions...”按钮,升级软件(把所有杀毒软件暂时退出)。
   先点击“Modem Parameters and Firmware”中的“Read”按钮读出XBee模块中的当前参数,接着在读出的“Networking & Security”中将“Channel”设为“C”,将“PAN ID”设置为“1234”。
  在“Serial interfacing”的“Interface Data Rate”中,可以修改XBee的波特率,XBEE模块默认波特率9600,可以不用修改,但我这次实验还是把波特率从9600b/s改成了115200b/s。
  上述主要参数设置好后,点击“Write”按钮将参数写到XBEE模块中,这里只做一个最简单的点对点网络,所以只需利用XBee适配器,把2个XBee模块的参数设置一致即可。
    这时如果您突然打算,把“Write”到XBee模块中的参数再“Read”出来,会出现问题,因为您已经把XBee模块的波特率设置为115200b/s,所以必须在X-CTU界面的“PC Settings”选项中把波特率从9600改为115200,才能“Read” 读取XBee模块参数。
   现在可以把两个XBee模块从适配器上拔下来,再插到Arduino控制板上的XBee V5传感器扩展板的专门插槽里。
    OK,编写一个串口通信程序,测试下XBee无线通信是否正常。测试结果,当然没问题。
   这个无线通信实验较简单,就是:按下与Arduino主机连接的亮灯按钮或者关灯按钮,通过无线通讯,控制Arduino从机上的LED灯亮灭。
    注意:下载程序到Arduino控制器时,不要把XBee模块插在Arduino控制器的传感器扩展板V5上,程序下载完再把它插上去。
主机程序:
int button_open =4;//开灯按钮连在数字端口4
int button_close =5; //关灯按钮连在数字端口5
char flag;//定义“向从机发送LED灯亮灭标志”的变量
void setup()
{
  pinMode(button_open, INPUT); //设置按钮为输入模式
  pinMode(button_close, INPUT);
  Serial.begin(115200);//启动串口通信,波特率为115200b/s
}
void loop()
{
  //如果亮灯按钮按下同时关灯按钮松开
  if( digitalRead(button_open)==LOW&&digitalRead(button_close)==HIGH)
  {
    flag='a';
    Serial.print(flag);//向从机发送灯亮标志
  }
 //如果关灯按钮按下同时亮灯按钮松开
 if(digitalRead(button_close)==LOW&&digitalRead(button_open)==HIGH)
  { 
    flag='b';
    Serial.print(flag);//向从机发送灯灭标志
  }
  delay(20);//延时,等待数据发送成功
}
 
从机程序:
int ledpin=9;//LED灯连在数字端口9
int val;   //定义“接受主机发来的LED灯亮灭标志”的变量
void setup()
{
  pinMode(ledpin,OUTPUT);//设置LED灯为输出模式
  digitalWrite(ledpin,HIGH);//初始化使LED灯熄灭
  Serial.begin(115200);//启动串口通信,波特率为115200b/s
}
void loop()
{
  if(Serial.available()>0) //查询串口有无数据
  {
        val=Serial.read();//读取主机发送的数据
        if(val=='a')//如果主机发送字符'a',则点亮LED
        {
          digitalWrite(ledpin,LOW);//LED灯点亮          
        }
        if(val=='b')//如果主机发送字符'b',则熄灭LED
        {
          digitalWrite(ledpin,HIGH);//LED灯熄灭           
        }
  }     
}
    这次无线通讯实验采用的是1mW的XBee模块,所以对电源要求不高,如果采用发射功率60mW,传输距离1600米的XBee PRO模块,耗电也相对大些,直接用USB供电就有点小牛拉大车的感觉,所以建议使用外部供电,保证模块能正常工作。

沒有留言:

張貼留言

Messaging API作為替代方案

  LINE超好用功能要沒了!LINE Notify明年3月底終止服務,有什麼替代方案? LINE Notify將於2025年3月31日結束服務,官方建議改用Messaging API作為替代方案。 //CHANNEL_ACCESS_TOKEN = 'Messaging ...