循迹避障智能小车设计

合集下载

智能循迹小车课程设计报告

智能循迹小车课程设计报告

智能循迹小车课程设计报告一、课程设计目标:本次智能循迹小车课程设计的目标是让学生了解智能硬件的基础知识,掌握基本电子元器件的原理及使用方法,学习控制系统的组成和运行原理,并通过实践操作设计出一款功能齐全的智能循迹小车。

二、课程设计内容及步骤:1. 调研与分析——首先要对市面上现有的智能循迹小车进行调研与分析,了解各种类型的循迹小车的特点和优缺点,为后续的设计提供参考。

2. 硬件选型——根据课程设计目标和实际需要,选择合适的主控芯片、电子元器件和传感器等硬件。

3. 原理图设计——根据硬件选型,设计出对应的原理图,并在硬件上进行布局与焊接。

4. 程序设计——先在电路板上测试硬件是否正常,随后进行程序设计,根据传感器的反馈控制小车的运动,让小车能够沿着黑线自动循迹行驶,同时加入避障功能和自动寻迹功能。

5. 调试与优化——完成程序设计后,要对小车进行全面验收测试,发现问题及时解决并优化相关程序。

三、设计思路:本次课程设计基于树莓派电路板,利用循迹模块实现小车的自动循迹和自动寻迹。

同时将超声波模块结合避障算法实现小车的自动避障。

小车的外壳采用3D打印技术制作,操作简单实用。

四、课程设计效果:通过本课程设计,学生们从理论到实践,了解了智能硬件的基础知识,掌握了基本电子元器件的原理及使用方法,学习了控制系统的组成和运行原理。

同时,实践操作过程中,学生们培养了动手能力和实际操作的技能。

通过制作一台智能循迹小车,学生们对智能硬件的认识更加深入,并获得了较高的设计满足感。

五、课程设计展望:智能循迹小车是智能硬件应用领域的一项重要发明,具有广泛的应用前景。

未来,可以将循迹小车应用于快递、物流等行业,实现自动化送货、配送。

同时可以将遥控技术与循迹技术相结合,设计出更加高效、实用的智能循迹小车,推动智能化生产和工作环境。

循迹避障小车设计报告

循迹避障小车设计报告

项目名称:智能小车系别:信息工程系专业:11电气工程及其自动化姓名:刘亮、崔占闯、韩康指导老师:王蕾目录摘要: (3)关键词: (3)绪论: (3)一、系统设计 (4)1.1、任务及要求 (4)1.2车体方案认证与选择 (4)二、硬件设计及说明 (5)2.1循迹+避障模块 (5)2.2主控模块 (6)2.3电机驱动模块 (6)2.4机械模块 (7)2.5 电源模块 (7)三、自动循迹避障小车总体设计 (7)四、软件设计及说明 (8)4.1系统软件流程图 (9)4.2系统程序 (9)五、系统测试过程 (12)六、总结 (13)七、附录:系统元器件 (13)摘要本设计主要有三个模块包括信号检测模块、主控模块、电机驱动模块。

信号检测模块采用红外光对管,用以对有无障碍与黑线进行检测。

主控电路采用宏晶公司的8051核心的STC89C52单片机为控制芯片。

电机驱动模块采用意法半导体的L298N专用电机驱动芯片,单片控制与传统分立元件电路相比,使整个系统有很好的稳定性。

信号检测模块将采集到的路况信号传入STC89C52单片机,经单片机处理过后对L298N发出指令进行相应的调整。

通过有无光线接收来控制电动小车的转向,从而实现自动循迹避障的功能。

关键词:智能循迹避障小车,STC89C52单片机,L298N驱动芯片,信号检测模块,循迹避障绪论(一)智能小车的作用和意义自第一台工业机器人诞生以来,机器人的发展已经遍及机械、电子、冶金、交通、宇航、国防等领域。

近年来机器人的智能水平不断提高,并且迅速地改变着人们的生活方式。

人们在不断探讨、改造、认识自然的过程中,制造能替代人劳动的机器一直是人类的梦想。

随着科学技术的发展,机器人的感系统,对于视觉的各种技术而言图像处理技术已相当发达,而基于图像的理解技术还很落后,机器视觉需要通过大量的运算也只能识别一些结构化环境简单的目标。

视觉传感器的核心器件是摄像管或CCD,目前的CCD已能做到自动聚焦。

智能小车用红外循迹避障模块设计方案

智能小车用红外循迹避障模块设计方案

