在智能小车、自动巡线机器人和工业移动设备中循迹传感器经常承担“判断当前位置”的基础任务。它不负责复杂决策却能把地面颜色变化转换成数字信号让程序知道当前检测位置是白色区域还是黑色线。对于硬件编程入门来说这类实验很适合理解 GPIO 输入因为代码不再只是输出控制 LED而是开始读取真实环境中的变化。本实验使用 CanMV K210 开发板读取循迹传感器的数字信号。传感器信号线连接到物理引脚 6程序通过fm.register()将该引脚映射到GPIOHS0再使用GPIO.IN输入模式读取电平值。代码中约定0表示白色区域1表示黑色线并通过多次采样取多数值的方式减少抖动误判。程序运行后串口只会在检测状态发生变化时输出结果避免重复刷屏影响观察。学习目标说明理解 GPIO 输入认识开发板如何读取外部传感器输出的数字电平掌握循迹传感器基础理解循迹模块如何把黑白区域转换成高低电平学会引脚映射使用fpioa_manager.fm将物理引脚 6 映射为GPIOHS0理解稳定采样通过多次采样取多数值减少瞬间抖动造成的误判建立输入驱动思路将传感器输入转换成状态再为后续小车控制预留接口这个实验的重点不是简单打印0或1而是建立“外部环境变化 - 传感器电平 - GPIO 输入 - 状态判断 - 程序分支”的完整输入链路。后续接入电机驱动后这个链路就可以继续扩展成循迹小车的基础控制逻辑。文章目录理论基础硬件设施软件代码扩展应用总结理论基础循迹传感器常用于判断地面是黑色轨迹还是白色背景。模块通常利用红外发射和接收结构检测反射差异白色区域反射较强黑色区域反射较弱模块内部电路再把这种差异转换成数字输出。开发板不需要直接分析光线强弱只需要读取传感器输出端的高低电平即可。本实验中循迹传感器输出的是数字信号因此使用 GPIO 输入即可完成读取。代码约定WHITE_LEVEL 0表示读取到0时认为当前检测区域是白色区域BLACK_LEVEL 1表示读取到1时认为当前检测区域是黑色线。不同循迹模块的输出逻辑可能相反如果实际现象与串口输出不一致只需要对调这两个常量不需要重写整套程序。GPIO 输入实验和 GPIO 输出实验的思路不同。LED、蜂鸣器、继电器实验中程序主动输出高低电平让外设产生动作循迹传感器实验中外部传感器先根据环境产生高低电平程序再读取这个电平并做判断。一个是“程序控制硬件”一个是“硬件反馈给程序”。这两类模型组合起来才是后续智能小车、自动控制和传感器联动实验的基础。地面区域白色背景 / 黑色轨迹循迹传感器红外检测反射差异数字信号输出0 或 1CanMV K210物理引脚 6FPIOA 映射GPIOHS0 输入Python 程序track_sensor.value()稳定采样多次读取取多数值状态判断WHITE / BLACK后续动作打印 / 声光反馈 / 小车控制模块供电VCC公共地线GND这张流程图展示的是循迹传感器实验中的信号链路。地面颜色变化先被循迹传感器转换成数字电平电平信号进入 CanMV K210 的物理引脚 6再通过 FPIOA 映射为GPIOHS0输入。程序读取电平后不直接立刻判断而是多次采样后取多数值再把结果转换成WHITE或BLACK状态。稳定采样是本实验中比较关键的设计。循迹传感器容易受到距离、角度、环境光、手持晃动和黑白边界位置影响。如果程序只读一次电平就可能因为瞬间波动产生误判。代码通过连续读取 5 次统计0和1出现次数再选出现次数更多的结果作为本次检测值。这个方法虽然简单但已经具备硬件输入防抖的基本思想。硬件设施本实验只围绕循迹传感器数字输入展开核心硬件是 CanMV K210 开发板和一路循迹传感器信号输入。代码没有使用 LCD、摄像头、蜂鸣器、电机驱动、按键等模块因此这些内容不作为本节功能讲解重点。程序侧主要依赖maix.GPIO、fpioa_manager.fm和time分别用于读取 GPIO 电平、完成引脚功能映射和控制采样间隔。接线关系可以先通过下面这张图建立整体印象。循迹传感器的信号线连接到 CanMV K210 的物理引脚 6模块供电端连接对应 VCCGND 与开发板 GND 相连。程序真正读取的是传感器信号端输出的数字电平。硬件 / 软件作用说明CanMV K210 开发板实验运行平台执行 MicroPython 程序并通过 GPIO 输入读取外部传感器信号循迹传感器黑白区域检测模块输出数字信号代码中约定0表示白色区域1表示黑色线物理引脚 6传感器信号输入引脚循迹传感器信号线连接到开发板物理引脚 6maix.GPIOGPIO 控制模块用于创建 GPIO 输入对象并通过value()读取当前电平fpioa_manager.fm引脚功能映射模块将物理引脚 6 映射为GPIOHS0time延时控制模块通过time.sleep_ms()控制采样间隔和主循环检测间隔实验中用到的循迹传感器和连接线如下。接线时需要区分 VCC、GND 和 OUT / DO / SIG 信号端。不同循迹模块的端子命名可能不完全一致但信号端都需要接到代码指定的物理引脚 6。接口 / 引脚代码变量对应硬件说明物理引脚 6TRACK_PIN 6循迹传感器信号线用于读取传感器输出的数字电平GPIOHS0TRACK_GPIO fm.fpioa.GPIOHS0K210 内部 GPIOHS 功能通过 FPIOA 映射到物理引脚 6GPIO 输入对象track_sensor程序中的循迹传感器对象通过track_sensor.value()读取当前电平VCC未在代码中定义循迹传感器供电端根据模块标识连接对应供电端GND未在代码中定义循迹传感器接地端需要与 CanMV GND 共地保证输入电平可靠输出端OUT / DO / SIG循迹传感器数字输出端连接到物理引脚 6完成接线后的整体效果如下。测试时可以将传感器分别对准白色区域和黑色轨迹观察串口是否输出对应状态。若实际输出与预期相反通常不是程序结构错误而是模块输出逻辑与当前电平约定不同可以调整WHITE_LEVEL和BLACK_LEVEL。实验现象正常表现异常提示程序启动串口输出初始化完成和当前规则说明没有输出时检查脚本是否运行和串口连接对准白色区域串口显示“检测结果白色区域”一直显示黑色线时检查电平规则或传感器高度对准黑色线串口显示“检测结果黑色线”一直显示白色区域时检查黑线材质和信号线连接黑白切换状态变化时串口才输出新结果状态不变时不重复输出这是当前程序设计手持测试轻微晃动时可能出现短暂变化可以增加采样次数或固定传感器高度边界区域黑白边界处可能频繁跳变属于正常现象可移动到更明确区域测试软件代码本实验代码围绕一路循迹传感器输入展开。程序先定义传感器连接的物理引脚、电平规则、采样次数和循环间隔再完成 GPIO 输入初始化。运行过程中程序会连续读取多次传感器值并取出现次数最多的电平作为稳定结果再把电平转换成WHITE、BLACK或UNKNOWN状态。为了让串口输出更清晰只有状态发生变化时才打印检测结果。软件环境作用检查重点CanMV IDE编辑、运行和调试 K210 程序能识别开发板串口并能运行基础print()测试CanMV 固件提供maix.GPIO、fpioa_manager等模块固件环境需要支持当前 GPIOHS 输入写法USB 串口驱动让电脑识别开发板串口串口工具中能看到对应端口串口终端查看检测结果能看到“白色区域”或“黑色线”的状态变化循迹测试材料提供黑白对比区域建议使用白色底板和清晰黑色胶带或黑线#!/usr/bin/env python3# -*- coding: utf-8 -*- CanMV K210 循迹传感器实验 Demo 功能说明 1. 读取循迹传感器数字信号 2. 判断当前检测到白色区域还是黑色线 3. 只在状态变化时打印信息避免串口刷屏 4. 增加稳定采样减少传感器抖动造成的误判 5. 预留循迹小车控制接口方便后续扩展电机控制 frommaiximportGPIOfromfpioa_managerimportfmimporttime# # 硬件配置区# TRACK_PIN6# 循迹传感器信号线连接的物理引脚TRACK_GPIOfm.fpioa.GPIOHS0# 映射到 GPIOHS0WHITE_LEVEL0# 根据原始代码检测到白色线时输出 0BLACK_LEVEL1# 根据原始代码检测到黑色线时输出 1SAMPLE_COUNT5# 每次读取采样次数SAMPLE_DELAY_MS5# 每次采样间隔LOOP_DELAY_MS100# 主循环检测间隔# # 全局对象# track_sensorNone# # 初始化函数# defsetup(): 初始化循迹传感器 循迹模块输出的是数字信号只需要配置为输入模式 globaltrack_sensor fm.register(TRACK_PIN,TRACK_GPIO,forceTrue)track_sensorGPIO(GPIO.GPIOHS0,GPIO.IN,GPIO.PULL_UP)print(循迹传感器初始化完成)print(当前规则0 表示白色区域1 表示黑色线)print(请将传感器对准白色区域或黑色线进行测试)# # 传感器读取函数# defread_raw_value(): 读取传感器原始电平 返回值通常为 0 或 1 returntrack_sensor.value()defread_stable_value(): 多次采样后取出现次数最多的电平值 可以减少环境光、距离变化、手抖带来的瞬间误判 count_00count_10for_inrange(SAMPLE_COUNT):valueread_raw_value()ifvalue0:count_01else:count_11time.sleep_ms(SAMPLE_DELAY_MS)ifcount_0count_1:return0else:return1defget_track_status(value): 将电平值转换为更容易理解的状态文字 ifvalueWHITE_LEVEL:returnWHITEelifvalueBLACK_LEVEL:returnBLACKelse:returnUNKNOWN# # 场景处理函数# defon_white_detected(raw_value): 检测到白色区域时执行 后续可以在这里控制小车偏离黑线后的动作 print(检测结果白色区域 | 原始值{}.format(raw_value))defon_black_detected(raw_value): 检测到黑色线时执行 后续可以在这里控制小车沿线前进 print(检测结果黑色线 | 原始值{}.format(raw_value))defhandle_track_status(status,raw_value): 根据识别结果执行不同逻辑 ifstatusWHITE:on_white_detected(raw_value)elifstatusBLACK:on_black_detected(raw_value)else:print(检测结果未知状态 | 原始值{}.format(raw_value))# # 循迹控制扩展接口# deftrack_car_control(status): 预留给循迹小车的控制接口 当前 Demo 只打印状态。 后续接入电机后可以在这里加入前进、左转、右转、停止等动作。 ifstatusBLACK:# 示例检测到黑线小车保持前进passelifstatusWHITE:# 示例检测到白色区域小车需要修正方向pass# # 主循环# defloop(): 主循环 持续读取循迹传感器状态。 只有状态发生变化时才打印观察效果更清晰。 last_statusNonewhileTrue:raw_valueread_stable_value()current_statusget_track_status(raw_value)ifcurrent_status!last_status:handle_track_status(current_status,raw_value)last_statuscurrent_status track_car_control(current_status)time.sleep_ms(LOOP_DELAY_MS)# # 程序入口# if__name____main__:try:setup()loop()exceptKeyboardInterrupt:print(程序已停止)这段程序可以分成硬件配置、初始化、原始读取、稳定采样、状态转换、场景处理、扩展接口和主循环几个部分。硬件配置区集中保存引脚编号、电平规则和时间参数便于实验调试时统一修改。TRACK_PIN 6说明循迹传感器信号线接在物理引脚 6TRACK_GPIO fm.fpioa.GPIOHS0说明程序将该引脚映射为GPIOHS0。setup()是整个程序的初始化入口。它通过fm.register()完成物理引脚到 GPIO 功能的绑定再通过GPIO(GPIO.GPIOHS0, GPIO.IN, GPIO.PULL_UP)创建输入对象。循迹模块输出的是数字信号开发板只需要读取高低电平不需要像 LED 那样主动输出控制信号。这里使用GPIO.IN表示输入模式GPIO.PULL_UP表示启用上拉配置有助于让输入引脚在没有稳定外部信号时保持更明确的电平状态。read_stable_value()是本实验的关键函数。它连续读取多次传感器值并统计0和1的出现次数再选择出现次数更多的电平作为稳定结果。get_track_status()则把原始电平转换成更容易理解的WHITE或BLACK状态。主循环中的last_status用来过滤重复输出只有黑白状态发生变化时才打印便于观察实际检测变化。函数名功能对应现象setup()初始化循迹传感器输入引脚串口打印初始化完成传感器进入可读取状态read_raw_value()读取传感器原始电平获得当前信号值通常为0或1read_stable_value()多次采样并取多数值减少抖动导致的黑白误判get_track_status(value)将电平转换成状态文字0转为WHITE1转为BLACKon_white_detected(raw_value)处理白色区域检测结果串口输出“检测结果白色区域”on_black_detected(raw_value)处理黑色线检测结果串口输出“检测结果黑色线”handle_track_status(status, raw_value)根据状态分发处理逻辑不同检测结果进入不同处理函数track_car_control(status)预留循迹小车控制接口当前不控制电机只为后续扩展保留入口loop()持续读取传感器状态状态变化时打印结果状态不变时保持安静当前代码中的track_car_control()只是预留接口没有真正控制电机。这样处理可以避免把小车前进、左转、右转等功能误写成已经实现。后续接入电机驱动模块后可以在这个函数里根据BLACK和WHITE状态加入运动控制逻辑。扩展应用循迹传感器实验的排查重点在电源、信号线、引脚映射、电平规则、传感器高度和环境干扰。代码已经加入稳定采样但硬件安装位置、传感器与地面的距离、黑线材质和环境光变化仍然会影响检测结果。问题现象可能原因处理思路串口一直没有输出初始化信息程序没有运行、串口连接异常、脚本未正确启动检查 CanMV 连接状态和运行入口确认执行到了setup()一直显示白色区域传感器未对准黑线、信号线接错、黑线反射差异不明显检查传感器位置确认信号线连接到物理引脚 6换用更清晰的黑色轨迹测试一直显示黑色线传感器高度不合适、环境光影响、模块输出规则与代码相反调整传感器与地面的距离检查模块指示灯必要时交换WHITE_LEVEL与BLACK_LEVEL黑白结果频繁跳变采样次数偏少、传感器抖动、地面边界处反复变化增大SAMPLE_COUNT适当提高SAMPLE_DELAY_MS让传感器对准更稳定的区域状态变化后串口没有连续打印代码只在状态变化时输出这是当前程序的设计效果如需连续观察原始值可在循环中临时打印raw_value检测反应偏慢主循环延时或采样延时偏大适当减小LOOP_DELAY_MS、SAMPLE_COUNT或SAMPLE_DELAY_MS但稳定性也会随之下降后续接电机没有动作track_car_control()当前只有pass当前 Demo 未实现电机控制电机驱动属于后续课程可扩展方向传感器指示灯变化但串口状态不变信号线未接到代码指定引脚或 GPIO 映射不一致核对 OUT / DO / SIG 是否接到物理引脚 6并确认TRACK_GPIO配置正确循迹传感器实验的价值不在于打印“黑线”或“白色区域”这几个字而在于建立“传感器输入驱动程序决策”的基础模型。程序读取真实环境中的状态变化再把电平转换成业务语义进一步进入不同处理函数。这个模式可以迁移到巡线小车、自动分拣、边界检测、地面标记识别、设备位置判断等场景中。应用场景实现思路可扩展能力循迹小车基础检测使用循迹传感器判断当前位置是否在黑线上后续可接入电机驱动根据BLACK和WHITE控制前进或修正方向地面边界识别将黑白边界作为设备可行驶区域的判断依据可扩展多路循迹传感器提高边界判断准确性自动分拣标记检测在传送带或轨道上放置黑白标记传感器识别位置节点可与计数逻辑结合实现经过节点统计教学演示实验用传感器输入展示 GPIO 读取、状态判断和函数分发可把抽象的输入判断变成可观察的串口结果硬件调试触发器根据黑白区域变化触发不同程序分支可与 LED 或蜂鸣器结合作为后续课程的声光反馈方向机器人路径检测将黑线作为路径线索让程序知道机器人是否偏离轨迹可扩展 PID 控制或双传感器差值判断但当前代码未实现状态变化记录只在状态变化时打印适合记录黑白切换时刻可扩展数据上传或日志保存形成简单检测记录系统从工程角度看当前代码已经具备比较清晰的扩展基础。硬件配置集中在顶部传感器读取被封装成独立函数状态转换和场景处理被拆开主循环只负责调度流程。后续接入电机时可以把控制逻辑写进track_car_control()接入 LED 或蜂鸣器时可以在on_white_detected()和on_black_detected()中增加反馈动作接入 LCD 时可以把当前状态显示到屏幕上。这些都属于后续课程可扩展方向当前 Demo 的实际功能仍然是读取循迹传感器并打印状态变化。总结本实验通过 CanMV K210 开发板完成了一路循迹传感器的数字信号读取核心能力包括 FPIOA 引脚映射、GPIO 输入模式、上拉配置、原始电平读取、多次采样防抖、状态转换、函数分发和主循环检测。代码从物理引脚 6 开始把传感器信号映射成GPIOHS0输入对象再把0和1转换成白色区域与黑色线两种语义状态让硬件检测结果能够进入程序逻辑。这类实验是智能硬件课程中非常重要的输入类案例。LED 实验展示的是程序如何控制外部设备循迹传感器实验展示的是程序如何读取外部环境。理解这两类模型后后续再学习按键输入、蜂鸣器反馈、LCD 显示、电机控制、传感器采集、AI 摄像头识别和自动驾驶小车逻辑时就能把不同模块放到同一套程序结构中理解。当前代码虽然只打印状态变化但已经搭好了从传感器读取到控制接口预留的完整骨架适合作为循迹小车和自动控制实验的起点。