基于行空板与TB6612FNG的智能安全遥控车:从扩展板设计到避障算法
2026/7/29 1:16:21 网站建设 项目流程

1. 项目概述:从开源硬件到智能遥控车的跨越

最近在捣鼓行空板,发现这玩意儿真是个宝藏。它本身集成了屏幕、Wi-Fi、蓝牙和各种传感器,开箱即用,特别适合教育场景和快速原型开发。但玩久了,总感觉它的GPIO引脚就那么几个,想接个电机、舵机或者多个传感器,就得用面包板飞线,既不稳定也不美观,更别提做成一个能拿得出手的“作品”了。于是,给行空板配一块专用的扩展板,就成了一个很自然的需求。这次的项目,就是用一块自制的行空板扩展板,来打造一辆功能完善、操控安全的智能遥控车。

这个“安全遥控车”项目,远不止是让一个小车跑起来那么简单。它的核心目标,是在实现基础遥控功能(前进、后退、转向)的同时,通过扩展板集成必要的驱动电路和传感器,赋予小车“感知”和“反应”的能力,从而避免碰撞、防止跌落,甚至实现一些简单的自主行为。行空板作为主控,负责逻辑运算、网络通信和人机交互(比如在板载屏幕上显示状态);扩展板则作为“力量与感官的延伸”,将微弱的控制信号放大以驱动电机,并接入各类传感器信号。最终成品,是一个融合了硬件设计、电路知识、嵌入式编程和物联网概念的综合性项目,非常适合有一定Python和电子基础的爱好者深入实践。

2. 扩展板核心设计思路与电路解析

为什么不能直接用行空板驱动电机?这是首先要搞清楚的问题。行空板的GPIO引脚输出电流能力有限,通常在十几毫安级别,而驱动小车电机(哪怕是N20这种微型减速电机)瞬间电流可能达到几百毫安甚至更高。直接连接会烧毁行空板的主控芯片。因此,扩展板的首要任务就是功率驱动信号隔离

2.1 电机驱动方案选型:H桥与驱动芯片

要让直流电机实现正反转和调速,最经典的电路是H桥。我们当然可以用四个MOS管自己搭建一个,但对于入门和快速实现来说,集成电机驱动芯片是更可靠、更便捷的选择。常见的芯片有L298N、TB6612FNG、DRV8833等。

  • L298N:经典、皮实、易得,但发热较大,效率相对较低,需要外接散热片。
  • TB6612FNG:效率高,发热小,内置保护电路,驱动能力适中,非常适合这种小型项目。
  • DRV8833:更小型化,双路H桥,驱动电流略小,但集成度极高。

对于我们的安全遥控车,我推荐使用TB6612FNG。它的理由很充分:首先,效率高意味着电池续航更长,小车跑得更久;其次,它支持PWM调速和正反转控制,逻辑接口简单(两个输入引脚控制一路电机的方向,一个PWM引脚控制速度);最后,它有过热保护和短路保护,这对新手和经常调试的项目来说是个“保险丝”。

在扩展板上,我们需要为TB6612FNG设计外围电路。这包括:

  1. 电源部分:芯片需要两个电源。一个是逻辑电源(VCC),通常接3.3V或5V,与行空板逻辑电平匹配。另一个是电机电源(VM),直接接电池(比如7.4V的2S锂电池)。这里必须注意:两个电源的地(GND)必须共地,否则控制信号无法形成回路。
  2. 输入输出部分:将芯片的AIN1/AIN2(控制方向)和PWMA(控制速度)引脚,通过排针引出,连接到行空板的GPIO。将电机的两根线连接到芯片的AO1和AO2输出端。
  3. 滤波电容:在VM和GND之间、VCC和GND之间,就近放置一个10uF的电解电容和一个0.1uF的陶瓷电容,用于滤除电源噪声,防止电机启停时产生的电压尖峰干扰芯片甚至行空板的工作。

注意:电机的电源(VM)一定要和行空板的供电电源分开。行空板最好由另一路稳定的5V供电(比如通过USB或稳压模块)。如果电机和主控共用电池,电机负载突变会导致电压瞬间跌落,可能引起行空板重启。这是遥控车项目中最常见的“灵异现象”根源之一。

2.2 传感器接口与电源管理设计