循迹避障模块设计方案包括电路原理图、实物图、器件表以及程序源代码循迹避障模块PCB图正面循迹避障模块PCB图背面循迹避障模块器件(BOM)表实物图封装直插直插直插直插直插直插封装封装直插封装封装表贴循迹避障模块实物图循迹避障模块电路板正面循迹避障模块电路板背面循迹避障程序源代码/*************51单片机智能小车红外循迹避障运动程序源代码***************开发软件:KEIL。

单片机型号:STC15W4K56S4。

单片机内部时钟,频率为22.1184M。

**********************************************************************/#include "stc15.h" //包含头文件stc15.h#include <intrins.h> //包含头文件intrins.h#define Busy 0x80 //LCD忙#define warning_voltage 7.0 //电池报警电压值#define ADC_POWER 0x80 //将0x80宏定义成ADC_POWER#define ADC_FLAG 0x10 //将0x10宏定义成ADC_FLAG#define ADC_START 0x08 //将0x08宏定义成ADC_START#define ADC_SPEEDLL 0x00 //将0x00宏定义成ADC_SPEEDLL#define ADC_SPEEDL 0x20 //将0x20宏定义成ADC_SPEEDL#define ADC_SPEEDH 0x40 //将0x40宏定义成ADC_SPEEDH#define ADC_SPEEDHH 0x60 //将0x60宏定义成ADC_SPEEDHHsbit Red_LED = P0^4; //红色LED对应P0.4sbit Green_LED = P0^5; //绿色LED对应P0.5sbit Blue_LED = P5^2; //蓝色LED对应P5.2sbit Yellow_LED = P5^3; //黄色LED对应P5.3sbit Beep = P4^4; //蜂鸣器对应P4.4sbit LCD_D4 = P4^3; //LCD_D4对应P4.3sbit LCD_D5 = P4^2; //LCD_D5对应P4.2sbit LCD_D6 = P2^7; //LCD_D6对应P2.7sbit LCD_D7 = P5^1; //LCD_D7对应P5.1sbit LCD_RS = P4^1; //LCD_RS对应P4.1sbit LCD_RW = P3^5; //LCD_RW对应P3.5sbit LCD_EN = P2^6; //LCD_EN对应P2.6sbit U6_L293D_En1_En2 = P1^7; //L293D(U6)的EN1和EN2对应P1.7 sbit U6_L293D_In1_In3 = P4^7; //L293D(U6)的IN1和IN3对应P4.7 sbit U6_L293D_In2_In4 = P1^6; //L293D(U6)的IN2和IN4对应P1.6 sbit U7_L293D_En1_En2 = P0^6; //L293D(U7)的EN1和EN2对应P0.6 sbit U7_L293D_In1_In3 = P0^7; //L293D(U7)的IN1和IN3对应P0.7 sbit U7_L293D_In2_In4 = P1^2; //L293D(U7)的IN2和IN4对应P1.2 sbit HW_LEFT_WAI = P2^0; //HW_LEFT_WAI对应IO口P2.0sbit HW_LEFT_NEI = P2^2; //HW_LEFT_NEI对应IO口P2.2sbit HW_RIGHT_NEI = P2^3; //HW_RIGHT_NEI对应IO口P2.3sbit HW_RIGHT_WAI = P2^4; //HW_RIGHT_WAI对应IO口P2.4sbit HW_LEFT = P2^1; //红外避障模块左外对应IO口P2.1 sbit HW_RIGHT = P2^5; //红外避障模块左内对应IO口P2.5 sbit Key_1 = P5^2; //Key1对应IO口P5.2sbit Key_2 = P0^4; //Key2对应IO口P0.4sbit Key_3 = P0^5; //Key3对应IO口P0.5sbit Key_4 = P5^3; //Key4对应IO口P5.3unsigned char code Start[]={"CAR START"}; //LCD显示内容CAR START unsigned char code Work[]={"CAR WORK"}; //LCD显示内容CAR WORK unsigned char code Voltage[]={"V: . V"}; //LCD显示内容V:unsigned char code VlotageLow[]={"LOW"}; //LCD显示内容LOWunsigned char code Space1[]={" "}; //LCD显示内容空白unsigned char code Space3[]={" "}; //LCD显示内容空白unsigned char code Forward[]={"FORWARD"}; //LCD显示内容FORWARD unsigned char code Back[]={"BACK"}; //LCD显示内容BACK unsigned char code Ting[]={"TING"}; //LCD显示内容TING unsigned char code Left[]={"LEFT"}; //LCD显示内容LEFT unsigned char code Right[]={"RIGHT"}; //LCD显示内容RIGHT unsigned char code ClockWise[]={"CLOCKWISE"}; //LCD显示内容CLOCKWISE unsigned char code AntiClockWise[]={"ANTICLOCKWISE"};//LCD显示内容ANTICLOCKWISE unsigned char code PressKey1[]={"P: K1"}; //LCD显示内容P: K1 unsigned char code PressKey2[]={"P: K2"}; //LCD显示内容P: K2 unsigned char code PressKey3[]={"P: K3"}; //LCD显示内容P: K3 unsigned char code PressKey4[]={"P: K4"}; //LCD显示内容P: K4 unsigned char code Hwxjbz[]={"HWXJBZ"}; //LCD显示内容HWXJBZvoid delay(unsigned int t); //delay延时函数void delay_us(unsigned int t); //delay_us延时函数void delay_ms(unsigned int t); //delay_ms延时函数void Delay5Ms(void); //延时函数void LED_INIT(void); //LED对应的IO口初始化void Red_Led_On(void); //红色LED亮void Red_Led_Off(void); //红色LED灭void Blue_Led_On(void); //蓝牙LED亮void Blue_Led_Off(void); //蓝色LED灭void Green_Led_On(void); //绿色LED亮void Green_Led_Off(void); //绿色LED灭void Yellow_Led_On(void); //黄色LED亮void Yellow_Led_Off(void); //黄色LED灭void BEEP_INIT(void); //蜂鸣器对应的IO口初始化void BEEP_ON(void); //蜂鸣器响void BEEP_OFF(void); //蜂鸣器不响void GPIO_1602_Configuration(void); //LCD1602液晶IO口初始化void WriteDataLCD(unsigned char WDLCD); //LCD写数据函数void WriteCommandLCD(unsigned char WCLCD,BuysC); //LCD写命令函数unsigned char ReadDataLCD(void); //LCD读数据函数unsigned char ReadStatusLCD(void); //LCD读状态函数void LCDInit(void); //LCD初始化void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);//LCD显示一个字符void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData); //LCD显示一个字符串void GPIO_MOTOR_Configuration(void); //电机控制IO口初始化void CAR_FORWARD(void); //智能小车前进void CAR_LEFT(void); //智能小车左转void CAR_RIGHT(void); //智能小车右转void CAR_STOP(void); //智能小车停止void ZUO_MOTOR_ZZ(void); //智能小车左侧电机正转void ZUO_MOTOR_TZ(void); //智能小车左侧电机停转void YOU_MOTOR_ZZ(void); //智能小车右侧电机正转void YOU_MOTOR_TZ(void); //智能小车右侧电机停转void HWXJ_INIT(void); //红外循迹模块对应的IO口初始化void Voltage_Warning(void); //测量电池电压void Timer0_Init(void); //定时器初始化void LEFT_MOTO(void); //左电机PWM调速函数void RIGHT_MOTO(void); //右电机PWM调速函数void CAR_HWXJ(void); //小车红外循迹函数void CAR_HWBZ(void); //小车红外循迹避障void HWBZ_INIT(void); //红外避障模块对应的IO口初始化void KEY_INIT(void); //KEY对应的IO口初始化void Key1_SCAN(void); //按键扫描void ADC_INIT(void); //AD初始化unsigned char GetADCResult(unsigned char ch);//获取AD值unsigned char pwmval_left = 0; //变量定义unsigned char pwmval_right = 0; //变量定义unsigned char pwmval_left_init = 5; //左电机占空比调节unsigned char pwmval_right_init = 5; //右电机占空比调节bit right_pwm = 1; //右电机PWM开关,为1时打开bit left_pwm = 1; //左电机PWM开关,为1时打开/************************延时函数***************************/void delay(unsigned int t) //delay延时函数{while(t--);}void delay_us(unsigned int t) //delay_us延时函数{unsigned char i;while(t--){i=3;while(i--)delay(1);}}void delay_ms(unsigned int t) //delay_ms延时函数{while(t--) {delay_us(t);}}void Delay5Ms(void) //5ms延时函数{unsigned int TempCyc = 3552;while(TempCyc--);}/**********************LED相关函数*************************/void LED_INIT(void) //LED对应的IO口初始化{P0M1=P0M1&0xcf;P0M0=P0M0&0xcf; //P0.5,P0.4设置为双向IO口 P5M1=P5M1&0xf3;P5M0=P5M0&0xf3; //P5.3,P5.2设置为双向IO口}void Red_Led_On(void) //红色LED亮{Red_LED = 0;}void Red_Led_Off(void) //红色LED灭{Red_LED = 1;}void Blue_Led_On(void) //蓝牙LED亮{Blue_LED = 0;}void Blue_Led_Off(void) //蓝色LED灭{Blue_LED = 1;}void Green_Led_On(void) //绿色LED亮{Green_LED = 0;}void Green_Led_Off(void) //绿色LED灭{Green_LED = 1;}void Yellow_Led_On(void) //黄色LED亮{Yellow_LED = 0;}void Yellow_Led_Off(void) //黄色LED灭{Yellow_LED = 1;}/*********************蜂鸣器相关函数***********************/void BEEP_INIT(void) //蜂鸣器对应的IO口初始化{P4M1=P4M1&0xef;P4M0=P4M0&0xef;}void BEEP_ON(void) //蜂鸣器响{Beep=0;}void BEEP_OFF(void) //蜂鸣器不响{Beep=1;}/*******************液晶LCD1602相关函数********************/void GPIO_1602_Configuration(void) //LCD1602液晶IO口初始化{P2M1=P3M1&0x3f;P2M0=P3M0&0x3f;P3M1=P3M1&0xdf;P3M0=P3M0&0xdf;P4M1=P4M1&0xf1;P4M0=P4M0&0xf1;P5M1=P5M1&0xfd;P5M0=P5M0&0xfd;}unsigned char ReadStatusLCD(void) //测试LCD忙碌状态{LCD_D7 = 1; //LCD的D7置1LCD_RS = 0; //LCD管脚RS设置成低电平 LCD_RW = 1; //LCD管脚RW设置成高电平LCD_EN = 0; //LCD管脚E设置成低电平 LCD_EN = 0; //LCD管脚E设置成低电平 LCD_EN = 1; //LCD管脚E设置成高电平 while(LCD_D7); //检测忙信号return(Busy); //表示当前忙}void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测{if(BuysC) ReadStatusLCD(); //根据需要检测忙LCD_EN = 0; //LCD管脚E设置成低电平 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //延时LCD_RS = 0; //LCD管脚RS设置成低电平 LCD_RW = 0; //LCD管脚RW设置成低电平 if((WCLCD&0x80)==0x80){LCD_D7=1;}else{LCD_D7=0;}if((WCLCD&0x40)==0x40){LCD_D6=1;}else{LCD_D6=0;}if((WCLCD&0x20)==0x20){LCD_D5=1;}else{LCD_D5=0;}if((WCLCD&0x10)==0x10){LCD_D4=1;}else{LCD_D4=0;}LCD_EN = 1; //LCD管脚E设置成高电平 LCD_EN = 0; //LCD管脚E设置成低电平 if((WCLCD&0x08)==0x08){LCD_D7=1;}else{LCD_D7=0;}if((WCLCD&0x04)==0x04){LCD_D6=1;}else{LCD_D6=0;}if((WCLCD&0x02)==0x02){LCD_D5=1;}else{LCD_D5=0;}if((WCLCD&0x01)==0x01){LCD_D4=1;}else{LCD_D4=0;}LCD_EN = 1; //LCD管脚E设置成高电平 LCD_EN = 0; //LCD管脚E设置成低电平}void WriteDataLCD(unsigned char WDLCD) //LCD写数据函数{ReadStatusLCD(); //读取LCD状态LCD_EN = 0; //LCD管脚E设置成低电平 _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //延时LCD_RS = 1; //LCD管脚RS设置成高电平 LCD_RW = 0; //LCD管脚RW设置成低电平 if((WDLCD&0x80)==0x80){LCD_D7=1;}else{LCD_D7=0;}if((WDLCD&0x40)==0x40){LCD_D6=1;}else{LCD_D6=0;}if((WDLCD&0x20)==0x20){LCD_D5=1;}else{LCD_D5=0;}if((WDLCD&0x10)==0x10){LCD_D4=1;}else{LCD_D4=0;}LCD_EN = 1; //LCD管脚E设置成高电平 LCD_EN = 0; //LCD管脚E设置成低电平 if((WDLCD&0x08)==0x08){LCD_D7=1;}else{LCD_D7=0;}if((WDLCD&0x04)==0x04){LCD_D6=1;}else{LCD_D6=0;}if((WDLCD&0x02)==0x02){LCD_D5=1;}else{LCD_D5=0;}if((WDLCD&0x01)==0x01){LCD_D4=1;}else{LCD_D4=0;}LCD_EN = 1; //LCD管脚E设置成高电平LCD_EN = 0; //LCD管脚E设置成低电平}void LCDInit(void) //LCD初始化{LCD_D7=0;LCD_D6=0;LCD_D5=0;LCD_D4=0;WriteCommandLCD(0x28,0);Delay5Ms(); //三次显示模式设置WriteCommandLCD(0x28,0);Delay5Ms();WriteCommandLCD(0x28,0);Delay5Ms();WriteCommandLCD(0x28,1); //显示模式设置WriteCommandLCD(0x08,1); //关闭显示WriteCommandLCD(0x01,1); //显示清屏WriteCommandLCD(0x06,1); //显示光标移动设置WriteCommandLCD(0x0C,1); //显示开及光标设置}void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData){Y&=0x1;X&=0xF; //限制X不能大于15,Y不能大于1if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; //算出指令码WriteCommandLCD(X,0); //这里不检测忙信号,发送地址码WriteDataLCD(DData); //发送数据}void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData) {unsigned char ListLength;ListLength = 0;Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1while(DData[ListLength]>=0x20) //若到达字串尾则退出{if (X <= 0xF) //X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]);//显示单个字符ListLength++;X++;}}}/********************电机控制相关函数**********************/void GPIO_MOTOR_Configuration(void) //电机控制IO口初始化{P0M1=P0M1&0x3f;P0M0=P0M0&0x3f;P1M1=P1M1&0x3b;P1M0=P1M0&0x3b;P4M1=P4M1&0x7f;P4M0=P4M0&0x7f;}void CAR_FORWARD(void) //智能小车前进{ZUO_MOTOR_ZZ();YOU_MOTOR_ZZ();} //智能小车左侧电机正转,右侧电机正转void CAR_LEFT(void) //智能小车左转{ZUO_MOTOR_TZ();YOU_MOTOR_ZZ();} //智能小车左侧电机停转,右侧电机正转void CAR_RIGHT(void) //智能小车右转{ZUO_MOTOR_ZZ();YOU_MOTOR_TZ();} //智能小车左侧电机正转,右侧电机停转void CAR_STOP(void) //智能小车停止{ZUO_MOTOR_TZ();YOU_MOTOR_TZ();} //智能小车左侧电机停转,右侧电机停转void ZUO_MOTOR_ZZ(void) //智能小车左侧电机正转{U6_L293D_In1_In3=1;U6_L293D_In2_In4=0;}void ZUO_MOTOR_TZ(void) //智能小车左侧电机停转{U6_L293D_In1_In3=0;U6_L293D_In2_In4=0;}void YOU_MOTOR_ZZ(void) //智能小车右侧电机正转{U7_L293D_In1_In3=0;U7_L293D_In2_In4=1;}void YOU_MOTOR_TZ(void) //智能小车右侧电机停转{U7_L293D_In1_In3=0;U7_L293D_In2_In4=0;} void LEFT_MOTO(void){if(left_pwm){if(pwmval_left<=pwmval_left_init){U6_L293D_En1_En2=1;}else if(pwmval_left>pwmval_left_init){U6_L293D_En1_En2=0;}if(pwmval_left>=20){pwmval_left=0;}}else{U6_L293D_En1_En2=0;}}void RIGHT_MOTO(void){if(right_pwm){if(pwmval_right<=pwmval_right_init){U7_L293D_En1_En2=1;}else if(pwmval_right>pwmval_right_init){U7_L293D_En1_En2=0;}if(pwmval_right>=20){pwmval_right = 0;}}else{U7_L293D_En1_En2=0;}}/********************红外循迹相关函数**********************/void HWXJ_INIT(void) //红外循迹模块对应的IO口初始化{P2M1=P2M1&0xe2;P2M0=P2M0&0xe2;} //P2.0,P2.2,P2.3,P2.4设置为双向IO口void CAR_HWXJ(void) //小车红外循迹函数{//探测到黑线为1,没有探测到黑线为0if((HW_LEFT_WAI==0)&&(HW_LEFT_NEI==0)&&(HW_RIGHT_NEI==0)&&(HW_RIGHT_WAI==0))//如果左外,左内,右内,右外循迹传感器都没有感应到黑线{pwmval_left_init=5;pwmval_right_init=5; //左右电机占空比调节CAR_FORWARD(); //小车前进}else if((HW_LEFT_WAI==1)&&(HW_LEFT_NEI==1)&&(HW_RIGHT_NEI==0)&&(HW_RIGHT_WAI==0))//如果左外,左内循迹传感器都感应到黑线;右内,右外循迹传感器没有感应到黑线 {pwmval_left_init=6;pwmval_right_init=6; //左右电机占空比调节CAR_LEFT(); //小车左转}else if((HW_LEFT_WAI==1)&&(HW_LEFT_NEI==0)&&(HW_RIGHT_NEI==0)&&(HW_RIGHT_WAI==0))//如果左外循迹传感器都感应到黑线;左内,右内,右外循迹传感器没有感应到黑线 {pwmval_left_init=6;pwmval_right_init=6; //左右电机占空比调节CAR_LEFT(); //小车左转}else if((HW_LEFT_WAI==0)&&(HW_LEFT_NEI==1)&&(HW_RIGHT_NEI==0)&&(HW_RIGHT_WAI==0))//如果左内循迹传感器都感应到黑线;左外,右内,右外循迹传感器没有感应到黑线 {pwmval_left_init=6;pwmval_right_init=6; //左右电机占空比调节CAR_LEFT(); //小车左转}else if((HW_LEFT_WAI==0)&&(HW_LEFT_NEI==0)&&(HW_RIGHT_NEI==1)&&(HW_RIGHT_WAI==1))//如果右外,右内循迹传感器都感应到黑线;左内,左外循迹传感器没有感应到黑线 {pwmval_left_init=6;pwmval_right_init=6; //左右电机占空比调节CAR_RIGHT(); //小车右转}else if((HW_LEFT_WAI==0)&&(HW_LEFT_NEI==0)&&(HW_RIGHT_NEI==1)&&(HW_RIGHT_WAI==0))//如果右内循迹传感器都感应到黑线;左外,左内,右外循迹传感器没有感应到黑线 {pwmval_left_init=6;pwmval_right_init=6; //左右电机占空比调节CAR_RIGHT(); //小车右转}else if((HW_LEFT_WAI==0)&&(HW_LEFT_NEI==0)&&(HW_RIGHT_NEI==0)&&(HW_RIGHT_WAI==1))//如果右外循迹传感器都感应到黑线;左外,左内,右内循迹传感器没有感应到黑线 {pwmval_left_init=6;pwmval_right_init=6; //左右电机占空比调节CAR_RIGHT(); //小车右转}}/********************红外避障相关函数**********************/void HWBZ_INIT(void) //红外避障模块对应的IO口初始化{P2M1=P2M1&0xdd;P2M0=P2M0&0xdd;}void CAR_HWBZ(void) //小车红外循迹避障{if((HW_LEFT==0)||(HW_RIGHT==0)){CAR_STOP();}}//感应到障碍物,小车停止/********************按键扫描相关函数**********************/void KEY_INIT(void) //KEY对应的IO口初始化{P0M1=P0M1&0xcf;P0M0=P0M0&0xcf; //P0.5,P0.4设置为双向IO口P5M1=P5M1&0xf3;P5M0=P5M0&0xf3; //P5.3,P5.2设置为双向IO口}void Key1_SCAN(void) //按键扫描{LOOP:if(Key_1 == 0) //判断按键是否被按下 {delay_us(20);if(Key_1 == 0) //第二次判断按键是否被按下{BEEP_ON(); //蜂鸣器响while(Key_1 == 0); //判断按键是否被松开BEEP_OFF(); //蜂鸣器停止}else{goto LOOP;} //跳转到loop处重新扫描}else{goto LOOP;} //跳转到loop处重新扫描}/******************电池电量监测相关函数********************/void ADC_INIT(void) //AD初始化{P1ASF = 0x08;ADC_RES = 0;ADC_CONTR = ADC_POWER|ADC_SPEEDLL;}unsigned char GetADCResult(unsigned char ch) //获取AD值{ADC_CONTR = ADC_POWER|ADC_SPEEDLL|ch|ADC_START;delay(4);while(!(ADC_CONTR&ADC_FLAG));ADC_CONTR&=~ADC_FLAG;return ADC_RES;}void Voltage_Warning(void) //电压报警函数{u8 AD_RESULT;float temp;unsigned int tempA;unsigned char disbuff[4]={0,0,0,0};AD_RESULT = GetADCResult(0x03); //读取电压值temp =((float)AD_RESULT/256)*5*2; //数值转换tempA = temp*1000;disbuff[3]=tempA/10000;disbuff[2]=tempA/1000%10;disbuff[1]=tempA/100%10;disbuff[0]=tempA/10%10;DisplayOneChar(2,1,(0x30+disbuff[3]));Delay5Ms();//显示电压值DisplayOneChar(3,1,(0x30+disbuff[2]));Delay5Ms();//显示电压值DisplayOneChar(5,1,(0x30+disbuff[1]));Delay5Ms();//显示电压值DisplayOneChar(6,1,(0x30+disbuff[0]));Delay5Ms();//显示电压值if(temp<=warning_voltage)//如果读取到的电压值小于等于设定的报警电压值warning_voltage{while(1){BEEP_ON(); //蜂鸣器响Red_Led_On();Blue_Led_On(); //红色LED亮,蓝牙LED亮 Green_Led_On();Yellow_Led_On(); //绿色LED亮,黄色LED亮 DisplayListChar(13,1,VlotageLow);delay_ms(200);//在LCD中显示LOWBEEP_OFF(); //蜂鸣器不响Red_Led_Off();Blue_Led_Off(); //红色LED灭,蓝色LED灭 Green_Led_Off();Yellow_Led_Off(); //绿色LED灭,黄色LED灭 DisplayListChar(13,1,Space3);delay_ms(200);}}}/********************定时器0初始化函数*********************/void Timer0_Init(void) //定时器初始化{TMOD= 0x01;TH0=0xf1;TL0=0x9a; //2ms定时TR0 = 1;ET0 = 1;EA = 1; //开总中断}/*************************主函数**************************/void main(void){GPIO_MOTOR_Configuration(); //电机控制IO口初始化CAR_STOP(); //智能小车停止GPIO_1602_Configuration();delay_ms(10); //LCD1602液晶IO口初始化LCDInit();delay_ms(10); //LCD1602初始化LED_INIT(); //LED对应的IO口初始化BEEP_INIT(); //蜂鸣器对应的IO口初始化ADC_INIT(); //处理器AD转换初始化KEY_INIT(); //KEY对应的IO口初始化HWXJ_INIT(); //红外循迹模块对应的IO口初始化 HWBZ_INIT(); //红外避障模块对应的IO口初始化 delay_ms(10); //延时BEEP_ON(); //蜂鸣器响Red_Led_On();Blue_Led_On(); //红色LED亮,蓝牙LED亮Green_Led_On();Yellow_Led_On(); //绿色LED亮,黄色LED亮delay_ms(500); //延时BEEP_OFF(); //蜂鸣器不响Red_Led_Off();Blue_Led_Off(); //红色LED灭,蓝色LED灭Green_Led_Off();Yellow_Led_Off(); //绿色LED灭,黄色LED灭delay_ms(500); //延时DisplayListChar(3,0,Start);delay_ms(10); //LCD1602显示CAR START DisplayListChar(0,1,Voltage);delay_ms(10);Voltage_Warning(); //电压报警函数DisplayListChar(11,1,PressKey1);delay_ms(10);//LCD1602显示P: K1Key1_SCAN(); //按键扫描Timer0_Init(); //定时器初始化delay_ms(10); //延时DisplayListChar(0,0,Space1);delay_ms(10); //LCD1602显示DisplayListChar(0,1,Space1);delay_ms(10); //LCD1602显示DisplayListChar(5,0,Hwxjbz);delay_ms(10); //LCD1602显示HWXJBZwhile(1){if((HW_LEFT == 0)||(HW_RIGHT == 0)){CAR_HWBZ();}//小车左右2个红外避障传感器任何一个感应到障碍物,小车红外循迹避障else{CAR_HWXJ();}//小车左右2个红外避障传感器都没有感应到障碍物,小车红外循迹函数}}/******************定时器0中断处理函数*******************/void timer0()interrupt 1 using 2 //定时器0中断处理{TH0=0xf1;TL0=0x9a; //2ms定时pwmval_left=pwmval_left + 1;pwmval_right=pwmval_right + 1;LEFT_MOTO();RIGHT_MOTO();}。

