我做过一个寻一条黑线的智能小车,按照你的问题一个个给你些建议吧。
我个人认为寻一条黑线和寻两条黑线在原理上应该是没有差别的,都是用对管来检测黑线和小车的偏差,从而知道小车当前的位置,不过常见的都是寻一个道路中间的黑线。至于程序控制上可以参考网上成熟的方案,都是根据传感器检测到黑线后来判断当前小车偏离黑线的位置,从而控制左右电机产生速度差(或者直接用舵机转向)来修正小车姿态。
PID是一个很高深也很简单的玩意,原理很简单,能够用好却不容易。小车上主要是为了稳定小车的速度,这对电机的响应速度,码盘的精度,单片机的处理速度都有一定的要求,网上有很多成熟的PID算法,加上一些前辈们做过的寻线小车PID案例,剩下的就是PID的参数问题了。
L298N是作为电机的控制器件(PID的输出量),舵机可以控制小车转向,红外对管是为了检测黑线的位置,测速码盘检测当前电机转速(PID控制的输入量)。
整体可以分为两个程序部分:
(1)主程序部分:对管检测黑线的位置-》单片机判断小车姿态-》舵机转向调整小车姿态-》回到起始部分循环。
(2)PID部分:码盘检测电机转速-》单片机进行PID运算-》输出速度控制量给L298N-》控制电机转动-》回到起始部分循环。
几个驱动轮的?可以用笨一点的方法 如果你是四轮车 你可以控制它直线高速四轮全动 低速动两个
转弯的话 高速可以正转一边反转 低速一边正转 另一边锁死 或者转一个 我比较笨 到现在都没学会pwm 所以只有这本办法了~
智能小车 串口指令格式与分析
指令格式:7E NN CC D1 D2 Dn,(NN = n+1,n = [0,12],CC = [0,255])
其中CC及指令代号,最多256条指令;串口指令分析程序如下:
u8 COM1_ZT = 0; // 串口1分析状态
uint32_t Time_Out_1 = 0; // 用于串口1分析超时计时
u8 Order_Size; // 指令数据长度
u8 Order_Sum; // 接收到的指令数据数量
u8 Order_Buff[COM1_Buff_Size]; // 接收到的指令缓冲区
void COM1_Analysis(void)
{
u8 ch;
if(USART1_RX_ANA != USART1_RX_STA)
{
ch = USART1_RX_BUF[USART1_RX_ANA++];
if (USART1_RX_ANA >= USART1_REC_LEN)
{ // 调整缓冲区尾指针
USART1_RX_ANA = 0;
}
switch(COM1_ZT)
{
case 0: // 判断指令头'7E'
if(ch == 0x7E){
COM1_ZT = 1;
Time_Out_1 = OSTimeGet(); // 超时复位
}
break;
case 1: // 接收指令数据长度
Order_Size = ch;
COM1_ZT = 2;
Time_Out_1 = OSTimeGet(); // 超时复位
Order_Sum = 0; // 接收数量置0
break;
case 2: // 接收指令数据
Order_Buff[Order_Sum++] = ch;
if(Order_Sum == Order_Size){
// 指令接收完毕,执行指令发送到邮箱
OSMboxPost(msg_order,(void)Order_Buff); //发送消息
COM1_ZT = 0; // 状态复位
Time_Out_1 = OSTimeGet(); // 超时复位
}
break;
default: // 意外处理
printf("COM1状态异常: %d",COM1_ZT);
COM1_ZT = 0; // 状态复位
Time_Out_1 = OSTimeGet(); // 超时复位
break;
}
}
if(OSTimeGet()>=Time_Out_1+10 && COM1_ZT > 0){
// 超时100ms处理
printf("COM1超时: %d",OSTimeGet() - Time_Out_1);
COM1_ZT = 0; // 状态复位
Time_Out_1 = OSTimeGet(); // 超时复位
}
}
以上就是关于基于51单片机的红外传感竞速智能小车程序全部的内容,包括:基于51单片机的红外传感竞速智能小车程序、求一个智能小车实现电机调速(尽量使速度降低)、循迹避障功能的C程序。、DIY“间谍”智能小车之十等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)