嵌入式实验智能小车避障+上位机手柄控制.docx

上传人:b****1 文档编号:2780658 上传时间:2023-05-04 格式:DOCX 页数:17 大小:373.60KB
下载 相关 举报
嵌入式实验智能小车避障+上位机手柄控制.docx_第1页
第1页 / 共17页
嵌入式实验智能小车避障+上位机手柄控制.docx_第2页
第2页 / 共17页
嵌入式实验智能小车避障+上位机手柄控制.docx_第3页
第3页 / 共17页
嵌入式实验智能小车避障+上位机手柄控制.docx_第4页
第4页 / 共17页
嵌入式实验智能小车避障+上位机手柄控制.docx_第5页
第5页 / 共17页
嵌入式实验智能小车避障+上位机手柄控制.docx_第6页
第6页 / 共17页
嵌入式实验智能小车避障+上位机手柄控制.docx_第7页
第7页 / 共17页
嵌入式实验智能小车避障+上位机手柄控制.docx_第8页
第8页 / 共17页
嵌入式实验智能小车避障+上位机手柄控制.docx_第9页
第9页 / 共17页
嵌入式实验智能小车避障+上位机手柄控制.docx_第10页
第10页 / 共17页
嵌入式实验智能小车避障+上位机手柄控制.docx_第11页
第11页 / 共17页
嵌入式实验智能小车避障+上位机手柄控制.docx_第12页
第12页 / 共17页
嵌入式实验智能小车避障+上位机手柄控制.docx_第13页
第13页 / 共17页
嵌入式实验智能小车避障+上位机手柄控制.docx_第14页
第14页 / 共17页
嵌入式实验智能小车避障+上位机手柄控制.docx_第15页
第15页 / 共17页
嵌入式实验智能小车避障+上位机手柄控制.docx_第16页
第16页 / 共17页
嵌入式实验智能小车避障+上位机手柄控制.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

嵌入式实验智能小车避障+上位机手柄控制.docx

《嵌入式实验智能小车避障+上位机手柄控制.docx》由会员分享,可在线阅读,更多相关《嵌入式实验智能小车避障+上位机手柄控制.docx(17页珍藏版)》请在冰点文库上搜索。

嵌入式实验智能小车避障+上位机手柄控制.docx

嵌入式实验智能小车避障+上位机手柄控制

嵌入式实验报告

小车避障+上位机

 

李晨,颜文杰

2012/6/7

一、小车的功能及部件

小车能够实现的主要功能有自动避障和上位机两个方面。

避障主要是依靠传感器检测小车与前方的距离,然后根据算法的程序,自动选择最近的方式避障。

上位机则是依靠电脑与小车通过无线串口相连,利用游戏手柄控制上位机的指令对小车进行前进、后退、左转、右转、加速等控制,从而实现用手柄对小车的无线遥控。

传感器的分布直接的影响到了小车的自动避障功能,因此,为达到最优的效果,将传感器如下图的分布:

前面两个用来判断小车与障碍物所成的角度,左右两边用来使小车与边界有一定的距离。

为实现上位机的无线遥控功能,将小车加上无线模块与游戏手柄。

二、小车功能的实现

小车的功能已经在上部分说明了,但是为实现两者功能的转化,我们采用了使用上位机发送指令从而改变小车工作模式的方法。

下图为上位机工作界面:

由上图可知,小车与电脑通过无线模块相连时,通过点选按钮“控制”和“自动避障”,可以使小车实现两种功能的切换。

具体实现如下:

通过串口中断,在计算机发送指令时改变flag_mode_choice的值,改变主程序中运行的不同模块,从而改变功能。

while

(1){

while(flag_mode_choice==0)

{

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)

{

if(ADC_Ch2_Res

Turn_Right();

elseif(ADC_Ch2_Res>ADC_Ch1_Res)

Turn_Left();

if(ADC_Ch2_Res<0xAA&&ADC_Ch1_Res<0xAA)

Backward_Cmd();

}

Delay(0XAFFFF);

}

while(flag_mode_choice==1){

if(RxBuffer[1]==0x11)

Forward_Cmd();

elseif(RxBuffer[1]==0xCC)

{now_speed=100;Forward_Cmd();}

elseif(RxBuffer[1]==0x22)

Backward_Cmd();

elseif(RxBuffer[1]==0x1A)

Forward_Accelerate_Cmd();

elseif(RxBuffer[1]==0x1B)

Forwar_non_Accelerate_Cmd();

elseif(RxBuffer[1]==0x33)

Turn_Right();

elseif(RxBuffer[1]==0x44)

Turn_Left();

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);

while(!

USART_GetFlagStatus(USART1,USART_FLAG_RXNE));

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;

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)

