尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

【CanMV K210】传感器实验 红外避障传感器障碍物检测

【CanMV K210】传感器实验 红外避障传感器障碍物检测 在智能小车、自动门、机器人避障和设备安全检测场景中红外避障传感器经常承担“发现前方是否有物体”的基础任务。它不像摄像头那样需要处理复杂图像也不需要复杂的模型推理只需要通过一个数字输出信号告诉开发板前方是否检测到障碍物。对于硬件编程入门来说这类实验非常适合理解“外部环境如何变成程序中的判断条件”。本实验使用 CanMV K210 开发板读取红外避障模块的数字输出信号。程序将红外避障模块的 OUT 引脚连接到开发板 IO6并映射到GPIOHS0。当传感器检测到障碍物时模块输出低电平程序在终端打印“检测到障碍物”并统计触发次数当障碍物离开时程序打印恢复提示。代码还通过状态变化判断避免终端重复刷屏让输出信息更接近真实项目中的事件日志。学习目标说明理解 GPIO 输入认识传感器 OUT 信号如何被开发板读取成高低电平掌握 FPIOA 映射使用fm.register()将 IO6 映射为GPIOHS0输入功能理解触发电平明确低电平触发和高电平触发对判断逻辑的影响学会状态变化检测使用last_state避免终端重复打印相同状态建立事件触发思路将“检测到障碍物”和“障碍物离开”转换成程序事件文章目录理论基础硬件设施软件代码扩展应用总结理论基础红外避障传感器是一类常见的数字输入模块。模块通过红外发射和接收判断前方是否存在障碍物再通过 OUT 引脚输出高电平或低电平。开发板并不需要知道红外发射、反射和接收的全部细节只需要读取 OUT 引脚当前电平就可以判断传感器是否触发。本实验中的红外避障模块按照低电平触发方式编写程序。也就是说检测到障碍物时 OUT 输出低电平程序读取到0没有检测到障碍物时 OUT 输出高电平程序读取到1。代码中使用OBSTACLE_LEVEL 0和NO_OBSTACLE_LEVEL 1保存这种电平含义后续如果换成高电平触发模块只需要调整这两个常量。GPIO 输入实验和 GPIO 输出实验的方向刚好相反。LED、蜂鸣器实验中程序输出电平控制外设动作红外避障实验中外设输出电平程序读取状态并作出判断。这种“外部状态驱动程序逻辑”的结构是后续按键输入、限位开关、人体感应、门磁检测、传感器报警等实验的基础。下面这张流程图从电路控制链路理解本实验。红外模块负责感知障碍物OUT 引脚负责输出数字信号CanMV K210 通过 IO6 读取这个信号程序再把高低电平转换成“有障碍物”或“无障碍物”的状态事件。前方环境有障碍物 / 无障碍物红外避障模块红外发射与接收OUT 数字输出低电平触发CanMV K210IO6 输入GPIOHS0GPIO 输入对象程序判断is_obstacle_detected()事件输出检测到障碍物 / 障碍物离开后续扩展小车停止 / 蜂鸣器报警 / LED 提示模块供电VCC公共地线GND从这条链路可以看出程序真正读取的并不是“障碍物”本身而是红外模块处理后的 OUT 电平。is_obstacle_detected()的作用就是把底层的0或1转换成更容易理解的布尔结果。主循环再根据状态变化决定是否打印提示、计数或触发其他动作。硬件设施本实验围绕红外避障模块的数字信号读取展开核心硬件只有 CanMV K210 开发板和红外避障传感器。代码没有使用 LCD、蜂鸣器、摄像头、电机等模块因此这些内容不在本节展开。软件侧主要依赖maix.GPIO、fpioa_manager.fm和time分别负责 GPIO 输入读取、引脚功能映射和循环检测延时。接线关系可以先通过下面这张图建立整体印象。红外避障模块的 OUT 信号线连接到 CanMV K210 的 IO6VCC 和 GND 用于模块供电与共地。程序中所有障碍物判断都围绕 OUT 这一路数字输入信号展开。硬件 / 软件作用说明CanMV K210 开发板实验运行平台负责执行 MicroPython 程序并读取红外避障模块输出的数字信号红外避障传感器模块障碍物检测外设通过 OUT 引脚输出高低电平表示是否检测到障碍物IO6 物理引脚传感器信号输入接口代码中IR_PIN 6表示红外模块 OUT 引脚连接到开发板 IO6GPIOHS0高速 GPIO 输入功能代码通过fm.fpioa.GPIOHS0将 IO6 映射为高速 GPIO 输入maix.GPIOGPIO 控制模块用于创建输入对象并通过value()读取传感器电平fpioa_manager.fm引脚功能映射模块用于把开发板物理引脚绑定到指定 GPIO 功能time延时控制模块通过time.sleep_ms()控制传感器检测间隔实验中用到的红外避障模块如下。模块一般包含红外发射管、红外接收管、比较器电路、指示灯和灵敏度调节电位器。实际调试时如果检测距离过远、过近或一直触发可以通过模块上的电位器调整灵敏度。接线关系可以直接从代码中的IR_PIN、IR_GPIO、fm.register()和GPIO()推导出来。红外避障模块的 OUT 引脚连接到开发板 IO6程序再把 IO6 注册为GPIOHS0并创建名为ir_sensor的输入对象。当前代码没有指定 VCC 和 GND 的具体引脚编号但红外避障模块正常工作必须连接电源和地线。接口 / 引脚代码变量对应硬件说明IO6IR_PIN 6红外避障模块 OUT用于读取红外避障模块的数字输出信号GPIOHS0IR_GPIO fm.fpioa.GPIOHS0GPIO 输入功能IO6 被映射成GPIOHS0后用于输入检测VCC未在代码中体现红外避障模块供电端根据模块标识连接对应电源常见模块通常支持 3.3V 或 5VGND未在代码中体现红外避障模块接地端必须与开发板共地否则 OUT 信号无法被稳定读取低电平OBSTACLE_LEVEL 0检测到障碍物当前代码按低电平触发逻辑编写高电平NO_OBSTACLE_LEVEL 1没有障碍物程序使用上拉输入保持默认高电平状态完成接线后的整体效果如下。检查时重点关注 OUT 是否接到 IO6VCC 和 GND 是否连接正确传感器前方是否存在被检测物体以及模块指示灯是否会随着障碍物靠近发生变化。实验现象正常表现异常提示程序启动终端输出初始化完成提示如果没有输出检查程序是否运行和串口是否连接无障碍物传感器处于未触发状态若一直显示触发检查灵敏度旋钮或触发电平物体靠近终端打印“检测到障碍物”并增加触发次数如果无反应检查 OUT 是否接到 IO6物体离开终端打印“障碍物已离开传感器恢复正常”如果不恢复可能是检测距离过远或环境干扰反复靠近离开触发次数逐次增加计数只在状态从无障碍变为有障碍时增加终端输出不刷屏只有状态变化时打印这是last_state状态缓存带来的正常现象软件代码本实验代码围绕红外避障模块的数字输入检测展开。程序先配置传感器信号引脚再创建 GPIO 输入对象接着通过函数读取当前电平并判断障碍物状态。主循环中没有持续打印原始电平而是只在状态发生变化时输出提示这种写法更适合真实项目中的事件检测逻辑。软件环境作用检查重点CanMV IDE编辑、运行和调试 K210 程序能识别开发板串口并能运行基础print()测试CanMV 固件提供maix.GPIO、fpioa_manager等模块固件环境需要支持当前 GPIO 输入与 FPIOA 写法USB 串口驱动让电脑识别开发板串口串口工具或 IDE 中能看到对应端口串口终端查看传感器状态变化能看到初始化、检测到障碍物和恢复提示红外避障模块提供 OUT 数字信号物体靠近时 OUT 电平应发生变化#!/usr/bin/env python3# -*- coding: utf-8 -*- CanMV K210 红外避障传感器实验 Demo 功能说明 1. 读取红外避障模块的数字输出信号 2. 检测到障碍物时输出提示 3. 障碍物离开时输出恢复提示 4. 避免重复刷屏 5. 统计障碍物触发次数 frommaiximportGPIOfromfpioa_managerimportfmimporttime# # 硬件配置区# IR_PIN6# 红外避障模块 OUT 引脚连接到开发板 IO6IR_GPIOfm.fpioa.GPIOHS0# 映射到高速 GPIO0OBSTACLE_LEVEL0# 大多数红外避障模块检测到障碍物时输出低电平NO_OBSTACLE_LEVEL1# 没有障碍物时输出高电平CHECK_INTERVAL_MS100# 检测间隔单位毫秒# # 初始化# defsetup():globalir_sensor fm.register(IR_PIN,IR_GPIO,forceTrue)# 红外避障模块 OUT 是数字信号输入默认上拉为高电平ir_sensorGPIO(GPIO.GPIOHS0,GPIO.IN,GPIO.PULL_UP)print(红外避障传感器初始化完成)print(请把物体靠近传感器观察输出状态)# # 读取传感器状态# defis_obstacle_detected(): 判断是否检测到障碍物 返回 True 表示检测到障碍物 返回 False 表示没有检测到障碍物 returnir_sensor.value()OBSTACLE_LEVEL# # 主循环# defloop():last_stateNonedetect_count0whileTrue:current_stateis_obstacle_detected()# 只有状态发生变化时才输出避免终端一直刷屏ifcurrent_state!last_state:ifcurrent_state:detect_count1print(检测到障碍物触发次数{}.format(detect_count))else:print(障碍物已离开传感器恢复正常)last_statecurrent_state time.sleep_ms(CHECK_INTERVAL_MS)# # 程序入口# if__name____main__:setup()try:loop()exceptKeyboardInterrupt:print(程序已停止)这段程序可以分成硬件配置、初始化、状态判断、循环检测和异常退出几个部分。硬件配置区使用常量保存引脚编号、电平含义和检测间隔后续更换接线或调整检测频率时只需要修改顶部参数。setup()负责完成 IO6 到GPIOHS0的映射并把GPIOHS0配置为输入模式。红外避障模块的 OUT 引脚不是被程序控制的对象而是向开发板输出检测结果的信号源因此这里必须使用GPIO.IN。GPIO.PULL_UP用于让输入引脚默认保持高电平状态减少信号悬空带来的误判。is_obstacle_detected()把底层电平判断封装成布尔结果。直接读取ir_sensor.value()得到的是 0 或 1但主循环真正关心的是“是否检测到障碍物”。封装成函数后后续扩展 LED、蜂鸣器或电机控制时逻辑会更加清晰。loop()中的last_state用来记录上一次检测状态current_state用来保存当前检测结果。只有两次状态不一致时程序才会打印提示信息。这样可以避免每 100 毫秒打印一次相同内容终端输出更干净也更接近真实设备中的状态变化日志。函数 / 语句功能对应现象setup()初始化红外避障传感器输入引脚终端输出初始化完成提示开发板开始准备读取 OUT 信号fm.register()建立 IO6 与GPIOHS0的映射关系物理引脚 IO6 被配置成 GPIO 输入功能GPIO(..., GPIO.IN, GPIO.PULL_UP)创建上拉输入对象没有明确低电平输入时引脚保持高电平is_obstacle_detected()判断当前是否检测到障碍物物体靠近传感器时返回True离开时返回Falseloop()持续检测传感器状态并输出变化结果检测到障碍物时打印触发次数障碍物离开时打印恢复提示time.sleep_ms(CHECK_INTERVAL_MS)控制检测间隔每隔 100 毫秒读取一次传感器状态避免循环占用过高KeyboardInterrupt捕获手动停止程序的情况停止运行时输出“程序已停止”从程序结构看当前代码没有把所有逻辑堆在主循环中而是把初始化、判断和循环分别拆开。setup()负责硬件准备is_obstacle_detected()负责把电平转换成布尔结果loop()负责持续运行和事件输出。这样的结构更适合后续扩展比如检测到障碍物时控制 LED 亮起、触发蜂鸣器、让小车停止或记录检测日志。扩展应用红外避障实验经常遇到传感器一直触发、完全不触发、输出逻辑相反和终端刷屏等问题。排查时需要围绕供电、OUT 接线、输入模式、触发电平和检测间隔进行确认避免把硬件连接问题误判成程序逻辑问题。问题现象可能原因处理思路终端一直提示检测到障碍物传感器输出逻辑与代码设定不一致或检测距离旋钮过于灵敏观察模块指示灯状态确认检测到障碍物时 OUT 是否为低电平必要时调整OBSTACLE_LEVEL物体靠近后没有任何提示OUT 没有接到 IO6、模块未供电、引脚映射不匹配检查 OUT、VCC、GND 接线确认代码中的IR_PIN 6与实际接线一致障碍物离开后不恢复传感器距离阈值过大、物体仍在检测范围内、模块受环境光干扰调整红外模块电位器改变检测距离并避开强光直射环境输出状态与实际相反当前模块可能是高电平触发将OBSTACLE_LEVEL改为1将NO_OBSTACLE_LEVEL改为0终端信息刷新过快检测间隔设置过短或状态判断逻辑被修改保留last_state判断机制并适当调大CHECK_INTERVAL_MS程序运行时报 GPIO 相关错误引脚功能未正确注册或 GPIO 名称与映射不一致核对fm.register(IR_PIN, IR_GPIO)和GPIO(GPIO.GPIOHS0, ...)是否对应模块指示灯变化但程序无变化OUT 信号线接错或者没有与开发板共地重新核对 OUT、VCC、GND 三根线重点确认 GND 是否共地检测距离不稳定反射面颜色、角度、环境光和电位器设置影响检测效果使用稳定目标物测试调整传感器角度和灵敏度旋钮红外避障实验的价值不止在于读取一个高低电平而是建立“传感器状态驱动程序决策”的基本思路。传感器负责感知外部环境GPIO 输入负责把信号送入开发板程序根据检测结果执行不同动作。这个模式可以迁移到很多硬件项目中例如小车避障、门禁检测、流水线计数、桌面互动装置和安全区域提醒。应用场景实现思路可扩展能力智能小车避障检测到前方障碍物后程序触发停止或转向逻辑后续可结合电机驱动实现自动避障自动门靠近检测通过红外模块判断前方是否有物体靠近可扩展继电器或电机控制实现门体开合动作设备安全区域提醒检测到物体进入指定范围时输出提示后续可扩展蜂鸣器或 LED实现声光提醒生产线物体计数每次从无障碍变成有障碍时让计数器递增当前代码中的detect_count已具备基础计数思路教学演示实验通过终端输出观察传感器电平变化和状态切换适合讲解 GPIO 输入、布尔判断、状态缓存和事件触发硬件调试反馈使用终端日志判断传感器是否接线正确、阈值是否合理可扩展为多传感器检测分别记录不同方向或不同区域状态限位保护将红外模块安装到运动机构边界位置可用于防止电机或滑轨运动到危险区域互动装置触发人手或物体靠近时触发灯光、声音或屏幕变化可扩展成桌面互动作品或教学演示装置从工程角度看当前代码已经具备事件触发程序的基本结构。is_obstacle_detected()把传感器电平封装成状态判断last_state避免重复输出detect_count记录触发次数CHECK_INTERVAL_MS控制检测节奏。后续新增 LED、蜂鸣器、电机或屏幕显示时不需要重写传感器读取逻辑只需要在状态变化的位置添加对应动作即可。总结本实验通过 CanMV K210 开发板完成了红外避障传感器的数字输入检测核心能力包括 FPIOA 引脚映射、GPIO 输入配置、上拉输入、传感器电平判断、状态变化检测、循环采样和触发次数统计。代码从 IO6 引脚注册开始把红外模块的 OUT 信号转化成程序中的布尔判断再通过主循环持续检测环境变化完整展示了外部传感器如何参与程序决策。这类实验非常适合作为硬件输入控制的入门案例。LED 实验强调程序如何控制硬件输出红外避障实验则强调硬件状态如何反过来影响程序逻辑。理解了 GPIO 输入与状态判断之间的关系后续就可以继续扩展到按键输入、蜂鸣器反馈、LCD 显示、电机控制、多路传感器采集和 AI 摄像头识别等方向。更多智能硬件项目本质上都可以从“读取环境状态再根据状态执行动作”这条思路逐步搭建起来。
返回列表