无线遥控机器人修改稿.docx
- 文档编号:30252306
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:37
- 大小:383.92KB
无线遥控机器人修改稿.docx
《无线遥控机器人修改稿.docx》由会员分享,可在线阅读,更多相关《无线遥控机器人修改稿.docx(37页珍藏版)》请在冰豆网上搜索。
无线遥控机器人修改稿
远程遥感机器人项目使用说明书
V1.0
深圳市鸥鹏科技有限公司
2010年11月
项目目标
利用RF无线收发模块、双轴加速度传感器在两轮机器人上实现机器人的无线远程控制。
项目背景
在生活中无线通信具有广泛的应用,例如手机上的蓝牙、遥控玩具、航模、汽车上使用的无线遥控锁等。
RF是无线通信中的一种,它具有易于实现和使用、传输距离远等特点,用户能方便的利用它以串行的方式来发送数据信息、控制信息、或者其他信息。
本项目利用RF无线通讯模块和加速度传感器设计和制作一个远程遥控小型机器人。
本项目主要包括以下几个任务:
1、认识RF发射和接收模块;
2、连接RF到控制板的C51芯片,并测试;
3、基于通信协议的无线通信实现;
4、结合双轴加速度传感器制作远程遥控机器人。
图1RF收发模块实物图
任务一认识RF无线收发模块
433.92MHZ的RF(RadioFreqency)收发模块如图1所示。
RF模块传输速率为1200到19.2K波特率,传输距离可达150米(根据环境不同可达更远距离),可以通过软件方式开启和关闭模块。
使用无线收发射模块非常简单,就像使用串口一样,只需要将模块的数据引脚连接到单片机的串口即可。
同时全新模块为收发一体
图2RF接收发送模块引脚图
RF收发模块引脚如图2所示。
RF接收模块有6个引脚,定义如表2所示:
表1RF收发模块引脚说明
引脚
名称
功能
1
GND
电源地0V(Vss)
2
VIN
电源3.3V~5VDC
3
DATA
串行数据输入
4
T/R
发送/接收选择:
高电平发送,低电平或默认设置为接收
5
PDN
低功耗模式设定引脚,低电平有效
6
RSSI
接收信号强度指示
PDN(Pullingthepowerdown):
当PDN引脚为低的时候接收/发送模块进入低电流状态,模块不会再发送或者接收数据了。
RSSI(接收模块信号强度引脚):
接收信号强度输出,这个引脚产生一个模拟的电压值来反映信号强度,在接收数据的时候这个值会比较稳定。
任务二连接RF到控制板的C51芯片,并测试
单片机的串口资源是有限的,这里引入了软串口,即用软件方式模拟串口通信,通过软串口可以让C51的任何一个I/O口变成串口进行数据的收发。
做一个单向的收发只需要将RF的发射和接收模块分别接到两块单片机教学板的串口,分别组成一个接收机和发射机即可。
在本项目中分别将作为发射的收发模块的数据引脚连接到单片机的P2_1,作为接收的收发模块的数据引脚接到单片机的P2_2引脚如图10-5所示。
图3RF模块与单片机连接
在RF收发模块开始通信之前,最好发送一个同步信号来建立起模块之间的通信连接,虽然不发送同步信息,在发送几个数据信息后也能完成连接,但是使用同步信号更有效。
同步信号是一个高电平为2400μs的脉冲。
发射端测试程序
头文件soft_rs232.h是软串口实现的头文件。
建立工程,输入例程TransmitTest.c
例程TransmitTest.c
#include"soft_rs232.h"
#include
intmain(void)
{
soft_rs232_init();
soft_send_enable();
while
(1)
{
rs_send_string("thisisatestforRF");
delay_nms(200);
}
}
例程TransmitTest.c是如何工作的?
RF发送消息,就像使用串口一样,打印数据就可以了。
rs_send_string()是软串口中打印字符串的函数。
rs_send_string("thisisatestforRF");
接收端测试程序
例程ReceiveTest.c
#include
#include"soft_rs232.h"
/*--------------------------------------------------------------------
定时器2做串口发生器
---------------------------------------------------------------------*/
voidtime2_init_uart(void)
{
EA=1;
T2MOD=0;
T2CON|=0x10;
SCON=0x50;
TH2=(65536-36)/256;
TL2=(65536-36)%256;
RCAP2H=(65536-36)/256;
RCAP2L=(65536-36)%256;
TR2=1;
TI=1;
}
intmain(void)
{
INT16UoutRS232=0;
INT8Utemp;
rs_clear_buffer();
time2_init_uart();
soft_rs232_init();
soft_receive_enable();
while
(1)
{
if(outRS232!
=ReceivePoint)//如果收到数据条件就成立了
{
temp=rs232buffer[outRS232++];
putchar(temp);
outRS232=0;
ReceivePoint=0;
}
}
return0;
}
例程ReceiveTest.c是如和工作的?
例程ReceiveTest.c每接收到一个字符,就把接收到的字符打印到上位机。
程序会通过比较数组指针来判断是否受到数据。
软串口应用说明
软串口,是指用软件方式模拟的串口通信,利用它可以将任何一个I/O实现串口通信,本项目使用的软串口可以在C51上实现2400~9600波特率的通信。
本程序使用一个定时器和任意2个I/O口模拟一个串行口。
1位起始位,8位数据位,1位停止位。
编程说明:
在使用软串口收发数据前,要先调用soft_rs232_init()初始化软串口。
发送:
由接收转换到发送时要先调用soft_send_enable(),它为发送做初始化的工作。
以后就可以调用rs_send_byte()启动发送一个字节的过程,或调用rs_send_string()发送一个字符串数据。
接收:
由发送转换到接收时要先调用soft_receive_enable(),它为接收做初始化的工
作。
接收到的数据存储在rs232buffer[]这个数组中,由ReceivePoint这个变量来指示数组个数。
任务三基于通信协议的无线通信
从测试运行结果可以看到虽然能够收发消息,但要实现真正的通信还要解决如下几个问题:
1、如何判断消息的开头;
2、如何知道消息的长度;
3、如何判别接收的每一个字节是否正确。
要解决这些问题,需要引进一个通信协议,以确保消息准确无误的发送和接收。
基本的单向通信协议
下面介绍一种简单可靠的通信协议。
首先是一个报文头"U!
"(或者是“UUUU!
”),这个报文头用于同步通信和判断一个数据包的开始。
然后是一个数据包,具体内容如下:
数据包格式
|---------------||-----------------||-----------------||------------------------||----------------------|
|数据个数||数据值|...|数据值||冗余校验低位||冗余校验高位|
|---------------||-----------------||-----------------||----------------------||------------------------|
BYTE1BYTE2BYTEn+1BYTEn+2BYTEn+3
Byte1是Char型数据的个数,这里可以从1到16(这里定义数据段最大为16字节),根据这个数值决定了后面具体数据的个数,最少要有一个数据。
Byte2到Byten+1是实际的数据其中n=数据长度+1。
Byten+2和Byten+3是这个包中的最后两个成员,这两个字节组成了一个16-bit的冗余校验值,通过一个冗余校验算法使数据错误的发现率高达99%。
关于通信协议的几点说明:
1、报头“UUUU!
”
RF在通信刚开始的时候会不稳定(即使有同步信号),这时候容易发生数据错误,除了发同步信号外,为了可靠我们发几个字节的数据以稳定通信,选择发“U”是因为“U”的ASC码值是0101,也就是低高低高的电平,最大限度的避免了可能的发送错误。
同时由于接收和发送不能完全的同步,同时传输数度快的时候多个“U”可以起到同步的作用。
最后一个“!
”表示数据下面就要开始接受数据了。
也就是说接收方要接受到一个或多个“U”后再接收到“!
”表示数据接收正式开始。
2、数据长度
在接受完报头之后,马上接收到的是数据长度,数据长度可以让接收方知道自己应该接受到多少个字节的数据的数据才是正确的,简单的比较这个数据和接收到的数据段的字节数目可以简单的判断接收是否正确。
数据长度还是接受数据和冗余校验的依据。
3、冗余校验值
最后两个字节是冗余校验的值。
这个值是根据冗余校验算法计算出来的结果。
接收方接收到数据后,根据冗余校验的算法以及计算接收到的数据段的冗余值。
利用这样一个计算出来的冗余值与接收到的冗余值比较就能知道数据是否接收正确了。
关于冗余校验算法下面会做更详细的介绍。
基于通信协议的通信步骤:
发送:
1、构建数据包的数据部分;
2、计算出CRC值;
3、按照帧格式依次发送字段(报头、数据长度值、数据、冗余位)
4、检测数据段是否发完,未发完就从第1步开始继续发送。
对于发送方,还有考虑每一个数据包发送频率,以保证在每次发送的时候接收方都做好准备。
发射端程序如下:
例程TransimtWithCRC.c
#include
#include
#include"soft_rs232.h"
INT8Ustring[16];
INT16Uidx=0;//消息索引(指向消息数组)
INT8UStrLen=0;//字符长度
INT8U*Asc;//当前的字符
INT8UcValue;//计算校验值的数据码
INT16Ucrc=0;//冗余校验值
INT8Utemp;
INT8UHigh_8bit,Low_8bit;
INT8Umessage[]="Hello,thisisaCommunicationwithRF";
voidget_high_low_8bit(INT16Ui)//将整型数据的高低8位分解
{
High_8bit=(INT8U)(i>>8);
Low_8bit=(INT8U)(i&0x00ff);
}
voidCalcCRC(void)//冗余校验
{
get_high_low_8bit(crc);
cValue=High_8bit^cValue>>4^(High_8bit^cValue);
crc=cValue^(cValue<<5)^(cValue<<12)^(crc<<8);
}
voidSync_Signal(void)//同步信号
{
P2_1=0;
P2_1=1;
delay_nus(2400);
P2_1=0;
}
voidSend_Data(void)//9600大约1ms一个字节数据
{
Asc=message;
while(*Asc!
='\0')
{
while((StrLen<15)&&(*Asc!
='\0'))
{
string[StrLen]=*Asc;//准备好的一帧数据
StrLen=StrLen+1;//一帧数据的长度计数
cValue=*Asc;
CalcCRC();//CRC校验
Asc++;
}
string[StrLen]='\0';
StrLen=StrLen-1;
get_high_low_8bit(crc);
Sync_Signal();//同步信号
rs_send_byte('U');//数据包头
rs_send_byte('U');
rs_send_byte('U');
rs_send_byte('!
');
rs_send_byte(StrLen);
rs_send_string(string);
rs_send_byte(Low_8bit);
rs_send_byte(High_8bit);
StrLen=0;
Low_8bit=0;
High_8bit=0;
}
}
intmain(void)
{
soft_rs232_init();
soft_send_enable();
while
(1)
{
Send_Data();
delay_nms(200);
}
return0;
}
TransimtWithCRC.c是如何工作的?
程序将message里面的数据按照数据帧格式发送出去,Send_Data()函数首先取出message里面的内容组成数据包,为保证通信的稳定有效数据为15个字节,同时计算一帧数据的字节数以及冗余值。
有了这些准备工作后就可以按照数据帧发送数据了。
接收:
1、监测报头,直到遇到“U!
”;
2、接收数据长度;
3、按照数据长度接收数据段;
4、接收冗余值;
5、根据数据长度以及接收到的数据计算冗余值,比较接收到的值,如果接收正确,就立即进入接收等待(第一步),否则发出错误信息;
接收必须是实时的,也就是说要在发送方发送数据之前进入接收准备。
如果需要处理接收到数据,要尽可能的快。
如果接收的是一个多帧的数据,应该在接收完整个帧后在处理数据。
对于每一个字节,串口在不断的检测串口的起始信号。
接收端程序如下:
例程ReceivWithCrc.c
#include
#include
#include"soft_rs232.h"
INT8Ustring[16];
INT8UStrLen=0;//字符长度
INT8UcValue;//校验码(计算)
INT16Ucrc=0;//冗余校验值
INT16UrcvdCrc;//接收到的冗余值
INT8UHigh_8bit,Low_8bit;
INT8UoutRS232;
INT16Uidx=0;
voidtime2_init_uart(void)
{
EA=1;
T2MOD=0;
T2CON|=0x10;
SCON=0x50;
TH2=(65536-36)/256;
TL2=(65536-36)%256;
RCAP2H=(65536-36)/256;
RCAP2L=(65536-36)%256;
TR2=1;
TI=1;
}
voidreceive_data(void)
{
INT8Ucount=0;
INT8Utemp;//临时
soft_send_enable();
while
(1)
{
if(outRS232!
=ReceivePoint)//如果收到数据条件就成立了
{
temp=rs232buffer[outRS232++];
if(temp=='U')
{
count++;
}
elseif((temp=='!
')&&(count>=1))
{
count=0;
break;
}
else
{
ReceivePoint=0;//如果是乱码丢弃
outRS232=0;
}
}
}
while
(1)
{
if(outRS232!
=ReceivePoint)
{
StrLen=rs232buffer[outRS232++];
break;
}
}
while
(1)
{
if(outRS232!
=ReceivePoint)
{
if(idx<=StrLen)
{
string[idx]=rs232buffer[outRS232++];
idx=idx+1;
}
else
{
idx=0;
break;
}
}
}
while
(1)
{
if(outRS232!
=ReceivePoint)
{
Low_8bit=rs232buffer[outRS232++];
break;
}
}
while
(1)
{
if(outRS232!
=ReceivePoint)
{
High_8bit=rs232buffer[outRS232++];
break;
}
}
TCON_ENABLE_TIMER=0;
rcvdCrc=(((INT16U)High_8bit)<<8)|Low_8bit;//得到冗余计算的值
string[StrLen+1]='\0';
ReceivePoint=0;//如果是乱码丢弃
outRS232=0;
}
/*=================================================================*/
voidget_high_low_8bit(INT16Ui)//将整型数据的高低8位分解
{
High_8bit=(INT8U)(i>>8);
Low_8bit=(INT8U)(i&0x00ff);
}
/*=================================================================*/
voidCalcCRC(void)//冗余校验
{
get_high_low_8bit(crc);
cValue=High_8bit^cValue>>4^(High_8bit^cValue);
crc=cValue^(cValue<<5)^(cValue<<12)^(crc<<8);
}
/*=================================================================*/
voidCheck_Crc(void)//校验数据
{
INT8Ui;
for(i=0;i<=StrLen;i++)
{
cValue=string[i];
CalcCRC();
}
}
/*=================================================================*/
voidPut_Out(void)//输出收到的数据
{
Check_Crc();
if(rcvdCrc==crc)
{
printf(string);
}
else
{
printf("error!
");
}
}
/*=================================================================*/
intmain(void)
{
time2_init_uart();
soft_rs232_init();
soft_receive_enable();
while
(1)
{
receive_data();//没有信息会一直在这里等待
Put_Out();
}
return0;
}
ReceivWithCrc.c是如何工作的?
Receive_Data()负责接收数据,函数接收数据过程如下:
1、首先检查报文的头部“UUU!
”;
2、如果正确接收了报文头部,接下来就开始接收数据个数;
3、然后根据数据个数接收实际发送的数据;
4、最后就是接收冗余校验位
程序做了一个简单的冗余校验错误处理,由函数Put_Out()完成,如果接收正确会打印数据到上位机,否则打印“error”
任务四结合双轴加速度传感器制作遥控机器人
双轴加速度传感器在静态的时候可以测量倾斜的角度。
因此将一个双轴加速度传感器安装在一个控制板上作为遥控端,通道RF发送动作消息来控制一个两轮小车运动。
具体控制效果如图9-6所示。
完成本项目所需要的器件:
1.C51/AVR教学板2块;
2.教育机器人机械对象一套;
3.双轴加速度传感器一个(可选三轴加速度传感器);
4.RF发送模块和RF接受模块各一块。
在这任务中,将教学板的X和Y轴上的倾斜角信息用RF发送模块发送到教育机器人,机器人根据角度信息运动。
首先微控制器采集来自加速度传感器MX2125上的加速度值。
然后再以串行数据的的方式,把加速度传感器的角度信息发送出去。
如果教育机器人上的RF接受模块正在准备接受数据,控制器会接受并处理数据,然后控制器根据接收的数据值来发送电机运动所对应的脉冲。
连接硬件电路
图5中描述了整个系统的模型模块关系,图6描述了加速度传感器与RF无线发送模块的与C51单片机的连接图,图7是接收端的硬件连接图。
在发射端主要需完成如下工作:
1、获取加速度传感器采样到加速度信息;
2、使用RF发送加速度传感器采样到的数据。
按照图3-7安装加速度传感器和RF发射模块到发射端。
根据安装加速度传感器在教学板上的安装位置,将双轴加速度传感器Y轴上的采样值对应于小车的前进和后退,X轴上的对应与小车运动的左转和右转。
在静态的情况下,加速度传感器的采样值为重力加速度在对应轴上的分量,范围是
-1000mg到1000mg,这是得到的直接数字,在计算的时候我们已经将数字除以了4,得到的结果是-200到+200,这个正好和控制舵机运动的脉宽时间值变化范围相同。
这样我们就把加速度的值的与舵机脉冲的值对应了起来。
例程RemoteTransimt.c
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 无线 遥控 机器人 修改稿