开在边缘 发表于 2020-7-2 19:41:46

两轮自平衡小车的线性CCD循迹总结

本帖最后由 开在边缘 于 2020-7-2 19:50 编辑

继之前的两轮自平衡小车的制作总结(https://mc.dfrobot.com.cn/thread-305939-1-1.html),这次新增了线性CCD循迹功能。选用的线性CCD是常用的TSL1401CL,配120度广角镜头,另外买了一根碳纤圆棒,外径6mm,内径4mm。


首先打印底座和支架




插个题外话,show一下自己的3D打印机。爷爷级的,2014年上市的家用级的3D打印机,三纬的da Vinci 1.0。


原厂的固件和软件简直就是烂成一坨屎,后来刷了Repetier 0.92的固件,再把主板上的SD卡引到机器外部。制图我一般都是用AutoCAD,切片软件是Simplify3D,保存gcode文件后copy到SD卡上就可以愉快的脱机打印了。

安装好的样子,CCD可以装在上端,也可以装在下端




后期调试的时候发现,在弱光环境下,CCD简直就是一个瞎子,就算是运放输出,也是一个白内障,所以又加了一个简单的照明




TSL1401CL的操作方式网上有很多介绍,这里就不再重复了。重点说说我的二值化算法,先看CCD的输出:




第一步要计算出二值化的阀值,最简单的就是找到最大值和最小值,然后取个平均值。但是原始数据有可能存在毛刺,就像上面第二张图,明显左侧有不正常的亮光,如果直接取平均值,那么阀值就会偏高。所以我先做了一次滤波,把毛刺去掉,然后像体育赛事打分一样,去掉几个最高分,再去掉几个最低分,尽量避免毛刺带来的影响,然后再取平均值,这样效果就明显好多了。

第二步,根据阀值进行二值化,最简单的就是高于阀值就是1,低于阀值就是0。这样做有一个明显的缺点,就是左右两侧的数值,会因为光照以及广角镜头畸变的原因,导致数值偏低,很有可能会低于阀值,被误认为是0。我根据阀值进行二值化后,多做了一个校验,就是看数值的曲线是不是平滑过渡的,如果是平滑过渡的,那就不认为是低于阀值,如果数值的曲线发生了突变,才认为是低于阀值。

第三步,对二值化后的数据,再做一次滤波,去除毛刺。

第四步,从上次的中值位置开始,往前往后同时寻找上升沿,找到上升沿后,再往后寻找下降沿,然后两者取平均值就是中值了。

第五步,如果没有寻找到上升沿和下降沿,那么判断之前一次的中值位置偏差是不是很大。如果很大,那么就表示因为弯道太急,速度太快,导致冲出弯道了,这时候就需要继续采用上一次的中值位置。

第六步,根据中值位置的偏差,进行PID计算。

先看看调试的过程,尽管我知道最好不要插着线调试,但是奈何串口输出数据简单明了啊。结果不出我所料,翻车了,又一次把开发板上的USB口给撅下来了,还好开发板便宜啊。
https://v.youku.com/v_show/id_XNDczNTUzNzQ4NA==.html
https://v.youku.com/v_show/id_XNDczNTUzNzQ4NA

调试的差不多了,先试试简单的,黑线边界,当中白色区域做为道路
https://v.youku.com/v_show/id_XNDczNTUzOTE4OA==.html
https://v.youku.com/v_show/id_XNDczNTUzOTE4OA

都ok了,开始整点难度高的。一个是降低环境光线,直接关灯,使用小车自带的照明。另一个是道路收窄,直接把黑线做为道路,并且加上直角弯道和交叉路口
https://v.youku.com/v_show/id_XNDczNTUzOTU2MA==.html
https://v.youku.com/v_show/id_XNDczNTUzOTkxNg==.html
https://v.youku.com/v_show/id_XNDczNTUzOTU2MA
https://v.youku.com/v_show/id_XNDczNTUzOTkxNg



源代码下载


libraries目录中的Kalman_Filter_Library是一个第三方库,用于MPU6050卡尔曼滤波计算的,你可以copy到Arduino的libraries目录中,或者直接在Arduino的库管理中下载。

程序里另外还用到的第三方库,就是u8g2和Adafruit的ST7735,都是用于驱动显示屏的,这个直接就可以在Arduino的库管理中下载。

rzegkly 发表于 2020-7-3 05:50:54

巡线平衡小车棒棒的

DFHJM_IpFmV 发表于 2020-7-4 15:57:05

项目很好,可以做个心愿单吗?方便我们购买材料啊

DFHJM_IpFmV 发表于 2020-7-4 20:13:46

材料准备啥?

开在边缘 发表于 2020-7-4 22:41:36

DFHJM_IpFmV 发表于 2020-7-4 20:13
材料准备啥?

材料在帖子里都有提到过
开发板:ESP32 devkit v1
姿态模块:MPU6050
电机驱动:TB6612
超声波测距:SR04
屏幕:普通的I2C或者SPI接口的OLED屏
电机:JGA25-370,减速比1:34,12线的霍尔编码器
电池:普通的航模电池,1500mAh-4S-35C
降压模块:MP1584,一个转3.3V,一个转12V
CCD:TSL1401CL,配120度广角镜头
还有就是洞洞板、电线、铜柱、螺丝若干

20060606 发表于 2020-7-5 06:23:14

电机电流没多大吧,为什么要用35C的电池呢

开在边缘 发表于 2020-7-5 10:44:53

20060606 发表于 2020-7-5 06:23
电机电流没多大吧,为什么要用35C的电池呢

主要是因为电压需要降压到12V,所以选择4s的。现在TB上的4s电池,起步就是25、30C了,你想买小的还买不到。

DFHJM_IpFmV 发表于 2020-7-5 12:35:06

开在边缘 发表于 2020-7-4 22:41
材料在帖子里都有提到过
开发板:ESP32 devkit v1
姿态模块:MPU6050


哦,谢谢

DFS1w2cb8o8 发表于 2020-7-6 17:46:55

厉害厉害{:6_215:}

佛系唐法官 发表于 2020-8-9 19:06:14

厉害厉害{:6_215:}

发表于 2022-4-18 13:56:46

嗨嘿嗨

发表于 2022-4-18 14:04:46

乍一看好像没用什么材料
页: [1]
查看完整版本: 两轮自平衡小车的线性CCD循迹总结