嵌入式实验智能小车避障+上位机手柄控制Word格式文档下载.docx
《嵌入式实验智能小车避障+上位机手柄控制Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《嵌入式实验智能小车避障+上位机手柄控制Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。
ADC_Ch0_Res=ADC_RegularConvertedValueTab[0]-ADC_Calibration_DR;
ADC_Ch1_Res=ADC_RegularConvertedValueTab[1]-ADC_Calibration_DR;
ADC_Ch2_Res=ADC_RegularConvertedValueTab[2]-ADC_Calibration_DR;
ADC_Ch3_Res=ADC_RegularConvertedValueTab[3]-ADC_Calibration_DR;
if(RxBuffer[1]==0xCC)now_speed=100;
Forward_Cmd();
if(ADC_Ch3_Res<
0x520)Turn_Right();
elseif(ADC_Ch0_Res<
0x520)Turn_Left();
if(ADC_Ch2_Res<
0x520||ADC_Ch1_Res<
0x520)
{
ADC_Ch1_Res)
Turn_Right();
elseif(ADC_Ch2_Res>
Turn_Left();
0xAA&
&
ADC_Ch1_Res<
0xAA)
Backward_Cmd();
}
Delay(0XAFFFF);
}
while(flag_mode_choice==1){
if(RxBuffer[1]==0x11)
elseif(RxBuffer[1]==0xCC)
{now_speed=100;
Forward_Cmd();
}
elseif(RxBuffer[1]==0x22)
elseif(RxBuffer[1]==0x1A)
Forward_Accelerate_Cmd();
elseif(RxBuffer[1]==0x1B)
Forwar_non_Accelerate_Cmd();
elseif(RxBuffer[1]==0x33)
elseif(RxBuffer[1]==0x44)
elseBreak_Cmd();
利用以下的串口中断实现功能转换:
externu8RxBuffer[6];
externintflag_mode_choice;
voidUSART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1,USART_IT_RXNE)!
=RESET)
USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);
/*Readonebytefromthereceivedataregister*/
while(!
USART_GetFlagStatus(USART1,USART_FLAG_RXNE));
RxBuffer[0]=USART_ReceiveData(USART1);
RxBuffer[1]=USART_ReceiveData(USART1);
if(RxBuffer[0]==0xEA)
flag_mode_choice=0;
if(RxBuffer[0]==0xEB)
flag_mode_choice=1;
/*CleartheUSART1Receiveinterrupt*/
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
1.避障功能的实现
为实现小车的避障功能,使小车前面两个传感器的值相比较,若其中一个大于另一个,则向偏大的方向转弯,反之亦然。
程序实现如下:
ADC_Ch0_Res=ADC_RegularConvertedValueTab[0]-ADC_Calibration_DR;
2.上位机功能实现
上位机的界面是由VisualC++6.0中的MFC编写的。
其中有打开串口,发送显示,接受显示等功能,也可实现小车的功能切换,可以直接支持游戏手柄的控制。
使用无线的控制时,波特率为9600,按钮的代码段如下所示:
//避障模式
voidCSerialPortTestDlg:
:
OnButtonSend()
Buf[0]=0xEA;
Buf[1]=0xAA;
//Buf[2]=0xAA;
//TODO:
Addyourcontrolnotificationhandlercodehere
if(!
m_bSerialPortOpened)return;
//检查串口是否打开
//UpdateData(TRUE);
//读入编辑框中的数据
m_strEditSendMsg=(CString)Buf;
m_SerialPort.WriteToPort((LPCTSTR)m_strEditSendMsg);
//发送数据
OnChangeEditSendmsg()
IfthisisaRICHEDITcontrol,thecontrolwillnot
//sendthisnotificationunlessyouoverridetheCDialog:
OnInitDialog()
//functionandcallCRichEditCtrl().SetEventMask()
//withtheENM_CHANGEflagORedintothemask.
//上位机控制模式
OnButtonSend2()
Buf[0]=0xEB;
//Buf[3]=0xAA;
//前进//
OnButtonSend6()
Buf[1]=0x11;
Buf[3]=0xAA;
//后退
OnButtonSend4()
Buf[1]=0x22;
//左转
OnButtonSend3()
Buf[1]=0x33;
//右转
OnButtonSend5()
Buf[1]=0x44;
//手柄控制
LRESULTCSerialPortTestDlg:
WindowProc(UINTmessage,WPARAMwParam,LPARAMlParam)
Addyourspecializedcodehereand/orcallthebaseclass
joyx=LOWORD(lParam)/2048;
joyy=HIWORD(lParam)/2048;
//WORDjoyx,joyy;
if((Buf[0]==0xEB)&
(Buf[1]==0x44)&
(joyx<
=20&
joyx>
=12)){
Buf[0]=0xEB;
Buf[1]=0x11;
m_strEditSendMsg=(CString)Buf;
m_SerialPort.WriteToPort((LPCTSTR)m_strEditSendMsg);
//Sleep(TIMEDELAY);
}elseif((Buf[0]==0xEB)&
(Buf[1]==0x33)&
}elseif((Buf[0]==0xEB)&
(Buf[1]==0x22)&
(joyy<
=25&
joyy>
if(message==MM_JOY1MOVE)
joyx=LOWORD(lParam)/2048;
joyy=HIWORD(lParam)/2048;
//如果游戏杆在中心位置的左边,移动光标到左边。
反之亦然
if(joyx<
=12)
{
//SetDlgItemText(IDC_STATIC1,"
左转"
);
Buf[0]=0xEB;
Buf[1]=0x44;
//if(!
m_strEditSendMsg=(CString)Buf;
m_SerialPort.WriteToPort((LPCTSTR)m_strEditSendMsg);
Sleep(TIMEDELAY);
}elseif(joyx>
=20)
Sleep(5);
右转"
Buf[1]=0x33;
}elseif(joyy<
=12)//如果游戏杆在中心位置的下边,移动光标到下边。
快速前进"
}
elseif(joyy>
=25)
{
后退"
Buf[1]=0x22;
}if(wParam&
JOY_BUTTON1)
1"
//前进
Buf[0]=0xEA;
Buf[1]=0xAA;
}elseif(wParam&
JOY_BUTTON2)
2"
}elseif(wParam&
JOY_BUTTON3)
3"
Buf[1]=0xAA;
//TODO:
//UpdateData(TRUE);
}
elseif(wParam&
JOY_BUTTON4)
4"
elseif(wParam&
JOY_BUTTON1CHG)
select"
//标准避障模式
Buf[1]=0xCC;
}elseif(wParam&
JOY_BUTTON2CHG)
start"
//标准上位机控制模式
JOY_BUTTON5)
5"
elseif(wParam&
JOY_BUTTON6)
6"
JOY_BUTTON7)//select
7"
Buf[1]=0x1A;
JOY_BUTTON8)//select
8"
Buf[1]=0x1B;
returnCDialog:
WindowProc(message,wParam,lParam);