




已阅读5页,还剩20页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
无线遥控机器人项目使用说明书 远程遥感机器人项目使用说明书V 1.0深圳市鸥鹏科技有限公司2010年11月目录项目目标3项目背景3任务一 认识RF无线收发模块3任务二 连接 RF到控制板的C51芯片,并测试4任务三 基于通信协议的无线通信7任务四 结合双轴加速度传感器制作遥控机器人 14项目目标利用RF无线收发模块、双轴加速度传感器在两轮机器人上实现机器人的无线远程控制。项目背景在生活中无线通信具有广泛的应用,例如手机上的蓝牙、遥控玩具、航模、汽车上使用的无线遥控锁等。RF是无线通信中的一种,它具有易于实现和使用、传输距离远等特点,用户能方便的利用它以串行的方式来发送数据信息、控制信息、或者其他信息。本项目利用RF无线通讯模块和加速度传感器设计和制作一个远程遥控小型机器人。本项目主要包括以下几个任务:1、 认识RF发射和接收模块;2、 连接RF到控制板的C51芯片,并测试;3、 基于通信协议的无线通信实现;4、 结合双轴加速度传感器制作远程遥控机器人。图1 RF收发模块实物图任务一 认识RF无线收发模块433.92MHZ的RF(Radio Freqency) 收发模块如图1所示。RF模块传输速率为1200到19.2K波特率,传输距离可达150米(根据环境不同可达更远距离),可以通过软件方式开启和关闭模块。使用无线收发射模块非常简单,就像使用串口一样,只需要将模块的数据引脚连接到单片机的串口即可。同时全新模块为收发一体图 2 RF接收发送模块引脚图RF收发模块引脚如图2所示。RF接收模块有6个引脚,定义如表2所示:表1 RF收发模块引脚说明引脚名称功能1GND 电源地0V(Vss)2VIN电源3.3V5VDC3DATA串行数据输入4T/R发送/接收选择:高电平发送,低电平或默认设置为接收5PDN低功耗模式设定引脚,低电平有效6RSSI接收信号强度指示PDN(Pulling the power down):当PDN引脚为低的时候接收/发送模块进入低电流状态,模块不会再发送或者接收数据了。RSSI(接收模块信号强度引脚):接收信号强度输出,这个引脚产生一个模拟的电压值来反映信号强度,在接收数据的时候这个值会比较稳定。任务二 连接 RF到控制板的C51芯片,并测试单片机的串口资源是有限的,这里引入了软串口,即用软件方式模拟串口通信,通过软串口可以让C51的任何一个I/O口变成串口进行数据的收发。做一个单向的收发只需要将RF的发射和接收模块分别接到两块单片机教学板的串口,分别组成一个接收机和发射机即可。在本项目中分别将作为发射的收发模块的数据引脚连接到单片机的P2_1,作为接收的收发模块的数据引脚接到单片机的P2_2引脚如图10-5所示。图3 RF模块与单片机连接在RF收发模块开始通信之前,最好发送一个同步信号来建立起模块之间的通信连接,虽然不发送同步信息,在发送几个数据信息后也能完成连接,但是使用同步信号更有效。同步信号是一个高电平为2400s的脉冲。发射端测试程序头文件soft_rs232.h是软串口实现的头文件。建立工程,输入例程TransmitTest.c例程TransmitTest.c#include soft_rs232.h#include int main(void)soft_rs232_init();soft_send_enable ();while(1)rs_send_string(this is a test for RF);delay_nms(200);例程TransmitTest.c是如何工作的?RF发送消息,就像使用串口一样,打印数据就可以了。rs_send_string( )是软串口中打印字符串的函数。rs_send_string (this is a test for RF);接收端测试程序例程ReceiveTest.c#include#includesoft_rs232.h/*-定时器2做串口发生器 -*/void time2_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;int main(void)INT16U outRS232 = 0;INT8U temp;rs_clear_buffer();time2_init_uart();soft_rs232_init();soft_receive_enable ();while(1)if(outRS232 != ReceivePoint) /如果收到数据 条件就成立了 temp = rs232bufferoutRS232+; putchar(temp); outRS232 = 0; ReceivePoint = 0; return 0 ;例程ReceiveTest.c是如和工作的?例程ReceiveTest.c每接收到一个字符,就把接收到的字符打印到上位机。程序会通过比较数组指针来判断是否受到数据。软串口应用说明软串口,是指用软件方式模拟的串口通信,利用它可以将任何一个I/O实现串口通信,本项目使用的软串口可以在C51上实现24009600波特率的通信。 本程序使用一个定时器和任意 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!”),这个报文头用于同步通信和判断一个数据包的开始。然后是一个数据包,具体内容如下:数据包格式|-|-|-|-|-| 数据个数 | 数据值|.| 数据值 | 冗余校验低位 | 冗余校验高位 |-|-| |-|-|-| BYTE 1 BYTE 2 BYTE n+1 BYTE n+2 BYTE n+3Byte 1 是Char型数据的个数,这里可以从1到16(这里定义数据段最大为16字节),根据这个数值决定了后面具体数据的个数,最少要有一个数据。Byte 2 到Byte n+1 是实际的数据其中n = 数据长度 + 1。Byte n+2 和 Byte n+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 #includesoft_rs232.hINT8U string16 ;INT16U idx = 0; /消息索引 (指向消息数组)INT8U StrLen = 0; /字符长度INT8U *Asc; /当前的字符INT8U cValue; /计算校验值的数据码INT16U crc = 0;/冗余校验值INT8Utemp;INT8UHigh_8bit,Low_8bit;INT8U message = Hello,this is a Communication with RF;void get_high_low_8bit(INT16U i) /将整型数据的高低8位分解High_8bit = (INT8U)(i 8);Low_8bit = (INT8U)(i & 0x00ff);void CalcCRC(void) /冗余校验get_high_low_8bit(crc);cValue = High_8bit cValue 4 (High_8bit cValue);crc = cValue (cValue 5) (cValue 12) (crc 8);void Sync_Signal(void) /同步信号P2_1 = 0;P2_1 = 1;delay_nus(2400);P2_1 = 0;void Send_Data(void) /9600大约1ms一个字节数据Asc = message;while(*Asc != 0) while(StrLen 15) & (*Asc != 0)stringStrLen = *Asc; /准备好的一帧数据StrLen = StrLen+1; /一帧数据的长度计数cValue = *Asc;CalcCRC(); /CRC校验Asc+;stringStrLen = 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; int main(void)soft_rs232_init();soft_send_enable ();while(1) Send_Data();delay_nms(200);return 0 ;TransimtWithCRC.c是如何工作的?程序将message里面的数据按照数据帧格式发送出去,Send_Data()函数首先取出message里面的内容组成数据包,为保证通信的稳定有效数据为15个字节,同时计算一帧数据的字节数以及冗余值。有了这些准备工作后就可以按照数据帧发送数据了。接收:1、监测报头,直到遇到“U!”;2、接收数据长度;3、按照数据长度接收数据段;4、接收冗余值;5、根据数据长度以及接收到的数据计算冗余值,比较接收到的值,如果接收正确,就立即进入接收等待(第一步),否则发出错误信息;接收必须是实时的,也就是说要在发送方发送数据之前进入接收准备。如果需要处理接收到数据,要尽可能的快。如果接收的是一个多帧的数据,应该在接收完整个帧后在处理数据。对于每一个字节,串口在不断的检测串口的起始信号。接收端程序如下:例程ReceivWithCrc.c#include#include #includesoft_rs232.hINT8U string16 ;INT8U StrLen = 0; /字符长度INT8U cValue; /校验码(计算)INT16U crc = 0;/冗余校验值INT16U rcvdCrc;/接收到的冗余值INT8UHigh_8bit,Low_8bit;INT8U outRS232;INT16U idx = 0;void time2_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;void receive_data(void)INT8U count = 0;INT8U temp ; /临时soft_send_enable ();while(1) if(outRS232 != ReceivePoint) /如果收到数据 条件就成立了 temp = rs232bufferoutRS232+; if(temp = U) count+; else if(temp = !)&(count =1) count = 0;break; else ReceivePoint = 0; /如果是乱码丢弃outRS232 = 0; while(1) if(outRS232 != ReceivePoint) StrLen = rs232bufferoutRS232+;break;while(1)if(outRS232 != ReceivePoint)if(idx =StrLen)stringidx = rs232bufferoutRS232+;idx = idx+1; else idx = 0;break; while(1)if(outRS232 != ReceivePoint)Low_8bit = rs232bufferoutRS232+;break;while(1)if(outRS232 != ReceivePoint)High_8bit = rs232bufferoutRS232+;break;TCON_ENABLE_TIMER = 0; rcvdCrc = (INT16U)High_8bit) 8);Low_8bit = (INT8U)(i & 0x00ff); /*=*/ void CalcCRC(void) /冗余校验get_high_low_8bit(crc);cValue = High_8bit cValue 4 (High_8bit cValue);crc = cValue (cValue 5) (cValue 12) (crc 8);/*=*/ void Check_Crc(void) /校验数据 INT8U i;for(i=0; i=StrLen; i+)cValue = stringi; CalcCRC(); /*=*/void Put_Out(void) /输出收到的数据Check_Crc();if(rcvdCrc = crc)printf(string);elseprintf(error!);/*=*/int main(void)time2_init_uart();soft_rs232_init();soft_receive_enable();while(1)receive_data(); /没有信息会一直在这里等待Put_Out();return 0 ;ReceivWithCrc.c是如何工作的?Receive_Data( )负责接收数据,函数接收数据过程如下:1、 首先检查报文的头部“UUU!”;2、 如果正确接收了报文头部,接下来就开始接收数据个数;3、 然后根据数据个数接收实际发送的数据;4、 最后就是接收冗余校验位程序做了一个简单的冗余校验错误处理,由函数Put_Out()完成,如果接收正确会打印数据到上位机,否则打印“error”任务四 结合双轴加速度传感器制作遥控机器人双轴加速度传感器在静态的时候可以测量倾斜的角度。因此将一个双轴加速度传感器安装在一个控制板上作为遥控端,通道RF发送动作消息来控制一个两轮小车运动。具体控制效果如图9-6所示。图 4 遥控小车运动完成本项目所需要的器件:1. C51/AVR教学板2块;2. 教育机器人机械对象一套;3. 双轴加速度传感器一个(可选三轴加速度传感器);4. RF发送模块和RF接受模块各一块。在这任务中,将教学板的X和Y轴上的倾斜角信息用RF发送模块发送到教育机器人,机器人根据角度信息运动。首先微控制器采集来自加速度传感器MX2125上的加速度值。然后再以串行数据的的方式,把加速度传感器的角度信息发送出去。如果教育机器人上的RF接受模块正在准备接受数据,控制器会接受并处理数据,然后控制器根据接收的数据值来发送电机运动所对应的脉冲。连接硬件电路图5中描述了整个系统的模型模块关系,图6描述了加速度传感器与RF无线发送模块的与C51单片机的连接图,图7是接收端的硬件连接图。图5 整体系统模块框图图6 发射端硬件连接图图7 接收端硬件连接图在发射端主要需完成如下工作:1、 获取加速度传感器采样到加速度信息;2、 使用RF发送加速度传感器采样到的数据。按照图3-7安装加速度传感器和RF发射模块到发射端。根据安装加速度传感器在教学板上的安装位置,将双轴加速度传感器Y轴上的采样值对应于小车的前进和后退,X轴上的对应与小车运动的左转和右转。在静态的情况下,加速度传感器的采样值为重力加速度在对应轴上的分量,范围是 -1000mg到1000mg,这是得到的直接数字,在计算的时候我们已经将数字除以了4,得到的结果是-200到+200,这个正好和控制舵机运动的脉宽时间值变化范围相同。这样我们就把加速度的值的与舵机脉冲的值对应了起来。例程RemoteTransimt.c为发射端程序,如下:#include#include #includesoft_rs232.h#define SIGX P2_3/信号引脚,外部中断0 X#define SIGY P2_4 / Y/*变量*/INT8U string16 ;INT16U idx = 0; /消息索引 (指向消息数组)INT8U StrLen = 0; /字符长度INT8U *Asc; /当前的字符INT8U cValue; /校验码(计算)INT16U crc = 0;/冗余校验值INT8Utemp;INT8UHigh_8bit,Low_8bit;INT8U message5; int Xmg,Ymg;/*RF发送*/void get_high_Low_8bit(INT16U i) /将整型数据的高低8位分解High_8bit = (INT8U)(i 8);Low_8bit = (INT8U)(i & 0x00ff);void CalcCRC(void) /冗余校验get_high_Low_8bit(crc);cValue = High_8bit cValue 4 (High_8bit cValue);crc = cValue (cValue 5) (cValue 12) (crc 8);void Sync_Signal(void) /同步信号P2_1 = 0;P2_1 = 1;delay_nus(2400);P2_1 = 0;void Send_Data(void) /9600大约1ms一个字节数据 Asc = message;while(*Asc != 0) while(StrLen 15) & (*Asc != 0)stringStrLen = *Asc; /准备好的一帧数据StrLen = StrLen+1; /一帧数据的长度计数 cValue = *Asc;CalcCRC(); /CRC校验Asc+;stringStrLen = 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; /*- 函数名:Time1_init( ) 功 能: T1记录X和Y 轴高电平持续时间-*/void Time1_init(void)TMOD |= 0x90 ; /定时器1,门控制 定时器1方式 TH1 = 0 ; TL1 = 0 ; TR1 = 0 ;int GetXmg(void)int temp,Xmg;while(SIGX = 1); / 测试下一个脉冲while(SIGX = 0);TR1 = 1;while(SIGX = 1);TR1 = 0; temp = TH1*256+TL1; /390是一个误差补偿 Xmg = (temp / 10) - 500) * 2-4;/得到加速度就可以了(16是补偿) TH1 = 0; TL1 = 0; return(Xmg);int GetYmg(void)int temp,Ymg;while(SIGY = 1); / 测试下一个脉冲while(SIGY = 0);TR1 = 1;while(SIGY = 1);TR1 = 0; temp = TH1*256+TL1; /390是一个误差补偿 Ymg = (temp / 10) - 500) * 2-4;/得到加速度就可以了(16是补偿) TH1 = 0; TL1 = 0; return(Ymg);int main(void)Time1_init();soft_rs232_init();soft_send_enable ();message4 = 0;while(1)get_high_Low_8bit(GetXmg();message0 = Low_8bit;message1 = High_8bit;Send_Data();/发送数据get_high_Low_8bit(GetYmg();message2 = Low_8bit;message3 = High_8bit;Send_Data();/发送数据return 0 ;例程RemoteTransimt.c是如何工作的?程序首先获取了加速度的值,并将值放入数组message中,再利用RF发送,X轴方向上的数据和Y轴方向上的数据是分别发送,是为了提高发射的速率。加速度传感器每采用一次数据需要的时候可能多达10ms,如果测量两个轴后发射,加上出来数据的时间,整个发射过程可能会多达30ms。为了提高控制的实时性,这里每采用一个轴就发送一次。另外一个轴保留了上次采样的数据。在接受端需要完成的工作:1、 实时的等待接收数据;2、 处理获取的数据,并转换为舵机运动的脉冲持续时。控制两轮机器人舵机的信号中高电平的时间决定速度和方向,而低电平的时间推荐为20ms,决定了运动的连续性,如果低电平延时时间过长舵机运动速度会下降,并出现不连续的现象,经测试,低电平时间在15ms到35ms之间可以较好的保证运动的速度和连续性。要保证控制的实时性,就必须保证每次发送到数据都能被接收到并且立刻转化为舵机的控制。根据例程分析发射端发射一次数据可以控制在20ms以内,而接收端接收处理数据也需要时间。这个时间可以与舵机运动的低电平时间要求匹配,可以用这个低电平时间来接收和处理数据。加速度传感器比较灵敏,手的抖动都会改变输出的结果,如果数据不加以处理,控制效果就不好。因此发射端需要对数据进行处理,首先设置一个触发有效值,Y轴方向的绝对值值必需大于20,X轴方向的绝对值必须大于30,同时规定了X轴控制和Y轴控制的优先规则为取绝对值较大的那个值。舵机运动脉冲设置了一个防止抖动的值,通过与前一次脉冲值的比较,只有相差的值大于6的时候,脉冲数据才会更新,这样既消除了抖动,又保证了控制的实时性。例程RemoteReceive.c#include#include #includesoft_rs232.h/*变量RF*/INT8U string16 ;INT8U StrLen = 0; /字符长度INT8U cValue; /校验码(计算)INT16U crc = 0;/冗余校验值INT16U rcvdCrc;/接收到的冗余值INT8UHigh_8bit,Low_8bit;INT8U outRS232;INT16U idx = 0;/*变量运动*/INT16UpulseLeft = 1500; INT16UpulseRight = 1500;INT16UpulseLeftOld = 1500;INT16UpulseRightOld = 1500;intxDir = 0;intyDir = 0; /*=*/ /*=*/ void receive_data(void)INT8U count = 0;INT8U temp ; /临时soft_receive_enable();while(1) if(outRS232 != ReceivePoint) /如果收到数据 条件就成立了 temp = rs232bufferoutRS232+; if(temp = U) count+; else if(temp = !)&(count =1) count = 0;break; else ReceivePoint = 0; /如果是乱码丢弃outRS232 = 0; while(1) if(outRS232 != ReceivePoint) StrLen = rs232bufferoutRS232+;break;while(1)if(outRS232 != ReceivePoint)if(idx =StrLen)stringidx = rs232bufferoutRS232+;idx = idx+1; else idx = 0;break; while(1)if(outRS232 != ReceivePoint)Low_8bit = rs232bufferoutRS232+;break;while(1)if(outRS232 != ReceivePoint)High_8bit = rs232bufferoutRS232+;break;TCON_ENABLE_TIMER = 0; rcvdCrc = (INT16U)High_8bit) 8);Low_8bit = (INT8U)(i & 0x00ff);/*=*/void CalcCRC(void) /冗余校验get_high_low_8bit(crc);cValue = High_8bit cValue 4 (High_8bit cValue);crc = cValue (
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论