|
本帖最后由 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);
} }
|
|