1. 项目缘起与整体设计思路
1.1 为什么选择智能小车作为入门项目
智能小车这个项目,在创客圈和电子爱好者群体里算是经典中的经典。我前前后后带过不少人入门嵌入式开发,发现一个规律:纯讲理论,大部分人听三分钟就开始走神;但一说要做一个能跑起来的小车,眼睛立马就亮了。这就是智能小车的魅力——它把抽象的控制逻辑、传感器原理、电机驱动这些概念,变成了一个看得见、摸得着、还能满地跑的东西。
从技术学习的角度来说,智能小车几乎涵盖了嵌入式开发的所有核心环节。你得会写代码控制GPIO口,得懂PWM调速的原理,得处理传感器数据,还得考虑电源管理和机械结构。麻雀虽小五脏俱全,这句话放在智能小车上再合适不过。而且它的难度曲线非常友好,你可以先做一个只会直线跑的小车,然后加避障,再加循迹,再加蓝牙遥控,每一步都有明确的成就感。
我个人的经验是,做智能小车最大的价值不在于最后那个成品有多厉害,而在于过程中你会被迫去理解很多平时写应用层代码时根本不会碰的东西。比如电机启动瞬间的电流冲击会导致单片机复位,这种问题你不实际做一遍是永远想不到的。再比如红外传感器在不同地面上的反射率差异,这些都需要你动手去试、去调。
1.2 核心功能定位与方案选型
这个项目我把它定位成“入门级但可扩展”的智能小车。基础功能包括:能前进后退、能左右转弯、能通过红外传感器避障、能通过蓝牙模块接收手机指令。进阶功能可以加超声波测距、循迹模块、甚至加个摄像头做简单的视觉识别。
主控芯片的选择上,市面上常见的有几种方案。Arduino Uno是最经典的选择,生态好、资料多、上手快,缺点是价格相对高一些,而且性能有限。STM32性能强很多,但对新手来说门槛偏高,光是环境配置就能劝退一批人。ESP32是我个人比较推荐的,它自带WiFi和蓝牙,价格也不贵,性能足够用,社区资源这几年也越来越丰富。
电机驱动方面,L298N是绕不开的经典模块。它能同时驱动两个直流电机,支持PWM调速,逻辑电平兼容3.3V和5V,价格便宜到几乎可以忽略不计。虽然它的效率不算高,发热也比较明显,但对于入门项目来说完全够用。如果你追求更小的体积和更高的效率,可以考虑TB6612或者DRV8833,但接线和调试的复杂度会稍微高一点。
电源方案我踩过不少坑。最开始用9V方块电池,结果发现电机一启动电压就掉得厉害,单片机频繁复位。后来换成18650锂电池两节串联,配合LM2596降压模块给单片机供电,稳定性好了很多。这里的关键是电机和单片机要分开供电,或者至少在电源输入端加一个大电容缓冲,否则电机启动瞬间的电流冲击很容易让单片机重启。
1.3 系统架构与模块划分
整个系统我把它分成四个层次来理解。最底层是电源层,负责给所有模块提供稳定的电压和足够的电流。往上是执行层,包括电机和驱动模块,负责把电信号变成机械运动。再往上是感知层,包括红外避障传感器、超声波模块这些,负责采集环境信息。最上面是控制层,也就是主控芯片,负责跑逻辑、做决策。
这种分层的好处是调试的时候可以逐层排查。小车不动了,先量电源电压对不对,再看电机驱动有没有输出,再看主控有没有发指令,一层一层往上找,很快就能定位问题。我见过很多新手一上来就盯着代码看,结果折腾半天发现是电池没电了。
通信方面,蓝牙模块我用的是HC-05,配对简单,手机端装个蓝牙串口助手就能发指令。如果你用ESP32的话,可以直接用它的蓝牙功能,省掉一个模块。红外避障传感器我用的是TCRT5000,这个模块输出的是数字信号,检测到障碍物输出低电平,没检测到输出高电平,逻辑很直观。
2. 核心硬件细节与实操要点
2.1 主控板与电机驱动的接线逻辑
先说你拿到主控板和L298N模块之后怎么接。L298N上面有三个电源相关的端子:12V输入、5V输出、GND。12V输入接你的电池正极,GND接电池负极。注意L298N自带的5V输出可以用来给主控板供电,但前提是你的输入电压在7V到12V之间,而且电流不能太大。如果你用的是ESP32或者Arduino,建议还是单独供电,避免电机干扰导致主控不稳定。
电机接线方面,L298N有两个输出端子,OUT1和OUT2接一个电机,OUT3和OUT4接另一个电机。电机的正负极不用太纠结,接反了无非就是转向相反,后面在代码里调一下就行。控制信号线一共六根:ENA、IN1、IN2控制电机A,ENB、IN3、IN4控制电机B。ENA和ENB是使能端,接主控的PWM引脚,用来调速。IN1和IN2控制电机A的正反转,IN3和IN4控制电机B的正反转。
这里有个细节要注意:L298N的使能端默认是短接在5V上的,也就是说如果你不接PWM,电机就是全速运行。如果你要调速,必须把使能端上的跳线帽拔掉,然后接到主控的PWM引脚上。我第一次用的时候没拔跳线帽,结果代码里怎么调PWM都没反应,排查了半天才发现这个问题。
注意:L298N的GND必须和主控板的GND连在一起,也就是共地。很多新手只接了信号线,忘了共地,结果电机完全不转或者乱转。共地是所有模块协同工作的基础,切记。
2.2 红外避障传感器的原理与调试
TCRT5000红外避障模块的工作原理其实很简单。它上面有一个红外发射管和一个红外接收管。发射管一直往外发射红外线,接收管负责检测反射回来的红外线。当没有障碍物的时候,红外线发射出去就散掉了,接收管收不到信号,模块输出高电平。当有障碍物的时候,红外线被反射回来,接收管收到信号,模块输出低电平。
模块上一般有一个电位器,用来调节检测灵敏度。调节的原理是改变接收管的比较电压阈值。你拿一个障碍物放在传感器前面,慢慢转动电位器,直到模块上的指示灯刚好亮起,这个位置就是比较合适的灵敏度。调得太灵敏会导致误触发,调得太迟钝又检测不到近处的障碍物。
实际安装的时候,红外传感器最好离地面有一定高度,大概5到10厘米比较合适。太低的话地面反射会干扰检测,太高的话又可能检测不到矮小的障碍物。另外,红外传感器对黑色物体和透明物体的检测效果比较差,因为黑色物体吸收红外线,透明物体让红外线直接穿过去了。如果你的小车要在深色地面上跑,可能需要考虑换用超声波模块。
我实测下来,TCRT5000的有效检测距离大概在2到15厘米之间,具体取决于障碍物的颜色和表面粗糙度。白色墙面检测距离最远,黑色物体可能只有两三厘米。这个特性你在写避障逻辑的时候要考虑进去,不能假设所有障碍物都在同一个距离被检测到。
2.3 电源管理与续航优化
电源这块我单独拿出来讲,因为它太重要了。智能小车最常见的故障就是电源问题,没有之一。电机启动瞬间的电流可能是额定电流的三到五倍,这个冲击如果直接作用在单片机供电上,轻则导致复位,重则烧毁芯片。
我的方案是两节18650锂电池串联,标称电压7.4V,满电8.4V。这个电压直接给L298N供电,L298N内部有稳压电路,可以输出5V给其他模块。但为了保险起见,我建议还是加一个独立的降压模块给主控供电。LM2596可调降压模块就很合适,输入接电池,输出调到5V或者3.3V给主控。
电池容量方面,单节18650一般是2000到3500mAh。两节串联容量不变,还是这么多。小车运行时的平均电流大概在300到500mA之间,算上各种损耗,续航大概在4到6小时。如果你加了很多传感器和模块,续航会相应缩短。
提示:锂电池不要过放,单节电压低于3.0V就要充电了。过放会导致电池容量永久性衰减,甚至充不进电。建议在电池输出端加一个低压检测电路,或者至少定期用万用表量一下电压。
还有一个容易被忽略的点是电源开关。我建议在电池和整个系统之间加一个自锁开关,不用的时候直接断电。有些模块即使主控不工作也在耗电,比如L298N的待机电流就有几十毫安,时间长了电池会被耗光。
3. 实操过程与核心环节实现
3.1 车体组装与机械结构搭建
车体我选的是最基础的双层亚克力板结构,某宝上十几块钱一套,包含底板、电机支架、轮子和万向轮。组装顺序很重要,先把电机固定在支架上,再把支架固定在底板上。电机轴和轮子之间一般用联轴器或者直接插进去,注意轮子要装正,歪了的话小车跑起来会画龙。
万向轮装在车头或者车尾,用来支撑和转向。我习惯装在车头,这样后面两个轮子驱动,前面一个万向轮支撑,结构最简单。万向轮的高度要调好,让底板保持水平,否则小车会往一边偏。
第二层板用来放主控板和电池,用铜柱撑起来。铜柱的高度根据你的模块尺寸来选,一般10到15毫米就够了。注意第二层板不要压到电机线,走线要规划好,用扎带固定。我见过有人线走得很乱,结果轮子转起来把线绞断了。
3.2 主控程序的逻辑框架
程序这块我用Arduino框架来写,因为它的语法简单,库也丰富。整个程序分成几个模块:初始化、电机控制、传感器读取、蓝牙通信、主循环。
初始化部分主要是设置引脚模式和初始状态。PWM引脚的频率默认是490Hz左右,对电机调速来说够用了。如果你觉得电机有啸叫声,可以改一下PWM频率,但要注意改频率可能会影响其他库的使用。
电机控制我封装了几个函数:forward()、backward()、turnLeft()、turnRight()、stop()。每个函数里面设置对应的IN引脚高低电平,以及PWM引脚的占空比。占空比决定了电机的转速,0是停转,255是全速。实际使用中我一般不会给满速,因为满速时电机噪音大、电流也大,给个180到200就差不多了。
传感器读取部分,红外避障就是读数字引脚的状态。我一般会做软件消抖,连续读三次,如果都是低电平才认为是真的检测到障碍物。这样可以避免偶尔的误触发。
蓝牙通信我用的是串口透传,手机发一个字符,主控收到后执行对应的动作。比如发'F'就前进,发'B'就后退,发'L'就左转,发'S'就停止。逻辑很简单,但很实用。
// 电机控制引脚定义 #define ENA 5 #define IN1 6 #define IN2 7 #define ENB 10 #define IN3 8 #define IN4 9 // 避障传感器引脚 #define IR_LEFT 2 #define IR_RIGHT 3 void setup() { pinMode(ENA, OUTPUT); pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(ENB, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); pinMode(IR_LEFT, INPUT); pinMode(IR_RIGHT, INPUT); Serial.begin(9600); } void forward(int speed) { digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); analogWrite(ENA, speed); analogWrite(ENB, speed); } void stop() { digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); analogWrite(ENA, 0); analogWrite(ENB, 0); }上面这段代码是最基础的部分,实际写的时候还要加上避障逻辑和蓝牙指令解析。避障逻辑我一般这样处理:如果左边传感器检测到障碍物,就右转;如果右边检测到,就左转;如果两边都检测到,就后退然后转弯。这个逻辑虽然简单,但在大多数场景下都能让小车自己绕开障碍物。
3.3 蓝牙遥控与手机端配置
蓝牙模块我用的是HC-05,默认波特率9600。接线很简单:VCC接5V,GND接GND,TXD接主控的RX,RXD接主控的TX。注意这里要交叉接,模块的TX接主控的RX,模块的RX接主控的TX。接反了通信不了。
配对的时候,手机蓝牙搜索到HC-05,默认密码是1234或者0000。配对成功后,用蓝牙串口助手APP连接,就能发数据了。我用的是一款叫“蓝牙串口助手”的APP,界面简单,能发文本也能发十六进制。
发送的指令格式我定义得很简单,单个字符就够了。'F'前进,'B'后退,'L'左转,'R'右转,'S'停止,'A'自动避障模式,'M'手动模式。主控收到字符后判断一下,执行对应的函数。
这里有个坑要注意:蓝牙模块和主控的串口通信会占用主控的硬件串口,而硬件串口同时也是下载程序的接口。如果你用Arduino Uno,下载程序的时候蓝牙模块会干扰下载。解决办法是下载程序时拔掉蓝牙模块,或者用软串口库把蓝牙模块接到其他引脚上。我用的是软串口方案,把蓝牙模块接到D2和D3上,这样下载和通信互不干扰。
注意:软串口的波特率不能太高,9600比较稳定,115200容易丢数据。如果你发现蓝牙控制有延迟或者丢指令,先检查波特率是不是设得太高了。
3.4 避障逻辑的调试与优化
避障逻辑写起来简单,调起来麻烦。最大的问题是传感器安装位置和检测角度。红外传感器的检测角度大概在35度左右,两个传感器如果装得太近,检测范围重叠,会出现两边同时触发的情况。装得太远,中间会有盲区,小车可能会撞上正前方的障碍物。
我的经验是,两个传感器分别装在车头左右两侧,间距大概10到15厘米,稍微向外倾斜一点。这样左边传感器负责左侧和正前方偏左的区域,右边传感器负责右侧和正前方偏右的区域,中间盲区很小。
调试的时候,我建议先把小车架起来,轮子悬空,用手或者纸板在传感器前面晃动,观察串口打印的传感器状态。确认传感器能正确检测之后,再放到地上跑。地上跑的时候注意地面颜色,深色地面会吸收红外线,导致检测距离变短。
避障的决策逻辑我优化过好几版。最开始是检测到障碍物就停,然后后退再转弯。后来发现这样效率太低,小车走走停停很笨拙。改成检测到障碍物就一边转弯一边前进,流畅很多。再后来加了“记忆”功能,如果左边连续检测到障碍物,就多往右转一点,避免在原地打转。
4. 常见问题与排查技巧实录
4.1 电机不转或只往一个方向转
这是最常见的问题,我把它放在第一个讲。电机完全不转,先检查电源。用万用表量L298N的12V输入端,看有没有电压。如果没有,检查电池和开关。如果有电压,再量5V输出端,看稳压电路是否工作。如果5V正常,再量控制信号端,看主控有没有输出。
电机只往一个方向转,通常是IN引脚的问题。检查IN1和IN2是不是一个高一个低,如果两个都是高或者两个都是低,电机就不转。如果代码没问题,用万用表量一下引脚电压,看是不是主控引脚坏了。我遇到过引脚虚焊的情况,外表看不出来,量了才发现电压不对。
还有一种情况是电机转但没力气,带不动轮子。这通常是电源电流不够。L298N的最大输出电流是2A,但那是峰值,持续输出建议不要超过1A。如果你用的电池放电能力不足,电机启动时电压会被拉低,导致扭矩不够。换用放电能力更强的电池,比如高倍率18650,问题就解决了。
4.2 蓝牙连接不稳定或频繁断开
蓝牙连接问题我遇到过好几次,原因各不相同。最常见的是电源干扰。电机启动时电流冲击导致电压波动,蓝牙模块供电不稳就会断开。解决办法是在蓝牙模块的VCC和GND之间并一个100uF的电解电容,能有效缓冲电压波动。
第二个原因是波特率不匹配。HC-05默认波特率是9600,但有些模块出厂时被设成了38400或者115200。如果你发现发指令没反应,先用AT指令查一下波特率。AT指令的进入方式是按住模块上的按键再上电,进入AT模式后波特率固定是38400。
第三个原因是手机端APP的问题。有些蓝牙串口助手APP在后台会被系统杀掉,导致连接断开。建议把APP加入电池优化白名单,或者用前台服务保持连接。另外,安卓和iOS的蓝牙协议栈有差异,如果安卓连不上,换iOS试试,反之亦然。
4.3 小车跑偏或画龙
小车跑偏的原因很多,我按可能性从高到低排个序。首先是电机转速不一致。两个电机即使型号相同,实际转速也会有差异,这是制造公差导致的。解决办法是在代码里给两个电机不同的PWM值,慢的那个给高一点,快的那个给低一点,通过实验找到平衡点。
其次是轮子安装不正。轮子如果歪了,小车跑起来就会往一边偏。检查方法是把小车拿起来,从正上方看两个轮子是不是平行的。如果不平行,调整电机支架或者轮子的安装角度。
第三个原因是万向轮阻力太大。万向轮如果卡涩或者高度不对,会给小车一个侧向的力,导致跑偏。检查万向轮能不能自由转动,高度是不是和驱动轮匹配。我一般会在万向轮和底板之间加几个垫片,微调高度。
第四个原因是地面不平。这个没办法,只能换平整的地面测试。地毯、门槛、地砖缝隙都会影响小车的直线行驶。
4.4 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| 电机完全不转 | 电源未接通 | 万用表量L298N输入端电压 | 检查电池、开关、接线 |
| 电机只往一个方向转 | IN引脚电平不对 | 量IN1和IN2电压 | 检查代码、补焊虚焊引脚 |
| 电机无力 | 电源电流不足 | 量电机启动时电压跌落 | 换高倍率电池、加大电容 |
| 蓝牙频繁断开 | 电源干扰 | 示波器看蓝牙供电纹波 | VCC并100uF电容 |
| 蓝牙无反应 | 波特率不匹配 | AT指令查波特率 | 改为9600 |
| 小车跑偏 | 电机转速不一致 | 分别测试两个电机转速 | 代码里补偿PWM值 |
| 避障不灵敏 | 传感器灵敏度低 | 转动电位器调灵敏度 | 调到指示灯刚好亮 |
| 避障误触发 | 地面反射干扰 | 观察不同地面上的表现 | 调高传感器安装高度 |
| 主控频繁复位 | 电机电流冲击 | 示波器看主控供电 | 电机和主控分开供电 |
| 续航太短 | 电池容量小或漏电 | 量待机电流 | 换大容量电池、加开关 |
4.5 独家避坑经验分享
第一个经验是关于电容的。我强烈建议在L298N的电源输入端并一个470uF的电解电容,再并一个0.1uF的陶瓷电容。大电容缓冲电机启动的电流冲击,小电容滤高频噪声。这两个电容加起来不到一块钱,但能解决很多莫名其妙的复位和干扰问题。
第二个经验是关于接线的。杜邦线用久了会接触不良,尤其是电机这种震动环境。我后来把所有接线都换成了焊接加热缩管,可靠性提升了一个档次。如果你不想焊接,至少用扎带把杜邦线固定住,不要让它们晃来晃去。
第三个经验是关于调试的。写代码的时候,多用串口打印调试信息。传感器状态、电机指令、蓝牙接收到的数据,都打印出来。这样出问题的时候一眼就能看出是哪一层的问题。我习惯在setup里打印一行“System Ready”,看到这行字就知道主控启动了。
第四个经验是关于电池的。18650电池不要买太便宜的,虚标容量很严重。我买过标称3000mAh实际只有800mAh的,小车跑十几分钟就没电了。建议买正规品牌的拆机电池或者全新电池,容量用充电器测一下,心里有数。
第五个经验是关于扩展的。做小车的时候不要把所有功能一次全加上,先让基础功能跑通,再一个一个加模块。每加一个模块就测试一次,确认没问题再加下一个。这样出问题的时候容易定位,不会一堆问题搅在一起。
5. 功能扩展与进阶玩法
5.1 超声波测距替代红外避障
红外避障的局限性很明显,检测距离短、受颜色影响大、容易误触发。如果你想让小车更智能,超声波模块是很好的升级选择。HC-SR04是最常见的超声波模块,检测距离2厘米到4米,精度大概3毫米,价格也很便宜。
超声波模块的工作原理是发射超声波,然后接收回波,通过时间差计算距离。它有两个引脚:Trig和Echo。Trig发一个10微秒的高电平脉冲,模块就发射一次超声波。Echo引脚会输出一个高电平,高电平的持续时间就是超声波往返的时间。距离等于时间乘以声速再除以二。
接线方面,VCC接5V,GND接GND,Trig和Echo接任意两个数字引脚。代码里用pulseIn函数读取Echo引脚的高电平持续时间,然后换算成距离。注意超声波模块的检测角度比较窄,大概15度,所以安装的时候要正对前方。
用超声波做避障,逻辑可以写得更精细。比如距离大于50厘米正常行驶,30到50厘米减速,小于30厘米转弯,小于15厘米后退。这样小车的行为会更自然,不会像红外避障那样一惊一乍的。
5.2 循迹功能的实现思路
循迹是智能小车的另一个经典功能。地面上贴一条黑色胶带,小车通过红外传感器检测黑线,自动沿着线走。循迹用的红外传感器和避障用的不太一样,它是对着地面检测的,通过地面反射率的差异来判断黑白。
最简单的循迹用两个传感器,分别装在车头左右两侧。两个都检测到白色,直行;左边检测到黑色,左转;右边检测到黑色,右转;两个都检测到黑色,停止或者继续直行。逻辑很简单,但效果出奇地好。
如果你想跑得更流畅,可以用五个或者七个传感器组成的循迹模块。传感器越多,对线位置的判断越精确,小车走起来越平滑。不过代码也会复杂一些,需要做加权计算,根据每个传感器的状态算出偏差值,然后调整左右轮的速度差。
循迹调试的关键是传感器高度和灵敏度。传感器离地面太远,反射信号弱,检测不到黑线。太近又容易刮到地面。我一般调到离地面1到2厘米,然后逐个调电位器,让每个传感器在白底和黑线上的输出都正确。
5.3 加入WiFi控制与简单视觉
如果你用的是ESP32,可以直接用它的WiFi功能做一个网页控制界面。手机连上ESP32的热点,打开浏览器就能控制小车。这个方案比蓝牙更灵活,因为你可以把控制界面做得更漂亮,还能加视频回传。
视觉方面,ESP32-CAM是一个性价比很高的选择。它集成了摄像头和WiFi,可以拍照和传视频。你可以用它做一个简单的视觉循迹,比如识别红色的球然后追着跑。不过视觉处理的代码比较复杂,需要用到图像处理库,对新手来说有一定难度。
我的建议是先把基础功能做扎实,再考虑这些进阶玩法。很多新手一上来就想做视觉识别,结果基础没打好,遇到问题不知道从哪查起,最后不了了之。做项目要循序渐进,每一步都踩实了再往前走。
提示:ESP32-CAM的引脚比较少,很多引脚被摄像头占用了。如果你要同时接电机驱动和传感器,引脚可能不够用。建议用ESP32 DevKitC做主控,ESP32-CAM单独做视觉模块,两者通过串口通信。
5.4 从零到一的完整调试流程
最后我整理一个完整的调试流程,你按照这个顺序来,能少走很多弯路。
第一步,单独测试主控板。写一个最简单的闪灯程序,确认主控能下载、能运行。这一步不过,后面都别谈。
第二步,单独测试电机驱动。不接主控,直接用电源和手动信号测试电机能不能转。确认电机和驱动模块都是好的。
第三步,主控和电机驱动联调。写一个简单的正反转程序,确认主控能控制电机。这时候先不装车,电机拿在手里测试。
第四步,装上小车,测试直线行驶和转弯。调整PWM值,让两个电机转速尽量一致。
第五步,加入避障传感器,测试避障逻辑。先用手动障碍物测试,再放到地上跑。
第六步,加入蓝牙模块,测试遥控功能。确认手机能发指令,小车能正确响应。
第七步,整合所有功能,做最终调试。处理各种边界情况,比如同时收到避障触发和蓝牙指令时怎么处理。
这个流程看起来繁琐,但每一步都确认好了,最后整合的时候问题会少很多。我见过太多人跳过前面的步骤,直接上完整代码,结果出了问题完全不知道是哪里的原因,只能从头再来。
6. 个人实操体会与建议
做智能小车这个项目,我最大的体会是:硬件项目跟纯软件项目最大的区别在于,软件出问题你能看到报错信息,硬件出问题你只能看到“它不工作”。所以调试硬件的时候,一定要学会用工具。万用表是最基本的,示波器如果有条件也备一个,很多电源干扰的问题用万用表看不出来,用示波器一看就明白了。
另外,不要怕失败。我做的第一辆小车,焊废了两块驱动板,烧了一个主控,前后折腾了快一个月才跑起来。但正是这些失败的经历,让我真正理解了电机驱动、电源管理、信号干扰这些概念。现在我做任何嵌入式项目,这些经验都用得上。
如果你是完全的新手,我建议从套件开始。买一套配齐所有零件的智能小车套件,按照教程一步步做。等做完了,再自己买散件重新搭一遍,这次不看教程,凭理解来。两遍下来,你就真正掌握了。
最后说一个心态问题。做硬件项目,耐心比聪明重要。很多时候问题就出在一个虚焊、一根接反的线、一个没拔的跳线帽上。遇到问题不要急,按照“电源→信号→代码”的顺序一步步排查,总能找到原因。我到现在做新项目,也经常犯低级错误,这很正常。重要的是有一套系统的排查方法,而不是靠运气。