上个月帮朋友做一个课程设计主题就是Arduino蓝牙遥控机器人。说实话这类项目网上教程一抓一大把但真正能照着做一次跑通的却不多——要么供电方案交代不清电机一转单片机就重启要么HC-05蓝牙模块死活连不上手机要么代码看着没问题轮子就是不听话。这篇文章不写那种“列一堆零件然后贴一段代码”的流水账而是把我从选型、接线、调参、写代码到排错的全过程拆开讲包括很多教程里不会写但实际必然踩的坑。整个项目做下来核心链路其实就一句话手机通过蓝牙透传发送指令Arduino解析指令后控制电机驱动模块最终让两个直流电机按指定方向和速度转动。听起来简单但里面的细节多到能把人磨疯。我尽量按一个新手拿到套件后最容易理解的顺序来讲先算账再动手再编程最后把那些最常见的玄学问题一个个列出排查方案。无论是做课程设计、参加比赛还是纯粹想给宿舍搞个能跑的玩具这篇文章应该都能帮你省下至少一个通宵。1. 方案设计动手之前先把账算清楚1.1 整车架构与核心部件选型我这次做的是最经典的两轮差速驱动小车车头两个轮子由两个TT马达独立驱动车尾一个万向轮负责支撑转向靠左右轮转速差实现。整车架构可以拆成五层主控、通信、驱动、执行、供电。主控用的是Arduino Uno。很多人问为什么不用Nano我的看法是新手第一版老老实实用Uno它引脚标得清楚插拔方便出问题也好飞线。等整个逻辑跑通之后再移植到Nano或者Pro Mini去缩小体积也不迟。Uno的ATmega328P虽然有2KB SRAM、32KB Flash对这个项目来说绰绰有余但好处是资源多随便搜个错误代码都能搜到Uno的解决方案。电机方面选了TT马达加减速器的组合。这种马达在淘宝上按“TT马达”搜几块钱一个自带塑料减速箱输出扭矩足够推动几百克的车身速度也合适。如果直接买那种不带减速的N20电机或者空心杯电机转速太快扭矩太小小车根本跑不起来。我建议买的时候直接买带轮子和配套螺丝的套装省去后面找配件的麻烦。驱动模块选了L298N。网上对它评价两极分化效率低、压降大这是事实但新手阶段它有一个无可替代的优势看得到、摸得着、资料多。L298N的输入输出引脚一目了然出问题用万用表一量就知道哪里断了。如果第一版就上TB6612FNG这类低压差MOS驱动性能是好但接线密、容易烧新手排查起来非常痛苦。L298N一个大模块能驱动两个电机还自带一个5V稳压输出布局上非常省事。底盘直接用几十块的亚克力智能小车底盘。注意选型的时候选“两轮万向轮”结构不要买四轮驱动的四驱虽然动力足但转向逻辑复杂很多对第一版项目来说没必要。底盘套件里一般包含亚克力板、铜柱、螺丝、电机支架、轮子基本不用额外加工。1.2 蓝牙模块选型HC-05为什么是默认答案蓝牙模块市面上最常见的两款是HC-05和HC-06很多人搞不清楚区别。简单说HC-06只能做从机也就是只能被动地被手机搜索和连接HC-05则是主从一体既可以当从机被手机连也可以配置成主机主动去连别的蓝牙设备。对于遥控小车来说手机是主机、小车是从机HC-06其实也够用。但HC-05和HC-06价格差不多HC-05还多了一大截可玩性通过AT指令可以修改蓝牙名称、配对密码、串口波特率、主从模式。以后想做双机通信、遥控器和车分离方案HC-05直接就能顶上去。所以我的建议很明确直接选HC-05别在HC-06上省那几块钱。HC-05还有一个特征对排查问题特别有用它的板载LED状态灯上电后如果慢闪约2秒一次说明未连接快闪或者常亮说明已有设备连接。这个状态灯是我调试时判断蓝牙模块有没有进入AT模式、有没有连接成功的最重要依据后面排查部分会反复提到。1.3 供电方案最容易翻车的地方网上不少教程会让你直接一个9V电池接Arduino然后让Arduino的5V输出同时给蓝牙模块、驱动模块和电机供电。这种方案如果只是让LED闪一下没问题但只要电机一转电流一上去电压瞬间跌落Arduino大概率直接复位重启。我的供电思路是把动力电源和逻辑电源分开电机电源两节18650锂电池串联约7.4V接入L298N的12V输入端子。如果手头没有18650用4节5号充电电池约4.8V也行但电压低会导致电机力气小、速度慢。逻辑电源Arduino的VIN接L298N的5V输出。但这里有个前提——只有当L298N输入电压高于7V时板上稳压器才能稳定输出5V如果你的电机电源只有6VL298N的5V输出可能会掉到4V以下Arduino会工作不稳定。这种情况建议单独用一个5V降压模块给Arduino供电比如LM2596模块调好电压后很稳。还有两个细节非常关键第一是共地。所有模块的GND必须连在一起Arduino的GND、L298N的GND、蓝牙模块的GND全部要接同一个参考地。这不是走形式而是串口通信能正常工作的基础。很多人蓝牙收不到数据、串口显示乱码最后查了半天发现是没共地。第二是滤波电容。在L298N电源输入正负极两端并联一个470uF到1000uF的电解电容正极接正极、负极接负极能显著抑制电机换向时产生的电压毛刺。加了电容之后Arduino复位的概率能下降一大半。这一步成本几毛钱效果立竿见影。2. 硬件搭建从散件到整车2.1 底盘与电机组装我买的亚克力底盘套件到手是一块板子和一堆螺丝需要自己组装。这里有几个小技巧亚克力板两面有保护膜先撕掉再安装。底盘底部也就是板子底面用铜柱或塑料柱撑起来高度要足够露出TT马达的螺丝孔。TT马达从板子底部穿上来用配套的金属支架或者扎带固定在板子上。注意马达的方向减速箱输出轴朝外两个马达的出线方向最好一致这样后面接线不会乱。轮子分左右装好之后用手转一下确认轮子没有蹭到板子边缘。万向轮装在尾部用螺丝固定。四颗螺丝不要一次拧死先全部带上调整好位置后再逐个拧紧避免板子变形。2.2 电机驱动接线跳线帽和PWML298N的接线是整个项目中信息量最大的一步。我直接列一张接线表这是我反复验证过没问题的接法新手照抄即可L298N引脚接到哪里12V电池正极7.4V锂电池GND电池负极同时接Arduino的GND共地5V输出Arduino VIN逻辑电源ENAArduino D5PWM调速IN1Arduino D7IN2Arduino D8IN3Arduino D9IN4Arduino D4ENBArduino D6PWM调速OUT1/OUT2电机A两根线OUT3/OUT4电机B两根线这里有两个重点要单独拿出来讲第一是ENA和ENB旁边的跳线帽。如果你想让代码通过PWM控制电机速度就必须把这两个跳线帽拔掉把ENA/ENB接到Arduino的PWM引脚上用analogWrite输出0到255的占空比来调速。如果跳线帽插着ENA/ENB被直接拉到高电平电机只会全速转速度不受代码控制。网上很多人说“我写了analogWrite但电机不听”十有八九是这个跳线帽没拔。第二是IN1和IN2的电平组合决定电机转向。L298N的逻辑是IN1高、IN2低电机正转IN1低、IN2高电机反转IN1和IN2都低或都高电机制动。三个状态对应的就是前进、后退、停止。IN3/IN4同理控制另一个电机。接线的时候只要按表接好后面代码里控制对应引脚的高低电平就行。2.3 HC-05接线逻辑电平与串口交叉HC-05模块一般是6个引脚我们实际用到的只有4个VCC、GND、TXD、RXD。接线表如下HC-05引脚接到ArduinoVCC5VGNDGNDTXDD10软串口RXRXDD11软串口TXEN/KEY悬空AT模式时接5V首先要说清楚一个原则串口是交叉接的。模块TXD发数据给Arduino的RX模块RXD接Arduino的TX发出去的数据。同名的接同名是错的我见过太多人把TXD接TXD然后说收不到数据。我强烈建议不要用Arduino自带的硬串口D0/D1接蓝牙而是用SoftwareSerial库在D10/D11上创建一个软串口原因是硬串口同时连着USB转串口芯片烧录程序时容易和蓝牙模块冲突每次烧程序都得拔蓝牙线非常麻烦。软串口则可以做到一边蓝牙通信、一边通过USB硬串口打印日志调试体验好一个档次。代价是软串口波特率不建议超过57600否则容易丢数据我们实测用9600最稳。还有一个逻辑电平问题容易踩坑HC-05的RXD引脚不能直接承受5V电压。部分出厂较新的模块板载了电平转换可以直接接5V的Arduino TX但老版本的模块直接接5V有烧毁风险。保险的做法是给RXD串一个分压电路用两个电阻比如10K和20K从Arduino TX出来经过分压点再接HC-05的RXD把5V降到约3.3V。我为了省事第一版直接接5V用了一周也没坏但这种方式有概率性如果你用的是非板载稳压的老模块老老实实加分压电阻。2.4 走线与固定几个让项目更可靠的小动作硬件搭建最后一步是走线整理。这个环节决定项目寿命但很多人忽略。我的建议是电机到L298N之间用稍粗一点的线因为电机电流大细线压降明显如果手头有接插端子尽量做成可插拔结构方便坏了单独换某个部件。所有接线全部用扎带固定防止小车跑动时震动导致杜邦线松动。蓝牙模块和Arduino之间如果空间够直接用排针座稳固插接不要用长长杜邦线悬空跨接。另外亚克力板上通常会留出固定孔你可以用尼龙柱把Arduino板固定在底盘上层这样电线不会直接压在板子上摩擦短路。我个人习惯是先扎带固定再插线最后整体检查一遍有没有裸露铜线互相碰触。搞硬件最容易出问题的不是原理错误而是两根线碰在一起。3. 编程与控制让小车听懂指令3.1 开发环境准备与IDE避坑软件部分从Arduino IDE开始。去官网下载对应系统的安装包安装完打开“工具-开发板-开发板管理器”搜索“arduino avr”装好Arduino Uno的支持包。插上开发板在“工具-端口”里选择对应COM口如果没有出现端口检查一下USB线和驱动是否正常。这里插一句关于Arduino IDE 2.x的体验问题很多人提问说2.3版本为什么没有代码补全。确实官方IDE 2.x的补全功能一直很弱毕竟它强调的是简单而不是强大。解决办法有两个一是继续用2.x接受它的简洁二是改用VS Code装PlatformIO插件那才是真正的“编程IDE”补全、提示、调试全都好。但注意PlatformIO的学习成本比官方IDE高不少新手第一版项目不建议折腾。3.2 蓝牙模块的AT指令配置HC-05要正常工作第一步是进入AT配置模式。操作方法是模块断电状态下按住模块上的小按键或EN引脚接5V保持按住的同时给模块上电。如果成功LED会变成2秒左右一次的慢闪。这个时候模块被当作一个配置设备而不是从机手机是搜不到它的。用USB转TTL模块连接HC-05RXD接USB转TTL的TXTXD接USB转TTL的RXGND接GNDVCC接5V。打开串口监视器波特率设为38400发送AT如果返回OK就说明进入AT模式了。有些模块出厂默认波特率是9600所以如果38400没反应就试9600再不行就115200挨个试。常用AT指令如下表建议按顺序配置一遍指令作用AT测试通信ATORGL恢复默认设置ATNAMEMyCar修改蓝牙名称ATPSWD1234修改配对密码ATROLE0设置从机模式0为从机ATUART9600,0,0设置通信波特率为9600这里重点提醒两个坑第一AT指令设置完就是生效的不需要额外保存。模块断电重启后继续使用新配置。第二波特率一旦改成了9600之后要进AT模式调试新波特率是9600。很多人改完波特率后第二天忘了再用38400发AT没有反应以为是模块坏了其实是波特率没对上。3.3 手机端控制App与通信协议设计手机App我试过几款推荐“蓝牙串口助手”和“Serial Bluetooth Terminal”这两款都稳定、免费、能自定义发送内容。连接时手机会扫描到刚才改好名字的设备比如MyCar输入配对密码1234连接成功就能看到类似串口的收发界面。这里有个关键点要想清楚手机发送的数据格式是什么。我不建议发单个字符比如F、B、L、R就完事因为这种协议没法带速度信息只能固定速度。我推荐用“指令数值换行”的格式例如F#200表示前进PWM速度200B#150表示后退PWM速度150L#180表示左转速度180R#200表示右转速度200S表示停止X#90表示舵机转到90度手机App端发送时每条指令之后加一个换行符或回车符Arduino端用readStringUntil(\n)读取就形成了稳定的指令流。这个“指令值分隔符”的协议设计思路以后做任何串口控制项目都能复用。3.4 主控程序完整解析下面给出完整程序我用的是软串口方案D10接HC-05的TXDD11接HC-05的RXD#include SoftwareSerial.h // 软串口RXD10, TXD11 SoftwareSerial BT(10, 11); // 电机引脚定义 const int ENA 5; // 左轮PWM调速 const int ENB 6; // 右轮PWM调速 const int IN1 7; const int IN2 8; const int IN3 9; const int IN4 4; // 舵机引脚 const int SERVO_PIN 3; int speedValue 150; // 默认PWM速度可调 String inputString ; // 存储完整指令 void setup() { // 初始化引脚 pinMode(ENA, OUTPUT); pinMode(ENB, OUTPUT); pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); pinMode(SERVO_PIN, OUTPUT); // 开启USB硬串口用于调试日志 Serial.begin(9600); // 开启蓝牙软串口 BT.begin(9600); // 舵机初始化使用Servo库 myservo.attach(SERVO_PIN); // 默认停止 stopCar(); Serial.println(Bluetooth Car Ready.); } void loop() { // 检查蓝牙串口是否有数据 while (BT.available()) { char c BT.read(); if (c \n) { // 收到完整指令解析执行 inputString.trim(); handleCommand(inputString); inputString ; } else { inputString c; } } } // 指令解析与执行 void handleCommand(String cmd) { if (cmd.length() 0) return; char action cmd.charAt(0); int value 0; // 提取数字部分 if (cmd.indexOf(#) 0) { String numPart cmd.substring(cmd.indexOf(#) 1); value numPart.toInt(); } // 根据指令字符执行动作 switch (action) { case F: // 前进 case f: moveForward(value 0 ? value : speedValue); break; case B: // 后退 case b: moveBackward(value 0 ? value : speedValue); break; case L: // 左转 case l: turnLeft(value 0 ? value : speedValue); break; case R: // 右转 case r: turnRight(value 0 ? value : speedValue); break; case S: // 停止 case s: stopCar(); break; case X: // 舵机旋转 case x: if (value 0 value 180) { myservo.write(value); } break; } // 打印调试日志到USB串口方便排查 Serial.print(CMD: ); Serial.print(action); Serial.print(, VAL: ); Serial.println(value); } // 前进 void moveForward(int spd) { digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); analogWrite(ENA, spd); analogWrite(ENB, spd); } // 后退 void moveBackward(int spd) { digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); analogWrite(ENA, spd); analogWrite(ENB, spd); } // 左转左轮减速或反转右轮前进 void turnLeft(int spd) { digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); // 左轮反转 digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); // 右轮正转 analogWrite(ENA, spd); analogWrite(ENB, spd); } // 右转右轮减速或反转左轮前进 void turnRight(int spd) { digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); // 左轮正转 digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); // 右轮反转 analogWrite(ENA, spd); analogWrite(ENB, spd); } // 停止 void stopCar() { digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); analogWrite(ENA, 0); analogWrite(ENB, 0); }这段代码里几个细节值得展开第一是软串口的数据读取方式。while (BT.available())循环逐字符读取直到读到一个换行符\n才认为一条完整指令到达。这种读取方式比一次性BT.read()更稳因为蓝牙是无线传输数据可能分帧到达逐字符拼装可以保证不丢字节。第二是字符串切割。cmd.indexOf(#)查找井号的位置substring(cmd.indexOf(#) 1)把井号之后的内容作为速度值toInt()转成整数。如果发送的是F#200解析出来action是Fvalue是200。第三是舵机部分。代码里用myservo.write(value)控制角度需要先放一个Servo myservo;的全局声明在setup里myservo.attach(SERVO_PIN)。舵机的电源建议不要从Arduino的5V硬取如果舵机堵转电流大会把5V拉垮最好单独从电池分一路5V给舵机共地即可。第四是PWM调速范围。analogWrite()输入范围是0到255。数值越大转速越快但实际测试中超过220后电机速度差异就很小了所以App端可以限制速度滑块在0到220之间避免浪费。3.5 舵机云台让机器人“转头”的扩展基础版小车只有前进后退左右转太单调。加一个舵机云台可以把超声波传感器、摄像头或者激光笔架在舵机上程序里通过X#90指令控制角度。我用的是SG90舵机9克那种扭矩对小支架够用。接线很简单橙色信号线接D3棕色GND红色VCC接5V。注意SG90堵转电流可能超过500mA如果直接从Arduino的5V引脚取电驱动多路伺服时可能电压不稳稳妥做法是从电池引出5V降压模块单独供电同时和Arduino共地。程序部分上面代码已经包含了舵机控制只需要在手机App端发送X#0到X#180的指令就能让舵机带着云台在0到180度之间转动。以后做自动避障可以把这个舵机和超声波传感器组合起来左右扫射测距识别障碍物方位。4. 常见问题与排查实录4.1 HC-05连不上的排查流这是最多人问的问题。按这个顺序排查基本能解决90%的“连不上”看LED状态上电后如果LED不亮检查VCC和GND如果LED常亮或快闪说明模块已经连接了一个设备如果慢闪说明没连接处于可被搜索状态。手机搜索不到设备先确认模块是否还在AT模式里。AT模式下LED是2秒慢闪手机搜索不到是正常的。退出AT模式的方法是断电后重新上电不按键。搜索到但连接失败检查配对密码。默认密码是1234如果你改过密码记得用新密码。有一些手机对旧蓝牙设备兼容性差建议用Android手机测试成功率比iOS高不少。连接成功但收不到数据大概率是波特率不匹配。手机App的波特率要和模块设置的UART波特率一致都是9600才行。实话说HC-05模块本身出问题的概率很低多数问题出在AT模式没退干净、波特率对不上、或者TX/RX接反。4.2 电机不动或乱转的处理判断顺序是先查供电再查信号最后查代码。电机完全不转先确认电机电源有没有送到L298N的12V端子用万用表量一下电压再确认ENA/ENB的跳线帽状态。如果跳线帽被拔了但代码里没有执行analogWrite(ENA, spd)电机当然不转。另外把IN1和IN2两个引脚分别手动接高/低电平测一下电机是否能转能快速判断是驱动板问题还是代码问题。电机乱转该正转的反转这是左右电机接反或者某个IN引脚接反导致的。最简单的修正方法是程序里把对应电机的两个IN引脚电平对调或者在硬件上交换OUT1和OUT2的两根线。不需要改程序直接换线更直观。电机只往一个方向转检查两个电机的IN1/IN2接法是否一致。如果A电机和B电机的正负逻辑接反了就会出现一个轮子正转一个轮子反转小车原地打转出不去。4.3 一开电机就重启供电问题的实证这个现象我见得太多了症状是小车静止的时候蓝牙控制一切正常但只要一按前进Arduino立刻重启重新跑一遍初始化。根本原因就是电压跌落。电机启动瞬间需要的电流很大如果电池内阻大或电源线太细电压会被瞬间拉到Arduino的复位阈值以下。排查和解决办法按优先级排序用两节18650供电不要用9V碱性电池。检查所有电源线的粗细至少使用0.5平方毫米以上的硅胶线。在L298N电源输入端并联一个大电容470uF以上。确认电池充电后电压充足18650放电到3.5V以下时动力明显下降。避免Arduino和电机共用同一路5V稳压器带大电流负载。做完这几步重启现象基本能消失。如果还有就要怀疑L298N稳压器的问题加大电容或者换独立5V降压模块。4.4 串口乱码和丢帧乱码的根源几乎都是波特率不匹配。Arduino端BT.begin(9600)手机App端必须是9600USB串口监视器可以是9600或者其他值但要和代码里Serial.begin()一致。三者不一致就会乱码。丢帧的常见原因是波特率太高。软件串口在57600以上时逐字符读取容易丢字节建议黄金速率就是9600。如果在9600下还丢帧检查指令结尾有没有换行符没有换行符的话readStringUntil(\n)会一直等到超时才结束导致下一条指令和上一条粘在一起。一个小技巧是在程序里加上对时间戳判断或者长度判断如果收到的字符串超过比如10个字符长度就清空重新等防止异常数据把缓冲区挤乱。4.5 先用Wokwi仿真预演逻辑这个必须单独说因为真的能省很多时间。Wokwiwokwi.com是一个在线电路仿真平台支持Arduino Uno、ESP32、树莓派Pico等多种主控能仿真LED、电机驱动、舵机、LCD等大部分常见外围设备更重要的是它自带虚拟串口监视器可以模拟程序运行状态。我现在的习惯是任何新代码先在Wokwi里搭个极简电路验证逻辑再烧到实机。比如这次蓝牙小车的指令解析逻辑先在Wokwi里用硬串口模拟蓝牙收数据写个假数据源发F#200、B#100看小车虚拟轮子状态对不对全部通过后再接实机调蓝牙。这样做的好处是把代码逻辑问题和硬件接线问题彻底分开。出现故障时你能够明确知道是板子的问题还是程序的问题不用在两头来回猜排查效率直接翻倍。5. 还能怎么玩低成本扩展方向5.1 加超声波自动避障给小车加一个HC-SR04超声波模块把Trig和Echo引脚接到Arduino用pulseIn()读取回波时间换算成距离。距离小于设定阈值时自动转向就成了一台会自主避障的小车。HC-SR04需要5V供电Trig和Echo都接普通数字引脚。要注意的是Echo引脚返回的高电平时间长度可能超过5V逻辑门限但模块本身已经兼容正常接没事。程序上建议在主循环里每100ms测量一次距离避免和蓝牙串口读取互相阻塞。5.2 换ESP32板载蓝牙与Wi-Fi如果手头有ESP32开发板可以直接一步到位——ESP32本身就自带经典蓝牙和BLE不需要外接HC-05还能同时开Wi-Fi的热点模式扩展性极强。Arduino IDE里装好esp32开发板支持包选择对应开发板型号就能烧录。用ESP32做蓝牙小车程序逻辑和Arduino Uno几乎一样区别是ESP32的串口引脚更灵活可以用Serial2等硬件串口连接外部设备而且有更多PWM引脚和ADC。以后想加摄像头、加Wi-Fi视频图传、做手机局域网控制都不用换主控。这里也顺便提一个热词里常出现的场景蓝牙App控制ESP32。ESP32配一个蓝牙串口App然后把电机驱动引脚接上整个控制链路比Arduino方案还简洁适合直接作为第二版迭代目标。5.3 自制控制App与更多玩法手机App方面除了用现成的蓝牙串口助手也可以用MIT App Inventor做一个专属控制界面拖拽几个按钮和滑块设置发送内容为F#200这样的指令就能生成一个简单的Android控制App。再进阶一点用Flutter或者uniapp做跨平台App连接蓝牙串口后自定义摇杆和波形界面也是很多爱好者提升技能的好路径。到这一步整个项目的扩展空间就打开了加光敏传感器做自动巡线、加红外避障、加蜂鸣器做声音反馈、加OLED显示运行状态、加摄像头做FPV第一视角遥控。核心还是那套“串口指令——主控解析——驱动执行”的链路框架不变加什么传感器都是往里挂外设的事。做这种DIY项目我的经验是先把最小系统跑通再逐步加功能。最小系统就是“手机连蓝牙——电机转——代码能解析指令”跑通之后每加一个传感器、一个外设都要单独测过再接进主程序。这样出了问题你永远知道是哪一步新增的代码导致的不会把所有逻辑搅在一起无从下手。另外一个很重要的习惯是保存好每一个版本的代码和接线图。你可能觉得没必要但当你三天后想给小车加新功能却怎么也想不起来上次那个转向逻辑是怎么调的时候就会发现版本管理有多重要。这篇文章从选型、接线、编程到排错基本覆盖了从零做一台Arduino蓝牙遥控机器人的完整流程。很多细节是我实际踩过坑之后总结出来的比如跳线帽不拔PWM不生效、软件串口调试方便、电感滤波救了一整块板子。希望你看完能少走一些弯路把更多时间花在玩出花样的部分。
