K210:视觉大脑,负责识别障碍物 + 判断位置 / 距离,把结果发给 STM32
STM32:运动控制核心,负责接收指令 + 驱动电机,执行避障动作
全程分硬件搭建→软件编程→联调避障三步,新手也能快速上手
一、整体系统架构
K210视觉模块 ←(摄像头采集图像)→ 识别障碍物 →(串口通信)→ STM32 → 电机驱动 → 小车避障
核心逻辑:K210 看不到障碍物→发直行指令;看到障碍物→发左转 / 右转 / 后退指令,STM32 执行动作。
二、硬件清单

K210 ↔ STM32 串口通信(核心数据通道)
K210 TX → STM32 RX(PA3)
K210 RX → STM32 TX(PA2)
K210 GND → STM32 GND(共地必须接,否则通信失败)
STM32 ↔ 电机驱动(控制电机)
左电机:PB0、PB1
右电机:PB2、PB3
电源接线
锂电池→电机驱动、稳压模块
稳压模块 3.3V→K210、STM32
下载 MaixPy IDE
K210 烧录MaixPy 固件(官网下载对应型号固件)
用 IDE 连接 K210,即可运行 Python 视觉代码
2. STM32 编程环境Keil5 + STM32CubeMX(图形化配置,不用手写寄存器)
基础:会用 GPIO、串口、PWM 电机控制即可
四、第一步:K210 视觉避障编程(核心!)新手优先学 **【颜色块识别避障】**(最简单、最稳定),进阶再学 AI 物体识别。原理用 K210 识别指定颜色的障碍物(比如黑色 / 红色方块),通过色块大小判断距离,位置判断左右,通过串口发指令给 STM32。
# K210 视觉避障:颜色块识别障碍物 + 串口发指令 import sensor, image, lcd, time from machine import UART # 1. 初始化串口(和STM32波特率一致:115200) uart = UART(1, baudrate=115200, tx=33, rx=32) # K210串口1 # 2. 初始化摄像头 sensor.reset() sensor.set_pixformat(sensor.RGB565) # 彩色模式 sensor.set_framesize(sensor.QVGA) # 分辨率320×240 sensor.skip_frames(time = 2000) # 跳过初始帧 sensor.set_auto_gain(False) # 关闭自动增益(识别更稳定) sensor.set_auto_whitebal(False) # 关闭自动白平衡 # 3. 初始化LCD屏幕(实时看识别效果) lcd.init() lcd.rotation(2) # 旋转屏幕 # 4. 障碍物颜色阈值(新手调试:黑色阈值,可改红色/蓝色) # 格式:(L最小值, L最大值, A最小值, A最大值, B最小值, B最大值) BLACK_THRESHOLD = (0, 30, -128, 127, -128, 127) OBSTACLE_AREA = 500 # 障碍物最小面积(面积越大=距离越近) # 5. 主循环 while(True): img = sensor.snapshot() # 抓拍图像 # 查找黑色色块(障碍物) blobs = img.find_blobs([BLACK_THRESHOLD], pixels_threshold=200, area_threshold=200) cmd = 0x00 # 默认指令:0x00=无障碍物,直行 if blobs: # 取最大的色块(最靠近的障碍物) max_blob = max(blobs, key=lambda b: b.pixels()) img.draw_rectangle(max_blob.rect()) # 框出障碍物 img.draw_cross(max_blob.cx(), max_blob.cy()) # 中心点 # 判断障碍物位置 + 发送指令 if max_blob.area() > OBSTACLE_AREA: # 距离过近,触发避障 if max_blob.cx() < 100: # 障碍物在左侧 cmd = 0x01 lcd.draw_string(10,10,"LEFT OBSTACLE", lcd.RED, lcd.WHITE) elif max_blob.cx() > 220: # 障碍物在右侧 cmd = 0x02 lcd.draw_string(10,10,"RIGHT OBSTACLE", lcd.RED, lcd.WHITE) else: # 障碍物在正前方 cmd = 0x03 lcd.draw_string(10,10,"FRONT OBSTACLE", lcd.RED, lcd.WHITE) uart.write(bytearray([cmd])) # 串口发送1字节指令给STM32 lcd.display(img) # 显示图像
指令定义(简单易记)0x00:无障碍物 → 直行
0x01:左侧有障碍物 → 右转
0x02:右侧有障碍物 → 左转
0x03:正前方有障碍物 → 后退 + 左转
五、第二步:STM32 运动控制编程STM32 只做两件事:接收 K210 指令 + 控制电机避障1. STM32CubeMX 配置(图形化)
开启USART2(波特率 115200,和 K210 一致)
开启 4 个 GPIO(推挽输出)控制电机正反转
开启 2 路 PWM(调速,可选)
2. STM32 核心控制代码(Keil)// 接收K210的指令 uint8_t uart_cmd; // 电机控制函数(简化版,根据驱动修改引脚) void Motor_Forward(void); // 直行 void Motor_Back(void); // 后退 void Motor_Left(void); // 左转 void Motor_Right(void); // 右转 void Motor_Stop(void); // 停止 // 串口中断回调函数(接收K210指令) void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART2) { uart_cmd = USART2->DR; // 读取指令 HAL_UART_Receive_IT(&huart2, &uart_cmd, 1); // 开启下一次接收 } } // 主循环避障逻辑 while(1) { switch(uart_cmd) { case 0x00: Motor_Forward(); break; // 无障直行 case 0x01: Motor_Right(); break; // 左障右转 case 0x02: Motor_Left(); break; // 右障左转 case 0x03: // 前障:后退1秒+左转 Motor_Back(); HAL_Delay(1000); Motor_Left(); break; default: Motor_Forward(); break; } }
六、第三步:整车联调(必做步骤)单独测试 K210:打开 MaixPy IDE,看屏幕是否能框出黑色障碍物,串口是否发送正确指令。
单独测试 STM32:用串口助手发指令,看小车是否正常直行 / 左转 / 右转。
硬件连接:K210 和 STM32 接好串口 + 共地,上电。
实物测试:在小车前方放黑色障碍物,看是否自动躲避。
七、新手必看避坑指南串口通信失败:99% 是GND 没共地,或波特率不一致。
K210 烧屏 / 损坏:严禁接 5V,必须用 3.3V 稳压。
识别不稳定:关闭 K210 自动增益 / 白平衡,调整颜色阈值。
电机干扰:电机电源和主控电源分开布线,加滤波电容。
八、进阶升级(学会基础后再学)AI 通用障碍物识别:K210 跑 YOLO2 模型,识别人、车、箱子等任意障碍物,不用限定颜色。
单目视觉测距:通过色块大小精准计算距离,避障更智能。
循迹 + 避障融合:小车既能循迹,又能躲避突发障碍物。
总结核心分工:K210 管视觉识别,STM32 管电机控制,串口传指令。
入门首选颜色块识别,代码简单、调试快,1 天就能跑通避障。
联调先分模块测试,再整车组合,快速定位问题
我要赚赏金