基于STM32的智能循迹避障小车

基于STM32的智能循迹避障小车

基于STM32的智能循迹避障小车智能循迹避障小车是一种基于STM32微控制器的智能车辆,它可以根据预设的路径自动行驶并能够避开障碍物。

这种小车具有很高的自主性和智能性,非常适合用于教学、科研和娱乐等领域。

本文将介绍基于STM32的智能循迹避障小车的设计原理、硬件结构、软件开发以及应用场景。

一、设计原理智能循迹避障小车的设计原理主要包括传感器感知、决策控制和执行动作三个部分。

通过传感器感知车辆周围环境的变化,小车可以及时做出决策并执行相应的动作,从而实现自动行驶和避障功能。

在基于STM32的智能小车中,常用的传感器包括红外避障传感器、光电传感器和编码器等。

红外避障传感器可以检测到障碍物的距离和方向,从而帮助小车避开障碍物。

光电传感器可以用于循迹,帮助小车按照预定的路径行驶。

编码器可以用于测量小车的速度和位置,实现精确的定位和控制。

通过这些传感器的数据采集和处理,小车可以实现智能化的行驶和避障功能。

二、硬件结构基于STM32的智能循迹避障小车的硬件结构包括主控制板、传感器模块、执行器模块和电源模块。

主控制板采用STM32微控制器,负责控制整个车辆的运行和决策。

