K230场景化自动驾驶

此案例需要搭配八路智能巡线模块(红外巡线模块)使用

串口通讯

USART:通用同步异步收发器。可以根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚发送出去,也可以自动接收RX引脚的数据帧时序,拼接成一个字节数据,存放在数据寄存器里。这次实验用到的就是UART2。

image-20230926100744845

在使用串口进行通信时,要求通信双方必须是“同频道”。“同频道” 指 相同的通信协议。 串口(USART)约定:通信时数据必须以“帧”的形式传递串口的一帧数据包括:起始位 + 数据位 + 校验位 + 停止位 其中: 1)起始位:固定是1个周期的低电平信号 2)数据位:可由通信双方自行约定是 5 ~ 9 bits 3)校验位:串口采用的是奇偶校验,可由通信双方自行约定 4)停止位:可选的 0.5 ~ 2 个周期的高电平 同时,为了同步通信双发的收发速度,还需要约定每秒钟传输的数据帧的数量,称为 波特率,典型波特率有9600、115200、57600 ……

硬件连接

(注:下图接线仅供位置参考,我们出厂有配备K230双头PH2.0 4Pin全黑线材,有防呆设计,不必担心接线问题)

八路智能巡线模块(红外巡线模块)MSPM0G3507
5V5V
GNDGND
RXTX0
TXRX0
K230视觉模块MSPM0G3507
5V5V
GNDGND
RXTX2
TXRX2

image-20251029164030395

image-20251029164356332

image-20251029164049976

 

启动小车 (4)

K230协议

当K230识别出路标之后,会通过串口发送一个数据帧,格式是“$09”+“标志内容ID,”+“#” 举例:“$091,#”

当单片机接收到上述数据帧时,会对每一位都进行判断。如果内容是“$09",继续接收,当收到“#”时,说明一包数据已经完成。解析K230传输的信息,再对标志内容ID跟特定指令比对,如果是对应的指令,小车就会做出对应的操作。

控制流程图

红灯
绿灯
1号库
2号库
开始
巡线行驶
红绿灯标志
停车等待
巡线行驶
识别到限速标志
低速行驶
正常速度行驶
识别到左转路标
左转优先巡线
识别到解除限速标志
正常速度行驶
识别到右转路标
右转优先巡线
鸣笛标志
小车鸣笛
正常速度行驶
倒车标志
到入1号库
到入2号库

 

部分代码解析

bsp_k230.c

main.py

主要函数

data_deal_K230

函数原型void data_deal_K230(uint8_t data)
功能描述处理 K230 发来的数据,按固定格式(以 '$' 开头、"09" 为标识、数字为数据、',' 分隔、'#' 结尾)解析,有效数据通过 deal_msg 处理,无效数据则重置状态
输入参数data:从 K230 接收的单字节数据
返回值

deal_msg

函数原型void deal_msg(uint8_t length)
功能描述将解析到的数字数据(长度 1 或 2)转换为 ID 值,校验 ID 是否在 1-11 范围内,有效则置 stop_flag 为 0,否则置 1
输入参数length:解析到的数字数据长度
返回值

set_dataid

函数原型void set_dataid(K230_TYPE id)
功能描述设置 data_id 的值(用于清除等操作)
输入参数id:要设置的 ID 值
返回值

get_dataid

函数原型uint8_t get_dataid(void)
功能描述获取当前的 data_id 值
输入参数
返回值uint8_t 类型,当前的 data_id

Reverse_parking_no2

函数原型void Reverse_parking_no2(void)
功能描述控制小车倒入 2 号库:后退指定时间后停止,左转指定时间后停止,再后退指定时间
输入参数
返回值

Reverse_parking_no1

函数原型void Reverse_parking_no1(void)
功能描述控制小车倒入 1 号库:后退指定时间后停止,右转指定时间后停止,再后退指定时间后停车
输入参数
返回值

Road_sign_right

函数原型void Road_sign_right(void)
功能描述道路标识右转控制:根据传感器状态调整左右电机速度,实现右转或修正方向
输入参数
返回值

Road_sign_left

函数原型void Road_sign_left(void)
功能描述道路标识左转控制(左转优先巡线):根据传感器状态调整左右电机速度,实现左转或修正方向
输入参数
返回值

Road_sign_speedlimit

函数原型void Road_sign_speedlimit(void)
功能描述低速巡线控制:以限制速度为基础,根据传感器状态微调左右电机速度,实现转向或直行
输入参数
返回值

LineWalking_PWM

函数原型void LineWalking_PWM(void)
功能描述基于 PWM 的循线控制:获取红外传感器状态,根据不同检测情况调整左右电机 PWM 值,实现直行或转向
输入参数
返回值

LineCheck

函数原型int LineCheck(void)
功能描述检测小车当前位于黑线还是白线上:所有传感器未检测到黑线返回 WHITE,否则返回 BLACK
输入参数
返回值int 类型,WHITE(白线)或 BLACK(黑线)

实验现象

此实验开始前首先需要将程序源码->K230文件中mp_deployment_source文件夹复制到CanMV/data目录下,路径如下,然后将main.py烧录到K230。

image-20251121195646272

本教程地图所放置的路标如下图所示,下载程序成功后,把小车放在地图上,打开开关后,等待一会当K230的屏幕亮了之后,小车开始巡线。因电机机械误差、地面材质、电池电量等诸多因素,循迹,倒库等场景需根据实际场景进行调试

识别到限速标志,小车就会做不超过限速标志的速度巡线运动。

识别到解除限速标志,小车就会恢复到正常巡线运动

识别到左转/右转,小车会做优先左转/右转的巡线运动

识别到鸣笛,小车会停下鸣笛两声。然后恢复到正常巡线运动

识别红绿灯,红灯会停止,绿灯会继续往前走

识别1、2号库,小车识别1号库,会进入1号库;识别2号库,小车会倒进2号库

image-20251030154504610