{

if(ADC_Ch2_Res

Turn_Right();

elseif(ADC_Ch2_Res>ADC_Ch1_Res)

Turn_Left();

if(ADC_Ch2_Res<0xAA&&ADC_Ch1_Res<0xAA)

Backward_Cmd();

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);//发送数据

 

}

 

voidCSerialPortTestDlg:

:

OnChangeEditSendmsg()

{

//TODO:

IfthisisaRICHEDITcontrol,thecontrolwillnot

//sendthisnotificationunlessyouoverridetheCDialog:

:

OnInitDialog()

//functionandcallCRichEditCtrl().SetEventMask()

//withtheENM_CHANGEflagORedintothemask.

//TODO:

Addyourcontrolnotificationhandlercodehere

}

//上位机控制模式

voidCSerialPortTestDlg:

:

OnButtonSend2()

{

Buf[0]=0xEB;

Buf[1]=0xAA;

//Buf[2]=0xAA;

//Buf[3]=0xAA;

//TODO:

Addyourcontrolnotificationhandlercodehere

if(!

m_bSerialPortOpened)return;//检查串口是否打开

//UpdateData(TRUE);//读入编辑框中的数据

m_strEditSendMsg=(CString)Buf;

m_SerialPort.WriteToPort((LPCTSTR)m_strEditSendMsg);

}

//前进//

voidCSerialPortTestDlg:

:

OnButtonSend6()

{

Buf[0]=0xEB;

Buf[1]=0x11;

//Buf[2]=0xAA;Buf[3]=0xAA;

//TODO:

Addyourcontrolnotificationhandlercodehere

if(!

m_bSerialPortOpened)return;//检查串口是否打开

//UpdateData(TRUE);//读入编辑框中的数据

m_strEditSendMsg=(CString)Buf;

m_SerialPort.WriteToPort((LPCTSTR)m_strEditSendMsg);

}

//后退

voidCSerialPortTestDlg:

:

OnButtonSend4()

{

Buf[0]=0xEB;

Buf[1]=0x22;

//Buf[2]=0xAA;Buf[3]=0xAA;

//TODO:

Addyourcontrolnotificationhandlercodehere

if(!

m_bSerialPortOpened)return;//检查串口是否打开

//UpdateData(TRUE);//读入编辑框中的数据

m_strEditSendMsg=(CString)Buf;

m_SerialPort.WriteToPort((LPCTSTR)m_strEditSendMsg);

}

//左转

voidCSerialPortTestDlg:

:

OnButtonSend3()

{

Buf[0]=0xEB;

Buf[1]=0x33;

//Buf[2]=0xAA;Buf[3]=0xAA;

//TODO:

Addyourcontrolnotificationhandlercodehere

if(!

m_bSerialPortOpened)return;//检查串口是否打开

//UpdateData(TRUE);//读入编辑框中的数据

m_strEditSendMsg=(CString)Buf;

m_SerialPort.WriteToPort((LPCTSTR)m_strEditSendMsg);

}

//右转

voidCSerialPortTestDlg:

:

OnButtonSend5()

{

Buf[0]=0xEB;

Buf[1]=0x44;

//Buf[2]=0xAA;Buf[3]=0xAA;

//TODO:

Addyourcontrolnotificationhandlercodehere

if(!

m_bSerialPortOpened)return;//检查串口是否打开

//UpdateData(TRUE);//读入编辑框中的数据

m_strEditSendMsg=(CString)Buf;

m_SerialPort.WriteToPort((LPCTSTR)m_strEditSendMsg);

}

 

//手柄控制

LRESULTCSerialPortTestDlg:

:

WindowProc(UINTmessage,WPARAMwParam,LPARAMlParam)

{

//TODO:

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)&&(joyx<=20&&joyx>=12)){

Buf[0]=0xEB;Buf[1]=0x11;

m_strEditSendMsg=(CString)Buf;

m_SerialPort.WriteToPort((LPCTSTR)m_strEditSendMsg);

}elseif((Buf[0]==0xEB)&&(Buf[1]==0x22)&&(joyy<=25&&joyy>=12)){

Buf[0]=0xEB;Buf[1]=0x11;

m_strEditSendMsg=(CString)Buf;

m_SerialPort.WriteToPort((LPCTSTR)m_strEditSendMsg);

}

 

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_bSerialPortOpened)return;//检查串口是否打开

m_strEditSendMsg=(CString)Buf;

m_SerialPort.WriteToPort((LPCTSTR)m_strEditSendMsg);

Sleep(TIMEDELAY);

}elseif(joyx>=20)

