XBee 控制小车(及传输数据) 初级经验贴-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5785|回复: 4

XBee 控制小车(及传输数据) 初级经验贴

[复制链接]
发表于 2016-10-4 23:21 | 显示全部楼层 |阅读模式
本帖最后由 Treaser 于 2016-10-4 23:23 编辑

0.在楼主想玩xbee时,在整个arduino中文社区都找不到有用的经验贴,而全部是求助帖,现在楼主自学成才,玩会了xbee,于是我要补全这块漏洞。

1.xbee是什么,能不能吃。就不要问我啦,百度一下喽。
2.【起源】楼主玩xbee 是因为有好几本arduino制作的书上都提到了,而且都说“xbee的无线控制简单、廉价”,于是我被忽悠了去买了2个xbee,一共300多。
3.【经历】对于像楼主这样的新手而言,xbee的控制真没那么简单,但是入门以后你就会回过头来看发现自己走了那么多不必要的弯路,所以觉得其实很简单。
在之前楼主曾经发过一个把红外遥控玩的比较透的帖子:http://www.arduino.cn/thread-22228-1-1.html
在这个帖子里楼主总结了自己玩红外控制的经验,并且深刻的认识到了红外遥控的局限。(就是只能发送红外编码,而且你摁住某个键的时候就是发出bug的编码。感觉控制不是很灵。)所以我想找一种更好的无线控制方法,本来要玩蓝牙的,但是被这么多书给忽悠去玩 了xbee。

xbee是用来传输数据的,用来发送控制信号确实有点大材小用,但是你学会控制后,用它来发送数据也会格外的简单了。

A。。。2个Xbee买来,我是先用了X-CTU,把2个xbee连好,由于我是win10的系统,软件的版本也不一样,自己感觉根本无法下手,浪费了多天时间后,终于厚着脸皮,让店家手把手教我,设置好了参数。当用X-CTU能互相收发数据的时候我整晚都兴奋得睡不着觉。
B。。。之后暑假我一直出去玩,兴趣也是转移到了4轴无人机上,一直在那边忙。9月份,楼主浙大开学了。后来想起来还没有做完和xbee有关的实验,于是在国庆节抽了2天出来,最后成功了。感觉也是很难。因为会用X-CTU接收数据和用arduino板来接收数据完全是有点2码事的意思。很多人都去下载xbee的库,比如#include <xbee.h> 其实我根本没用,我的代码里你最后可以看到,只有一个arduino标准库:SoftwareSerial。用xbee库反而感觉有点来的麻烦,也会使你对xbee的理解更加浅。因为xbee其实和所有带有tx、rx的模块一样,是SoftwareSerial类。
C。。。楼主当然也借用了几本书来实现自己的代码,我是改编于原代码的。
D。。。硬件部分:2个Xbee,连接方式:很简答,把xbee的承托板的tx、rx脚(看下面的代码)连到对应的arduino板上。然后吧GND、5V接好,都很简单。我就不发图了。然后烧录程序。

遥控器概况

遥控器概况

小车(接收)

小车(接收)

实地概况

实地概况


E。。。程序:
信号发出板:(注意有几句代码是没用的,在前期调试时留下的,我懒得删了。。。)


#include <SoftwareSerial.h>




const int xb_rx=2;
const int xb_tx=3;
const int ana0=0;
const int ana1=1;
const int ana2=2;
const int dig=10; //????
boolean LEDstate=false;
char mode;


int keyDelay=300;
long previousMillis=0;


SoftwareSerial xbee(xb_rx,xb_tx);


void setup() {
  // put your setup code here, to run once:
  
xbee.begin(9600);


  Serial.begin(9600);
  pinMode(dig,OUTPUT);
  digitalWrite(dig,HIGH);
  pinMode(13,OUTPUT);
  digitalWrite(13,HIGH);
  Serial.begin(9600);
  xbee.print("begin");
  Serial.println("begin");
}


void loop() {
  // put your main code here, to run repeatedly:
  button();
  
}


void button(){
    byte ana0_val;
    byte ana1_val;
   
    unsigned long currentMillis=millis();
    if(currentMillis - previousMillis > keyDelay){
      previousMillis = currentMillis;
    }
   
      if(LEDstate==true)
      { //xbee.print('l');
        Serial.println('l');
        mode='l';
        LEDstate=!LEDstate;}
            
      else{
        //xbee.print('h');
        Serial.println('h');
        mode='h';
        LEDstate=!LEDstate;}
        
        delay(200);
        
      xbee.write(analogRead(ana0)/4);
      xbee.write(analogRead(ana1)/4);
      xbee.write(analogRead(ana2)/4);
      
       /*while(digitalRead(dig)==HIGH){ }
        * while(mode=='l'){  
        xbee.print('l');
        xbee.write(analogRead(ana0)/8);
        Serial.println(ana0_val);
        delay(100);
        if(digitalRead(dig)==LOW) break;   //这部分代码本来是我用串口调试时写的
       }
        
       while(mode=='h'){
        xbee.print('h');
        xbee.write(analogRead(ana1)/8+128);
        Serial.println(ana1_val);
        delay(100);
        if(digitalRead(dig)==LOW)break;
        
        }*/
  
  

  
  }



接收板:


#include <SoftwareSerial.h>
#include <AFMotor.h>
#include <Servo.h>


const int xb_rx=2;
const int xb_tx=3;
//const int LEDpin=0;


AF_DCMotor motorr(4);
AF_DCMotor motorl(3);
Servo myservo;






SoftwareSerial xbee(xb_rx,xb_tx);


void setup() {
  // put your setup code here, to run once:
  
  xbee.begin(9600);
  Serial.begin(9600);
  //myservo.attach(2);
  // myservo.write(90);
  motorl.setSpeed(200);
  motorr.setSpeed(200);
  motorl.run(RELEASE);
  motorr.run(RELEASE);

}


void loop() {//l---light!--left;h-head;
  if(xbee.available()>0){
  // char mode=xbee.read();
   byte num1= xbee.read();
   byte num2= xbee.read();
  // byte num3= xbee.read();
  // Serial.print("mode:");
  // Serial.println(mode);
    Serial.print("num1:");
    Serial.print(num1);
    Serial.print("num2:");
    Serial.println(num2);
    delay(200);
    int left_motor=num1*4;
    int right_motor=num2*4;
   // int servo=map(num3,0,255,0,180);
   
    motorr.run(FORWARD);
    motorl.run(FORWARD);
    motorr.setSpeed(right_motor);
   motorl.setSpeed(left_motor);
   // myservo.write(servo);
   


  }  }

 楼主| 发表于 2016-10-4 23:28 | 显示全部楼层
楼主要分享一点经验:
1.write是传输byte类型数据的。
2.接收端我写了delay(200);发送端也有delay(200);猜想一下假如delay的时间不一样会怎么样。
3.print我之前用来调试发送按键信息的,我感觉这个非常简单,所以最后发的是发送模拟量的。这个难点。

然后大家对于xbee有什么问题就提吧,感觉没太多人看我也没必要全部写清楚。。。

小车的控制视频的话我会早日上传。
 楼主| 发表于 2016-10-6 23:55 | 显示全部楼层
发表于 2016-10-18 19:55 | 显示全部楼层
楼主你好啊,你的程序也没上传完吧。。我想知道你的板子接收数据用的是查询方式还是中断方式?还有你有没有试过隔远一点距离来控制小车,我现在有个问题就是距离远了有时候协调器发送过去小车就没有反应
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 03:48 , Processed in 0.077861 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表