/intelligent-car

单片机课程设计摄像头智能车

Primary LanguageC

摄像头智能车

1 硬件

  1. 车模是老款的 B 车模。
  2. 主控用的是大疆的 C 板,带降压输出。
  3. 摄像头用的是逐飞的 MT9V034 摄像头。
  4. 编码器用的是龙邱 512 线带方向编码输出编码器。
  5. 电机驱动是 BTS7960 的驱动。

2 软件

2.1 开发方式

  1. 底层的驱动编写使用的是 CUBEMX + HAL 库。
  2. 工程使用 VSCode 开发,通过 Makefile,利用 ARM-Toolchain 编译以及 Cortex-Debug 插件进行烧录和断点调试。
  3. 使用 Ozone 进行进一步调试(可以动态观看变量和绘制波形)。

2.2 RTT 调试

使用 Jlink 特有的调试通道,可以不占用 CPU 的情况下,代替串口 printf。

2.3 代码风格

  1. 中断回调函数写在对应的外设文件里。例如定时器中断回调函数写在 Src/tim.c 文件里。
  2. algorithm 文件夹下放了摄像头的处理算法以及 PID 算法。
  3. component 文件夹下放了摄像头驱动。

3 遇到问题

3.1 VSCode 开发单片机

可以参考视频。但是经过这次项目的使用,感觉便捷程度与 Keil 还是有很大差距,以后应该会继续使用 Keil 来开发。首先是入门门槛有点高,需要掌握基础的 Makefile ,写编译规则,虽然可以 CubeMX 生成,然后自己稍微修改就行,但还是感觉不如 GUI 界面点点点。然后为了让 VSCode 识别到一些 Makefile 里的宏定义、头文件里的声明,还需要添加 c_cpp_properties.json 文件。最后就是调试动态查看需要另开软件还是比较麻烦。

3.2 Makefile 文件编写

添加 .lib 文件时,添加到一个 LIB 变量下。然后可能会报一个关于 fpu 的错,上网搜了一下,把 FLOAT-ABI 变量改成应该是软件浮点计算的意思。

3.3 后轮速度调试

可以使用 Ozone 观察编码器反馈的值,与设定值拟合的曲线,调整参数。

3.4 串口 DMA 和 DCMI 接口 DMA

本来想将接收到的图像数据用串口 DMA 再转发到串口,然后就能搞无线图传,但怎么都搞不好,怀疑是图像数据接收和串口发送都用同个 DMA 导致占用。发一两个数据是没问题的,但发图像那么多就不太行。最终还是在 while 循环里用阻塞式发送用的有线串口,但感觉这个 CPU 占用率会很高。

3.5 舵机控制量选择

由于赛道**有黑线,最终摄像头是直接识别赛道的黑线,然后选择图像 5 到 25 行中线像素进行最小二乘拟合,再选用拟合出来的直线 40 行的与中线偏差作为控制量。但这是不太对的,控制量应该随速度的改变而改变,当快的时候应更加超前的控制。