安全功能依赖于传感器。扩展板需要预留常见传感器的接口。

  1. 超声波测距模块:这是防撞的主力。通常需要5V供电、一个触发信号(Trig)和一个回响信号(Echo)。Echo脚输出的是高电平脉冲,其宽度代表距离。行空板的GPIO是3.3V电平,虽然很多5V供电的超声波模块其Echo脚输出也能被3.3V系统识别,但为了稳妥,可以在Echo信号线上串联一个1kΩ的电阻进行限流,或者使用一个简单的电平转换电路。
  2. 红外避障或循迹模块:这类模块通常输出数字信号(检测到障碍物输出低电平或高电平),使用起来更简单,直接接GPIO即可,但需要根据模块要求提供5V或3.3V供电。
  3. 舵机接口:如果你想控制云台搭载摄像头,就需要舵机。舵机控制线接GPIO(PWM),但供电必须单独提供,且电流要足。最好在扩展板上为舵机设计一个独立的供电接口,并由一个开关稳压模块(如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设计与制作要点

有了电路原理,接下来就是把它变成一块实实在在的电路板。使用立创EDA(LCEDA)这类免费且强大的工具,是DIY爱好者的福音。

3.1 元件布局与布线规则

布局决定了电路的性能和抗干扰能力。

  1. 分区布局:将PCB划分为几个区域:电机驱动区(TB6612FNG及其外围电容、接口)、电源管理区(降压芯片、滤波电容)、传感器接口区(排针排母)、主控连接区(与行空板对接的邮票孔或排母)。
  2. 大电流路径优先:电机驱动部分的电源线(VM和GND)要尽可能粗、短。可以使用铺铜(Pour Copper)的方式,将整个电机驱动区域的底层或顶层铺设为GND平面,并在VM走线上开窗加锡,以增加过电流能力。
  3. 模拟与数字分离:虽然本项目数字信号为主,但也要注意。将电源稳压部分(模拟特性较强)稍微远离数字信号密集的区域。晶振(如果扩展板自己有)下面不要走线。
  4. 去耦电容就近放置:给TB6612FNG、稳压芯片供电的滤波电容,一定要放在芯片电源引脚最近的地方,回路面积要小,这是抑制高频噪声的关键。

3.2 与行空板的接口设计

行空板的边缘有一排金手指引脚。扩展板需要通过邮票孔(Castellated Holes)或高精度的排母与之对接。这是整个设计中最需要耐心的一环。

  1. 精准测量:用游标卡尺仔细测量行空板金手指的间距、宽度和长度。通常间距是标准的2.54mm(0.1英寸)。
  2. PCB封装绘制:在LCEDA中,根据测量结果,精确绘制一个邮票孔焊盘或排母插座的封装。邮票孔是半孔,需要在PCB加工时特别注明“半孔工艺”,成本稍高但连接最稳固美观。使用排母则更简单,但会增加一层高度。
  3. 引脚定义映射:在原理图中,将行空板的每一个需要用到的引脚(如GPIO、5V、3.3V、GND)清晰地标号,并在PCB布局时,确保这些网络连接到了扩展板上正确的位置。强烈建议在扩展板PCB的丝印层,清晰地标注出每个引脚对应的行空板功能(如“PIN12 / GPIO18”),这样调试时会方便无数倍。

3.3 打样与焊接实操

设计完成后,可以将Gerber文件发给PCB打样厂商。对于这种双面板,通常5块钱就能做5片,非常便宜。

焊接环节:

  1. 顺序:先焊贴片小元件(电阻、电容、芯片),再焊插接件(排针、插座、接口)。焊接TB6612FNG这类贴片芯片时,可以使用“拖焊”技巧,配合优质焊锡丝和助焊剂,效果很好。
  2. 检查:焊接完成后,先不要接行空板和电机。用万用表蜂鸣档,仔细检查电源和地之间是否短路,各电源网络电压是否正常。确认无误后,再接入行空板进行初步测试。
  3. 测试:先写一个简单的Python程序,控制扩展板上的一个LED(如果设计了的话)闪烁,确认通信正常。再逐步测试电机驱动、传感器读取等功能。

4. 遥控车底盘组装与系统集成

硬件不止是电路板。车架、电机、轮子、电池的选择同样重要。

4.1 机械结构与动力系统选型

  • 车架:可以选择现成的智能小车底盘套件,通常包含亚克力或金属底板、两个带减速箱的直流电机、轮子、万向轮或从动轮。尺寸建议在10cm x 15cm左右,有足够的空间安装行空板、扩展板和电池。
  • 电机:常用的有N20减速电机(扭力大,速度慢)或TT减速电机(型号多,性价比高)。根据小车重量和期望速度选择。我们的扩展板使用TB6612FNG,单路持续驱动电流在1.2A左右,峰值可达3.2A,驱动常见的TT电机绰绰有余。
  • 电池:推荐7.4V 2S锂电池,容量在1000mAh到2000mAh之间。务必搭配一个专用的锂电池充电器。安全警告:锂电池不能过充过放,使用时最好有保护板。在扩展板的电源输入端,可以设计一个反接保护电路(一个二极管或MOS管电路),防止电池接反烧毁一切。

4.2 行空板与扩展板的固定

将行空板和扩展板稳固地安装在车架上,是保证可靠性的物理基础。

  1. 电气连接:确保行空板金手指和扩展板邮票孔对齐,焊接牢固,或者通过排母插接紧密,无虚接。
  2. 机械固定:使用尼龙柱和螺丝,将行空板和扩展板作为一个整体,抬升并固定在车架上方。避免电路板直接接触金属车架,防止短路。可以在板子和车架之间加绝缘垫片。
  3. 走线管理:电机线、电池线、传感器线要用扎带或线槽规整好,防止缠绕进轮子或脱落。

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 ontouchstart="sendCmd(‘F‘)" ontouchend="sendCmd(‘S‘)">前进</button><br> <button ontouchstart="sendCmd(‘L‘)" ontouchend="sendCmd(‘S‘)">左转</button> <button ontouchstart="sendCmd(‘R‘)" ontouchend="sendCmd(‘S‘)">右转</button><br> <button ontouchstart="sendCmd(‘B‘)" ontouchend="sendCmd(‘S‘)">后退</button> <p>速度: <input type="range" min="0" max="1023" value="512" id="speedSlider"></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‘, port=80, debug=False, threaded=True) # 在后台线程中启动Web服务器 server_thread = threading.Thread(target=run_server) server_thread.daemon = True server_thread.start() print("遥控服务器已启动,请用浏览器访问行空板的IP地址")