{

Sleep(5);

//SetDlgItemText(IDC_STATIC1,"右转");

Buf[0]=0xEB;Buf[1]=0x33;

//if(!

m_bSerialPortOpened)return;//检查串口是否打开

m_strEditSendMsg=(CString)Buf;

m_SerialPort.WriteToPort((LPCTSTR)m_strEditSendMsg);

Sleep(TIMEDELAY);

}elseif(joyy<=12)//如果游戏杆在中心位置的下边,移动光标到下边。

反之亦然

{

//SetDlgItemText(IDC_STATIC1,"快速前进");

Buf[0]=0xEB;Buf[1]=0x11;

//if(!

m_bSerialPortOpened)return;//检查串口是否打开

m_strEditSendMsg=(CString)Buf;

m_SerialPort.WriteToPort((LPCTSTR)m_strEditSendMsg);

Sleep(TIMEDELAY);

}

elseif(joyy>=25)

{

//SetDlgItemText(IDC_STATIC1,"后退");

Buf[0]=0xEB;Buf[1]=0x22;

//if(!

m_bSerialPortOpened)return;//检查串口是否打开

m_strEditSendMsg=(CString)Buf;

m_SerialPort.WriteToPort((LPCTSTR)m_strEditSendMsg);

Sleep(TIMEDELAY);

}if(wParam&JOY_BUTTON1)

{

Sleep(5);

//SetDlgItemText(IDC_STATIC1,"1");//前进

Buf[0]=0xEA;Buf[1]=0xAA;

//if(!

m_bSerialPortOpened)return;//检查串口是否打开

m_strEditSendMsg=(CString)Buf;

m_SerialPort.WriteToPort((LPCTSTR)m_strEditSendMsg);

Sleep(TIMEDELAY);

}elseif(wParam&JOY_BUTTON2)

{

Sleep(5);

//SetDlgItemText(IDC_STATIC1,"2");//后退

 

}elseif(wParam&JOY_BUTTON3)

{

Sleep(5);

//SetDlgItemText(IDC_STATIC1,"3");

Buf[0]=0xEB;

Buf[1]=0xAA;

//TODO:

Addyourcontrolnotificationhandlercodehere

//if(!

m_bSerialPortOpened)return;//检查串口是否打开

//UpdateData(TRUE);//读入编辑框中的数据

m_strEditSendMsg=(CString)Buf;

m_SerialPort.WriteToPort((LPCTSTR)m_strEditSendMsg);

Sleep(TIMEDELAY);

}

elseif(wParam&JOY_BUTTON4)

{

Sleep(5);

//SetDlgItemText(IDC_STATIC1,"4");

}

elseif(wParam&JOY_BUTTON1CHG)

{

//SetDlgItemText(IDC_STATIC1,"select");//标准避障模式

Buf[0]=0xEA;Buf[1]=0xCC;

//if(!

m_bSerialPortOpened)return;//检查串口是否打开

m_strEditSendMsg=(CString)Buf;

m_SerialPort.WriteToPort((LPCTSTR)m_strEditSendMsg);

Sleep(TIMEDELAY);

}elseif(wParam&JOY_BUTTON2CHG)

{

//SetDlgItemText(IDC_STATIC1,"start");//标准上位机控制模式

Buf[0]=0xEB;Buf[1]=0xCC;

//if(!

m_bSerialPortOpened)return;//检查串口是否打开

m_strEditSendMsg=(CString)Buf;

m_SerialPort.WriteToPort((LPCTSTR)m_strEditSendMsg);

Sleep(TIMEDELAY);

}elseif(wParam&JOY_BUTTON5)

{

//SetDlgItemText(IDC_STATIC1,"5");

}

elseif(wParam&JOY_BUTTON6)

{

//SetDlgItemText(IDC_STATIC1,"6");

}elseif(wParam&JOY_BUTTON7)//select

{

//SetDlgItemText(IDC_STATIC1,"7");

Buf[0]=0xEB;Buf[1]=0x1A;

//if(!

m_bSerialPortOpened)return;//检查串口是否打开

m_strEditSendMsg=(CString)Buf;

m_SerialPort.WriteToPort((LPCTSTR)m_strEditSendMsg);

Sleep(TIMEDELAY);

}elseif(wParam&JOY_BUTTON8)//select

{

//SetDlgItemText(IDC_STATIC1,"8");

Buf[0]=0xEB;Buf[1]=0x1B;

//if(!

m_bSerialPortOpened)return;//检查串口是否打开

m_strEditSendMsg=(CString)Buf;

m_SerialPort.WriteToPort((LPCTSTR)m_strEditSendMsg);

Sleep(TIMEDELAY);

}

}

returnCDialog:

:

WindowProc(message,wParam,lParam);

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2