基于行空板与TB6612FNG的智能安全遥控车:从扩展板设计到避障算法

基于行空板与TB6612FNG的智能安全遥控车:从扩展板设计到避障算法 1. 项目概述从开源硬件到智能遥控车的跨越最近在捣鼓行空板发现这玩意儿真是个宝藏。它本身集成了屏幕、Wi-Fi、蓝牙和各种传感器开箱即用特别适合教育场景和快速原型开发。但玩久了总感觉它的GPIO引脚就那么几个想接个电机、舵机或者多个传感器就得用面包板飞线既不稳定也不美观更别提做成一个能拿得出手的“作品”了。于是给行空板配一块专用的扩展板就成了一个很自然的需求。这次的项目就是用一块自制的行空板扩展板来打造一辆功能完善、操控安全的智能遥控车。这个“安全遥控车”项目远不止是让一个小车跑起来那么简单。它的核心目标是在实现基础遥控功能前进、后退、转向的同时通过扩展板集成必要的驱动电路和传感器赋予小车“感知”和“反应”的能力从而避免碰撞、防止跌落甚至实现一些简单的自主行为。行空板作为主控负责逻辑运算、网络通信和人机交互比如在板载屏幕上显示状态扩展板则作为“力量与感官的延伸”将微弱的控制信号放大以驱动电机并接入各类传感器信号。最终成品是一个融合了硬件设计、电路知识、嵌入式编程和物联网概念的综合性项目非常适合有一定Python和电子基础的爱好者深入实践。2. 扩展板核心设计思路与电路解析为什么不能直接用行空板驱动电机这是首先要搞清楚的问题。行空板的GPIO引脚输出电流能力有限通常在十几毫安级别而驱动小车电机哪怕是N20这种微型减速电机瞬间电流可能达到几百毫安甚至更高。直接连接会烧毁行空板的主控芯片。因此扩展板的首要任务就是功率驱动和信号隔离。2.1 电机驱动方案选型H桥与驱动芯片要让直流电机实现正反转和调速最经典的电路是H桥。我们当然可以用四个MOS管自己搭建一个但对于入门和快速实现来说集成电机驱动芯片是更可靠、更便捷的选择。常见的芯片有L298N、TB6612FNG、DRV8833等。L298N经典、皮实、易得但发热较大效率相对较低需要外接散热片。TB6612FNG效率高发热小内置保护电路驱动能力适中非常适合这种小型项目。DRV8833更小型化双路H桥驱动电流略小但集成度极高。对于我们的安全遥控车我推荐使用TB6612FNG。它的理由很充分首先效率高意味着电池续航更长小车跑得更久其次它支持PWM调速和正反转控制逻辑接口简单两个输入引脚控制一路电机的方向一个PWM引脚控制速度最后它有过热保护和短路保护这对新手和经常调试的项目来说是个“保险丝”。在扩展板上我们需要为TB6612FNG设计外围电路。这包括电源部分芯片需要两个电源。一个是逻辑电源VCC通常接3.3V或5V与行空板逻辑电平匹配。另一个是电机电源VM直接接电池比如7.4V的2S锂电池。这里必须注意两个电源的地GND必须共地否则控制信号无法形成回路。输入输出部分将芯片的AIN1/AIN2控制方向和PWMA控制速度引脚通过排针引出连接到行空板的GPIO。将电机的两根线连接到芯片的AO1和AO2输出端。滤波电容在VM和GND之间、VCC和GND之间就近放置一个10uF的电解电容和一个0.1uF的陶瓷电容用于滤除电源噪声防止电机启停时产生的电压尖峰干扰芯片甚至行空板的工作。注意电机的电源VM一定要和行空板的供电电源分开。行空板最好由另一路稳定的5V供电比如通过USB或稳压模块。如果电机和主控共用电池电机负载突变会导致电压瞬间跌落可能引起行空板重启。这是遥控车项目中最常见的“灵异现象”根源之一。2.2 传感器接口与电源管理设计安全功能依赖于传感器。扩展板需要预留常见传感器的接口。超声波测距模块这是防撞的主力。通常需要5V供电、一个触发信号Trig和一个回响信号Echo。Echo脚输出的是高电平脉冲其宽度代表距离。行空板的GPIO是3.3V电平虽然很多5V供电的超声波模块其Echo脚输出也能被3.3V系统识别但为了稳妥可以在Echo信号线上串联一个1kΩ的电阻进行限流或者使用一个简单的电平转换电路。红外避障或循迹模块这类模块通常输出数字信号检测到障碍物输出低电平或高电平使用起来更简单直接接GPIO即可但需要根据模块要求提供5V或3.3V供电。舵机接口如果你想控制云台搭载摄像头就需要舵机。舵机控制线接GPIOPWM但供电必须单独提供且电流要足。最好在扩展板上为舵机设计一个独立的供电接口并由一个开关稳压模块如LM2596从主电池降压得到5V或6V。电源管理是整个扩展板稳定运行的基石。建议设计如下主电池输入一个DC插座或XT30接口接入7.4V锂电池。电机驱动电源路径主电池电压直接供给TB6612FNG的VM引脚。主控与传感器电源路径主电池电压经过一个降压稳压模块如AMS1117-5.0或效率更高的MP1584EN模块得到稳定的5V。这路5V再分为两支一支直接给需要5V的传感器供电另一支经过一个AMS1117-3.3稳压芯片得到3.3V供给行空板以及3.3V传感器。电源开关与指示灯总电源开关是必要的。在5V和3.3V输出端加上LED指示灯能直观判断供电是否正常。3. 扩展板PCB设计与制作要点有了电路原理接下来就是把它变成一块实实在在的电路板。使用立创EDALCEDA这类免费且强大的工具是DIY爱好者的福音。3.1 元件布局与布线规则布局决定了电路的性能和抗干扰能力。分区布局将PCB划分为几个区域电机驱动区TB6612FNG及其外围电容、接口、电源管理区降压芯片、滤波电容、传感器接口区排针排母、主控连接区与行空板对接的邮票孔或排母。大电流路径优先电机驱动部分的电源线VM和GND要尽可能粗、短。可以使用铺铜Pour Copper的方式将整个电机驱动区域的底层或顶层铺设为GND平面并在VM走线上开窗加锡以增加过电流能力。模拟与数字分离虽然本项目数字信号为主但也要注意。将电源稳压部分模拟特性较强稍微远离数字信号密集的区域。晶振如果扩展板自己有下面不要走线。去耦电容就近放置给TB6612FNG、稳压芯片供电的滤波电容一定要放在芯片电源引脚最近的地方回路面积要小这是抑制高频噪声的关键。3.2 与行空板的接口设计行空板的边缘有一排金手指引脚。扩展板需要通过邮票孔Castellated Holes或高精度的排母与之对接。这是整个设计中最需要耐心的一环。精准测量用游标卡尺仔细测量行空板金手指的间距、宽度和长度。通常间距是标准的2.54mm0.1英寸。PCB封装绘制在LCEDA中根据测量结果精确绘制一个邮票孔焊盘或排母插座的封装。邮票孔是半孔需要在PCB加工时特别注明“半孔工艺”成本稍高但连接最稳固美观。使用排母则更简单但会增加一层高度。引脚定义映射在原理图中将行空板的每一个需要用到的引脚如GPIO、5V、3.3V、GND清晰地标号并在PCB布局时确保这些网络连接到了扩展板上正确的位置。强烈建议在扩展板PCB的丝印层清晰地标注出每个引脚对应的行空板功能如“PIN12 / GPIO18”这样调试时会方便无数倍。3.3 打样与焊接实操设计完成后可以将Gerber文件发给PCB打样厂商。对于这种双面板通常5块钱就能做5片非常便宜。焊接环节顺序先焊贴片小元件电阻、电容、芯片再焊插接件排针、插座、接口。焊接TB6612FNG这类贴片芯片时可以使用“拖焊”技巧配合优质焊锡丝和助焊剂效果很好。检查焊接完成后先不要接行空板和电机。用万用表蜂鸣档仔细检查电源和地之间是否短路各电源网络电压是否正常。确认无误后再接入行空板进行初步测试。测试先写一个简单的Python程序控制扩展板上的一个LED如果设计了的话闪烁确认通信正常。再逐步测试电机驱动、传感器读取等功能。4. 遥控车底盘组装与系统集成硬件不止是电路板。车架、电机、轮子、电池的选择同样重要。4.1 机械结构与动力系统选型车架可以选择现成的智能小车底盘套件通常包含亚克力或金属底板、两个带减速箱的直流电机、轮子、万向轮或从动轮。尺寸建议在10cm x 15cm左右有足够的空间安装行空板、扩展板和电池。电机常用的有N20减速电机扭力大速度慢或TT减速电机型号多性价比高。根据小车重量和期望速度选择。我们的扩展板使用TB6612FNG单路持续驱动电流在1.2A左右峰值可达3.2A驱动常见的TT电机绰绰有余。电池推荐7.4V 2S锂电池容量在1000mAh到2000mAh之间。务必搭配一个专用的锂电池充电器。安全警告锂电池不能过充过放使用时最好有保护板。在扩展板的电源输入端可以设计一个反接保护电路一个二极管或MOS管电路防止电池接反烧毁一切。4.2 行空板与扩展板的固定将行空板和扩展板稳固地安装在车架上是保证可靠性的物理基础。电气连接确保行空板金手指和扩展板邮票孔对齐焊接牢固或者通过排母插接紧密无虚接。机械固定使用尼龙柱和螺丝将行空板和扩展板作为一个整体抬升并固定在车架上方。避免电路板直接接触金属车架防止短路。可以在板子和车架之间加绝缘垫片。走线管理电机线、电池线、传感器线要用扎带或线槽规整好防止缠绕进轮子或脱落。4.3 传感器安装与调试超声波模块安装在小车前方通常需要一个小支架使其探测面水平朝前。注意避开电机和车轮的遮挡。在软件中需要根据实际安装高度对测距结果进行一定的偏移补偿。红外或巡线模块可以安装在车底用于循迹也可以安装在车头两侧用于检测侧面障碍物。安装高度需要根据模块的探测距离仔细调整通常离地1-2厘米为宜。5. 软件程序开发从基础遥控到智能避障硬件就绪后灵魂在于软件。行空板编程主要使用Python其库生态非常友好。5.1 开发环境搭建与基础驱动首先通过Wi-Fi将行空板连接到电脑使用Mind或VSCode等支持SSH的编辑器进行远程编程。编写电机驱动类是最基础的一步。这个类要封装对TB6612FNG的控制逻辑。# motor_driver.py import pinpong from pinpong.board import Board, Pin from pinpong.extension.unihiker import * import time class DCMotor: def __init__(self, in1_pin, in2_pin, pwm_pin): Board().begin() self.in1 Pin(in1_pin, Pin.OUT) self.in2 Pin(in2_pin, Pin.OUT) self.pwm Pin(pwm_pin, Pin.PWM) self.speed 0 def forward(self, speed): self.in1.write_digital(1) self.in2.write_digital(0) self.pwm.write_analog(speed) # speed 范围 0-1023 self.speed speed def backward(self, speed): self.in1.write_digital(0) self.in2.write_digital(1) self.pwm.write_analog(speed) self.speed speed def stop(self): self.in1.write_digital(0) self.in2.write_digital(0) self.pwm.write_analog(0) self.speed 0 # 示例初始化连接在扩展板引脚GPIO16, GPIO17, GPIO18上的电机 left_motor DCMotor(16, 17, 18) right_motor DCMotor(19, 20, 21)这个类将方向控制和PWM调速封装成forward,backward,stop三个直观的方法。注意pinpong库对行空板支持很好它抽象了底层细节让我们可以像使用Arduino一样操作引脚。5.2 遥控功能实现网络与控制协议行空板自带Wi-Fi我们可以用它创建一个Web服务器通过手机或电脑浏览器进行遥控。这是最通用和便捷的方式。# remote_control.py from flask import Flask, render_template_string, request import threading from motor_driver import left_motor, right_motor app Flask(__name__) # 一个简单的HTML遥控界面 HTML ‘’’ !DOCTYPE html html body h2安全遥控车控制面板/h2 button ontouchstartsendCmd(‘F‘) ontouchendsendCmd(‘S‘)前进/buttonbr button ontouchstartsendCmd(‘L‘) ontouchendsendCmd(‘S‘)左转/button button ontouchstartsendCmd(‘R‘) ontouchendsendCmd(‘S‘)右转/buttonbr button ontouchstartsendCmd(‘B‘) ontouchendsendCmd(‘S‘)后退/button p速度: input typerange min0 max1023 value512 idspeedSlider/p script let speed 512; document.getElementById(‘speedSlider‘).oninput (e) speed e.target.value; function sendCmd(cmd) { fetch(‘/cmd?c‘ cmd ‘s‘ speed); } /script /body /html ‘’’ app.route(‘/‘) def index(): return render_template_string(HTML) app.route(‘/cmd‘) def command(): cmd request.args.get(‘c‘, ‘S‘) spd int(request.args.get(‘s‘, 512)) if cmd ‘F‘: left_motor.forward(spd) right_motor.forward(spd) elif cmd ‘B‘: left_motor.backward(spd) right_motor.backward(spd) elif cmd ‘L‘: left_motor.backward(spd//2) # 差速转弯 right_motor.forward(spd) elif cmd ‘R‘: left_motor.forward(spd) right_motor.backward(spd//2) elif cmd ‘S‘: left_motor.stop() right_motor.stop() return ‘OK‘ def run_server(): app.run(host‘0.0.0.0‘, port80, debugFalse, threadedTrue) # 在后台线程中启动Web服务器 server_thread threading.Thread(targetrun_server) server_thread.daemon True server_thread.start() print(遥控服务器已启动请用浏览器访问行空板的IP地址)这段代码创建了一个简单的Web界面通过按钮发送指令。ontouchstart和ontouchend事件实现了“按下即动松开即停”的操控感比点击更符合遥控直觉。速度通过滑块实时调节。5.3 安全逻辑与传感器融合有了遥控接下来注入“安全”的灵魂。我们需要让超声波传感器持续工作并在检测到障碍物时自动覆盖遥控指令执行刹车或避让。# safety_controller.py import time from hcsr04 import HCSR04 # 假设有超声波库 from motor_driver import left_motor, right_motor # 初始化超声波传感器Trig接GPIO22, Echo接GPIO23 sonar HCSR04(22, 23) SAFE_DISTANCE 20 # 厘米安全距离阈值 current_cmd ‘S‘ # 记录当前遥控命令 auto_override False # 自动干预标志 def check_distance(): global auto_override try: distance sonar.distance_cm() if 0 distance SAFE_DISTANCE: print(f警告前方障碍物: {distance}cm) if not auto_override: auto_override True # 执行紧急制动并稍作后退 left_motor.stop() right_motor.stop() time.sleep(0.1) left_motor.backward(300) right_motor.backward(300) time.sleep(0.3) left_motor.stop() right_motor.stop() print(已执行自动避撞) else: # 障碍物解除恢复遥控控制如果当前是停止状态 if auto_override and current_cmd ! ‘S‘: print(障碍物已清除恢复控制) auto_override False except Exception as e: print(f超声波传感器读取错误: {e}) def execute_command(cmd, speed): global current_cmd current_cmd cmd if auto_override: print(自动避撞中忽略遥控指令) return # 如果系统正在自动避撞则忽略外部遥控指令 # ... 这里接之前遥控部分的电机控制逻辑 ... # 在主循环中不断检查距离 while True: check_distance() # 这里可以整合接收遥控指令的循环 time.sleep(0.1) # 100ms检测一次这个安全控制器运行在一个独立的循环或线程中。它不断测量前方距离一旦小于安全阈值就设置一个“干预标志”并立即执行刹车和短暂后退的动作。同时主控循环在执行遥控命令前会检查这个标志如果处于干预状态就忽略遥控指令。这就实现了“安全优先”的层级控制。6. 功能扩展与优化思路基础的安全遥控实现后这个平台还有巨大的潜力可以挖掘。6.1 多传感器融合与更智能的行为增加红外传感器在车头左右两侧加装红外避障传感器。当前方超声波触发刹车后可以让小车原地旋转同时用红外传感器探测左右两侧哪边更空旷然后自动朝空旷一侧移动一小段距离实现简单的“碰撞后自动绕行”。集成惯性测量单元在扩展板上增加一个MPU6050这样的六轴传感器可以获取小车的加速度和角速度。结合编码器如果电机带或轮子转速计可以实现更精确的直线行走控制、角度旋转控制甚至估算位置航迹推算。摄像头视觉利用行空板本身的USB接口或通过CSI接口连接摄像头配合OpenCV等库可以实现颜色跟踪、人脸识别、二维码导航等高级功能。这时扩展板可以为摄像头云台的舵机提供驱动。6.2 通信与交互升级低延迟遥控Flask Web服务器虽然方便但延迟相对较高。对于要求快速响应的场景可以考虑使用WebSocket协议进行双向实时通信或者使用行空板的蓝牙功能编写一个手机App进行控制。状态反馈与显示将超声波测得的距离、电池电压、电机电流等数据实时显示在行空板自带的屏幕上。也可以通过Web界面动态刷新这些数据让操控者一目了然。数据记录与回传让小车在运行过程中记录传感器数据和运动轨迹通过Wi-Fi回传到电脑用于后续分析和算法调试。6.3 电源与能耗优化电池电压监测在扩展板上设计一个分压电路将电池电压按比例降低到行空板ADC可测量的范围如0-3.3V。通过程序实时监测电池电压当电压过低时在屏幕上发出警告并自动控制小车返回充电防止锂电池过放损坏。休眠模式当遥控车长时间未被操作时可以让行空板进入深度睡眠模式仅保留网络唤醒或蓝牙唤醒功能大幅降低待机功耗。7. 常见问题与调试心得实录在制作和调试过程中一定会遇到各种问题。这里记录几个典型坑点和解决思路。7.1 电机不转或转动异常现象程序控制电机转动但电机不动或只抖动。排查供电检查首先用万用表测量TB6612FNG的VM引脚电压确认电机电源正常7V以上。测量VCC引脚确认逻辑电源正常5V或3.3V。信号检查用逻辑分析仪或示波器如果没有可以用一个LED加电阻接到控制引脚上粗略观察检查行空板GPIO输出的控制信号IN1, IN2, PWM是否随程序变化。确保程序中的引脚编号与硬件连接一致。共地检查这是最容易被忽略的一点务必确认行空板的GND、扩展板的GND、电机驱动芯片的GND、电池的GND所有这些“地”都是连接在一起的。用万用表蜂鸣档仔细检查。芯片使能检查TB6612FNG的STBY待机引脚是否被拉高到了逻辑高电平。如果悬空芯片可能处于待机状态。7.2 超声波传感器读数不稳定或为0现象距离读数跳动很大或者一直返回0或一个极大值。排查电源干扰超声波模块对电源噪声敏感。确保其VCC引脚有良好的滤波并联一个10uF和0.1uF电容。尽量让超声波模块的供电线路远离电机驱动部分。时序问题检查程序中的触发脉冲宽度和测量间隔是否符合传感器手册要求。通常Trig需要至少10us的高电平脉冲然后需要等待一段时间如60ms以上再进行下一次测量防止上一次的回波干扰。物理遮挡检查传感器探头前方是否有障碍物遮挡或者安装角度是否导致声波打到车体自身。电平兼容如果Echo脚输出5V电平直接接3.3V的行空板GPIO长期可能损坏引脚。建议串联一个1kΩ电阻或者使用电平转换模块。7.3 遥控延迟高或控制不跟手现象按下网页按钮后小车反应慢半拍。优化网络环境确保行空板和操控设备手机/电脑连接在同一个Wi-Fi路由器下且信号良好。避免使用行空板自身的热点模式进行复杂网页交互其带宽和处理能力有限。服务器优化使用threadedTrue运行Flask服务器避免阻塞。对于控制指令使用单独的、简单的路由避免复杂的页面渲染。前端优化使用WebSocket替代HTTP轮询或短连接可以实现真正的实时双向通信。或者简化前端逻辑确保按钮事件能快速发出请求。程序结构确保主循环没有耗时操作。将传感器读取、安全判断、网络监听等任务合理分配到不同的线程或使用异步框架处理防止一个任务卡住整个系统。7.4 小车跑偏或直线走不直现象发送前进指令小车却走弧线。原因与解决这是双电机小车的通病因为两个电机的特性不可能完全一致轮子摩擦力也有差别。软件校准在程序中为两个电机设置不同的PWM基准值。例如让小车在光滑地面上空载前进观察偏移方向然后微调其中一个电机的PWM系数如left_speed command_speed * 0.97多次试验直到基本走直。闭环控制这是终极解决方案。为电机加装编码器实时反馈轮子转速。编写一个PID控制器根据两个轮子的速度差动态调整PWM输出让它们保持同步。这需要扩展板支持编码器接口通常只需要两个GPIO读取正交编码器信号。制作这样一辆安全遥控车从电路设计、PCB打样、焊接调试到软件编程、算法实现、问题排查是一个完整的项目闭环。它锻炼的不仅仅是焊接和写代码的手艺更是系统性的工程思维如何划分模块如何设计接口如何管理电源如何处理实时性与安全性的矛盾。当看到自己设计的小车既能响应自如地遥控又能在即将撞墙时“聪明”地自己停下来那种成就感是单纯购买套件组装无法比拟的。这个扩展板就像一个桥梁将行空板强大的计算和交互能力与真实的物理世界连接起来打开了无数创意项目的大门。