传感器模块包括红外避障传感器、光电传感器和编码器等,用于感知周围环境的变化。

执行器模块包括电机和舵机,用于控制车辆的速度和方向。

电源模块提供电能,为整个车辆的运行提供动力支持。

三、软件开发基于STM32的智能循迹避障小车的软件开发主要包括嵌入式系统的编程和算法的设计。

嵌入式系统的编程主要使用C语言进行开发,通过STM32的开发环境进行编译和调试。

算法的设计主要包括避障算法和循迹算法。

避障算法通过传感器的数据处理,判断障碍物的位置和距离,并做出相应的避开动作。

循迹算法通过光电传感器的数据处理,使小车能够按照预设的路径行驶。

四、应用场景基于STM32的智能循迹避障小车可以广泛应用于教学、科研和娱乐等领域。

在教学领域,可以用于智能机器人课程的教学实验,帮助学生掌握嵌入式系统的开发和智能控制的原理。

智能循迹小车设计方案

智能循迹小车设计方案

智能循迹小车设计方案一、设计目标:1.实现智能循迹功能,能够沿着预定轨迹自动行驶。

2.具备避障功能,能够识别前方的障碍物并及时避开。

3.具备远程遥控功能,方便用户进行操作和控制。

4.具备数据上报功能,能够实时反馈运行状态和数据。

