1. 为什么你的智能小车需要一个“好司机”TB6612电机驱动模块深度解析很多朋友第一次玩Arduino智能小车可能都听说过或者用过L298N这个经典的电机驱动模块。我刚开始做小车那会儿用的也是它便宜、皮实但说实话用久了就发现一些问题发热有点厉害效率不算高控制精度也差点意思。后来接触到TB6612FNG这个模块感觉就像给小车换了个“职业赛车手”当司机整个操控体验都上了一个台阶。今天我就结合自己这些年做机器人和智能硬件的经验跟你好好聊聊这个TB6612它到底强在哪里以及我们怎么用它来从零搭建一台听话又好用的智能小车。简单来说TB6612FNG是一个专门用来驱动直流电机的芯片做成的模块。你可以把它想象成连接你大脑Arduino和肌肉电机之间的“神经中枢”和“功率放大器”。Arduino发出的指令是微弱的信号比如“转快点”、“停一下”而电机工作需要的是实实在在的大电流。TB6612的作用就是精准无误地理解Arduino的“想法”并把它转化成足够强劲的电力去指挥电机干活。相比起老前辈L298NTB6612有几个让我特别愿意推荐给新手的优点。首先是效率高发热小。L298N是线性驱动简单理解就是靠“硬扛”电阻来调节电流多余的能量都变成热量散掉了所以你得给它装个不小的散热片。而TB6612是MOSFET H桥驱动属于开关式导通电阻极小能量损耗很少我实测下来驱动两个小电机长时间工作模块也只是微微温根本不需要散热片这让小车的结构可以更紧凑。其次是控制精度高响应快。这主要得益于它对PWM脉冲宽度调制信号优秀的响应能力。PWM你可以理解为一种“开关灯”技术通过快速开关来控制电机在一个周期内通电的时间比例占空比从而无级调节速度。TB6612对PWM信号的解析非常细腻能让电机从静止到全速的加速过程非常平滑没有顿挫感。这对于需要精确巡线或者保持平衡的小车来说至关重要。最后是集成度高保护完善。一个芯片里集成了两路完整的H桥电路可以独立控制两个直流电机正转、反转、刹车、停止四种状态轻松切换。而且它自带了过热关断、欠压锁定和过流检测这些保护功能相当于给电机和驱动模块都上了保险大大降低了因为接线错误或者负载过大而“烧板子”的风险这对新手来说非常友好。2. 开工前的“购物清单”硬件选型与核心部件剖析动手之前我们把所有需要的“食材”准备齐全。这份清单是我经过多次项目实践总结出来的兼顾了性价比和可靠性特别适合入门级智能小车项目。核心控制器Arduino Uno R3这是整个项目的大脑。我强烈推荐从Arduino Uno R3开始。原因很简单资料最全、社区支持最好、价格便宜。它的数字IO口和PWM输出口完全足够驱动TB6612模块。你可能会看到一些更小巧的板子比如Nano但对于第一次搭建Uuno的接口布局更清晰接线和调试都更方便不容易插错。动力心脏直流减速电机电机的选择直接决定小车的“力气”和“速度”。对于在桌面、地板跑的小车我建议选择工作电压在3-6V带有减速箱的直流电机。减速箱的作用是把高转速低扭矩变成低转速高扭矩这样小车爬个小坡、过个门槛才有力气。你可以买一对常见的TT马达黄色外壳那种价格实惠。选购时注意看一下参数建议转速在100-200RPM转/分钟之间比较合适太快了不好控制太慢了小车跑起来没精神。动力指挥官TB6612FNG驱动模块这是今天的主角。你在电商平台直接搜索“TB6612FNG模块”就能找到通常是一个绿色的小板子上面已经焊好了必要的电容和排针。买的时候注意有些店家会送排针你需要自己焊接一下有些是已经焊好排针的对没有焊接经验的朋友更友好。模块上通常会有清晰的丝印标明各个引脚的功能。能量源泉电源方案供电是很多新手容易栽跟头的地方。绝对不要试图只用USB线给Arduino供电来带动整个小车USB提供的5V/500mA电流根本带不动两个电机。正确的方案是独立供电。我常用的有两种一是使用一块7.4V的2S锂聚合物电池搭配一个降压模块如LM2596给Arduino提供稳定的5V电压。二是更简单的直接用4节5号电池盒输出6V正负极直接接到TB6612的VM电机电源输入端同时从电池盒的正负极引线到Arduino的VIN和GND引脚给它供电。第二种方法更简单但要注意电池电量下降后速度会变慢。其他必备小件杜邦线准备至少20根公对公的用于连接Arduino和TB6612再准备几根公对母的方便连接电源。小车底盘套件网上有现成的包含底盘板、轮子、万向轮、电机固定座等省去自己打孔的麻烦。螺丝刀套装组装底盘用。可选但推荐一个9V或12V的直流电源适配器在桌面调试时比用电池方便随时可以插电测试。3. 像拼乐高一样接线TB6612模块引脚详解与安全连接指南拿到TB6612模块上面一排排的引脚可能让人有点发怵。别担心我们把它拆解开来一个个认识接线就像拼乐高按图索骥就不会错。我们先看模块上最重要的几组引脚电机控制端每路电机对应3个引脚AIN1/AIN2, BIN1/BIN2这是电机的方向控制引脚。它们接收来自Arduino的数字信号HIGH或LOW通过这两个引脚电平的不同组合来决定电机是正转、反转还是刹车。你可以把它想象成控制一个双刀双掷的开关。PWMA/PWMB这是电机的速度控制引脚。它们需要接收来自Arduino的PWM信号。PWM信号的占空比0-255直接决定了电机的速度。占空比越大速度越快。电源端VM电机驱动电源正极。这里接入你的主电源电池或适配器的正极电压范围很宽我建议在6V-12V之间根据你的电机额定电压来选。VCC逻辑电路电源正极。这个引脚给TB6612芯片内部的逻辑电路供电必须接5V。通常我们可以直接从Arduino的5V引脚引过来。GND电源地。非常重要VM的GND、VCC的GND以及Arduino的GND必须全部连接在一起这叫“共地”是电路正常工作的基础。使能端STBY待机控制引脚。接高电平HIGH时芯片正常工作接低电平LOW时芯片进入待机状态所有输出关闭电机停止。这个引脚可以用来做一个总开关。我们通常直接将它接高电平或者用一个Arduino的IO口控制实现软件开关。现在我们开始实战接线。请务必在断电状态下操作每接好一组线都检查一下。我的接线方案如下你可以跟着一步步来连接电源将电池盒或适配器的正极接到TB6612模块的VM引脚。将电池盒或适配器的负极-接到TB6612模块的GND引脚。同时从这同一个GND引脚引一根线到Arduino Uno的一个GND引脚。从Arduino Uno的5V引脚引一根线到TB6612模块的VCC引脚。连接控制信号线用公对公杜邦线将TB6612的STBY引脚连接到 Arduino 的数字引脚 10。将TB6612的AIN1, AIN2引脚分别连接到 Arduino 的数字引脚 9 和 8。将TB6612的PWMA引脚连接到 Arduino 的PWM引脚 3注意引脚旁边有波浪线~标记的才是PWM口。将TB6612的BIN1, BIN2引脚分别连接到 Arduino 的数字引脚 6 和 7。将TB6612的PWMB引脚连接到 Arduino 的PWM引脚 5。连接电机将左电机的两根线接到模块上标有A 和 A-的接线端子上。将右电机的两根线接到模块上标有B 和 B-的接线端子上。如果发现电机转向和你预期的相反很简单把这两根线对调一下位置接就行不会损坏任何设备。注意这是最核心也是最容易出错的一步。接线时一定要心细最好接完一路比如A路的所有线就检查一遍。接错线轻则电机不转重则可能瞬间烧毁驱动芯片。我当年就因为VM和VCC接反冒过一缕青烟损失了一个模块这都是学费啊。4. 让小车“活”起来从基础驱动到高级控制的Arduino代码实战硬件连接好比搭好了骨架现在我们要注入灵魂——程序。我会从最基础的电机测试开始逐步带你写出一个能前进、后退、转弯的小车控制程序。我们使用Arduino IDE进行编程。首先我们来写一个最基础的测试程序目的是验证你的接线完全正确并且能独立控制两个电机。这个程序让两个电机同时正转2秒停1秒再反转2秒如此循环。// 定义TB6612模块所有控制引脚对应的Arduino引脚 int pwma 3; // A电机速度控制 int ain1 9; // A电机方向控制1 int ain2 8; // A电机方向控制2 int pwmb 5; // B电机速度控制 int bin1 6; // B电机方向控制1 int bin2 7; // B电机方向控制2 int stby 10; // 芯片使能控制 void setup() { // 初始化所有控制引脚为输出模式 pinMode(pwma, OUTPUT); pinMode(ain1, OUTPUT); pinMode(ain2, OUTPUT); pinMode(pwmb, OUTPUT); pinMode(bin1, OUTPUT); pinMode(bin2, OUTPUT); pinMode(stby, OUTPUT); // 启动TB6612芯片拉高STBY引脚 digitalWrite(stby, HIGH); // 设置两个电机的初始速度为最大值255 analogWrite(pwma, 255); analogWrite(pwmb, 255); } void loop() { // 电机A和B同时正转 // A电机ain1HIGH, ain2LOW // B电机bin1HIGH, bin2LOW digitalWrite(ain1, HIGH); digitalWrite(ain2, LOW); digitalWrite(bin1, HIGH); digitalWrite(bin2, LOW); delay(2000); // 持续2秒 // 电机A和B同时刹车快速停止 // 将两个方向引脚都置为HIGH电机短路刹车 digitalWrite(ain1, HIGH); digitalWrite(ain2, HIGH); digitalWrite(bin1, HIGH); digitalWrite(bin2, HIGH); delay(1000); // 刹车状态保持1秒 // 电机A和B同时反转 // A电机ain1LOW, ain2HIGH // B电机bin1LOW, bin2HIGH digitalWrite(ain1, LOW); digitalWrite(ain2, HIGH); digitalWrite(bin1, LOW); digitalWrite(bin2, HIGH); delay(2000); // 持续2秒 // 再次刹车 digitalWrite(ain1, HIGH); digitalWrite(ain2, HIGH); digitalWrite(bin1, HIGH); digitalWrite(bin2, HIGH); delay(1000); }把这段代码上传到Arduino接通电源你应该能看到两个电机按照“正转-停-反转-停”的节奏运行。如果电机不转首先检查电源是否接通然后逐根线核对接线是否正确特别是PWMA/PWMB是否接到了Arduino带PWM功能的引脚3, 5, 6, 9, 10, 11。如果电机只朝一个方向转检查方向控制引脚AIN1/AIN2的电平组合。基础测试通过后这个写法虽然直观但重复代码多控制逻辑分散在loop里不利于扩展。作为一个有经验的开发者我强烈建议你进行代码封装。我们把控制一个电机的所有操作封装成一个函数甚至一个C的类这样主程序会变得非常清晰。下面我展示一个函数封装版的例子并实现小车的差速转向。// 引脚定义同上略 // 电机控制函数 void setMotor(int pwmPin, int in1Pin, int in2Pin, int speed, int direction) { // 确保speed在0-255之间 speed constrain(speed, 0, 255); if(direction 1) { // 正转 digitalWrite(in1Pin, HIGH); digitalWrite(in2Pin, LOW); } else if(direction -1) { // 反转 digitalWrite(in1Pin, LOW); digitalWrite(in2Pin, HIGH); } else { // 停止或刹车 digitalWrite(in1Pin, LOW); digitalWrite(in2Pin, LOW); } // 输出PWM速度信号 analogWrite(pwmPin, speed); } void setup() { // 引脚模式初始化同上略 pinMode(stby, OUTPUT); digitalWrite(stby, HIGH); } void loop() { // 示例1小车前进3秒全速 setMotor(pwma, ain1, ain2, 255, 1); // 左电机全速正转 setMotor(pwmb, bin1, bin2, 255, 1); // 右电机全速正转 delay(3000); // 示例2小车原地左转2秒 // 左电机反转右电机正转实现原地旋转 setMotor(pwma, ain1, ain2, 200, -1); // 左电机中速反转 setMotor(pwmb, bin1, bin2, 200, 1); // 右电机中速正转 delay(2000); // 示例3小车右转弯差速转弯 // 左电机全速右电机半速车体向右画弧线 setMotor(pwma, ain1, ain2, 255, 1); setMotor(pwmb, bin1, bin2, 128, 1); // 速度减半 delay(2000); // 停止所有电机 setMotor(pwma, ain1, ain2, 0, 0); setMotor(pwmb, bin1, bin2, 0, 0); delay(1000); }通过setMotor这个函数我们只需要关心四个参数速度引脚、方向引脚1、方向引脚2、速度值、方向。主循环loop()里的逻辑变得一目了然。你可以轻松地组合出前进、后退、左转、右转、停止等各种动作。更进一步你可以把这个函数和相关引脚定义打包成一个Motor类这是更工程化的做法适合项目复杂后管理。5. 调试与进阶常见问题排查与让你的小车更智能代码写好了小车组装完毕但第一次上电很可能不会那么顺利。别灰心调试是嵌入式开发中最常态也最有意思的部分。我总结了几种最常见的问题和排查方法问题一电机完全不转也没有声音。检查电源用万用表测量TB6612的VM和GND之间是否有电压6-12V。再测量VCC和GND之间是否是5V。检查使能信号确保STBY引脚被设置为HIGH代码里digitalWrite(stby, HIGH)执行了。检查代码上传确认程序已成功上传到Arduino并且没有编译错误。检查接地确保Arduino的GND和TB6612的GND、电源的GND都连接在了一起共地。问题二只有一个电机转或者两个电机转向不一致。检查信号线连接逐个核对AIN1/AIN2/BIN1/BIN2、PWMA/PWMB这几根线是否插对了Arduino的引脚。最常见的就是把PWM线插到了非PWM口。检查电机线连接确认电机线牢固地接在A/A-和B/B-端子上。交换测试将控制A电机的代码临时改成控制B电机的引脚看看是不是电机本身的问题。如果交换后原来不转的电机转了说明代码和接线没问题可能是电机或接线端子接触不良。问题三电机抖动、转速不稳或噪音大。电源功率不足这是最常见的原因。电机启动瞬间需要很大的电流堵转电流如果电池电量不足或适配器功率不够电压会被拉低导致控制紊乱。尝试换上新电池或功率更大的电源建议2A以上。PWM频率问题Arduino默认的PWM频率对于某些电机可能不太合适。你可以尝试使用analogWriteFrequency()函数在某些型号上或定时器库来改变PWM频率通常降低频率如几百Hz会让某些电机运行更平稳。机械阻力检查小车的轮子是否安装过紧底盘是否摩擦地面。当你解决了基础驱动问题就可以考虑让小车变得更“智能”。这里有两个最经典也最有趣的进阶方向方向一加入遥控你可以很容易地增加一个红外接收头或者一个蓝牙模块如HC-05。以蓝牙为例将HC-05的TX/RX接到Arduino的软件串口引脚然后在手机上下载一个蓝牙串口APP。在Arduino程序中读取手机APP发送过来的字符比如‘F’代表前进‘B’代表后退然后调用我们写好的setMotor函数就可以实现手机遥控小车了。这会让你的项目互动性大大增强。方向二实现自动避障这是智能小车的核心功能之一。你需要增加至少一个超声波传感器如HC-SR04。把它安装在小车前方VCC和GND接好Trig和Echo引脚接到Arduino的数字口。在loop()函数中不断测量前方距离。当距离小于一个安全值比如20厘米时就执行“停止-后退一点-左转或右转-继续前进”的逻辑。代码逻辑就是测距-判断-控制电机的循环。通过这个项目你能真正理解传感器、控制器、执行器是如何协同工作的。调试的过程就是学习和深入理解的过程。我建议你准备一个笔记本记录下每次遇到的问题和解决方法。这些小坑踩过去你对硬件和代码的理解会深刻得多。记住让一个小车动起来不难但让它稳定、可靠、智能地动起来才是工程师价值的体现。从最基础的接线和代码开始一步步增加功能你会发现创造一台属于自己的智能机器其乐趣远超你的想象。