昨天,作为大二和工作室骨干的的我,执裁了我们工作室的全国大学生智能汽车竞赛选拔赛,我打一的时候智能车玩的是室外模块,很多室内模块都没尝试过,所以当知道今年大一队员的选拔赛是通过光电寻迹完赛的,为了更好的帮助他们运行代码和完赛,我也特意去学习了光电传感器的原理和使用,虽然很基础,但是我谈谈我的学习心得吧
一、原理:
这部分我不是专业的,我只能按照个人的理解和网上查找的资料讲解一下了。
红外光电传感器是通过对外不断发射红外光线,如果未收到了回来的光线,灯亮,模块会将信号传输给光电控制的芯片输出高电平,芯片处理后将主控芯片传输高电平信号。如果收到了回来的光线,灯就不亮。
主控芯片在收到信号之后,按原本写好的代码进行计算,给对应的电机输出引脚pwm。
转向:小车是没有伺服电机的,所以我们使用左右轮的差速旋转进行转弯,在大弯道的时候通过正转和反转进行转弯。
二、代码实现:
我们使用的是stm32作为寻迹小车的主控芯片,使用了我们工作室学长自主编写的库文件,方便大一的新生学习,从学会调库开始,学长熬夜许久才写出来的标准库文件,有兴趣的可以看非凡智联:基于STM32F103C8T6标准库的二级库-CSDN博客
首先我们main函数中对判断光电管数据的gpio引脚进行初始化
//本次使用的电机驱动芯片是使用两个引脚控制电机的正反转
FF_PWM_Init(TIM2_MAP0_CH1_A0, 1000, 0);
FF_PWM_Init(TIM2_MAP0_CH2_A1, 1000, 0);
FF_PWM_Init(TIM2_MAP0_CH3_A2, 1000, 0);
FF_PWM_Init(TIM2_MAP0_CH4_A3, 1000, 0);
//本次我们使用的是四路光电管寻迹
FF_GPIO_Init(A4,GPIO_Input_Up,High);
FF_GPIO_Init(A5,GPIO_Input_Up,High);
FF_GPIO_Init(A6,GPIO_Input_Up,High);
FF_GPIO_Init(A7,GPIO_Input_Up,High);
其次我们就是在main函数中的while(1)循环中去书写执行代码
while(1)
{
//将四个光电管信号获取赋值给一个变量,方便后期代码书写
int right_1=FF_GPIO_Get_Level(A6);
int right_2=FF_GPIO_Get_Level(A7);
int left_1=FF_GPIO_Get_Level(A5);
int left_2=FF_GPIO_Get_Level(A4);
//直线寻迹
if(right_1==0&&right_2==0&&left_1==0&&left_2==0)
{
FF_PWM_Set_Duty(TIM2_MAP0_CH1_A0, 0);
FF_PWM_Set_Duty(TIM2_MAP0_CH2_A1, 9500);//700//1000/3500
FF_PWM_Set_Duty(TIM2_MAP0_CH3_A2, 9500);
FF_PWM_Set_Duty(TIM2_MAP0_CH4_A3, 0);
continue;
}
//走直线时,向左边微调
if(right_1==0&&right_2==1&&left_1==0&&left_2==0)
{
FF_PWM_Set_Duty(TIM2_MAP0_CH1_A0, 0);
FF_PWM_Set_Duty(TIM2_MAP0_CH2_A1, 9500);
FF_PWM_Set_Duty(TIM2_MAP0_CH3_A2, 9200);
FF_PWM_Set_Duty(TIM2_MAP0_CH4_A3, 0);
continue;
}
//转弯时,向左进行大幅度转弯
if(right_1==1&&right_2==1&&left_1==0&&left_2==0)
{
FF_PWM_Set_Duty(TIM2_MAP0_CH1_A0, 0);
FF_PWM_Set_Duty(TIM2_MAP0_CH2_A1, 9500);
FF_PWM_Set_Duty(TIM2_MAP0_CH3_A2, 0);
FF_PWM_Set_Duty(TIM2_MAP0_CH4_A3, 4000);
continue;
}
//转弯时,向左进行大幅度转弯
if(right_1==1&&right_2==0&&left_1==0&&left_2==0)
{
FF_PWM_Set_Duty(TIM2_MAP0_CH1_A0, 0);
FF_PWM_Set_Duty(TIM2_MAP0_CH2_A1, 9500);
FF_PWM_Set_Duty(TIM2_MAP0_CH3_A2, 0);
FF_PWM_Set_Duty(TIM2_MAP0_CH4_A3, 4000);
continue;
}
//走直线时,向右边微调
if(right_1==0&&right_2==0&&left_1==1&&left_2==0)
{
FF_PWM_Set_Duty(TIM2_MAP0_CH1_A0, 0);
FF_PWM_Set_Duty(TIM2_MAP0_CH2_A1, 9200);
FF_PWM_Set_Duty(TIM2_MAP0_CH3_A2, 9500);
FF_PWM_Set_Duty(TIM2_MAP0_CH4_A3, 0);
continue;
}
//转弯时,向右进行大幅度转弯
if(right_1==0&&right_2==0&left_1==1&&left_2==1)
{
FF_PWM_Set_Duty(TIM2_MAP0_CH1_A0, 4000);
FF_PWM_Set_Duty(TIM2_MAP0_CH2_A1, 0);
FF_PWM_Set_Duty(TIM2_MAP0_CH3_A2, 9500);
FF_PWM_Set_Duty(TIM2_MAP0_CH4_A3, 0);
continue;
}
//转弯时,向右进行大幅度转弯
if(right_1==0&&right_2==0&left_1==0&&left_2==1)
{
FF_PWM_Set_Duty(TIM2_MAP0_CH1_A0, 4000);
FF_PWM_Set_Duty(TIM2_MAP0_CH2_A1, 0);
FF_PWM_Set_Duty(TIM2_MAP0_CH3_A2, 9500);
FF_PWM_Set_Duty(TIM2_MAP0_CH4_A3, 0);
continue;
}
//四路触发后停转
if(right_1==1&&right_2==1&left_1==1&&left_2==1)
{
FF_PWM_Set_Duty(TIM2_MAP0_CH1_A0, 0);
FF_PWM_Set_Duty(TIM2_MAP0_CH2_A1, 0);
FF_PWM_Set_Duty(TIM2_MAP0_CH3_A2, 0);
FF_PWM_Set_Duty(TIM2_MAP0_CH4_A3, 0);
continue;
}
}
这是我对本次光电传感器的了解,写的不好勿喷哦