FEATURED · 精选文章

MicroPython实战:Raspberry Pi Pico从GPIO到交通灯项目入门

发布时间 / 2026/9/12 16:26:20
来源 / 创域科博编辑部
栏目 / 资讯中心
MicroPython实战:Raspberry Pi Pico从GPIO到交通灯项目入门 如果你刚拿到一块 Raspberry Pi Pico想立刻动手做点东西又不想一开始就跟寄存器、数据手册死磕那 MicroPython 基本是让你最快看到成果的一条路。Pico 这块板子在国内外的创客圈子里火了好几年原因就一个字便宜、够用、资料多。板子几十块钱一条 USB 线就能烧录和调试再装一个 Thonny 编辑器十分钟内点亮板载 LED 完全不是问题。这篇文章是 Pico 硬件开发的第一课面向完全没碰过单片机的小白也适合用过 Arduino、想换个更灵活玩法的朋友。我会从为什么选 Pico 讲起再到固件烧录、GPIO 控制、按键输入最后用一个模拟交通灯的小项目把所有知识点串起来。整个过程不涉及复杂的电路设计最多用几颗 LED 和一个按键所有例子都是我在实际调试中跑过的。你看完以后跟着步骤操作一遍基本就能摸清 MicroPython 开发的基本节奏了。1. 为什么第一块开发板选 Pico1.1 先看 RP2040 这颗芯片Raspberry Pi Pico 的核心是一颗名叫 RP2040 的芯片这是树莓派官方自己设计的 MCU双核 ARM Cortex-M0主频默认 133MHz可以超频到 250MHz 左右。这个性能放在 PC 上当然不值一提但在单片机里已经算不错的水平跑 MicroPython 完全绰绰有余。最让我满意的是它的引脚资源。RP2040 一共引出了 26 个 GPIO支持 ADC、PWM、I2C、SPI、UART 等常见通信协议。树莓派官方还给它加了一个非常独特的 PIO 外设翻译成大白话就是你可以自己编程定义引脚的行为做一些原本需要专用芯片才能完成的时序输出。入门阶段你用不到这个功能但知道有它在心里就有底后面想玩 WS2812 灯带、驱动舵机甚至模拟 VGA 信号都行。再聊价格。Pico 官方板常年售价在 4 美元左右国内零售也就三四十块。对比 Arduino Uno 和 STM32 开发板这个价格配上双核和 PIO性价比高得离谱。而且树莓派基金会为了教育市场写了大量官方文档和示例代码全部免费公开这对新手来说比任何参数都重要。1.2 为什么用 MicroPython而不是 C/C 或 Arduino单片机编程最常见的两条路是 C/C 和 Arduino 框架。C/C 性能最好贴近底层但对新手不友好光是搭建交叉编译环境、理解链接脚本、处理烧录工具链就能劝退不少人。Arduino 框架把 C 包装了一层做简单项目很方便可一旦遇到复杂的数据结构或异步逻辑写起来还是会束手束脚。MicroPython 则完全是另一种体验。它是 Python 3 的一个精简实现专门为微控制器设计。你可以直接在板子上打开一个交互式解释器REPL敲一行代码立刻看到结果不需要编译、不需要烧录错了就改改了再试整个过程就像在跟板子对话。Python 本身简洁易读有了列表、字典、类这些高级语法写复杂一点的逻辑比 C 语言省太多事了。有人担心 MicroPython 跑得慢实际用下来在 Pico 上做 LED 控制、传感器采集、小屏显示这类项目性能完全够。如果哪天项目对实时性要求极高比如做飞控、做电机闭环控制再切换到 C/C 也不迟。很多人的路线是先 MicroPython 快速验证方案确认可行性之后再用 C 重写两边的好处都占了。这里也回应一下热词里的“支持 micropython 的单片机”怎么选。MicroPython 官方支持的芯片平台很多比如 ESP32、ESP8266、STM32、nRF52840 等。选型时优先看两点一是 MicroPython 官方是否把该平台列为稳定支持二是板子本身的引脚和外设是否满足你未来一两年的项目需求。Pico 恰好是这两年社区支持最活跃、文档最齐全的选择所以我把它定位为第一块板子非常合适。2. 环境准备与固件烧录2.1 把 MicroPython 装进 PicoPico 出厂时是空芯片里面没有固件。所谓烧录固件就是把 MicroPython 解释器写进它的 Flash 存储器里之后板子才能解释执行 .py 脚本。先说怎么下载固件。直接搜“micropython download”进入官方下载页面在 Downloads 区域找到 “MicroPython for Raspberry Pi Pico” 或对应型号的链接下载后缀为 .uf2 的文件。建议选择带稳定版标签的版本别一上来就追 RC 版或 nightly 版入门阶段稳定第一。装固件的方法简单到难以置信先把 USB 线插到电脑上但先不要连接 Pico。用手按住 Pico 板子上的 BOOTSEL 按键保持按住不放。将 USB 线插入 Pico 的 micro USB 接口等待两三秒后松开 BOOTSEL 按键。电脑上会出现一个名为 “RPI-RP2” 的可移动磁盘。把下载好的 .uf2 文件直接拖进这个磁盘等它自动复制完成。复制完成后RPI-RP2 磁盘会自动消失Pico 自动重启固件就算装好了。整个过程和往 U 盘里拷贝文件一样不需要额外安装驱动不需要命令行操作这一点比 ESP32 需要按住 Boot 键再用串口工具烧录要省心得多。如果你按照步骤操作却没有出现 RPI-RP2 磁盘可以先换一根 USB 数据线试试。很多 USB 线只供电不能传数据坑了无数人。还有电脑的前置 USB 口有时供电不稳优先用主板后置接口。2.2 用 Thonny 做你的第一个开发环境固件装好之后还需要一个编辑器来写代码和与板子通信。市面上的选择很多Mu、VS Code 加插件都可以但我建议新手先从 Thonny 开始。Thonny 是一款专门为 Python 教学设计的 IDE界面极简但有一个功能对 Pico 开发来说太重要了它内置了对 MicroPython 的完整支持包括 REPL 终端、文件浏览器和固件烧录界面。也就是说你不需要单独装串口终端工具也不需要手动设置编译器所有操作都在一个窗口里完成。打开 Thonny点击右下角的解释器下拉框选择 “MicroPython (Raspberry Pi Pico)”它会自动检测连接到电脑的 Pico 并建立串口连接。连接成功后窗口底部会变成一个叫 Shell 的交互终端直接输入 help() 再回车板子会返回一段帮助信息。到这里你的开发环境就搭建完毕了。在 Shell 里输入print(Hello, Pico!)回车后立刻能看到输出。你第一次感受到“代码在硬件上运行”就是这个时候有点像当年第一次用命令行敲 hello world 的感觉。接下来写程序不需要新建文件再运行直接摆在 Shell 里临时验证就行想长期保存的代码可以创建一个 main.py 或者其它 .py 文件保存时选择“保存到 Raspberry Pi Pico”。2.3 认识 REPL 和 main.pyREPL 是 Read-Eval-Print Loop 的缩写意思是“读取—执行—打印—循环”。这是 MicroPython 开发里非常有用的工作方式你输入一行代码它立刻执行并返回结果再输入下一行。整个过程不需要编译也不需要有完整的大程序特别适合测试某个传感器模块的通信是否正常、某个引脚电平是否正确。REPL 有两个隐藏技能新手必须知道。第一个是按 CtrlD 软复位板子相当于让板子重新运行启动脚本第二个是按 CtrlC 中断当前正在运行的代码把控制权抢回 REPL。如果你的程序陷入死循环按钮被占住了CtrlC 就是你最好的逃生手段。而 main.py 是 Pico 上电后自动运行的脚本。你写好的项目代码只要保存为 main.py 放在板子根目录断电再上电它就会自动执行。这就有点像 Arduino 里的 setup 和 loop 流程只不过 MicroPython 把选择权交给你想要循环就自己写 while True。我的习惯是调试阶段用其它文件名比如 test_led.py跑通之后再把核心逻辑合并成 main.py 保存免得板子一上电就跑一个半成品打断调试思路。3. 从点亮 LED 开始认识硬件控制3.1 板载 LED 背后的 GPIO 逻辑Pico 的板子上有一颗用户可控制的 LED通常焊接在 GPIO25 这个引脚上。为什么是 25因为这个引脚和其它板载功能没有冲突拿来做一个指示灯最合适。GPIO 的中文全称是通用输入输出引脚你可以通过程序把它配置成输出模式让它输出高电平3.3V或低电平0V也可以配置成输入模式读取外部电路给它的电平状态。理解 GPIO 是理解所有单片机项目的基础LED 亮灭、按键检测、传感器读取本质上都是 GPIO 在干活。第一次点亮 LED 的完整代码就三行from machine import Pin led Pin(25, Pin.OUT) led.value(1)第一行从 machine 模块里导入 Pin 类。machine 模块是 MicroPython 里操作硬件的核心入口Pin、PWM、ADC、I2C、SPI 都在这个模块里。第二行创建了一个 Pin 对象参数 25 表示第 25 号引脚Pin.OUT 表示把它配置为输出模式。第三行给这个引脚输出高电平也就是 1LED 就亮了。如果你想让它灭掉执行led.value(0)就行。把这个过程放到 REPL 里你会发现可以反复改变 LED 的状态完全不需要重新烧录固件这就是交互式开发的好处。3.2 控制灯的三种基础玩法亮灭、闪烁、PWM呼吸从亮灭到闪烁只需要加一个延时函数。MicroPython 的 time 模块提供了 sleep 函数单位是秒from machine import Pin import time led Pin(25, Pin.OUT) while True: led.value(1) time.sleep(1) led.value(0) time.sleep(1)这段代码的逻辑非常直观点亮 1 秒熄灭 1 秒无限循环。while True循环是嵌入式开发里的常用写法因为程序一旦启动就不希望它退出必须一直循环执行。闪烁练熟之后可以试试 PWM 呼吸灯效果。PWM 的全称是脉冲宽度调制简单理解就是引脚在高电平和低电平之间快速切换通过调整高电平所占的时间比例让 LED 感受到的平均电压发生变化表现出来的效果就是亮度变化。MicroPython 里 PWM 的占空比范围是 0 到 655350 是全灭65535 是全亮。呼吸灯代码如下from machine import Pin, PWM import time pwm PWM(Pin(25)) pwm.freq(1000) while True: for duty in range(0, 65535, 100): pwm.duty_u16(duty) time.sleep_ms(1) for duty in range(65535, 0, -100): pwm.duty_u16(duty) time.sleep_ms(1)解释一下两个关键点。freq(1000)把 PWM 频率设为 1000Hz也就是每秒切换 1000 次这比人眼能感知的闪烁频率高很多所以看到的是平滑的明暗变化而不是闪光。duty_u16接受一个 0 到 65535 的数值来设置占空比两个 for 循环一个递增一个递减亮度就会慢慢由暗变亮再由亮变暗。为什么是 65535 而不是 100因为 MicroPython 在 RP2040 端口上把 PWM 分辨率定为 16 位对应 2 的 16 次方减一。你当然可以用duty_u16(32768)直接设一半亮度也可以用duty_ns按时间设置但 16 位占空比是最常见的方式。3.3 按键输入与按键消抖LED 是输出设备按键则是最典型的输入设备。Pico 的 GPIO 做输入检测时最常用的配置是启用内部上拉电阻也就是Pin.PULL_UP。上拉电阻的作用是把引脚在没有外部信号时默认拉到高电平这样按键一端接地、一端接引脚按下按键时引脚被拉到低电平松开时又恢复高电平。读取时value()返回 1 表示未按下返回 0 表示按下。很多新手在这里容易绕晕为什么按下反而是 0因为按键按下就是把引脚和 GND 接通了电压变成 0V自然就是低电平。按键还有一个绕不开的问题机械抖动。物理按键在按下和松开的瞬间触点会因弹片振动产生多次通断持续时间大概几毫秒到十几毫秒如果不处理程序可能一次按下触发好几次逻辑。最简单的消抖方式是在检测到电平变化后延时一小段时间再确认状态from machine import Pin import time btn Pin(14, Pin.IN, Pin.PULL_UP) while True: if btn.value() 0: time.sleep_ms(20) if btn.value() 0: print(Button pressed) while btn.value() 0: time.sleep_ms(10)这个代码做了两件事检测到按下后等待 20ms 再读一次确认还是低电平才判定为有效按下然后进入一个等待松开的循环防止按住期间反复触发。实际开发中按键消抖方案非常多有软件延时、定时器扫描、状态机等但入门阶段理解这个 20ms 确认再读的思路就够用了。4. 入门综合项目模拟交通信号灯4.1 项目需求与设计思路学会 LED、延时、按键之后就可以做一个稍微综合一点的小项目了。我这里选的是模拟交通信号灯三个 LED 分别代表红灯、黄灯、绿灯按正常交通灯的时序循环亮灭另外用一个按键实现“运行/暂停”切换。项目不大但把输出、延时、输入、逻辑判断全部串起来了。硬件清单如下Raspberry Pi Pico 一块红色 LED、黄色 LED、绿色 LED 各一颗220 欧姆电阻三个轻触按键一个面包板一块杜邦线若干接线方式元件正极引脚负极/GND 引脚红色 LEDGPIO 2220Ω 电阻 → GND黄色 LEDGPIO 3220Ω 电阻 → GND绿色 LEDGPIO 4220Ω 电阻 → GND按键一端GPIO 14另一端接 GND为什么每个 LED 都要串一个 220Ω 电阻LED 是电流型器件导通后的压降大概是 1.8V 到 2.2V而 Pico 的 GPIO 输出高电平是 3.3V。如果直接接电流会超过 LED 的最大额定值轻则过热重则烧掉引脚。串联电阻起限流作用按欧姆定律电阻两端电压约 1.5V电流约 7mA既能点亮 LED 又安全。按键为什么只接两根线因为启用了内部上拉电阻一端接 GPIO 14另一端接 GND。按下时 GPIO 读到低电平利用的是芯片内部的上拉不需要外部再接上拉电阻节省了元件和接线。4.2 完整代码实现与解释我先把完整代码贴出来再逐段分析。from machine import Pin import time red Pin(2, Pin.OUT) yellow Pin(3, Pin.OUT) green Pin(4, Pin.OUT) btn Pin(14, Pin.IN, Pin.PULL_UP) running True def traffic_cycle(): red.value(1) yellow.value(0) green.value(0) time.sleep(3) red.value(0) yellow.value(1) green.value(0) time.sleep(1) red.value(0) yellow.value(0) green.value(1) time.sleep(3) yellow.value(1) time.sleep(1) yellow.value(0) while True: if btn.value() 0: time.sleep_ms(20) if btn.value() 0: running not running while btn.value() 0: time.sleep_ms(10) if running: traffic_cycle()初始化部分和前文讲过的 LED、按键配置一模一样这里不再重复。running变量用来记录当前状态True 表示正常运行False 表示暂停。traffic_cycle()是核心逻辑它的执行顺序是红灯亮 3 秒黄灯亮 1 秒绿灯亮 3 秒最后黄灯再亮 1 秒。这样一轮下来刚好 8 秒对应真实交通灯常见的“红灯—红黄切换—绿灯—清空黄灯”时序。每一秒钟用什么灯亮、其它灯灭代码里写得很直白不用担心状态错乱。主循环里先检测按键这里沿用了上文的消抖逻辑。按下后把running取反同时用一个空循环等待按键松开。为什么要等待松开如果不等待按住按键期间 while True 会反复检测到按键按下导致状态来回切换实际体验就是按键没反应。加上等待松开的循环一次按下只触发一次切换。需要注意一点time.sleep(3)是阻塞式的在睡眠期间程序不做其它事情。这意味着按下暂停键后程序要等当前灯的状态执行完才能响应。比如红灯刚好亮了 2 秒时你按下按键它不会立刻暂停而是等红灯组 3 秒执行完才停下来。入门阶段这样处理没问题想真正做到随时响应需要引入定时器中断或非阻塞状态机那是后面课程的内容。4.3 运行调试与扩展建议代码写好后在 Thonny 里运行你会看到红黄绿三盏灯按 3-1-3-1 秒的节奏循环按一下按键会在当前循环结束后暂停再按一下继续。如果灯不亮或者按键没反应先检查接线尤其要看 LED 正负极是否接反按键是不是误接到了别的引脚。这个项目跑通之后你已经掌握了 MicroPython 开发的核心节奏初始化硬件、写主循环、用交互终端调试、再固化到 main.py。想继续扩展的话方向非常多加一个蜂鸣器红灯亮时发出提示音加一个数码管显示倒计时秒数改成行人过街按钮按下后红灯快速闪烁。这些扩展本质上都在考验你如何把新的外设接入同一套 GPIO 逻辑循环、延时、输入检测这些技能可以一直复用。5. 避坑指南新手常踩的坑与排查方法5.1 常见问题速查表我列一个这段时间带新手最常见的问题表格基本覆盖了入门阶段 90% 的翻车现场。问题现象可能原因解决方法电脑不识别 PicoUSB 线只能供电不能传数据换一根带数据传输的 USB 线没有出现 RPI-RP2 磁盘没有正确进入 bootloader拔掉 USB按住 BOOTSEL 再插入拖入 .uf2 后无反应文件下载不完整或型号不匹配重新去官方页面下对应型号的固件Thonny 连不上板子解释器配置不对或端口被占用检查右下角解释器是否选了 MicroPython (Raspberry Pi Pico)代码运行后灯不亮引脚号错误或正负极接反先用 REPL 敲machine.Pin(25).value(1)测试板载灯按键按了没反应接线错误或忘了启用 PULL_UP检查按键两端是不是接在 GPIO 和 GND上电后程序不自动运行没有保存为 main.py保存文件时选“保存到 Raspberry Pi Pico”文件名用 main.py程序跑飞后怎么停下来等待或重启浪费时间按 CtrlC 中断必要时拔线重插大部分问题都出在硬件连接和文件保存这两个环节代码本身的语法错误反而好解决因为 Thonny 会直接告诉你哪一行出了问题还高亮显示。5.2 我的几点调试心得实际调试过程中我养成了一些习惯对效率提升帮助非常大分享给你。第一先软件后硬件。遇到问题先别急着怀疑电路先在 REPL 里一个功能一个功能地测。比如按键没反应就用 REPL 打印btn.value()然后手动按下松开看返回值是不是从 1 变成 0。如果 REPL 里能读到状态变化说明硬件没问题问题一定在代码逻辑。第二用 print 当调试工具。MicroPython 的 print 输出会直接显示在 Thonny 的 Shell 里这是最朴素的断点调试。每进一个关键分支就 print 一条信息很快就能定位卡在哪一段逻辑。有几个新手死活找不到按键为什么没切换状态我让他在 if 里加个 print一运行就发现是消抖的判断条件写反了几秒钟就解决了问题。第三看原理图比看板子照片靠谱。Pico 的引脚位置和 GPIO 编号不是一一对应的GPIO 2 不一定是物理上第二排的第二个脚。官方提供的 pinout 图标注得非常清楚接线之前先对着图核对编号能避免很多低级错误。这个习惯越早建立后面玩外设时越省心。第四善用 CtrlC 和软复位。写循环代码时经常出现死循环键盘没有反应正确操作是先在 Thonny 的 Shell 窗口里点一下然后按 CtrlC 中断程序再按 CtrlD 软复位。比反复拔 USB 线温和多了也不会把文件系统弄坏。6. 从入门到下一步还能玩什么到这里第一课的内容就讲完了。你已经能烧录固件、操作 GPIO、控制 LED、读按键还完成了一个综合小项目。接下来想继续深入的话我列几个方向供你参考。第一个方向是外接传感器。DHT11 温湿度传感器、HC-SR04 超声波测距、MPU6050 六轴陀螺仪这些模块都有成熟的 MicroPython 驱动库而且都能用你现在学的 GPIO、I2C、ADC 知识接入。做一个小气象站或者小避障车难度递增但每一步都能复用你已有的经验。第二个方向是显示设备。SSD1306 OLED 屏、LCD1602 字符屏、WS2812 灯带都是把程序运行结果变成可视反馈的好帮手。尤其是 WS2812 灯带配合 RP2040 的 PIO 外设能做出非常炫彩的效果社区里有大量现成例子可以学习。第三个方向是无线通信。树莓派官方出的 Pico W 在 Pico 基础上加了 Wi-Fi 模块同样支持 MicroPython可以用来做物联网设备、手机控制台灯、上报传感器数据。如果你已经有 Pico 而不是 Pico W外接一个 ESP-01S 模块也能实现类似功能只是稍微多几根线。第四个方向值得单独提一下USB Host。Micropython 社区有一些实验性固件开始支持在单片机上直接接 USB 键盘、鼠标等设备。这意味着 Pico 可以当作一个小型 USB 主机做键盘映射器、鼠标宏命令器都成为可能。不过这个方向目前还偏前沿固件不够稳定入门阶段了解即可不用急着折腾。我个人在实际操作中的体会是单片机入门最难的其实不是语法和硬件而是习惯它“一次只做一件事、循环往复地做”的工作模式。你在电脑上写程序程序跑完就结束了但在单片机上程序上电后就一直活着它在不停读按键、翻电平、算计时像一个小型的心跳。把这个观念转过来很多代码设计上的困惑都会迎刃而解。第一课的内容足够你迈过这个门槛了接下来就选一个感兴趣的小项目把它做出来再做下一个。
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