已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
嵌入式实验报告小车避障+上位机李晨,颜文杰2012/6/7一、 小车的功能及部件小车能够实现的主要功能有自动避障和上位机两个方面。避障主要是依靠传感器检测小车与前方的距离,然后根据算法的程序,自动选择最近的方式避障。上位机则是依靠电脑与小车通过无线串口相连,利用游戏手柄控制上位机的指令对小车进行前进、后退、左转、右转、加速等控制,从而实现用手柄对小车的无线遥控。传感器的分布直接的影响到了小车的自动避障功能,因此,为达到最优的效果,将传感器如下图的分布:前面两个用来判断小车与障碍物所成的角度,左右两边用来使小车与边界有一定的距离。为实现上位机的无线遥控功能,将小车加上无线模块与游戏手柄。二、 小车功能的实现小车的功能已经在上部分说明了,但是为实现两者功能的转化,我们采用了使用上位机发送指令从而改变小车工作模式的方法。下图为上位机工作界面:由上图可知,小车与电脑通过无线模块相连时,通过点选按钮“控制”和“自动避障”,可以使小车实现两种功能的切换。具体实现如下:通过串口中断,在计算机发送指令时改变flag_mode_choice的值,改变主程序中运行的不同模块,从而改变功能。while (1) while (flag_mode_choice=0) ADC_Ch0_Res = ADC_RegularConvertedValueTab0 - ADC_Calibration_DR; ADC_Ch1_Res = ADC_RegularConvertedValueTab1 - ADC_Calibration_DR; ADC_Ch2_Res = ADC_RegularConvertedValueTab2 - ADC_Calibration_DR; ADC_Ch3_Res = ADC_RegularConvertedValueTab3 - ADC_Calibration_DR; if (RxBuffer1=0xCC) now_speed=100; Forward_Cmd(); if(ADC_Ch3_Res0x520)Turn_Right(); else if(ADC_Ch0_Res0x520)Turn_Left(); if(ADC_Ch2_Res0x520|ADC_Ch1_Res0x520) if(ADC_Ch2_ResADC_Ch1_Res) Turn_Left(); if(ADC_Ch2_Res0xAA&ADC_Ch1_Res0xAA) Backward_Cmd(); Delay(0XAFFFF); while (flag_mode_choice=1) if(RxBuffer1=0x11) Forward_Cmd(); else if (RxBuffer1=0xCC) now_speed=100;Forward_Cmd(); else if (RxBuffer1=0x22) Backward_Cmd(); else if (RxBuffer1=0x1A) Forward_Accelerate_Cmd(); else if (RxBuffer1=0x1B) Forwar_non_Accelerate_Cmd(); else if (RxBuffer1=0x33) Turn_Right(); else if (RxBuffer1=0x44) Turn_Left(); else Break_Cmd(); 利用以下的串口中断实现功能转换:extern u8 RxBuffer6;extern int flag_mode_choice;void USART1_IRQHandler(void) if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) USART_ITConfig(USART1,USART_IT_RXNE,DISABLE); /* Read one byte from the receive data register */ while(!USART_GetFlagStatus(USART1,USART_FLAG_RXNE) ; RxBuffer0 = USART_ReceiveData(USART1); while(!USART_GetFlagStatus(USART1,USART_FLAG_RXNE) ; RxBuffer1 = USART_ReceiveData(USART1); if (RxBuffer0 = 0xEA) flag_mode_choice=0; if( RxBuffer0 = 0xEB) flag_mode_choice=1; /* Clear the USART1 Receive interrupt */ USART_ClearITPendingBit(USART1, USART_IT_RXNE); USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); 1. 避障功能的实现为实现小车的避障功能,使小车前面两个传感器的值相比较,若其中一个大于另一个,则向偏大的方向转弯,反之亦然。程序实现如下:ADC_Ch0_Res = ADC_RegularConvertedValueTab0 - ADC_Calibration_DR; ADC_Ch1_Res = ADC_RegularConvertedValueTab1 - ADC_Calibration_DR; ADC_Ch2_Res = ADC_RegularConvertedValueTab2 - ADC_Calibration_DR; ADC_Ch3_Res = ADC_RegularConvertedValueTab3 - ADC_Calibration_DR; if (RxBuffer1=0xCC) now_speed=100; Forward_Cmd(); if(ADC_Ch3_Res0x520)Turn_Right(); else if(ADC_Ch0_Res0x520)Turn_Left(); if(ADC_Ch2_Res0x520|ADC_Ch1_Res0x520) if(ADC_Ch2_ResADC_Ch1_Res) Turn_Left(); if(ADC_Ch2_Res0xAA&ADC_Ch1_Res0xAA) Backward_Cmd();2. 上位机功能实现上位机的界面是由Visual C+ 6.0中的MFC编写的。其中有打开串口,发送显示,接受显示等功能,也可实现小车的功能切换,可以直接支持游戏手柄的控制。使用无线的控制时,波特率为9600,按钮的代码段如下所示:/避障模式void CSerialPortTestDlg:OnButtonSend() Buf0=0xEA;Buf1=0xAA;/Buf2=0xAA;/ TODO: Add your control notification handler code hereif(!m_bSerialPortOpened)return;/检查串口是否打开/UpdateData(TRUE);/读入编辑框中的数据m_strEditSendMsg = (CString)Buf;m_SerialPort.WriteToPort(LPCTSTR)m_strEditSendMsg);/发送数据void CSerialPortTestDlg:OnChangeEditSendmsg() / TODO: If this is a RICHEDIT control, the control will not/ send this notification unless you override the CDialog:OnInitDialog()/ function and call CRichEditCtrl().SetEventMask()/ with the ENM_CHANGE flag ORed into the mask./ TODO: Add your control notification handler code here/上位机控制模式void CSerialPortTestDlg:OnButtonSend2() Buf0=0xEB;Buf1=0xAA;/Buf2=0xAA;/Buf3=0xAA;/ TODO: Add your control notification handler code hereif(!m_bSerialPortOpened)return;/检查串口是否打开/UpdateData(TRUE);/读入编辑框中的数据m_strEditSendMsg = (CString)Buf;m_SerialPort.WriteToPort(LPCTSTR)m_strEditSendMsg);/前进/void CSerialPortTestDlg:OnButtonSend6() Buf0=0xEB;Buf1=0x11;/Buf2=0xAA;Buf3=0xAA;/ TODO: Add your control notification handler code hereif(!m_bSerialPortOpened)return;/检查串口是否打开/UpdateData(TRUE);/读入编辑框中的数据m_strEditSendMsg = (CString)Buf;m_SerialPort.WriteToPort(LPCTSTR)m_strEditSendMsg);/后退void CSerialPortTestDlg:OnButtonSend4() Buf0=0xEB;Buf1=0x22;/Buf2=0xAA;Buf3=0xAA;/ TODO: Add your control notification handler code hereif(!m_bSerialPortOpened)return;/检查串口是否打开/UpdateData(TRUE);/读入编辑框中的数据m_strEditSendMsg = (CString)Buf;m_SerialPort.WriteToPort(LPCTSTR)m_strEditSendMsg);/左转void CSerialPortTestDlg:OnButtonSend3() Buf0=0xEB;Buf1=0x33;/Buf2=0xAA;Buf3=0xAA;/ TODO: Add your control notification handler code hereif(!m_bSerialPortOpened)return;/检查串口是否打开/UpdateData(TRUE);/读入编辑框中的数据m_strEditSendMsg = (CString)Buf;m_SerialPort.WriteToPort(LPCTSTR)m_strEditSendMsg);/右转void CSerialPortTestDlg:OnButtonSend5() Buf0=0xEB;Buf1=0x44;/Buf2=0xAA;Buf3=0xAA;/ TODO: Add your control notification handler code hereif(!m_bSerialPortOpened)return;/检查串口是否打开/UpdateData(TRUE);/读入编辑框中的数据m_strEditSendMsg = (CString)Buf;m_SerialPort.WriteToPort(LPCTSTR)m_strEditSendMsg);/手柄控制LRESULT CSerialPortTestDlg:WindowProc(UINT message, WPARAM wParam, LPARAM lParam) / TODO: Add your specialized code here and/or call the base classjoyx = LOWORD(lParam)/2048;joyy = HIWORD(lParam)/2048;/WORD joyx,joyy;if (Buf0=0xEB)&(Buf1=0x44)&(joyx=12) Buf0=0xEB;Buf1=0x11;m_strEditSendMsg = (CString)Buf;m_SerialPort.WriteToPort(LPCTSTR)m_strEditSendMsg);/Sleep(TIMEDELAY);else if(Buf0=0xEB)&(Buf1=0x33)&(joyx=12) Buf0=0xEB;Buf1=0x11;m_strEditSendMsg = (CString)Buf;m_SerialPort.WriteToPort(LPCTSTR)m_strEditSendMsg); else if(Buf0=0xEB)&(Buf1=0x22)&(joyy=12) Buf0=0xEB;Buf1=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 = 20)Sleep(5);/SetDlgItemText(IDC_STATIC1,右转);Buf0=0xEB;Buf1=0x33;/if(!m_bSerialPortOpened)return;/检查串口是否打开m_strEditSendMsg = (CString)Buf;m_SerialPort.WriteToPort(LPCTSTR)m_strEditSendMsg);Sleep(TIMEDELAY);else if(joyy = 25) /SetDlgItemText(IDC_STATIC1,后退);Buf0=0xEB;Buf1=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);/前进Buf0=0xEA;Buf1=0xAA;/if(!m_bSerialPortOpened)return;/检查串口是否打开m_strEditSendMsg = (CString)Buf;m_SerialPort.WriteToPort(LPCTSTR)m_strEditSendMsg);Sleep(TIMEDELAY);else if (wParam & JOY_BUTTON2)Sleep(5);/SetDlgItemText(IDC_STATIC1,2);/后退else if(wParam & JOY_BUTTON3)Sleep(5);/SetDlgItemText(IDC_STATIC1,3);Buf0=0xEB;Buf1=0xAA;/ TODO: Add your control notification handler code here/if(!m_bSerialPortOpened)return;/检查串口是否打开/UpdateData(TRUE);/读入编辑框中的数据m_strEditSendMsg = (CString)Buf;m_SerialPort.WriteToPort(LPCTSTR)m_strEditSendMsg);Sleep(TIMEDELAY); else if(wParam & JOY_BUTTON4)Sleep(5);/SetDlgItemText(IDC_STATIC1,4);else if (wParam&JOY_BUTTON1CHG) /SetDlgItemText(IDC_STATIC1,select);/标准避障模式Buf0=0xEA;Buf1=0xCC;/if(!m_bSerialPortOpened)return;/检查串口是否打开m_strEditSendMsg = (CString)Buf;m_SerialPort.WriteToPort(LPCTSTR)m_strEditSendMsg);Sleep(TIMEDELAY);else if(wParam&JOY_BUTTON2CHG) /SetDlgItemText(IDC_STATIC1,start);/标准上位机控制模式Buf0=0xEB;Buf1=0xCC;/if(!m_bSerialPortOpened)return;/检查串口是否打开m_strEditSendMsg = (CString)Buf;m_SerialPort.WriteToPort(LPCTSTR)m_strEditSendMsg);Sleep(TIMEDELAY);else if(wParam&JOY_BUTTON5) /SetDlgItemText(IDC_STATIC1,5);else if(wParam&JOY_BUTTON6) /SetDlgItemText(IDC_STATIC1,6);else if(wParam&JOY_BUTTON7)/select/SetDlgItemText(IDC_STATIC1,7); Buf0=0xEB;Buf1=0x1A;/if(!m_bSerialPortOpened)return;/检查串口是否打开m_strEditSendMsg = (CString)Buf;m_SerialPort.WriteToPort(LPCTSTR)m_strEditSendMsg);Sleep(TIMEDELAY);else if(wParam&JOY_BUTTON8)/select/SetDlgItemText(IDC_STATIC1,8);Buf0=0xEB;Buf1=0x1B;/if(!m_bSerialPortOpened)return;/检查串口是否打开m_strEditSendMsg = (CString)Buf;m_SerialPort.WriteToPort(LPCTSTR)m_strEditSendMsg);Sleep(TIMEDELAY);return CDialog:WindowProc(message, wParam, lParam);BOOL CSerialPortTestDlg:OnInitDialog()CDialog:On
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB 48147.1-2026矿山隐蔽致灾因素普查规范第1部分:总则
- DB32/T 5113-2025港口粉尘在线监测系统建设技术规范
- DB31/T 329.26-2025重点单位重要部位安全技术防范系统要求 第26部分:民用机场航站楼
- DB62/T 5161-2025智慧园区信息系统建设与管理规范
- DB32/T 2074-2025学生军训服质量评价技术规范
- T/BSIA 019-2024跨媒体虚假新闻识别系统要求
- T/ASAC 0005-202141型中蜂蜂箱
- 幼儿园2026春季教研工作计划精
- T/CABP 007-2023现代厨房运行与管理职业技能等级标准
- 建筑工程资料归档(移交)目录
- 2026中国工业废水零排放技术路线与成本效益分析报告
- 2026-2032年中国智能辅助治疗行业市场动态分析及发展趋向研判报告
- 2026年度国家工作人员学法用法考试题库(含答案)
- 2026年成都市金牛区人民检察院公开招聘编外人员笔试参考题库及答案详解
- 2026年上海市建筑三类人员项目负责人(安全员B证)考试题库
- 《整 理收纳》高职现代家政服务专业全套教学课件
- 湖南省湘潭市2027届高三上学期第一次模拟考试英语试卷(含答案)
- IPC-4101 标准中文版文档
- 第一单元 健康生活(单元自测)科学教科版六年级上册2026秋
- 2026年贵州省现代种业集团有限公司第二批人才招聘考试备考试题及答案详解
- 2026统考专升本英语:英语550个高频核心词
评论
0/150
提交评论