4.3红外遥控功能
4.3.1红外遥控功能详细说明
小车启动后,按下红外遥控器的“2”键,小车前进;按下红外遥控器的“8”键,小车后退;按下红外遥控器的“4”键,小车左转;按下红外遥控器的“6”键,小车右转;按下红外遥控器的“5”键,小车停止;按下红外遥控器的“+”键,小车加速;按下红外遥控器的“-”键,小车减速。 4.3.2系统构成
红外遥控功能的整个系统由红外信号发射部分、接收部分、控制、电机驱动等几个模块构成。首先由遥控器发射红外信号,接收器接收到信号后传递给中央处理器进行分析,继而驱动电机,控制小车的运动。系统框图如下所示。 遥控器发送接收器接收中央处理器 信号 信号 分析信号
控制小车 驱动电机
红外遥控功能系统框图
4.3.3红外遥控原理
按下遥控器的不同按键,即可通过遥控器的红外信号发射器发射经过调制的特定信号,当小车上的红外信号接收器接收到信号后,便对信号进行解调。单片机分析得到具体编码,则可据此控制小车的相应运动。 4.3.4软件设计
小车接收到红外信号,触发外部中断,进入外部中断函数。在中断函数内进行信号的具体判断,并将编码存储在数组中。而后在循环函数内不断判断编码的值,并据此控制小车的运动。 部分程序:
void timer0(void) interrupt 1 {
Tc=TH0*256+TL0; TH0=0;
TL0=0; if((Tc>Imin)&&(Tc m=0; f=1; return; } if(f==1) { if(Tc>Inum1&&Tc 16 { Im[m/8]=Im[m/8]>>1|0x80; m++; } if(Tc>Inum2&&Tc else IrOK=0; } } } while(1) { change_pwm_right(); change_pwm_left(); if(IrOK==1) { switch(Im[2]) { case 0x18: run();break; case 0x52: backrun();break; case 0x08: leftrun();break; case 0x5A: rightrun();break; case 0x1C: stoprun();break; case 0x44: yuzhileft--;if(yuzhileft==0){yuzhileft=1;}break; case 0x40: yuzhileft++;if(yuzhileft>20){yuzhileft=20;}break; case 0x07: yuzhiright--;if(yuzhiright==0){yuzhiright=1;}break; case 0x15: yuzhiright++;if(yuzhiright>20){yuzhiright=20;}break; default:break; } IrOK=0; } } 17 4.4超声波测距功能 4.4.1超声波测距功能详细说明 可通过超声波测距模块测得小车与前方障碍物的距离,同时使用测温模块测得温度对距离进行补偿。所测距离与温度用LCD1602液晶屏显示,且均可实时变化。当所测距离超出范围时,液晶屏显示“out of range!!!”。 4.4.2系统构成 超声波测距功能的系统由超声波模块、温度检测模块、液晶屏显示模块等构成。首先通过超声波模块发射、接收超声波,并得到超声波在空气中的传播时间。之后由测温模块获取环境温度。中央处理器计算得到经过温度补偿的测量距离,然后使用液晶屏显示距离与温度。系统框图如下所示。 超声波模块 中央处理器计液晶屏显示距离 算得到距离 温度检测模块 超声波测距功能系统框图 4.4.3测距原理 超声波测距原理在前文介绍超声波模块时已进行了说明,此处介绍本设计的创新之处——通过温度补偿增加超声波测距的精确度。 当用常规的方法进行超声波测速时,一般认为超声波的速度为344m/s。然而,超声波的速度必然不会是常量,其受空气密度所影响,空气的密度越高则超声波的传播速度就越快,而空气的密度又与温度有着密切的关系,近似公式为:C=C0+0.607×T℃。式中:C0为摄氏零度时的超声波速度332m/s;T 为实际温度(℃)。对于超声波测距精度要求达到1mm 时,就必须把超声波传播的环境温度考虑进去。故本设计使用DS18B20测温模块测得环境温度,并将温度这一参数添加到超声波测距的距离计算公式中,使得所测距离更为精确。 4.4.4软件设计 利用定时器获取超声波发射到接收的时间,在计算函数内计算出距离,并将数值写入液晶屏显示。 部分程序: void Conut(void) { uint C; time=TH0*256+TL0; TH0=0; TL0=0; C=332+0.607*(Temp/100); S=time*1.085*C*0.001*0.5; if((S>=7000)||(flag==1)) { 18 flag=0; DisplayListChar(0, 1, table1); } else { disbuff[0]=S; disbuff[1]=S/10; disbuff[2]=S/100; disbuff[3]=S/1000; DisplayListChar(0, 1, table); DisplayOneChar(9, 1, ASCII[disbuff[3]]); DisplayOneChar(10, 1, ASCII[disbuff[2]]); DisplayOneChar(11, 1, ASCII[disbuff[1]]); DisplayOneChar(12, 1, ASCII[10]); DisplayOneChar(13, 1, ASCII[disbuff[0]]); } } while(1) { display18b20(Temp=ds18b20_get_temp()); RX=1; startmodule(); for(valA=7510;valA>0;valA--) { if(RX==1) { TR0=1; while(RX); TR0=0; Conut(); } } } 4.5重力感应遥控功能 4.5.1重力感应遥控功能详细说明 通过改变手中MPU6050的倾斜姿态,可遥控小车的运动。当MPU6050处于平衡状态时,小车停止;向前倾斜时,小车前进;向后倾斜时,小车后退;向左倾斜时,小车左转;向右倾斜时,小车右转。 4.5.2系统构成 重力感应遥控功能的系统由重力感应模块、控制系统、无线通信模块、电机驱动模块等组成。首先通过改变重力感应模块的姿态取得相应姿态的数据,在 19 由中央处理器STM32单片机对数据进行处理后,将信号由无线信号发射模块发射出去。接收端接收到信号后,中央处理器51单片机对信号进行分析,然后驱动电机,控制小车的运动。系统框图如下所示。 重力感应控制小车 模块 驱动电机 STM32单 片机 51单片机 无线信号无线信号 发射模块 接收模块 重力感应遥控功能系统框图 4.5.3重力感应遥控原理 使用的重力感应装置MPU6050可测得自身当前姿态,其原始数据经过融合及简单计算处理后便可得具体的倾角数据,将此数据通过无线通信模块传送给小车的控制系统,便可根据MPU6050的倾角控制小车运动。 4.5.4软件设计 通过读取MPU6050相应寄存器获得倾角数据,对倾角范围进行判断后,将特定标志用无线模块发射出去。接收端接收到标志,经过判断再执行相应函数。 部分程序: while(1) { if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0) { temp=MPU_Get_Temperature(); MPU_Get_Accelerometer(&aacx,&aacy,&aacz); MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz); LED0=!LED0; } if(((int)pitch)<(-40)) { NRF24L01_TX_Mode(); NRF24L01_TxPacket(tmp_buf1); } if(((int)pitch)>40) { NRF24L01_TX_Mode(); NRF24L01_TxPacket(tmp_buf2); } 20