这是2022年的省赛题,难度不是很高,但真正做起来的时候发现没那么简单,或者说,想用简单的一些外设实现所有题目比较考验代码功底。
总体思路就是:通过灰度传感器所传输的数据进行pid调参,能够达到高速巡线并且不丢线的情况。然后再通过按键设置期望速度以及模式,蓝牙通信方面只需要发送对应的指令就可以实现不同题目的切换。我认为的难点有几个:如何积累检测停车位的数量,如何平稳停车,如何检测岔路口并且能够进行转换小车状态。
我用的是牛眼轮加两个直流减速电机加一个8路灰度加一个蓝牙模块,显示方面用的7针的OLED显示屏(硬件SPI驱动)。最终实现了高速巡线以及通信的功能,由于时间有限,使用的超声波模块并没有再加入算法进行速度的矫正。
代码过多,就不展示了,可读性不是很高。欢迎交流与讨论
嗯...............
决定分享一段代码,这是第三问的逻辑,其实我认为第三问才是最难的,第四问比较考验硬件。
大体的思路就是不断地检验标志位,通过标志位的累加,发送对应的指令
if(key.flag==1&&key.Subject_flag==2)
{
while((get_sensor()<2)&&n==0&&key.flag==1);
while((get_sensor()>2)&&n==0&&key.flag==1)
{
uart2_send_char('a');
n=1;
}
while((get_sensor()<2)&&n==1&&key.flag==1);
while((get_sensor()<2)&&n==1&&key.flag==1)
{
uart2_send_char('c');//让后车走内圈的指令,如果后车此时接到这条指令并且get_sensor()<4就给一个左转的速度
if(get_sensor()<4)
{
Load_Motor_PWM(pid.Car_speed,pid.Car_speed);
key.flag=0;
}
while(get_sensor()>5);
while(get_sensor()>5&&key.flag==0)
{
n=2;
}
}
while((get_sensor()<2)&&n==2&&key.flag==1);//当后车完成内圈超车后让后车走外圈
while((get_sensor()<2)&&n==2&&key.flag==1)
{
uart2_send_char('d');//发送一条走外圈的指令 if(get_sensor()<4) Load_Motor_PWM(pid.Car_speed,pid.Car_speed);
if(get_sensor()<4) Load_Motor_PWM(0,pid.Car_speed);
n=3;
}
while(get_sensor()<2&&n==3)
{
uart2_send_char('b');
key.flag=0;
}
}