这段代码创建了一个简单的Web界面,通过按钮发送指令。ontouchstartontouchend事件实现了“按下即动,松开即停”的操控感,比点击更符合遥控直觉。速度通过滑块实时调节。

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 电机不转或转动异常

  • 现象:程序控制电机转动,但电机不动,或只抖动。
  • 排查
    1. 供电检查:首先用万用表测量TB6612FNG的VM引脚电压,确认电机电源正常(7V以上)。测量VCC引脚,确认逻辑电源正常(5V或3.3V)。
    2. 信号检查:用逻辑分析仪或示波器(如果没有,可以用一个LED加电阻接到控制引脚上粗略观察)检查行空板GPIO输出的控制信号(IN1, IN2, PWM)是否随程序变化。确保程序中的引脚编号与硬件连接一致。
    3. 共地检查这是最容易被忽略的一点!务必确认行空板的GND、扩展板的GND、电机驱动芯片的GND、电池的GND,所有这些“地”都是连接在一起的。用万用表蜂鸣档仔细检查。
    4. 芯片使能:检查TB6612FNG的STBY(待机)引脚是否被拉高到了逻辑高电平。如果悬空,芯片可能处于待机状态。

7.2 超声波传感器读数不稳定或为0

  • 现象:距离读数跳动很大,或者一直返回0或一个极大值。
  • 排查
    1. 电源干扰:超声波模块对电源噪声敏感。确保其VCC引脚有良好的滤波(并联一个10uF和0.1uF电容)。尽量让超声波模块的供电线路远离电机驱动部分。
    2. 时序问题:检查程序中的触发脉冲宽度和测量间隔是否符合传感器手册要求。通常Trig需要至少10us的高电平脉冲,然后需要等待一段时间(如60ms以上)再进行下一次测量,防止上一次的回波干扰。
    3. 物理遮挡:检查传感器探头前方是否有障碍物遮挡,或者安装角度是否导致声波打到车体自身。
    4. 电平兼容:如果Echo脚输出5V电平,直接接3.3V的行空板GPIO,长期可能损坏引脚。建议串联一个1kΩ电阻,或者使用电平转换模块。

7.3 遥控延迟高或控制不跟手

  • 现象:按下网页按钮后,小车反应慢半拍。
  • 优化
    1. 网络环境:确保行空板和操控设备(手机/电脑)连接在同一个Wi-Fi路由器下,且信号良好。避免使用行空板自身的热点模式进行复杂网页交互,其带宽和处理能力有限。
    2. 服务器优化:使用threaded=True运行Flask服务器,避免阻塞。对于控制指令,使用单独的、简单的路由,避免复杂的页面渲染。
    3. 前端优化:使用WebSocket替代HTTP轮询或短连接,可以实现真正的实时双向通信。或者,简化前端逻辑,确保按钮事件能快速发出请求。
    4. 程序结构:确保主循环没有耗时操作。将传感器读取、安全判断、网络监听等任务合理分配到不同的线程或使用异步框架处理,防止一个任务卡住整个系统。

7.4 小车跑偏或直线走不直

  • 现象:发送前进指令,小车却走弧线。
  • 原因与解决:这是双电机小车的通病,因为两个电机的特性不可能完全一致,轮子摩擦力也有差别。
    1. 软件校准:在程序中为两个电机设置不同的PWM基准值。例如,让小车在光滑地面上空载前进,观察偏移方向,然后微调其中一个电机的PWM系数(如left_speed = command_speed * 0.97),多次试验直到基本走直。
    2. 闭环控制:这是终极解决方案。为电机加装编码器,实时反馈轮子转速。编写一个PID控制器,根据两个轮子的速度差动态调整PWM输出,让它们保持同步。这需要扩展板支持编码器接口(通常只需要两个GPIO读取正交编码器信号)。

制作这样一辆安全遥控车,从电路设计、PCB打样、焊接调试,到软件编程、算法实现、问题排查,是一个完整的项目闭环。它锻炼的不仅仅是焊接和写代码的手艺,更是系统性的工程思维:如何划分模块,如何设计接口,如何管理电源,如何处理实时性与安全性的矛盾。当看到自己设计的小车,既能响应自如地遥控,又能在即将撞墙时“聪明”地自己停下来,那种成就感,是单纯购买套件组装无法比拟的。这个扩展板就像一个桥梁,将行空板强大的计算和交互能力,与真实的物理世界连接起来,打开了无数创意项目的大门。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询