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

资讯详情

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

微控制器入门首选:Raspberry Pi Pico 与 MicroPython 实战指南

微控制器入门首选:Raspberry Pi Pico 与 MicroPython 实战指南 1. 为什么第一课我选 Raspberry Pi Pico 和 MicroPython1.1 这块板子到底能干什么Raspberry Pi Pico 是树莓派基金会推出的微控制器开发板和你们熟悉的树莓派电脑不一样它不跑 Linux不能接显示器敲键盘它更像一块“单片机”专门用来控制硬件点亮 LED、读取传感器、驱动电机、做小仪表盘这些活它都能干。我见过很多人第一节课纠结“我该买 Arduino 还是 STM32 还是 ESP32”最后买了板子结果刷固件、配环境、调编译参数就折腾了两周。Pico 的定位很明确上手门槛极低、资料极其丰富、MicroPython 固件一烧就能跑你只需要一根 USB 线就能在 10 分钟内看到板载 LED 闪烁。对入门者来说这种“看得见的正反馈”比什么都重要。这块板子用的是 RP2040 芯片双核 Cortex-M0主频 133MHz内存 264KBFlash 2MB性能在同类开发板里不算顶级但绝对够用。重要的是它的 GPIO 引出了 26 个多功能引脚支持 ADC、PWM、I2C、SPI、UART 等常用外设配合 MicroPython 能从 0 开始覆盖绝大多数入门项目。加上 Raspberry Pi 的社区积累很多问题一搜就有答案学习成本非常低。1.2 MicroPython 到底解决了什么问题传统做单片机的路径是 C/C 加 Keil、STM32CubeMX配置寄存器、管时钟树、处理中断光是工程模板就够让人头疼。MicroPython 直接把这层全抹掉了。它是 Python 3 语法在嵌入式环境的精简实现解析执行方式有点像“解释器跑在板子上”你写的每一行代码都会被实时解析成底层操作所以你可以一条一条执行一条一条看效果开发体验非常像在电脑上写 Python 脚本。这就解决了入门最大的痛点你在接触硬件设计之前不需要先变成编译器和链接器的专家。我之前带过几个零基础的朋友做小项目用 C 语言光“把点灯程序烧进去”就卡了两小时换成 MicroPython 后他们在五分钟内就看到了自己的第一颗 LED 发光那个兴奋感是实实在在的。MicroPython 的另一个优势是交互式环境。你在终端里输入from machine import Pin设备立即响应输入pin.on()LED 立刻点亮。这种“所见即所得”的反馈方式特别适合验证想法、排查问题也让学习曲线变得很缓。对于只想快速实现功能、不被底层寄存器细节拖累的人来说MicroPython 是当前最友好的选择之一。1.3 哪些人适合看这篇入门课这篇内容适合完全没碰过单片机的小白也适合有 Arduino 经验但想换一个更快迭代流程的爱好者。如果你想做 IoT 传感器节点、桌面小摆件、实验室数据采集器或者只是想给孩子做个类似智能小夜灯的东西MicroPython 都能快速实现。如果你未来要搞高性能实时控制比如飞控算法、音视频采集、极其严苛的时序逻辑那我建议后续还是要学一学 C 语言但第一课用 MicroPython 建立完整硬件思维框架完全没有任何问题。语言只是工具关键是理解引脚、电压、电流、通信协议、传感器数据怎么流动——这些概念学会了用什么语言都只是习惯问题。2. 动手前的准备硬件、固件与开发环境2.1 你需要准备的硬件其实很少Raspberry Pi Pico 的开发成本很低入门需要的物料清单非常精简物料数量说明Raspberry Pi Pico 开发板1块普通版或带排针的 H 版均可Micro USB 数据线1根注意必须买“数据传输线”很多充电线只能供电不能传数据面包板1块用于插电路免焊接LED 灯珠若干3-5个颜色随意选红色绿色最直观330Ω 或 220Ω 电阻若干限流保护 LED别直接用 GPIO 直连 LED轻触开关2个用于按键输入实验10kΩ 电阻可选2个需要做分压或下拉实验时用杜邦线若干公对公连接开发板和面包板注意一个容易忽略的点Micro USB 线一定要选能传数据的否则板子通电了电脑设备管理器里却死活不出现串口白折腾半小时。我建议买板子的时候顺手买三根短线标注清楚是数据线省下后续的排查烦恼。如果你后续想做环境温度监测类项目可以买一个 DHT11 或 DHT22 温湿度传感器大概十几块钱。不过这篇先用板载传感器和光敏电阻演示暂且不需要额外加钱。2.2 MicroPython 固件下载与烧录实操市面上的 Pico 出厂时并没有预装任何固件它里面只是一颗空芯片所以要做的第一件事是下载 MicroPython 固件并烧录进去。打开 Raspberry Pi 官方网站在 MicroPython 区域找到 “Raspberry Pi Pico” 对应的.uf2文件下载最新稳定版即可。文件名的命名类似rp2-pico-20240602-v1.23.0.uf2这个.uf2就是树莓派专用的固件格式特点是烧录方式极其简单不需要额外烧录器。如果你遇到下载慢的情况可以从国内镜像站下载但一定要核对文件大小和校验值避免下载到损坏文件。烧录步骤大概分三步用 Micro USB 线把 Pico 连接到电脑。按住 Pico 板子上的 BOOTSEL 按键不放然后再插入 USB 线等待电脑弹出一个名为RPI-RP2的 U 盘。如果没弹出可能是线的问题或者你按住 BOOTSEL 的时间不够长。把下载好的.uf2固件文件直接拖进这个 U 盘等待拷贝完成板子会自动重启并退出 U 盘模式。此时 MicroPython 固件已经烧录完成。这个原理其实隐藏着一个关键设计RP2040 芯片内部有一段不可擦除的引导程序ROM Bootloader只要按住 BOOTSEL 再上电芯片就会以 USB 大容量存储模式出现用户只需要把固件“扔”进 U 盘芯片就会把固件写入 Flash。整个过程 10 秒比传统 ARM 用 J-Link 烧录爽太多了。烧录完成后你的 Pico 在 Windows 设备管理器里会多出一个串口通常叫USB Serial Device (COMx)这个串口就是以后运行 MicroPython 代码和查看打印信息用的通道。2.3 开发环境配置我为什么推荐 ThonnyMicroPython 的官方推荐 IDE 是 Thonny一个轻量级 Python IDE可以直接管理解释器、上传代码、运行程序、查看串口输出。它的安装包有 Windows、macOS、Linux 全平台版本安装完成后需要手动配置一下解释器打开 Thonny点击右下角的解释器位置。选择“MicroPython (Raspberry Pi Pico)”。端口处选择刚才设备管理器里看到的 COM 口。配置好后点一下绿色的“运行”按钮Thonny 会先把当前文件发送到 Pico然后执行所有print输出都会出现在下方 Shell 窗口里。这比写 C 语言时要反复“编译-烧录-串口助手调试”的流程舒服多了特别适合快速验证想法。如果 Thonny 提示找不到端口先拔插 USB 线再检查数据线是否可传输数据。如果系统里装过 Arduino IDE 或其它串口工具也可能会出现端口占用直接关闭其他软件再试。还有一点Windows 升级或驱动问题可能导致 Pico 被识别为USB Composite Device而不是串口出现这种情况时更新主板驱动或换一个 USB 口基本能解决。3. MicroPython 核心基础从闪烁 LED 到读取模拟信号3.1 用 10 行代码点亮第一颗 LED学任何单片机点灯都是第一座里程碑。Pico 上有一颗绿色的板载 LED连接到 GPIO25 引脚第一课我们从它开始。from machine import Pin import time led Pin(25, Pin.OUT) while True: led.toggle() time.sleep(0.5)把这段代码粘贴到 Thonny点运行你应该看到板载 LED 以 0.5 秒间隔交替闪烁。这里有个细节Pin(25, Pin.OUT)表示把 25 号引脚配置成输出模式led.toggle()会把引脚电平翻转也就是从高电平变低电平、低电平变高电平因此不需要写led.on()和led.off()两行就能实现闪烁效果。你可能会问为什么点灯还要加time.sleep(0.5)因为 MicroPython 是顺序执行如果没有延时代码会在微秒级别反复翻转电平肉眼看到的只会是一颗亮度很暗的常亮 LED根本没有闪烁效果。这也是硬件代码和普通 Web 开发最大的差异你必须理解“时间是程序的一部分”。想控制外部 LED 的话把 LED 长脚串一个 330Ω 电阻接到 GP15 引脚短脚接 GND代码里把25改成15即可。GPIO 输出高电平时 LED 亮低电平时灭这个逻辑先记下来后面的项目都会用到。3.2 按键输入与上拉电阻的坑看完了输出再看输入。按键读取是单片机交互的基础但第一次接触按键的人很容易踩中“引脚悬空”的坑。先看代码from machine import Pin import time button Pin(14, Pin.IN, Pin.PULL_UP) led Pin(25, Pin.OUT) while True: if button.value() 0: led.value(1) else: led.value(0) time.sleep(0.05)接线方式轻触开关一侧接 GP14 引脚另一侧接 GND不需要额外上拉电阻因为Pin.PULL_UP已经启用了芯片内部上拉。电路上电后GP14 默认被内部电阻拉到 3.3V 高电平button.value()返回 1按下按键后GP14 和 GND 短路引脚被拉到低电平返回 0。这里最关键的一点是为什么不能用“不按高电平、按下低电平”这种思路因为如果读取方式不对某个引脚悬空时会收到空间电磁干扰数值随机跳动程序会误触发。上拉电阻提供了一个确定的默认状态让引脚不会处于“漂浮”状态这是数字电路里非常基础也非常重要的设计。按键还有一个必学知识点抖动。机械开关按下和松开的瞬间金属触点会弹跳几次导致电平在几毫秒内快速变 0、1、0、1。如果程序在做一个计数器按一次键可能会加好几次数。解决抖动的常见方案是在代码里做短暂延时例如检测到低电平后先time.sleep(0.02)再确认一次状态。传感器项目里不一定每次都要消抖但做计数器、按键菜单时一定要加上。3.3 PWM 调光从亮灭控制到亮度控制GPIO 能输出的只有 0 和 3.3V但很多时候我们需要中间的亮度、速度或力度这就轮到 PWM脉冲宽度调制登场了。原理简单说就是让引脚在一段时间内以极快速度交替输出高电平和低电平人眼察觉不到闪烁只看到平均电压变化。from machine import Pin, PWM import time pwm PWM(Pin(15, Pin.OUT), freq1000) pwm.duty_u16(0) for i in range(0, 65536, 2000): pwm.duty_u16(i) time.sleep(0.05)上面的代码会把 GP15 上的 LED 亮度从 0 逐步提升到最大然后再循环。freq1000表示 PWM 频率为 1kHz也就是每秒翻转 1000 个周期duty_u16(i)里的数值范围是 0 到 65535对应占空比 0% 到 100%你传 32768 就相当于 50% 占空比。实验时如果发现亮度变化不均匀不要怀疑代码这正是 PWM 的典型特性LED 感知亮度与占空比之间的关系接近对数所以最好把亮度曲线做一下 Gamma 校正。入门阶段你可以不处理但如果你要做呼吸灯建议搜索一下“PWM gamma 校正”的资料效果会精致很多。一个我踩过的坑MicroPython 里同一引脚如果要切换使用必须先执行PWM对象的deinit()否则下次Pin输出会失效。比如你先定义了pwm PWM(Pin(15))做调光接着想直接用led Pin(15, Pin.OUT)点灯大概率不亮这就是 PWM 占用没有释放导致的。遇到这种情况调用pwm.deinit()之后再配置Pin就好。3.4 ADC 采集让 Pico 感知模拟世界数字信号只有 0 和 1但真实世界的声音、光线、温度都是连续变化的模拟量。微控制器内部集成了 ADC模数转换器可以把 0 到 3.3V 的电压值转换成数字信号。Pico 上有 ADC 功能的引脚是 GP26、GP27、GP28 和 GP29另外内部还有一个专门连接板载温度传感器的 ADC4。from machine import Pin, ADC import time adc ADC(Pin(26)) reference 3.3 while True: value adc.read_u16() voltage value * reference / 65535 print(Raw:, value, Voltage:, voltage, V) time.sleep(1)接线方法把光敏电阻的一端接到 3.3V另一端接 GP26同时在 GP26 和 GND 之间接一个 10kΩ 电阻这样 GP26 上的电压会随环境光线变化而变化。read_u16()返回 0~65535 之间的数值0 代表 0V65535 代表 3.3V从 0 到 3.3V 的分辨率约为 50 微伏。买 ADC 时要注意Pico 的 ADC 参考电压是 3.3V也就是说你最高只能测 3.3V。想测更高电压必须用分压电阻不能直接怼到引脚上否则可能烧毁芯片。另外ADC 引脚附近如果有大电流设备比如电机、继电器测量值会有波动可以考虑串联一个小电阻或用滤波电容但入门阶段先记住“参考地要干净”就够了。4. 项目实践做一个温度与光线双通道监测器4.1 项目需求与硬件连接前面几个基础实验玩透了以后我们来做一个有点实用性的小项目环境温度和光线监测器。它能实时读取板载温度传感器的温度值同时通过光敏电阻读取环境光强度在 Shell 窗口里每秒打印一行数据。这套方案不需要额外买传感器只要一块 Pico 加一个光敏电阻和电阻就能完成非常适合新手在原有点灯基础上进阶。硬件连接表如下组件引脚说明板载温度传感器ADC4无需接线直接读取光敏电阻3.3V 与 GP26 之间串联到 3.3V一端接 GP2610kΩ 电阻GP26 到 GND与光敏电阻组成分压电路如果你手头没有光敏电阻也可以把这个项目简化为单个温度传感器监测器代码里去掉光照部分即可。但建议光敏电阻一定要买几个因为后续很多创意项目都会用到环境光判断逻辑而且价格才几毛钱一个。4.2 代码实现与关键解释将以下代码完整粘贴到 Thonnyfrom machine import Pin, ADC import time ldr ADC(Pin(26)) temp_sensor ADC(4) led Pin(25, Pin.OUT) REF_VOLTAGE 3.3 ADC_FULL_SCALE 65535 def read_temperature(): value temp_sensor.read_u16() volt value * REF_VOLTAGE / ADC_FULL_SCALE temp_c 27 - (volt - 0.706) / 0.001721 return temp_c, volt def read_light(): raw ldr.read_u16() return raw while True: temp, temp_voltage read_temperature() light read_light() print(Temperature: {:.2f} C, Voltage: {:.2f} V, Light raw: {}.format(temp, temp_voltage, light)) if light 10000: led.on() else: led.off() time.sleep(1)代码里有几个值得说透的点板载温度传感器本质上是一个利用二极管 PN 结电压随温度变化的模拟传感器它的电压与温度近似成线性关系。RP2040 的参考手册给出公式温度 27 - (电压 - 0.706) / 0.001721。0.706V 是 27°C 时的典型电压0.001721 是温度系数也就是每升高 1°C电压降低约 1.721mV。代码直接套用这个公式即可误差通常在 ±2°C 以内不需要额外校准。光敏电阻和 10kΩ 电阻组成了一个分压电路。环境光线越强光敏电阻阻值越小GP26 上的分压电压就越高light数值也就越大。反之环境变暗时数值变小。不同型号的光敏电阻基础阻值不同从几百欧到几十千欧都有所以阈值不能照搬别人的我一般在项目里先打印一组“明亮”和“昏暗”状态下的读数再取中间值作为阈值。代码里加了一个“光照过低时点亮板载 LED”的逻辑这其实就是最简单的自动夜灯。把它放在环境监测项目里是想让你意识到任何传感器数据本身没有意义只有结合业务逻辑后才有价值。你可以把 LED 替换成一个继电器再控制一个 220V 的小台灯就变成了一个真正能用的自动夜灯但这一步涉及强电入门阶段先不要碰。4.3 运行验证与数据解读点运行后Shell 窗口应该每隔一秒输出一行数据。用手机闪光灯照一下光敏电阻Light raw数值会明显升高用嘴哈一哈芯片背面或者把板子靠近温暖的水杯温度数值也会缓慢爬升。看到这两个变化说明整个链路已经打通了。有个比较常见的现象是刚烧完程序时温度读数可能偏高比如 30 多度。这不是传感器坏了而是板载 ADC4 紧挨着 CPU芯片运行时会自身发热温度传感器测到的是芯片温度而不是空气温度。想要精确测环境温度建议外接 DHT11 或 DS18B20 这种独立传感器这个项目只是为了让你理解 ADC 和传感器数据读取流程。数据打印频率也可以根据场景调整。比如你要长期监测室内温度每 1 秒打印一次完全没必要后期可以考虑接入 DS3231 时钟模块做成每天整点记录一次的温湿度记录仪那才是真正的长期项目。我把完整代码保存在 Pico 板载 Flash 里后拔出 USB 线重新上电程序会自动运行。Thonny 里有个小技巧保存文件时文件名必须设为main.pyMicroPython 启动时才会自动执行这个文件。之前我随手存成test.py结果每次上电都不跑后来才明白这个命名规则。5. 常见问题与排查技巧实录5.1 串口无法识别 / 板子不亮很多新手第一次插上 Pico发现电脑毫无反应或者设备管理器里没有串口。先别急着退货按顺序排查检查数据线。这是出现频率最高的原因很多 USB 线只有电源线没有信号线电脑检测不到设备。换一根确定能传数据的线问题立刻解决。检查驱动。正常插入后系统应该自动识别如果识别成未知设备更新一下电脑的 USB 控制器驱动或者换一个 USB 口前置 USB 口有时供电不稳定。按住 BOOTSEL 再插入 USB看会不会出现RPI-RP2盘符。如果能出现说明芯片没坏只是 MicroPython 固件有问题如果连盘符都没有那板子可能真的没进入下载模式或者硬件损坏。我自己遇到过一个特别迷的情况板子插了一晚上第二天突然怎么插都不识别。最后发现是 USB 线接口松了重新插紧后恢复正常。所以物理连接永远排在第一位。5.2 固件烧录失败 / BOOTSEL 模式进不去把.uf2拖进RPI-RP2盘符后盘符过一会儿自动消失这是正常现象。但如果拖进去后盘符一直存在文件好像也拷贝成功了板子却重启不了很可能是固件文件损坏或者下载不完整。重新下载一次核对文件大小是否为 200KB 左右再刷一遍。另外如果你的 Pico 板子上已经跑着 MicroPython 程序而且程序里使用了while True死循环它会在上电瞬间抢占了 USB 通信导致你按 BOOTSEL 也没反应。解决办法是按住 BOOTSEL 不放插入 USB 线后至少等 2-3 秒再松开确保引导程序接管了 USB 口。还有一个小技巧如果代码里不小心把 Pico 的 USB 串口给禁用了比如对machine.UART(0)做了奇怪设置导致 Thonny 连不上不必惊慌。按住 BOOTSEL 重新烧录固件即可这是一个万能恢复方法比 STM32 的串口恢复模式简单太多了。5.3 引脚冲突、程序跑飞与复位MicroPython 里引脚复用错误很常见。我刚学的时候经常把 PWM 引脚误加到 ADC 引脚上或者一个引脚既想接 LED 又想接按键结果程序行为完全混乱。Pico 上有几个引脚要注意GP0 和 GP1 同时连接在板载 Flash 上一般不要用作普通 IOGP24 和 GP25 分别连接板载 SPI Flash 和板载 LEDGP25 可以正常点灯GP24 最好别用。程序“跑飞”通常不是芯片真的崩溃而是死循环里没有延时函数导致程序占用全部 CPUUSB 通信卡顿甚至断开。比如while True: pass空转会让 RP2040 的 USB 接口响应变慢Thonny 按停止键半天都没反应。碰到这种情况按一下板子上的 RESET 按钮就能解决。在开发阶段建议每个循环里都加一个time.sleep(0.01)以上既是消抖也是给系统留出喘息的窗口。Thonny 里如果程序无法停止可以试着点击“停止/重启后端进程”按钮或者直接拔出 USB 线重新插比强行关 IDE 更有效。5.4 关于 MicroPython 版本、USB Host 固件与其它单片机最近社区里关于“支持 USB Host 的 MicroPython 固件”讨论很多。所谓 USB Host就是让 Pico 反向去读取其他 USB 设备比如接一个 USB 键盘、U 盘或者 USB 鼠标。这不是官方标准固件的功能社区里一些编译好的 fork 版本能提供有限支持但我在实际测试中发现Pico 的硬件 USB 资源有限部分 USB 设备兼容性并不理想更适合做一个“能读 U 盘的数据记录器”之类的实验项目。如果你入门阶段看到这玩意建议先收藏不做把基础打好再折腾。下载 MicroPython 固件时也要留意版本差异Pico 和 Pico W 的固件并不完全一样Pico W 因为多了无线网卡芯片固件带 WiFi 支持如果你买的是普通 Pico不要刷 Pico W 的固件否则启动会异常。每次固件官网更新后都会同时给出标准版、Pico W 版以及带外设支持的版本选对型号再下载。再说说“支持 MicroPython 的单片机”这件事。不只是 Pico目前 ESP32、ESP8266、RP2040、部分 STM32、K210 等芯片都有社区移植版 MicroPython。如果你做物联网项目ESP32 的 WiFi 和蓝牙能力比 Pico 强如果你做 USB 外设类项目Pico 的 USB 控制器更灵活如果追求性能和生态STM32 也值得了解。我个人的建议是入门首选仍然 Pico因为它的 USB 烧录方式和 MicroPython 官方支持最省心避开了 ESP32 串口驱动、模组供电这些额外变量。6. 从点亮一颗 LED 到构建完整项目的路径建议到这里你已经跑通了 GPIO 输出、按键输入、PWM 调光、ADC 采集和一个小型监测项目。这些知识其实已经覆盖了 MicroPython 微控制器开发的大部分基础后面的扩展基本都是在这几个能力上叠维度。如果你沿着这个方向继续走我建议按顺序做下面三件事把监测器升级成带 OLED 屏幕的桌面状态屏。使用 I2C 接口的 SSD1306 OLED学会SoftI2C和屏幕驱动把温湿度、亮度直接显示在屏幕上。这一步会帮你建立“传感器 - 数据处理 - 输出展示”的完整闭环。接入 WiFi 模块无论是 Pico W 还是外接 ESP-01S把数据上传到局域网内的 MQTT broker然后用手机 App 查看。你会接触到网络协议、数据格式和异步通信难度增加但收获也最大。回看之前写的代码重构工程结构。把每个传感器的驱动拆成独立文件抽离配置文件编写异常处理逻辑。很多人学了半年还在一个文件里堆代码其实 MicroPython 也支持模块化组织越早建立工程思维后续复杂项目越不容易翻车。最后分享一个我个人的实操心得不要急着把所有示例代码都跑一遍而是挑一个和实际生活相关的需求比如“给阳台植物做一个自动浇水提醒器”然后围绕这个需求去查文档、接线、写代码、调试。例子小但它是你自己的东西遇到问题时的记忆效果比跑 20 个教程里的例程强得多。Pico 和 MicroPython 的优势就在于反馈即时、试错成本低你可以大胆改参数、乱接线、看现象、再修正这种探索过程才是硬件开发真正的乐趣所在。
返回列表