尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

从MicroPython到ESP32:桌面版MicroDuck完整DIY路线图

从MicroPython到ESP32:桌面版MicroDuck完整DIY路线图 前阵子逛创客市集看见一个小伙子用MicroPython驱动一只巴掌大的黄色橡皮鸭鸭肚子里塞了ESP32和几个传感器鸭子在桌面上一摇一晃地溜达有人靠近就鸭叫。回去我查了下类似的玩法在GitHub上被统称为microduck——其实不是一个标准项目而是“MicroPython 鸭子形态硬件”这类DIY的总称。关键是整套东西门槛比想象中低得多硬件几十块到一百多块代码从点亮LED开始学也就几天的事。这篇文章我按自己从选型到跑通代码的真实顺序整理一份关于microduck的完整路线图。内容包括鸭子本体要拆成哪些功能模块、主控/电机/传感器怎么选、开发环境怎么搭、第一行代码从哪写起、怎么让鸭子动起来以及我实际踩过的供电和引脚坑。适合三类人想用Python入门硬件开发的程序员、带学生做创客项目的老师、以及单纯想做个能跑的小鸭子自娱自乐的动手党。1. 动手之前先把MicroDuck拆成一张需求清单很多人拿到“做个自己的microduck”这个目标后第一反应是逛淘宝买板子。我建议反过来先花半小时把鸭子拆成功能模块再决定买什么。因为硬件选型不是越贵越好而是匹配需求。1.1 先确定版本桌面版还是下水版microduck没有标准形态我做的是桌面版但也有不少人在做水上版就是那种在浴缸、泳池里扑腾的遥控鸭子。这两个版本的核心差异非常大桌面版重点在传感器交互、造型、灯光和声音电机只需要让鸭子缓慢移动或转头对防水要求为零。下水版重点在密封、螺旋桨推进、浮力配平和远程遥控对电机防水和续航要求很高成本会明显上涨。我建议第一次做选桌面版。先把逻辑跑通、把代码写熟再考虑要不要给它加防水壳。如果你的目标就是水上版本也建议先做一个裸板桌面原型再逐步移植到防水壳里否则接线和调试会非常折磨。1.2 先定义MVP再谈扩展功能MVP最小可行产品这个词虽然是软件圈的但放在硬件DIY上同样适用。我给自己定的microduck MVP只有三个功能能上电启动板载LED按要求闪烁证明系统活着。能通过PWM控制两个电机实现前进、后退、左右转向。能连接WiFi通过浏览器或手机发送指令控制运动。这个MVP避开了传感器校准、复杂结构件和电池管理把核心链路压缩到“主控电机驱动供电通信”四件事。后续再扩展传感器比如温湿度、超声波避障就轻松得多。千万别一开始就想着做一只会巡线、会避障、会联网报天气、还会用鸭语聊天的全能鸭子那样大概率烂尾。1.3 画一张简单的数据流图比写代码更关键动手前我用一张纸画了数据流向。对硬件项目来说数据流决定接线方案接线方案决定引脚冲突。桌面版microduck最简单的一条链路是电源 → 主控板 → 电机驱动板 → 左右电机同时主控板通过GPIO读取传感器、控制LED/蜂鸣器电脑通过USB或WiFi向主控板发送代码和指令。这张图的作用是帮你明确“哪部分需要独立供电”“哪些引脚被占用”。很多新人翻车就是因为电源和图没理清楚等接线时发现一个引脚被两路信号共用。2. 硬件选型遵循哪些原则核心是供电与驱动microduck的硬件选型不需要追新用到成熟方案即可。我的原则很简单主控选社区生态活跃的驱动选压降小的电机选好固定的传感器选三线制的。2.1 主控选择为什么我更推荐ESP32-S3而不是Arduino Uno这可能是很多人第一个纠结的点。如果你懂一点C语言Arduino Uno也不是不行但它板载芯片的性价比、内存和无线能力在当前环境下确实不太能打。microduck这类项目我认为更合适的起步板是ESP32-S3系列。主控价格区间WiFi/蓝牙MicroPython支持适合场景ESP32-S325-45元都有原生支持推荐IO丰富内存大ESP32-C315-30元都有原生支持体积小但引脚少RP204020-35元无支持适合纯逻辑不做联网Arduino Uno25-60元需要扩展支持有限适合传统教学我选ESP32-S3原因是双核240MHz跑MicroPython游刃有余。板载WiFi和蓝牙后续做遥控、上报数据都不用加模块。引脚数量充足即使接错烧了一两个引脚也还有冗余。Thonny和esptool对它的支持很成熟烧录难度低。补充一点买ESP32-S3开发板时注意看引脚说明不要买那种引脚全部引出但没标注的板子。找个丝印清晰、引脚标注明确、带自动下载电路也就是USB直插直接能烧录不用手动按BOOT键的板子能省很多事。2.2 电机和驱动板最容易买错的一个环节桌面版鸭子不需要无刷电机那种猛货我用的是N20微型减速电机就是那种圆柱形、带金属减速箱的小电机。它的优点是扭矩够、体积小、好固定。另一个常见方案是TT马达就是黄色透明外壳、自带轮子那种便宜但转速偏高对鸭子来说略猛。电机类型电压体积扭矩固定难度N20减速电机3-6V小适中需要支架或热熔胶TT马达3-6V较大较大自带螺丝孔简单步进电机28BYJ-485V大大太重不推荐驱动板方面我不推荐用老的L298N压降太大两节锂电池供电根本推不动而且体积硕大塞进鸭子肚子里很勉强。我用的是DRV8833模块双路H桥体积只有手指头大小压降约0.2V驱动小电机足够。如果你手头只有L298N也能做但要额外准备7V以上的供电否则电机就是哼哼不动。2.3 传感器与扩展模块从“能跑”到“好玩”MVP阶段传感器不是必须的但如果你想让鸭子有点互动感优先级建议这样排板载LED必须用来验证代码运行状态。无源蜂鸣器简单用PWM可以模拟鸭叫优先级高。DHT11/DHT22温湿度传感器三线制接线简单数据直接读适合入门。超声波模块HC-SR04避障用价格低但新手容易对时序感到困惑。循迹模块TCRT5000配合黑胶带可以画一条固定路线优先级中等。第一次做我建议“LED蜂鸣器一个传感器”就够。加太多传感器代码里的状态判断会指数级变复杂调试时很难定位是硬件问题还是逻辑问题。2.4 电池方案与供电拓扑供电是整个项目里最容易出问题、也最容易被忽略的地方。我的经验是分开供电主控和电机各走各的电源但必须共地GND连在一起。桌面版microduck我用了两节18650锂电池串联标称7.4V接到DRV8833的VM端给电机供电再从电池电压里取一路接到ESP32-S3开发板的5V引脚通过板载稳压到3.3V给主控供电。如果你用USB线供电调试电机接电池主控接电脑USB两者共地就行。这里有一个关键提醒不要尝试用ESP32开发板的3.3V引脚去带电机哪怕是小N20也不行。电机启动瞬间电流很容易超过500mA会把板载稳压芯片拉垮表现为板子直接重启或USB掉线。3. 从零搭建开发环境烧录MicroPython固件并跑通串口大多数爱好者卡住的第一关不是代码而是“板子买回来插上去没反应”。这节我按自己实际跑通的流程写跟着做基本能到“第一行代码”那一步。3.1 需要的工具和软件清单操作系统我用WindowsmacOS和Linux操作也类似只是串口驱动安装方式略有差异。准备这几样ESP32-S3开发板一块。USB数据线一根注意要能传输数据的线不要用那种只能充电的。Thonny IDE官网下载用最新版本即可。esptool通过pip install esptool安装用来擦除和烧录固件。MicroPython官方固件去micropython.org下载选ESP32-S3对应型号的.bin文件。3.2 烧录固件的步骤步骤很简单但每一步都有坑按住开发板上的BOOT键然后把USB线插到电脑等待两秒再松开BOOT键。打开设备管理器查看串口号通常显示为“USB 串行设备(COM3)”之类。在命令行里先擦除芯片esptool --chip esp32s3 --port COM3 erase_flash再烧固件esptool --chip esp32s3 --port COM3 --baud 460800 write_flash -z 0x0 micropython_esp32s3_xxx.bin看到“Hash of data verified”就说明烧录成功。如果烧录时提示连接失败九成是BOOT键没按对或者USB线是充电线。换根线、重新插拔一般能解决。3.3 用Thonny确认板子活了打开Thonny依次点击“运行 - 配置解释器”解释器选择MicroPython(ESP32)端口选择刚才那个COM号。点击“停止/重启后端进程”如果下方Shell出现类似MicroPython v1.23.0 on 2024-...的提示说明MicroPython已经跑起来。在这里插入最经典的验证代码from machine import Pin from time import sleep led Pin(2, Pin.OUT) while True: led.value(1) sleep(0.5) led.value(0) sleep(0.5)如果板载LED以0.5秒间隔闪烁环境就完全通了。这是第一步也是通向后面所有代码的地基。4. 第一行代码从点亮LED开始再到控制电机“第一行代码”听起来应该是打印Hello World但在嵌入式里真正有意义的第一行代码是操作引脚。因为打印Hello World只能说明串口通不能说明你能控制硬件。控制LED才是硬件开发的“Hello World”。4.1 为什么用MicroPython而不是Cmicroduck这类项目的优势之一就是用MicroPython把硬件控制封装得像Python一样。你不用关心寄存器、中断向量、链接脚本直接引入machine库就能操作引脚。对Python开发者来说上手成本几乎为零。有人会怀疑Python太慢但ESP32-S3双核240MHz跑MicroPython完成鸭子运动、传感器读取、WiFi通信这些事情完全够用。我们不写操作系统不做视频解码不需要C语言的极致性能。开发速度才是个人项目最稀缺的资源这一点MicroPython完胜。4.2 点灯代码的逐行拆解上面那段点灯代码拆开解释from machine import Pin导入Pin类它能控制芯片的GPIO引脚。Pin(2, Pin.OUT)把编号为2的引脚设置为输出模式。不同开发板板载LED引脚不同常见是GPIO2但也有GPIO48或GPIO15的具体看你的板子丝印。led.value(1)把引脚拉到高电平LED点亮。sleep(0.5)暂停0.5秒。不暂停的话LED闪烁太快肉眼看不到状态变化。这一步背后是“数字输出”的概念一个引脚只有高电平和低电平两种状态。理解了数字输出后面的PWM只是在输出高/低电平的时间比例上做文章。4.3 从点灯到驱动电机GPIO与PWM的关系点灯是纯数字输出但电机调速需要PWM。所谓PWM就是在一个固定频率下控制高电平所占的比例即占空比从而控制电机的平均电压。0%占空比是全停50%是半速100%是全速。我的两个N20电机分别接在DRV8833模块的AIN1/AIN2对应GPIO32/GPIO33BIN1/BIN2对应GPIO25/GPIO26。DRV8833的逻辑是当一个输入为高、另一个输入为低时电机正向转反过来则反向转两个都为低时电机停止。如果同时为高电机会刹车。写一个简单的电机控制函数from machine import Pin, PWM left_fwd PWM(Pin(32), freq1000) left_rev PWM(Pin(33), freq1000) right_fwd PWM(Pin(25), freq1000) right_rev PWM(Pin(26), freq1000) def motor_left(speed): if speed 0: left_fwd.duty_u16(speed) left_rev.duty_u16(0) else: left_fwd.duty_u16(0) left_rev.duty_u16(-speed) def motor_right(speed): if speed 0: right_fwd.duty_u16(speed) right_rev.duty_u16(0) else: right_fwd.duty_u16(0) right_rev.duty_u16(-speed) motor_left(40000) motor_right(40000)注意duty_u16的取值范围是0-65535对应0-100%占空比。40000大概是61%对N20来说已经能平稳转动了。跑这段代码前要确认电机接线没有接反否则两条代码下去鸭子可能原地转圈而不是前进。5. 让MicroDuck真正动起来巡线逻辑与手动遥控控制函数有了接下来要让鸭子有“行为”。这个阶段我不建议写很复杂的自动算法两条路选一条要么做循迹要么做手动遥控都能让你立刻获得“我做的鸭子听我指挥”的反馈。5.1 循迹方案两个传感器就够了市面上电子积木的巡线传感器模块输出是数字量即检测到黑线输出高或低。我的做法是装两个模块左右各一个间距略小于黑胶带的宽度。这样鸭子骑在黑线上时两个传感器都在黑线内或者都压到黑线外通过不一致时纠偏。接线方式简单VCC接3.3VGND接GNDOUT分别接两个GPIO输入引脚。这里提醒一下买模块时要买带比较器输出的数字模块不要买那种直接输出电压模拟量的光敏电阻模块否则你又要写阈值比较逻辑。5.2 循迹状态机逻辑用简单的状态判断from machine import Pin left_sensor Pin(27, Pin.IN) right_sensor Pin(14, Pin.IN) def line_follow(): left left_sensor.value() right right_sensor.value() if left 1 and right 1: motor_left(30000) motor_right(30000) elif left 0 and right 1: motor_left(0) motor_right(30000) elif left 1 and right 0: motor_left(30000) motor_right(0) else: motor_left(20000) motor_right(-20000)这个逻辑可以理解为两个都看到线直行只有左边看到线说明车头偏右了左轮减速纠偏都看不见线说明车头偏离路线原地掉头找线。这套代码不完美但足够建立起“传感器输入 - 决策 - 电机输出”的完整闭环比纠结于调PID参数更能建立直觉。5.3 手动遥控用WebREPL或网页按钮如果不想折腾地面黑线也可以走遥控路线。最简单的办法是直接用Thonny底部的Shell在函数里输入motor_left(50000)、motor_right(0)这样实时控制。但这样只能键盘操作不够直观。稍微进阶一点用ESP32自带的WiFi做网页遥控。核心代码思路是import network import socket wlan network.WLAN(network.STA_IF) wlan.active(True) wlan.connect(你的WiFi, 密码) import time while not wlan.isconnected(): time.sleep(0.5) print(wlan.ifconfig())然后创建一个TCP socket监听80端口浏览器访问时返回一个带方向按钮的网页收到方向指令就调用motor_left/motor_right。这样手机和电脑都能控制鸭子。这一步的价值在于它把microduck从“一个离线玩具”变成“一个物联网设备”。后续你想接入语音控制或微信小程序底层走的都是这套socket通信逻辑只是换了个前端壳子。6. 实测中踩过的坑供电不足、引脚冲突和电机反转硬件DIY最大的学习来源不是教程而是排障。我的microduck从硬件选型到跑通第一行代码反复栽在几个老问题上这里完整复盘一遍。6.1 现象一USB连接后板子反复重启这是我遇到的第一个问题。插着USB运行点灯程序程序跑几秒后板子重启循环往复。起初我以为是固件问题重新烧固件也没解决。后来用万用表量电压才明白电机启动瞬间把USB供电的电压拉低了ESP32瞬间欠压于是重启。解决办法是把电机供电和主控供电彻底分开我从18650电池的7.4V取电给DRV8833再从电池端并联一个降压模块降到5V给ESP32的5V引脚供电USB线只用来传代码。同时注意共地即电池负极和ESP32的GND用杜邦线相连。从这之后就没再出现过随机重启。6.2 现象二电机转但鸭子不走直线两个N20电机看起来一样实际转速总有微小差异而且两个轮子的摩擦力也不一样。刚组装完成通电直行时鸭子总往右偏。我一开始怀疑是电机问题逐个测试才发现左边电机转速确实比右边慢一些。解决办法有两种一是在结构上给左轮增加一点摩擦或调整重心治标不治本二是在代码里给左右轮设定不同的PWM占空比比如左轮37000、右轮34000实测能走得很直。这个修正值不是固定的不同电压和地面条件下会变化所以我把纠偏参数单独做成一个变量放在代码开头方便随时调整。6.3 现象三接上传感器后数值飘忽不定起初DHT11温湿度读出来数值异常跳变排查后发现是传感器线太长和电机电源线捆在一起电机转动时产生电磁干扰把信号线上的电平搞乱了。把传感器信号线换成短线并和电源线分开走线之后读数立刻稳定。另外一个容易被忽略的点是传感器共地。如果传感器用独立电源而不和主控共地信号线参考地不一致读出来的数据必然乱跳。6.4 结构件固定与重心调整电机固定是新手最头疼的问题之一。N20电机没有现成的螺丝孔位我是用电烙铁在ABS板鸭身底座上烫出两个凹槽把电机卡进去再用热熔胶固定。注意热熔胶不要滴到电机轴和减速箱缝隙里否则会卡死。重心尽量放在鸭子身体中后部也就是驱动轮的正上方。我一开始把电池放在鸭头位置结果电机的前轮被压得抬不起来只能原地打转。调整电池位置后运行轨迹立刻正常。如果你的鸭子空间有限可以用双面胶把电池竖着贴在电机上方效果也还行。7. 给路线图做个优先级排序先能跑再会玩最后才有智能整个microduck项目如果从头规划我的建议是把它拆成三个里程碑按顺序完成每个里程碑有明确退出标准。这样不会在中途迷失方向也能在每一步获得正反馈。7.1 里程碑一硬件能通电代码能控制这个阶段目标是让LED闪烁、串口输出日志、电机按指令转动。硬件只需要主控、电机驱动、电机不需要任何传感器。检验标准是你拿着手机或电脑能控制鸭子前进、后退、左右转。这个里程碑的意义在于验证所有基础链路。如果这个阶段出了问题不要往后面推进先修到稳定再说。很多项目烂尾就是因为这第一步没走稳就急着加功能。7.2 里程碑二给鸭子加一个“新器官”第二个里程碑是加入至少一个传感器并建立反馈闭环。可以是温度检测后蜂鸣器报警可以是超声波避障也可以是循迹。这个阶段的重点不是传感器的数量而是让你理解Input-Process-Output的循环。我是选了DHT11温湿度传感器把数据打印到OLED小屏幕上再把读数通过MQTT发到手机。如果你选超声波避障建议先写出“测量一次距离并在Shell打印”的程序确认读数可靠再写避障逻辑。避开一个常见误区很多人一上来就写完整避障算法结果发现传感器读数本身就飘最后连问题出在哪都找不到。7.3 里程碑三联网与远程控制最后一个里程碑是接入WiFi实现远程通信。除了前面提到的网页遥控更推荐MQTT协议。用公共MQTT服务器或自己局域网搭建一个鸭子作为客户端订阅控制主题、发布传感器数据手机上的MQTT调试软件直接控制。相比网页socketMQTT的架构更接近真实物联网产品学到的东西也更通用。这一步完成后你的microduck就已经不是玩具了而是一个具备“感知-决策-执行-通信”四大能力的微型机器人终端。之后再按兴趣扩展语音交互、人脸识别或者太阳能充电都不会有任何系统性障碍。8. 关于路线图顺序的一点个人建议如果让我重新做一遍我不会急着买一堆模块而是会严格按“先点灯、再电机、再传感器、再联网”这个顺序走。每个阶段之间都留出时间把对应的原理弄清楚比如PWM占空比、H桥逻辑、GPIO上下拉这些概念不搞懂后面接再多模块也只是在模仿别人代码。还有一个实际经验所有代码都写在同一个main.py里用Thonny保存到开发板根目录。MicroPython上电后会自动执行main.py这样鸭子就实现了“脱离电脑独立运行”。调试时我习惯在代码顶部加一个debug开关设为True时打印详细日志设为False时安静运行这样后续接电池跑鸭子时不会被串口日志拖慢执行速度。最后不建议买太便宜的无牌扩展板。这里不是贵就好而是那些两三块钱的模块引脚丝印经常标错国内贴片厂批次不同实际引脚和文档对不上排查起来非常痛苦。多花几块钱买有正规厂商标注的模块省下的时间远远值回差价。我的microduck现在放在书桌角落偶尔碰上不写代码的晚上给它换了块满电电池在客厅地板上溜几圈。那个过程会让人很清楚地感受到一个想法从选型、接线、写代码到跑起来其实不需要多深的理论只需要一步一步把每件事做扎实。希望这份路线图也能让你少走几段弯路。
返回列表