二、硬件设计:1.主控模块:使用单片机或者开发板作为主控模块,负责控制整个小车的运行和数据处理。

2.传感器模块:-光电循迹传感器:用于检测小车当前位置,根据光线的反射情况确定移动方向。

-超声波传感器:用于检测前方是否有障碍物,通过测量障碍物距离来判断是否需要避开。

3.驱动模块:-电机和轮子:用于实现小车的运动,可选用直流电机或者步进电机,轮子要具备良好的抓地力和摩擦力。

-舵机:用于实现小车的转向,根据循迹传感器的信号来控制舵机的角度。

4.通信模块:-Wi-Fi模块:用于实现远程遥控功能,将小车与遥控设备连接在同一个无线网络中,通过网络通信进行控制。

-数据传输模块:用于实现数据上报功能,将小车的运行状态和数据通过无线通信传输到指定的接收端。

三、软件设计:1.循迹算法:根据光电循迹传感器的反馈信号,确定小车的行进方向。

为了提高循迹的精度和稳定性,可以采用PID控制算法进行修正。

2.避障算法:通过超声波传感器检测前方障碍物的距离,当距离过近时,触发避障算法,通过调整小车的行进方向来避开障碍物。

3.遥控功能:通过Wi-Fi模块与遥控设备建立连接,接收遥控指令并解析,根据指令调整小车的运动状态。

