尧图精选

ESP32无线遥控智能车DIY全指南:从硬件选型到PID闭环与避坑

🕒 发布时间:2026/10/2 3:41:47 📁 来源:尧图网络
1. 为什么用ESP32做智能车选型背后的真实权衡先说说我这次做小车的起因。之前带学生参加智能车竞赛用的都是STM32虽然稳定但每次调试都要插线、烧录、拔线、看串口来回折腾特别费时间。后来换成ESP32之后整个开发体验像是换了一个时代——烧录走无线调试看网页连代码更新都不用弯腰去拔USB线了。这篇文章就围绕ESP32小车DIY这个项目把从零搭建无线遥控智能车的完整思路和代码都摊开来讲适合三类人看一是刚接触ESP32想做个能跑能动的实物的新手二是在校学生想拿智能车练手顺便参加竞赛的三是想给自己的小车加无线遥控但又不想碰复杂通信协议的老玩家。很多人会问为什么不直接用Arduino Uno或者STM32我的回答是ESP32把“主控通信”这两件事在硬件层面合并了。Uno要外接蓝牙模块或者NRF24L01STM32要自己画板或者买转接板而ESP32板载WiFi和蓝牙双模一颗芯片就把遥控链路解决了。再加上它240MHz双核、520KB SRAM、大量外设接口做一辆带PID调速、手机App遥控、网页控制面板的智能车绰绰有余。选型这件事我的看法是不要盲目追求性能也不要贪便宜买杂牌开发板。市面上ESP32-WROOM-32模组做的开发板几十块钱但有些板子的USB转串口芯片用的是CH340虽然能用但驱动在部分电脑上会有兼容性问题。我推荐选带CP2102芯片的板子驱动稳定烧录失败率低尤其是你在Linux或者新Mac上开发的时候差别很明显。另外尽量选引脚全部引出、带排针的型号方便以后扩展传感器。再聊聊整车的架构。我这次做的版本是四驱底盘、TB6612电机驱动、18650电池组供电、ESP32 DevKitC做主控控制端同时支持WiFi网页遥控和蓝牙手柄遥控。整体上分成三层底层是电机和驱动板负责动力执行中间是ESP32负责读控制指令、跑PID、输出PWM上层是遥控端可以是手机浏览器、微信小程序也可以是PS2手柄之类的蓝牙外设。这个分层的好处是每一层都能单独调试出现问题也好定位。关于这个项目能扩展到什么程度说实话ESP32的上限非常高。你可以往上面加摄像头做视觉巡线加MPU6050做姿态平衡加舵机云台做遥控追踪甚至接上ROS 2跑micro-ROS。热搜词里正好有micro-ROS和ESP32的组合这个后面有机会单独写一篇。但这一切的前提是你得先把基础的小车跑起来把无线遥控链路走通。所以这篇文章的核心就是帮你把地基打好。2. 底盘与驱动方案两驱还是四驱驱动芯片怎么选2.1 底盘结构的选择逻辑底盘是小车的骨架很多新手上来就先纠结买两驱还是四驱。我的建议很简单如果你只是室内平地跑跑两驱完全够用结构简单、电池省电、转弯半径还好控制如果你想折腾越野、爬坡或者以后要加摄像头云台这种重量级的负载就直接上四驱。四驱的优势是抓地力强、动力足但代价是耗电快、控制上要花更多心思处理四个轮子的转速差。我这次用的是亚克力四驱底盘带四个TT马达也就是常见的黄色减速电机。这种底盘便宜、结实孔位多方便固定开发板、电池盒和后续的传感器。TT马达的减速比有1:48、1:120等规格买的时候注意看。1:48的转速快但扭矩小适合平地竞速1:120的扭矩大但速度慢适合爬坡或者负重。我选的是1:48实测在室内瓷砖地面上速度大概能到0.8m/s左右体感是“起步有劲、巡航平稳”很适合作为通用平台。TT马达本身不带编码器这一点要特别注意。没有编码器就意味着你拿不到真实的轮速反馈只能做开环控制。开环控制做直行还好但两个马达的个体差异、电池电压波动、地面摩擦不均匀都会导致小车走偏。如果要做精准的直线行驶、定距离停止就必须上带编码器的电机比如常见的MG310或者TT马达的编码器版本。有了编码器才能做闭环PID。这篇文章后面的代码会同时给出开环和闭环两种模式方便你根据自己的硬件情况选择。2.2 驱动芯片L298N与TB6612的实测对比电机驱动是连接ESP32逻辑电平和小车动力系统的桥梁。TT马达正常工作电流在200-500mA之间堵转瞬间能到1A以上而ESP32的GPIO只能输出3.3V、最高40mA的电流根本推不动电机。所以必须要驱动芯片来做电流放大和方向控制。市面上最常见的两款是L298N和TB6612。我在项目里用的是TB6612FNG原因很简单L298N太老了用的是三极管二极管方案管压降能到2V以上意味着6V的电池到头电机实际可能只拿到不到4V力不从心还发热严重。而TB6612是MOSFET方案导通电阻小压降不到0.5V效率高体积还小。对比参数如下对比项L298NTB6612FNG驱动方式双H桥三极管双H桥MOSFET最大持续电流2A/通道1.2A/通道逻辑电压5V3.3V/5V均可导通压降约2V约0.5V发热严重轻微重量体积大小TT马达这种负载TB6612的1.2A持续电流完全够用而且它的逻辑电压和ESP32的3.3V直接兼容省去了电平转换的麻烦。接线也直观AIN1、AIN2、PWMA控制A通道电机比如左轮BIN1、BIN2、PWMB控制B通道电机比如右轮STBY接3.3V。电机侧VM接电池正极VCC接3.3V给芯片逻辑供电GND和ESP32共地——共地这件事极其重要不共地的话控制信号会飘电机转得乱七八糟我在调试初期就因为漏了共地折腾了半天。2.3 供电架构的容量估算供电是整个小车最容易出问题的环节没有之一。ESP32的WiFi处于发射状态时电流会突然飙到240mA甚至更高而电机启动瞬间也要大电流。如果电源纹波太大ESP32会随机重启表现为“跑着跑着车就死了”过一两秒又自己开机。我的供电方案是两节18650电池3.7V标称、4.2V满电串联成7.4V然后分两路走一路直接接到TB6612的VM给电机供电电机内部电路能容忍7.4V的电压波动另一路经过AMS1117-3.3稳压模块或者开发板自带的稳压电路降到3.3V给ESP32供电。这里有一个关键点是绝对不要把电机电源和逻辑电源并在一起直连,一定要分开走再在逻辑电源端加一个1000μF的电解电容和一个0.1μF的陶瓷电容做去耦。实测下来加了这个电容组合之后ESP32在四驱急加速、急停的场景下再也没有随机重启过。电池容量方面两节松下或者国产大厂的18650标称3200mAh可以支撑连续跑大概40-50分钟。如果你用的是续航焦虑型玩法长时间边跑边调试建议买四节电池做两并两串电压还是7.4V但容量翻倍。另外充电一定要用专用充电器别用USB直接怼电池18650过充很危险。3. 电机控制与调速从PWM到PID闭环3.1 用LEDC产生PWM信号ESP32控制电机转速的本质就是通过PWM脉冲宽度调制改变施加在电机上的有效电压。PWM的占空比越高等效电压越高电机转得越快。ESP32的PWM由LEDCLED Control外设产生这个外设名字虽叫LED Control但本质上就是一个通用的PWM发生器适合用来驱动电机、舵机、蜂鸣器。ESP32的LEDC和Arduino Uno的analogWrite有几个重要区别。第一LEDC有独立的频率和分辨率设置你可以精确地设置PWM频率为1000Hz、20000Hz分辨率可以到1-16位第二LEDC的通道和GPIO之间是映射关系不是固定绑定第三ESP32的PWM波形非常稳定不会因为其他中断而抖动。在Arduino环境下使用LEDC的代码如下// 初始化LEDC通道0频率1000Hz分辨率8位 ledcSetup(0, 1000, 8); ledcAttachPin(LEFT_MOTOR_PWM_PIN, 0); // 输出50%占空比也就是让电机半速运转 ledcWrite(0, 127);这里的分辨率8位意味着占空比数值范围是0-255所以127就是50%。如果你把分辨率调到10位范围就变成0-1023。实际项目中我用的1000Hz PWM频率听不到电机啸叫也不会产生让人烦躁的高频噪音。有些教程推荐用20000Hz说这样电机运行更平滑实测差别不大但20000Hz下开关损耗会略微增加驱动芯片会稍微热一点所以我个人还是倾向于1000-5000Hz这个区间。3.2 全向运动控制的坐标分解基础的双轮差速驱动控制逻辑可以用一句话概括左轮速度和右轮速度的“和”决定了前进快慢“差”决定了转向快慢。用数学表达就是左轮速度 基础速度 转向量 右轮速度 基础速度 - 转向量在遥控场景中手机端会传来两个量摇杆的Y轴表示油门前进/后退X轴表示转向。把这两个量换算成左右轮速度之后写入PWM和方向引脚即可。这一步是所有差速底盘控制的通用思路不管你是麦克纳姆轮还是普通轮子核心都是速度分解。void setMotorSpeeds(int leftSpeed, int rightSpeed) { // leftSpeed, rightSpeed范围-255 ~ 255负值表示反转 if (leftSpeed 0) { digitalWrite(AIN1, HIGH); digitalWrite(AIN2, LOW); } else { digitalWrite(AIN1, LOW); digitalWrite(AIN2, HIGH); leftSpeed -leftSpeed; } if (rightSpeed 0) { digitalWrite(BIN1, HIGH); digitalWrite(BIN2, LOW); } else { digitalWrite(BIN1, LOW); digitalWrite(BIN2, HIGH); rightSpeed -rightSpeed; } ledcWrite(0, constrain(leftSpeed, 0, 255)); ledcWrite(1, constrain(rightSpeed, 0, 255)); }这里用到了TB6612的“AIN1AWM2决定方向、PWMA决定速度”的机制。需要注意的是很多新手会把方向引脚和PWM引脚的逻辑搞混以为PWM负值就能反转。实际上TT马达并没有“反向PWM”这个概念必须靠H桥切换输出极性才能反转电机所以你需要在软件上把“负速度”翻译成“换方向正PWM”上面的代码做的就是这件事。3.3 编码器读取与增量式PID实现如果你买了带霍尔编码器的电机就可以做闭环控制了。闭环的意义在于不管负载怎么变、电池电压怎么掉、地面摩擦怎么不均匀小车都能按照你设定的目标速度匀速前进。尤其是做直线行驶的时候开环的小车会歪闭环的能自己修正差别肉眼可见。编码器的工作原理是利用电机内部的霍尔传感器检测磁环的转动输出方波脉冲。常见的电机编码器有AB双相输出通过判断A相和B相的相位关系可以得到当前轮的旋转方向。在ESP32上读转速有两种做法一种是开PCNT外设做硬件计数不占CPU另一种是用外部中断配合millis()做软计数。对于DIY项目来说软计数完全够用但要注意中断服务函数里不能做耗时操作只能用volatile变量累加计数然后由主循环定期读取计算。下面给出一段完整的增量式PID调速代码这段代码就是我车上实际跑着的版本可以直接抄volatile long leftEncoderCount 0; volatile long rightEncoderCount 0; // 在中断服务函数里只做计数累加 void IRAM_ATTR leftEncoderISR() { if (digitalRead(ENCODER_A_PIN) digitalRead(ENCODER_B_PIN)) { leftEncoderCount; } else { leftEncoderCount--; } } // 增量式PID计算 float pidCalculate(float targetSpeed, float currentSpeed, PIDParam pid) { float err targetSpeed - currentSpeed; pid.integral err; pid.integral constrain(pid.integral, -pid.integralLimit, pid.integralLimit); float output pid.kp * err pid.ki * pid.integral pid.kd * (err - pid.lastErr); pid.lastErr err; return output; }PID参数调起来有一个实用口诀先调Kp让车“走得动”再调Kd抑制“点头”和抖动最后调Ki消除静态误差。我实测的初始参数是Kp0.8、Ki0.05、Kd0.1然后再根据小车的实际反应微调。如果电机发出滋滋的抖动声但轮子不动那通常是Kp太大或者PWM频率太低。如果起步响应很慢那就加Kp或者加快控制频率。还有一个细节编码器计数换算成速度需要一个常数。我的TT马达减速比是1:48电机本身每圈输出13个脉冲所以轮子每转一圈计数约等于13×48624个脉冲。轮子直径65mm那么每个脉冲对应的行进距离就是π×65/624≈0.327mm。有了这个换算关系你可以算出精确的速度甚至里程。4. 无线遥控链路WiFi还是蓝牙取决于你想怎么玩4.1 WiFi方案手机浏览器即开即用ESP32最让人舒服的地方就是板载WiFi而且可以工作在SoftAP模式或者Station模式。SoftAP模式就是ESP32自己开一个热点手机连上这个热点后在浏览器里输入一个IP地址就能进入控制界面不需要外网、不需要路由器非常适合野外或者比赛场地这种没有网络设施的场景。Station模式则是让ESP32连接家里的路由器这样在想远程控制的时候手机和车在同一局域网内也能控制。我个人更推荐WiFi方案作为主控方案原因有三第一手机浏览器本身就是跨平台的iOS和Android都能用不用装App第二WebSocket协议能做到很低延迟的实时双向通信第三调试时可以随时在网页里加可视化控件比如实时速度曲线、电池电压显示。控制界面我用了轻量级的WebSocket方式。ESP32作为WebSocket服务端手机浏览器作为客户端摇杆操作通过WebSocket发送JSON字符串。JSON结构长这样{type:drive,x:0.0,y:1.0,speed:180}其中x是转向量范围-1.0到1.0y是油门量范围-1.0到1.0speed是最大速度限制。ESP32收到后解析执行。之所以用JSON而不是二进制是因为JSON可读性好、好调试而且一条指令只有几十个字节对WiFi来说完全不是负担。实测下来局域网环境下控制延迟在20-40ms左右体感上几乎是即时的。4.2 蓝牙方案PS2手柄的另类玩法蓝牙方案里我推荐PS2手柄ESP32的组合。PS2手柄虽然是老古董但它的遥控体验非常成熟双摇杆、按键布局合理接收器直接输出数字信号不需要额外的模拟量读取电路。ESP32蓝牙走的是经典蓝牙SPP协议用“PS2X”库就能直接读到按键状态。结合前面的差速控制逻辑左摇杆控制油门和转向比手机屏幕上的虚拟摇杆舒服太多了。PS2手柄接收器的接线不复杂但注意供电要接3.3V千万别接5V否则会损伤模组。数据线是SPI协议ESP32用硬件SPI或者软件模拟都可以。这里有一个经验教训PS2接收器在靠近电机的时候容易被干扰导致按键失灵或者双击解决办法是让接收器尽量远离电机和驱动板实在不行用锡纸包一层做简单的电磁屏蔽。4.3 多通道融合通过模式切换实现一个车两种玩法我的做法是“WiFi和蓝牙共存”开机默认进入蓝牙模式等你在网页上点击“切换WiFi模式”之后就自动断开蓝牙、启用WiFi连接。这个设计有点贪心但实际操作起来并不复杂核心思路就是用两个标志位管理两种协议栈主循环里只按照当前模式去轮询对应的数据源。void loop() { if (controlMode MODE_BLUETOOTH) { if (ps2x.ButtonPressed(PSB_CROSS)) { emergencyStop(); } // 读取摇杆值映射到差速 } else if (controlMode MODE_WIFI) { processWebSocketMessages(); } // 统一执行PID闭环控制 updateMotorPID(); }这种双模控制的好处是日常在桌上调试用WiFi网页方便看日志和参数真跑起来用蓝牙手柄手感好。两套方案放在一套软件里也不多占多少FlashESP32有4MB Flash完全放得下。5. 完整代码框架解构各模块的职责边界这一节我把整套代码的结构拆开讲。项目文件夹里我分了这几个文件main.ino负责初始化和主循环motor_control.cpp负责电机控制与PIDremote_control.cpp负责WiFi/蓝牙的解析config.h放所有引脚定义和可调参数。模块化这么做的原因很简单每一块出错都可以单独测试不用翻几百行代码去找一个括号。config.h里建议把下面这些参数做成全局可配置// WiFi参数 #define WIFI_SSID ESP32-Car #define WIFI_PASS 12345678 // 引脚定义 #define PIN_MOTOR_AIN1 32 #define PIN_MOTOR_AIN2 33 #define PIN_MOTOR_PWMA 25 #define PIN_MOTOR_BIN1 26 #define PIN_MOTOR_BIN2 27 #define PIN_MOTOR_PWMB 14 // 编码器引脚 #define PIN_ENCODER_A 34 #define PIN_ENCODER_B 35 // PID参数初始值 #define PID_KP_DEFAULT 0.8 #define PID_KI_DEFAULT 0.05 #define PID_KD_DEFAULT 0.1这里面要特别提醒两点。第一GPIO34、GPIO35在ESP32上是输入-only引脚不能输出PWM但非常适合接编码器这种纯输入信号。你把编码器A相接GPIO34完全不用担心误配成输出模式。第二GPIO12在部分模组上是MTDI引脚上电时如果被拉高会影响Flash电压导致无法启动所以尽量别用GPIO12接对电平敏感的器件尤其是编码器这种有固定电平的信号源。WiFi初始化的完整代码段如下void setupWiFi() { WiFi.mode(WIFI_AP_STA); // 同时支持AP和STA模式 WiFi.softAP(WIFI_SSID, WIFI_PASS); WiFi.begin(WIFI_SSID, WIFI_PASS); // 等待连接超时重试 int retries 0; while (WiFi.status() ! WL_CONNECTED retries 20) { delay(500); retries; } // 打印IP地址方便知道在网页里输入什么IP Serial.println(WiFi.softAPIP()); Serial.println(WiFi.localIP()); }需要留意的是WiFi.softAP()和WiFi.begin()如果参数一样在部分固件版本里会互相干扰。稳妥的做法是SSID分开设置比如AP热点的SSID叫“ESP32-Car”STATION模式的路由器名单独读取配置。或者像我代码里那样先开AP再连STA并设置超时保护避免一直卡在连接状态导致程序阻塞。主循环的设计要特别注意“不要用delay”。用一个经典的非阻塞调度方式周期性地执行不同任务unsigned long lastMotorUpdate 0; unsigned long lastWebsocketUpdate 0; void loop() { // 10ms周期执行一次PID更新 if (millis() - lastMotorUpdate 10) { updateMotorPID(); lastMotorUpdate millis(); } // 5ms周期处理一次WebSocket消息 if (millis() - lastWebsocketUpdate 5) { processWebSocketMessages(); lastWebsocketUpdate millis(); } // 串口日志和低电量检测可以低频执行 if (millis() - lastLogUpdate 500) { logStatus(); checkLowBattery(); lastLogUpdate millis(); } }非阻塞调度的价值在于你永远不需要担心某个任务卡住导致WiFi断连或者电机失去控制。尤其是遥控车这种对实时性敏感的场景一个卡死的delay几百毫秒都可能让车撞上墙。6. 避坑实录从全面崩溃到稳定运行我踩过的那些坑6.1 GPIO选择引发的上电启动失败第一个坑发生在我第一次给整车全部接完线、上电的瞬间。小车完全没反应串口也连不上代码烧录都失败。排查了很久最后发现是我把电机PWM引脚放在了GPIO12上。GPIO12是Strapping引脚上电瞬间如果电平不对ESP32会进入下载模式或者异常模式表现为芯片“死”了。从那一刻起我养成了一个习惯任何新项目画线之前先查一遍ESP32的Strapping引脚表。GPIO0、GPIO2、GPIO5、GPIO12、GPIO15这几个引脚都尽量避免用作输出控制尤其是GPIO12牵一发动全身。6.2 供电震荡导致的随机重启前面提到过ESP32在WiFi发射瞬间会有一个电流尖峰。当四个电机同时急加速时电池电压会瞬时跌落如果这个瞬间发生在WiFi正好也要发数据的时候ESP32就可能被拉低到复位电压以下然后重启。这个坑的表现很有迷惑性车跑得好好的突然就重新进入启动流程了可能还会连着串口打印一堆启动日志。我的解决手段是“稳压大电容电流限制”三管齐下电机电源和逻辑电源彻底分开走逻辑电源入口并接一个1000μF电解电容在PID输出里加maxSpeed限幅让电机的加速度不是阶跃式突变的而是缓慢上升。软件上游刃有余的加速度限制对硬件的稳压压力改善极大基本杜绝了瞬态跌落。6.3 编码器中断抖动与错乱编码器在电机高转速下会产生非常频繁的中断信号。如果电机供电不足或者电刷有火花干扰编码器的脉冲里会夹杂高频毛刺导致计数跳变PID输入信号直接失真。我的排查发现根本原因在于编码器电源和电机电源共用了同一路电。后来把编码器电源单独从3.3V供电引脚取电并在编码器VCC和GND之间加了一个0.1μF的陶瓷电容数据就干净了。如果做完这些还有毛刺那就是驱动板布局不合理可以试着减小PWM频率或者改用光耦隔离的方案。6.4 PID参数整定从“死去活来”到“稳如老狗”PID参数整定大概是整个项目里最容易让人崩溃的环节。我刚调的时候Kp给到2.0结果小车像个喝醉的人一样左右横跳电机的声音也很刺耳。后来老老实实按步骤来先调Kp从0.1开始一步一步往上加直到出现轻微超调然后退回去20%再加Kd抑制超调最后加Ki修正稳态误差。整个过程用了大概40分钟调出来的参数和网上很多人给的通用参数差别很大——这也说明一定要自己实测别指望抄参数能一次成功。每辆车的重心、轮胎抓地力、电机特性都不一样PID必须跟着车走。6.5 电池电压的监测与低压保护锂电池最怕过放一颗18650放到2.5V以下基本就废了。所以我在系统里加了低压报警和自动停车通过ESP32的ADC读取电池分压值当电压低于设定阈值时直接切断电机输出并推送报警到网页端。这个功能花不了多少代码却可能是整个项目里对你电池寿命最有帮助的功能。float readBatteryVoltage() { int raw analogRead(BATTERY_PIN); float voltage raw * 3.3f / 4095.0f; // 分压比补偿 return voltage * (100.0f 33.0f) / 33.0f; }ADC的读取要注意ESP32的ADC高输入阻抗直接接分压电阻后值会偏低最好是加一个运放跟随器或者用一个较小的分压电阻组合。同时ADC2在WiFi开启状态下无法正常工作所以电池检测引脚必须放在ADC1上GPIO32-GPIO39。7. 进阶优化从能跑到跑好再引入语音与视觉基础版本跑通之后大多数人不会止步。这条进阶路线我会推荐沿着“传感器自动化”的方向走因为这是在现有底盘上最划算的升级路径。先加超声波及红外避障模块让小车在没有遥控输入时自动巡障。它的核心逻辑并不复杂用超声波测距小于阈值就停下来判断左右方向往障碍少的一侧转弯。但在实际执行中要处理一个问题——超声波模块在电机转动时容易受到干扰测距值会跳变。处理方式是做中值滤波取连续5次测量值的中间值作为判断依据虽然延迟一点但数据稳定了很多。然后可以加红外或者灰度传感器做巡线配合PID做循迹。巡线PID的思路和速度PID本质上一样输入是传感器偏差比如“偏左”“正中”“偏右”输出是转向量修正量。这个模式下电机速度保持恒定转向环单独用PID控制能做到比较顺滑的过弯不会像传统的“开关控制”那样走折线。真正让我觉得这个平台天花板高的是接入语音控制。ESP32在Arduino环境下可以用离线语音识别芯片比如SU-03T这种通过串口和ESP32通信识别“前进”“后退”“左转”“停止”这几个词。这样一来车的控制方式从手机手柄扩展到了纯语音演示效果直接拉满拿去学校开放日或者比赛现场围观率很高。再往后走就是热搜词里提到的ESP32-CAM和Blinker App远程监控方案了。ESP32-CAM可以实时推流视频画面到手机改造成云台追踪小车你就可以坐在电脑前看着摄像头画面遥控完全脱离视线范围。这种玩法已经把“车”延伸成了“移动监控机器人”但底层的差速控制、WiFi通信、供电设计和这篇文章里讲的基础功是同一个内核。还有一个我自己特别想实现的扩展是micro-ROS也就是ROS 2在嵌入式设备上的轻量实现ESP32可以作为传感器和执行器的桥梁把轮速、电量、图像数据以ROS 2的话题形式发布到主机让小车变成一个标准的ROS机器人。这也是智能车竞赛之外的一条技术路。如果你已经掌握了本文这些基础那这个方向完全值得尝试。8. 最后的调试心得三句话帮你省掉半天瞎折腾第一句串口日志好过一切猜测。给每个关键动作打印日志——遥控指令收到、已执行、传感器数值、PID输出值出问题的时候看日志定位永远比盯着小车的动作猜原因快。第二句接线颜色统一并写好标签尤其是正负极和信号线一旦小车跑起来震动线头松脱是最常见也最好修的问题但如果你不知道哪根线接哪排查就变成了大海捞针。第三句别贪快先单电机调试、再整车道、最后加闭环循序渐进地来每一次改动都能预判结果这个项目才能真正变成你的知识沉淀。整辆车从零到能稳定无线遥控实际施工时间大约两个晚上加一个下午。大部分时间花在了接线和调参上真正的代码逻辑其实并不复杂。ESP32这颗芯片给了普通DIY爱好者非常高的天花板希望这篇完整代码与避坑指南能让你少走一些我走过的弯路。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →