资讯动态

Arduino Uno+扩展板+乐高:动手搭建可重构硬件原型全攻略

发布时间:2026/10/2 18:51:51 来源:尧图企业网站定制
把Arduino Uno、扩展板和乐高拼在一起看起来像是把三样完全不相干的东西硬凑一桌但实际玩过一圈之后我得说这个组合可能是入门级硬件原型制作里最舒服的搭配之一。Uno负责逻辑控制扩展板把接线复杂度和驱动能力一次解决乐高则解决了“结构件从哪来”这个长期困扰创客的问题——不需要3D打印机不需要铝型材切割手边一套得宝或者科技系列零件就能把传感器支架、车架、机械臂底座全部搞定。这篇东西我按自己踩过的完整路径来写从选型思路、引导程序烧录、扩展板驱动到卡纸级别复现的完整步骤都有适合正在做课程设计、机器人小项目、或者单纯想把闲置乐高变成能动的东西的朋友参考。1. 项目定位与方案选型1.1 为什么是Uno、Shield再加乐高Arduino Uno是绝大多数人接触嵌入式开发的起点这不光是因为教程多、资料全更重要的是它的引脚定义已经成了事实标准。很多扩展板在设计时以Uno的引脚排布为基准插上去就能用不用考虑飞线或者转接。在这个项目里Uno承担的任务是读懂传感器输入、按照写好的逻辑给执行器输出PWM或数字信号简单说就是个“大脑”。扩展板在这里的逻辑比较清晰——它解决的是接口和驱动能力的问题。Uno本身最常用的14个数字引脚加6个模拟引脚如果你自己接一个电机驱动模块至少要占用6根杜邦线还要额外接电源线和地线线路稍微一多就乱。扩展板的好处是所有信号通过引脚叠插的方式直接落在Uno上螺丝端子或者带插座的设计把电源、信号、地线都归拢整齐调试的时候不用在一堆跳线里找哪根是哪根。乐高在这个组合里的角色是“骨架”和“关节”。它提供了特别低门槛的结构搭建方式梁、销、齿轮、轮子、履带这些基础件能让你的创意在两小时内变成能握在手里的实物。以前做小车底盘要画图、切割亚克力、打孔攻丝现在用乐高梁拼一个底盘10分钟搞定而且改尺寸只需要拆掉重拼成本几乎为零。1.2 三者的分工边界怎么划很多新手容易把三者混为一谈觉得有了扩展板就什么都能驱动或者有了乐高就随便堆电机。实操下来我建议这样划分Uno只管逻辑不做大电流输出扩展板管功率转换和信号路由不做运算乐高管结构强度不参与电气。比如做一个循迹小车负责读红外传感器状态的是Uno负责根据状态决定左右轮转速的也是Uno但真正让电机转起来的是扩展板上的驱动芯片它把Uno的5V逻辑电平转换成电机需要的6到12V功率输出。而车轮、底盘、传感器支架则是乐高的活儿。这样分层之后调试哪一层出问题就非常清晰车不走先看电机端有没有电压电机有电不转再查Uno给控制脚的高低电平信号也对但轮子卡住那就是乐高齿轮咬合的问题。我自己在项目初期的最大教训就是越权。一开始图省事用Uno引脚直连一个小电机结果Uno的稳压芯片发烫严重没跑两分钟就自动复位。后来老老实实加扩展板问题再也没有出现。所以选型的时候一定要想清楚哪一个环节是自己在做哪一个环节是模块在做边界划清楚了后面才不会返工。2. 从零开始准备开发环境与引导程序烧录2.1 给裸Uno装“开机引导程序”这件事如果你买的是原装Uno或者正规渠道的兼容板出厂时芯片里已经预烧了引导程序插上USB就能用不需要做这一步。但如果你手里的是裸芯片、二手板、或者自己用面包板搭的“最小系统”那就必须自己给芯片烧引导程序——这个步骤就是热词里说的“给uno板烧录引导”。引导程序到底是什么你可以把它理解成电脑里的BIOS它是存在芯片flash区底部的一小段独立程序负责让“电脑上的Arduino IDE”和“芯片本身”之间产生通信。没有引导程序的ATmega328P你在IDE里点了上传电脑信号发过去芯片根本不理会因为芯片里没有代码在“收听”USB端口传来的数据。烧入了引导程序之后芯片每次上电先运行引导程序引导程序等待一小段时间检查有没有新的程序要写入没有的话就跳转去运行flash区里已有的用户代码有的话就执行写入操作再跳转。实操里最常见的场景是用另一块Arduino板当ISP编程器给目标Uno板烧引导。这不需要额外买编程器手头有两块板子就能干。2.2 用第二块Arduino做ISP烧录的具体步骤我把这个完整流程走一遍你照着做基本不会有问题。第一步准备两块板子。一块作为“编程器”一块作为“目标板”。编程器板建议也用Uno或NanoNano更简洁。目标板必须先把原来芯片里的程序清掉吗不需要引导程序覆盖写入就行。第二步接线。ISP烧录要连接六根线MISO、MOSI、SCK、RESET、VCC、GND。以两块Uno为例对应关系是编程器引脚 - 目标板引脚5V - 5VGND - GNDD10 (RESET) - RESETD11 (MOSI) - D11D12 (MISO) - D12D13 (SCK) - D13所有信号线一一对应。这里的关键是RESET引脚的接法D10接目标板RESET编程器会在烧录过程中通过拉低这个引脚让目标芯片进入编程模式。我之前有一次就是把RESET接到D13上结果烧录一直报“target doesnt answer”查了半天才发现是把SCK和RESET搞混了。接线完用万用表量一下通断这十秒钟能省下半小时的排查时间。第三步在IDE里选择编程器固件。Arduino IDE自带一个示例程序路径是“文件 - 示例 - ArduinoISP - ArduinoISP”把这个程序烧录到编程器板上。这个固件负责把电脑发送的指令转换成ISP协议信号。第四步配置烧录参数。工具菜单里把板卡选成“Arduino Uno”编程器选成“Arduino as ISP”。然后点击“工具 - 烧录引导程序”开始烧。烧录过程大概10秒左右如果IDE底部显示“Done burning bootloader”就说明成功了。这时候目标板已经具备从USB口接收程序的能力以后直接用USB线连接电脑正常上传代码即可。2.3 烧录失败的常见原因和排查顺序烧录失败是新手最容易卡住的地方但我总结过失败原因其实就集中在几个点上按顺序排查很快就能定位。第一类原因是接线松动尤其是RESET线。因为ISP编程器和目标板之间是通过SPI协议通信的如果RESET没有被正确拉低目标芯片根本不会进入编程模式。判断方法是在烧录时观察目标板上电源LED的亮度变化如果RESET线正确接地上电瞬间LED会有一个明显的暗亮变化说明芯片重启了如果没有变化大概率RESET没接对。第二类原因是时钟源设置不对。老版本IDE有一个坑默认烧录引导程序时会配置芯片熔丝位如果熔丝位设置成了使用外部晶振而你用的是内部RC振荡器比如面包板最小系统没接16M晶振那么芯片会直接变砖连ISP都连不上。现在的新版IDE在“工具 - 时钟”菜单里默认选“External 16MHz”如果你用的是面包板没接晶振记得改成“Internal 8MHz”。我建议能接晶振就尽量接内部振荡器精度差串口通信容易乱码。第三类是板卡型号选错。ATmega328P有多个封装型号Uno用的是DIP封装如果你的板子芯片丝印是“ATmega328P-PU”就不用担心但如果丝印是“ATmega328PB”则是另一个型号引脚定义不同必须选对板型。烧录引导这个环节说难不难说简单也容易翻车但只要记住了“SPI四根信号线加复位线”这个核心结构再配合万用表和LED观察法基本都能解决。3. 扩展板选型与驱动逻辑详解3.1 常用Uno扩展板怎么分类市面上的扩展板五花八门但按用途分其实只有几大类。第一类是电机驱动扩展板代表作是L293D电机驱动扩展板。板上有一颗或两颗驱动芯片每颗芯片能驱动两个直流电机支持正反转和PWM调速。这种板子直接叠在Uno上电机接板边的螺丝端子电源独立输入信号通过引脚定义自动对接不需要额外接线。第二类是传感器扩展板Sensor Shield。它不具备驱动能力本质上是个引脚转接板把Uno的每个引脚引出一个三针接口信号-电源-地方便插各种传感器模块。这种板对新手极其友好因为不需要记引脚号每个接口都标注了数字直接看丝印插就行。第三类是无线通信扩展板比如SIM900 GSM扩展板、ESP8266 WiFi扩展板、NRF24L01无线模块扩展板。它们把复杂的天线匹配和电源转换都做好了用户只需要关心串口设置。在这个Lego项目中核心是电机驱动扩展板因为只要是能动的东西电机驱动是绕不开的。3.2 L293D电机驱动扩展板的工作原理L293D芯片本身是一个四通道推挽式驱动器本质上是四个独立的半桥电路。每个半桥可以通过输入引脚控制输出引脚的高低电平从而实现电机的正转、反转和停止。芯片内部还集成了续流二极管这个细节很重要——电机是感性负载断电瞬间会产生反向电动势如果没有续流回路电压尖峰能轻松打到几十伏不仅会干扰单片机还可能烧毁驱动芯片。L293D内部已经内置了这些二极管所以你不需要在外围额外加保护电路。扩展板上有几个关键布局需要注意板子中间是两排与Uno对齐的叠插排母直接把扩展板插到Uno的引脚上。板子一侧是电机接线端子标着M1到M4每个电机两个端子。另一侧是电源端子需要接外部电源因为电机工作电流远远超过USB能提供的500mA。板上有几个跳线帽用于选择使能信号的来源。默认情况下跳线帽是插着的此时使能引脚被接到高电平电机始终处于使能状态控制逻辑完全由D4/D5M1使能、D6/D7M2使能等PWM引脚控制。如果拔掉跳线帽就需要自己用杜邦线给使能引脚送信号。关于电源一个常见的错误是用Uno的5V输出去给电机驱动板供电。Uno板载稳压芯片AMS1117最大只能稳定输出800mA电流而你驱动两个电机随便就能吃1A以上结果就是电压跌落加芯片发烫。正确做法是电机电源独立接7-12V扩展板的逻辑电源可以和Uno共用5V——这一点扩展板电路已经设计好了它会把电机电源降压到5V供逻辑使用不需要你操心。3.3 接线实操一个完整的小车动力方案以做一个双电机差速驱动小车为例接线逻辑如下左电机接M1端子右电机接M2端子。电机电源正负极接扩展板的“EXT_PWR”端子电压选9V六节AA电池或7.4V两节锂电串联。电池负极接到Uno的GND注意这个共地必须做否则逻辑信号没有参考电位控制命令会乱套。代码中使用digitalWrite和analogWrite控制方向与速度。关于PWM调速的原理我多说一句。电机调速不是通过改变电压大小实现的而是通过快速开关电源、改变“开”和“关”的时间比例即占空比来改变平均电压。就像你手动开关电灯一秒内开80%关20%人眼感觉亮度大约是80%。PWM频率一般在490Hz或980Hz人耳能听到轻微的啸叫这是正常的。占空比越大电机转速越高但不要低于30%因为低速时电机电枢反应产生的不规则脉动会让你感觉车在抖。4. 乐高结构与电气部件的机械结合4.1 用什么乐高零件最合适把乐高和Arduino结合有个现实问题乐高梁上的孔距是8mm模数而Arduino的安装孔距是公制两者没有直接完全匹配的安装孔。这时候需要用一些过渡方案。最常用的零件是乐高科技系列的“销”和“轴”。销直径是4.8mmArduino的螺丝孔直径是3.2mm直接用销塞不进去但可以通过一块3D打印的转接板或者钻头扩孔解决。如果你不想破坏Arduino板更简单的办法是用扎带把扎带穿过Arduino的螺丝孔再绑到乐高梁上固定效果非常稳。如果是给电机出轴连接乐高齿轮那就顺畅多了。乐高电机的输出轴就是十字轴可以直接插乐高齿轮。但如果你用的是普通的直流电机比如TT马达输出轴是圆形你只需要买一个联轴器一边圆孔套电机轴一边方孔或十字孔接乐高轴几块钱一个比想象中好用。4.2 传感器支架和底盘结构的搭建思路以下是我自己试过、觉得特别稳定的结构方案底盘用两块双层梁平行放置中间用交叉梁连起来这种结构类似汽车大梁兼顾重量和强度。四角装轮子如果做差速驱动两个后轮用电机直驱前轮用万向轮或者乐高球轮。乐高球轮是个好东西Rotational Speed很高的那种白色滚珠座组合摩擦力小转向顺滑。传感器支架看你要什么传感器。做循迹小车的话红外循迹模块需要离地1厘米左右且左右各一个。做法是用两块短梁通过销卡在底盘前面传感器用双面胶或者扎带固定在梁上。做超声波避障的话超声波模块固定在车头正前方高度要高于障碍物检测点用两块梁搭一个龙门架形状固定即可。结构搭建有个原则叫“冗余度最小化”能用一个零件就不用两个能用插接就不用胶粘。因为乐高结构的魅力就在于可重构如果你动不动就上胶等于把自己锁死在一个方案里后面想改就麻烦了。我现在的习惯是先快速拼一个“丑但能跑”的验证结构跑通了再优化外观和强度而不是一开始就追求完美。4.3 机械部分和电气部分的联调这里有一个很重要的细节机械和电气的物理接口在哪里。电机扩展板的输出是两根电线乐高结构需要轴来传递动力。所以中间需要“轮子直接装在电机轴上”或者“联轴器乐高轴齿轮传动”这两种方式。方式一最简单买现成的轮子轴孔直径和电机出轴一致直接插进去用紧定螺丝锁紧。这种方式齿轮传动效率高没有中间损耗但缺点是无法改变传动比扭矩和速度都被锁定在电机本身特性上。方式二适合需要更大扭矩的场景电机出轴装一个小齿轮通过乐高齿轮组减速把高速低扭变成低速高扭。比如一个微型直流电机转速能到10000rpm直接带轮子根本起不了步通过3级齿轮减速可以把转速降到200rpm扭矩提升50倍这车就能爬坡了。减速比计算就是各级齿轮齿数比的乘积比如20齿带60齿是1:3再带一次1:3总减速比就是1:9。联调时最常出问题的环节是齿轮打架。乐高齿轮咬合需要中心距精确稍微错位就会憋住电机会因为堵转过流扩展板上的驱动芯片直接进入热保护表现就是车不走但板子特别烫。排查的时候先用手转轮子判断是否顺畅不顺畅就调齿轮位置千万别硬通电硬试。5. 程序逻辑与完整控制代码5.1 核心控制逻辑的拆分在写代码之前先把任务逻辑想清楚。以最经典的“循迹避障”小车为例完整逻辑分三层输入层读传感器状态红外循迹模块返回数字量超声波模块返回距离值决策层根据传感器状态决定行动前进、左转、右转、后退、停止执行层调用驱动函数控制电机方向和PWM占空比这三层分离的好处是调试时每一层都可以单独验证。先单独测试传感器读数再单独测试电机动作最后再把逻辑串起来问题定位会快很多。5.2 驱动函数的代码实现以下是一段可以直接用的基础驱动代码基于L293D扩展板的引脚映射// 定义电机控制引脚 // L293D Shield 默认引脚映射 // M1: 方向 D12, PWM D3 // M2: 方向 D13, PWM D11 #define MOTOR1_DIR 12 #define MOTOR1_PWM 3 #define MOTOR2_DIR 13 #define MOTOR2_PWM 11 void setup() { pinMode(MOTOR1_DIR, OUTPUT); pinMode(MOTOR1_PWM, OUTPUT); pinMode(MOTOR2_DIR, OUTPUT); pinMode(MOTOR2_PWM, OUTPUT); } // 左电机正转100%速度 void motor1Forward() { digitalWrite(MOTOR1_DIR, HIGH); analogWrite(MOTOR1_PWM, 255); } // 左电机反转50%速度 void motor1Backward() { digitalWrite(MOTOR1_DIR, LOW); analogWrite(MOTOR1_PWM, 127); } // 右电机同样逻辑 void motor2Forward() { digitalWrite(MOTOR2_DIR, HIGH); analogWrite(MOTOR2_PWM, 255); } void motor2Backward() { digitalWrite(MOTOR2_DIR, LOW); analogWrite(MOTOR2_PWM, 127); } // 停车 void stopMotors() { analogWrite(MOTOR1_PWM, 0); analogWrite(MOTOR2_PWM, 0); } void loop() { motor1Forward(); motor2Forward(); delay(2000); stopMotors(); delay(1000); motor1Backward(); motor2Backward(); delay(2000); stopMotors(); delay(1000); }注意这里有个新手容易踩的坑digitalWrite控制方向引脚时你以为的“正转”和“反转”其实取决于电机接线方向。如果发现左右电机一个正转一个反转最简单的解决不是改代码而是把其中一个电机的两根线交换位置——当然你也可以直接交换代码里的HIGH和LOW。我倾向于改接线因为代码保持通用性后面换电机不至于还要改程序。5.3 循迹和避障的传感器接入循迹模块用的是红外对管一般是两路或三路模块。它输出的是数字信号黑线反射率低白线反射率高模块上有电位器可以调阈值。接法很简单模块VCC接5VGND接GNDOUT接Uno的数字引脚。读取用digitalRead就可以了。超声波模块HC-SR04是很多避障项目的标配工作逻辑是Uno给Trig引脚发一个10微秒以上的高电平脉冲模块发出超声波并开始计时当回波到达时Echo引脚输出一个高电平脉冲脉冲宽度等于声波往返时间。距离等于时间乘以声速再除以2。实际换算代码long getDistance() { pinMode(TRIG, OUTPUT); digitalWrite(TRIG, LOW); delayMicroseconds(2); digitalWrite(TRIG, HIGH); delayMicroseconds(10); digitalWrite(TRIG, LOW); pinMode(ECHO, INPUT); long duration pulseIn(ECHO, HIGH); long distance duration * 0.034 / 2; // 单位cm return distance; }0.034是声速340m/s换算成cm/微秒的结果除以2是因为声波走了往返路程。这个公式很常用建议记下来。5.4 避障决策逻辑的编写在知道距离之后控制逻辑可以很简单void loop() { long dist getDistance(); if (dist 20) { // 前方有障碍先停车再右转 stopMotors(); delay(200); motor1Forward(); // 左轮前进 motor2Backward(); // 右轮后退实现原地右转 delay(400); } else { motor1Forward(); motor2Forward(); } }这个逻辑虽然粗糙但已经能让小车“活”起来。如果加上循迹模块做成“遇到黑线就转弯”代码里加一个条件判断即可。逻辑决策是不断迭代的过程不用一步到位写得多复杂先把最基础的行为跑起来再逐步叠加。6. 联调、问题排查与避坑实录6.1 常见的电气故障现象与排查我在这个组合项目上翻过不少车把最典型的现象和原因整理成了一张表遇到问题时直接对照现象可能原因排查方法上电后Uno红色电源LED不亮电源接反或短路万用表量电压检查电池极性电机不转但板子电源正常使能跳线帽未插或PWM引脚输出为0确认跳线帽在位打印PWM值电机转但方向反电机接线反了交换两根电机线电机乱抖、转速不稳PWM频率过低或电源电压不足换稳定电源检查电池电压是否低于6V板子发烫电机堵转或外部电源接入错位断电排查机械卡阻检查电源接线程序上传失败引导程序损坏或串口被占用重新烧引导程序拔掉所有占用串口的程序循迹传感器误判阈值调节不当或安装高度不对用小螺丝刀调电位器调整传感器离地高度6.2 机械与电气的联调技巧联调时有一个很实用的顺序先机械后电气。机械部分先用手推动小车确认轮子转得顺滑、没有卡阻再单测电气用代码分别测试每个电机的正反转最后才接传感器做完整联调。这个顺序能帮你把“车不走”的问题拆成“机械卡住”和“电气故障”两个互不干扰的部分。我曾经在调试时花了二十分钟排查电机驱动结果发现是乐高齿轮里卡了一根头发丝粗细的塑料毛刺机械阻力大到电机根本带不动。用手转轮子发现不顺畅的那一瞬间真想给自己一下。还有一个细节乐高十字轴插入联轴器时不要完全顶到底留出1-2mm的间隙。因为电机运转时会有轴向窜动如果轴顶死了产生的摩擦力会额外增加电机负载。这个间隙问题在高速运转时特别明显会导致电机过热。6.3 电源管理的经验电源是整个项目最容易忽视的环节。Uno的USB供电只能应付“Uno 一个传感器”这种超低负载场景一旦接上电机驱动扩展板并带两个电机USB口直接掉电保护。所以独立供电是必须的。我的建议是逻辑电Uno和动力电电机分开但不一定要两个电池组。常见的做法是单电池组同时供电但要从电池组正极分两条支路一条到扩展板的电机电源输入端一条到Uno的VIN引脚。注意共地两条支路的负极要连在一起。这种接法能保证电机启动时的大电流压降不会把Uno的5V电压拖垮因为Uno的稳压芯片只承担逻辑电路的电流电机电流直接走独立路径。电容也是一个容易被忽略的地方。在电机电源输入端并联一个470uF的电解电容能显著缓解电机启动瞬间的电压跌落。电压跌落是因为电池有内阻瞬时大电流导致端电压下降电容就像一个微型储水池瞬间的电流需求先由电容顶上。6.4 从验证原型到功能扩展当你把基础小车跑通了之后这个组合的扩展空间非常大。我给几个思路一是加蓝牙模块HC-05/HM-10手机APP直接控制小车代码量和循迹差不多多了个串口通信而已。二是加舵机用乐高做机械臂搭配超声波做成自动抓取机器人。三是加OLED显示屏实时显示传感器数据对调试和演示都很有帮助。更进阶的玩法是用ESP8266替换Uno做远程控制。ESP8266也能跑Arduino代码引脚兼容部分扩展板但5V和3.3V电平问题需要注意。或者考虑用Arduino的I2C总线挂多块扩展板用PCF8574扩展IO口从而在Uno上挂更多传感器。如果是做课程设计或者比赛作品这个组合的展示效果也很好乐高的积木感让作品看起来不太“工业化”更有亲和力Arduino的开放生态又保证了功能深度。评委或者老师看到实物能跑动、能交互分数往往不会低。我个人做这类项目最大的感受是方案选型比写代码更重要。代码出问题看报错、查逻辑总能定位但硬件方案选错了从基础上就得推倒重来。Uno配扩展板再配乐高这套组合优点就在于三层都可以独立替换、独立升级。烧录引导程序是基本功做了这一次之后后面玩最小系统、玩自制开发板都用得上。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