4.数据上报功能:定时采集小车的各项运行数据,并通过数据传输模块将数据发送到指定的接收端,供用户进行实时监测和分析。

四、系统实现:1.硬件组装:根据设计要求进行硬件的组装和连接,确保各个模块之间的正常通信。

2.软件编程:根据功能要求,进行主控模块的编程,实现循迹、避障、遥控和数据上报等功能。

3.调试测试:对整个系统进行调试和测试,确保各项功能正常运行,并进行性能和稳定性的优化。

4.用户界面设计:设计一个用户友好的界面,实现对小车的远程控制和数据监测,提供良好的用户体验。

论文开题:智能循迹避障小车设计

论文开题:智能循迹避障小车设计

论文开题:智能循迹避障小车设计论文开题:智能循迹避障小车设计论文开题:智能循迹避障小车设计:2013-9-17 19:33:01大学本科毕业论文(设计)开题报告学院:华侨大学机电学院专业班级:08测控2班课题名称智能循迹避障小车设计1、本课题的的研究目的和意义:随着汽车工业的迅速发展,其与电子信息产业的融合速度也显著提高,汽车开始向电子化、多媒体化和智能化方向发展,使其不仅作为一种代步工具、同时能具有交通、娱乐、办公和通讯等多种功能。

关于汽车的研究也就越来越受人关注。

