本帖最后由 帆船102 于 2021-5-18 12:26 编辑
花了一段时间研究了下飞思卡尔恩智浦的K60系列的单片机,主要是通过摄像头来完成赛道一圈的行驶,本人萌新比较菜,到处CtrlC+V程序,又到处去问,总算是了解了一些,经过理解修改代码,算是入了个门吧,接下来有空的话搞一搞直立小车,那也就另说了…… 。
发这篇文的目的主要还是记录一下自己的经历,顺便对比我还菜的萌新有个引导作用,额……应该没有吧,感觉有也非常少。
首先我用的是逐飞的一系列的东西,大大小小加起来还是花了上千,有些还是咸鱼买的……所以如果想搞智能车大赛的同志们要做好掏空钱包的准备……当然能报销最好,我仅仅是出于兴趣。。
主板:某一个宝搜索 逐飞科技智能车基地
K60是非常老的一款单片机,主频为100MHZ,K66的话主频为180MHZ。
摄像头:MT9V032(这是130度的摄像)
电机驱动:双电机驱动电路模块
车模类型:C车车模(自带3010舵机与电机)
编码器(512线)
显示屏:IPS液晶屏模块 1.14寸
无线转串口通信:主要是将摄像头采集的图片通过上位机传输到电脑上YY上位机上。(传输为蓝色,接收为绿色)
另外:编译环境用的是IAR,不过需要配置一下逐飞库的参数才能用,不然报错,上位机用的是YY上位机(能够以方格形式显示)
说一下摄像头小车思路,这里用main函数说明,可以很好的知道小车具体流程,大致有个思路,我觉得
{
get_clk(); //逐飞程序必备初始化代码,可以不用管
Init_Hardware();// 初始化各个模块,如串口模块,电机驱动模块,摄像头模块,按键模块,等等。
//Test_Steer_CenterVal();//寻找舵机中值代码
while(1)
{
if(mt9v032_finish_flag)//一场图像采集的标志
{
JC_isGet_Gray_Image(image,PICTURE_USE2);//得到灰度图像。
mt9v032_finish_flag = 0;//图像采集完的结束标志
THRESHOLD = JC_Get_OSTU (PICTURE_USE2);//自动寻找最佳阈值,也就是图像二值化的临界值,阈值越大黑点越多。
JC_GetBinaryImage(PICTURE_USE2,PICTURE_USE2,THRESHOLD);//得到阈值后,就可以得到二值化的图像
ips114_displayimage032(PICTURE_USE2[0],IMGW,IMGH) ;//在显示屏显示二值化图像
JC_Element(PICTURE_USE2);//元素处理,如十字处理,弯道处理,环岛处理额这个没弄起 。
hauxian();//画线,在ISP114显示屏显示中线位置,可以快速检测有无错误
Test_KD_Control();//这个简单的舵机PD控制,可以通过按键增加P D 与qianzhan值。
//sending(PICTURE_USE2,sizeof(PICTURE_USE2));//当需要将图像发往PC端yy上位机时才加,不然占内存。
ips114_showint16(0,-9,st_control.jiao); //在显示屏显示舵机角度。
ips114_showint16(0,-10,st_control.qianzhan); //显示前瞻值,作用举个例子:当有弯道出现时,值的增加和减少会让 小车提前转弯冲出赛道或延迟冲出赛道。
ips114_showint8(0,-12,st_control.kp);//实际上我感觉 它调节舵机在规定范围内的最大角度
ips114_showint8(0,-11,st_control.kd); //实际上感觉无卵用,当然针对我的代码,有点问题 锁定在1或2.
//ips114_showint16(0,-11,st_control.duoji_mid - st_control.jiao); //负值应该向左转,正值向右转,0的值不转,值的绝对值越大舵机打角越大
}
}
}
流程大概是这样,我太懒了也不细说,代码附一份,不过文件大概有80M,只有将代码的.c与.h文件单独发出来,在说一次这是逐飞库!山外啊龙邱啊请别烧……代码中有些地方会有注释,不过对于初学者来说,只需要大概搞懂那一坨代码干啥的?然后直接调用就对了,当然你是大佬,觉得代码太low,那也很正常,逐飞底层代码也不用管,也不要改,拿来用就是了,当然你要深入理解那也就当我没说,反正我没管。
附图
俯视图:
侧视图:
工程文件远大于20M发不了 ,截取其中需要的代码上位机等关键资料附上:
代码上位机.zip
(10.26 MB, 下载次数: 14)
|