全国电子大赛和省内电子大赛几乎每次都有智能小车这方面的题目,全国各高校也都很重视该题目的研究,可见其研究意义很大。

本设计就是在这样的背景下提出的,为了适应机电一体化的发展在汽车智能化方向的发展要求,提出简易智能小车的构想。

目的在于:通过独立设计并制作一辆具有简单智能化的简易小车,获得项目整体设计的能力,并掌握多通道多样化传感器综合控制的方法,设计的智能电动小车能够具有循迹避障等功能。

通过本次毕设,了解智能系统,学会查阅科技文车辆导航的方法,促进日本智能车辆的整体进步。

进入80年代中期,设计和制造智能车辆的浪潮席卷了全世界,一大批世界著名的公司开始研制智能车辆平台。

第三阶段:从90年代开始,智能车辆进入到了深入系统、大规模的研究阶段。

最为突出的是,美国卡内基-梅陇大学机器人研究所一共完成了Navlab系列的自主车的研究,取得了显著的成就。

目前,智能车辆的发展正处于第三阶段,这一阶段的研究成果代表了当前国外智能车辆的主要发展方向。

2.2 国内智能车辆的现状研究相比于国外,我国开展智能车辆技术方面的研究起步较晚,开始于20世纪80年代,而且大多数研究尚处于针对某个单项技术研究的阶段。

虽然我国在智能车辆技术方面的研究总体上落后于发达国家,并且存在一定的技术差距,但是我国也取得了一系列的成果,主要有:中国第一汽车集团公司和国防科技大学机电工程与自动化学院于2003年研制成功了我国第一辆自主驾驶轿车。

基于单片机的智能小车设计(红外避障及循迹)

基于单片机的智能小车设计(红外避障及循迹)

轮式移动机器人的设计报告单片机系统课程设计智能小车(避障及循迹)的设计毕业设计(论文)原创性声明和使用授权说明原创性声明本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。

尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。

对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。

作者签名:日期:指导教师签名:日期:使用授权说明本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。

作者签名:日期:学位论文原创性声明本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。

除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。

对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。

本人完全意识到本声明的法律后果由本人承担。

作者签名:日期:年月日学位论文版权使用授权书本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。

本人授权大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。

涉密论文按学校规定处理。

作者签名:日期:年月日导师签名:日期:年月日注意事项1.设计(论文)的内容包括:1)封面(按教务处制定的标准封面格式制作)2)原创性声明3)中文摘要(300字左右)、关键词4)外文摘要、关键词5)目次页(附件不统一编入)6)论文主体部分:引言(或绪论)、正文、结论7)参考文献8)致谢9)附录(对论文支持必要时)2.论文字数要求:理工类设计(论文)正文字数不少于1万字(不包括图纸、程序清单等),文科类论文正文字数不少于1.2万字。

智能循迹、避障遥控小车设计

智能循迹、避障遥控小车设计

智能循迹、避障遥控小车设计摘要:本文设计了一款以STM32单片机为控制核心的智能小车,智能小车主要采用高灵敏度的光电管,对路面黑色轨迹进行检测,并利用单片机产生PWM波,控制小车速度。

能够平稳跟踪给定的路径实现循迹的目的。

整个系统基于普通玩具小车的机械结构,并利用了小车的底盘、前后轮电机及其自动复原装置,能够平稳跟踪路面黑色轨迹运行。

若遇到障碍物,通过检测障碍物离自己的距离来判断自己是前进、后退还是左转、右转,最终达到避障的目的。

1、背景及意义近年来人工智能技术的快速发展,智能小车技术也已经发展到可以模仿人类行为程度,主要是因为自动化生产设备越来越精密,它不仅给传统产业带来了翻天覆地的变化,而且提高了我们生活生产的质量。

智能小车具有自动循迹、避障和可控行驶等诸多功能,可以在不同环境完成工作,智能小车在各个行业都有不错的应用价值。

例如,在日常生活中,智能小车可以像导盲犬那样给盲人指引正确的道路。

在军事方面,智能小车可以代替我们在危险区域的排雷和侦察等任务。

在科学研究中,智能小车可以在外星球上完成探索或返回照片。

另外,它可以帮助人们在复杂的环境中执行设备检查和货物处理等任务。

2、智能小车硬件设计小车通过红外探测法实现循迹功能,红外接收装置和发射装置实现避障功能,红外传感器实现测速功能,超声波系统实现测距。

车轮应用了PWM调速系统和L298N芯片来控制调速和车轮旋转,还有用液晶显示模块LCD1602来显示小车基本情况。

通过c语言完成对小车行动指令的编程,实现小车按照设定路线行驶、避障。

智能小车硬件设计主要是电源模块设计、单片机最小系统的设计、循迹模块设计、避障模块电路设计以及遥控电路设计等。

电源模块设计主要为单片机最小系统以及需要的外围电路中用到的芯片进行供电,供电电压为+5V,因此需要一个恒定+5V的稳压电源,本文中主要是通过直流稳压电源7805输出恒定电源的方式来进行设计,输入电源电压为36V一下,交直流方式均可,直流电源模块电路图如图1所示图1 电源模块部分电路图单片机最小系统采用了传统的STM32最小系统的设计,包含电源滤波部分、晶振部分电路、复位电路等,为最常用的电路,在此不再进行赘述。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档