ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

树莓派Python入门到实战:从烧录系统到GPIO控制小车

树莓派Python入门到实战:从烧录系统到GPIO控制小车 树莓派买回来吃灰几乎成了这类小型单板电脑的宿命。我在社群里见过太多例子硬件到手、系统烧完、开机看到彩色桌面然后就没有然后了。多数人卡住的不是决心而是缺一条能从头走到尾的路——从选型、烧录、系统配置到Python开发环境、GPIO引脚控制每一步都有新人掉队。这篇文章是典型的树莓派Python入门篇面向准备入坑树莓派、并且打算用Python作为主语言的读者。我会按自己实操过几十次流程的顺序把树莓派从一张TF卡到跑通GPIO程序、接上摄像头和小车的完整链路讲清楚包括哪些环节容易报错、报错以后怎么定位。内容覆盖树莓派4B/5及常见配件没有屏幕也能完成安装。跟着走完你会拿到一台能联网、能远程开发、能控制硬件的树莓派而不是一个继续吃灰的摆件。我不打算写成官方文档式的罗列很多细节是文档里不会写的为什么新系统不建议直接跑pip3 install、为什么摄像头接口明明插对了却报错找不到设备、为什么树莓派一天到晚莫名其妙重启。这些坑我踩过写出来后面的人能少走弯路。1. 树莓派选型与系统烧录别在第一步就踩坑1.1 硬件定位Zero、4B、5代怎么选先泼一盆冷水不是所有树莓派都适合“入门Python”。Zero 2W价格低、体积小但性能有限GPIO针脚大多需要自己焊接USB口也只有一个新手从零开始用会非常痛苦。3B还能跑但内存普遍只有1GB装完桌面再开浏览器就捉襟见肘。4B是当前资料最多、配件最便宜的选择2GB起步4GB或8GB版本跑Python开发、小型服务器、摄像头应用都够用。5代性能提升明显官方散热器、电源要求也更高预算充足可以直接上大多数入门教程在4B和5上通用。我的建议很简单预算有限、主要学Python和GPIO选树莓派4B 4GB想跑视觉识别或复杂模型选5代8GB追求便携和低功耗至少准备一块带排针的Zero 2W并做好焊针和转接的心理准备。配套硬件的优先级我按踩坑频率排个序配件要求说明电源4B建议5V 3A5代建议官方27W5V 5A别拿旧手机充电器凑合供电不足会引发各种莫名问题TF卡A2级别、16GB起步Class 10以上杂牌卡是烧录失败和系统损坏的头号元凶散热4B加铝制散热片即可5代强烈建议主动风扇5代满载温度不控制会触发过温降频1.2 镜像选哪个32位还是64位Raspberry Pi OS有Lite无桌面和Desktop完整桌面两种树莓派4B/5都有64位版本。新装系统直接选64位完整版理由很实际树莓派官方已经明确64位是长期方向很多面向视觉、AI的Python库比如OpenCV、TensorFlow Lite在64位系统上的预编译版本更多踩坑更少。Lite版留给纯服务器场景入门阶段建议Desktop因为浏览器、配置工具raspi-config都在里面遇到问题可视化排查也更直观。下载镜像不需要去官网找链接直接用官方工具Raspberry Pi Imager。它不只是烧录器还能在烧录前完成一堆关键的预设置这一点许多旧教程完全没提。注意2022年4月之后的Raspberry Pi OS镜像不再有默认的pi/raspberry账号无人值守配置中必须手动设置用户名和密码否则开机后根本登录不进去。很多老教程还在让人用pi和raspberry照着做会卡在登录这一步。1.3 无屏幕安装烧录前把Wi-Fi和SSH一并配好无屏幕安装headless是我给新手推荐的首选方式一套流程下来树莓派通电后你根本不需要额外买显示器和键鼠。操作步骤打开Raspberry Pi Imager选择设备型号比如树莓派4。选择操作系统Raspberry Pi OS64位。选择TF卡。这一步务必确认盘符别选错移动硬盘或U盘我见过全盘被清的案例。点击右下角齿轮图标或按CtrlShiftX打开高级设置对话框。启用SSH设置用户名和密码。配置Wi-Fi输入SSID和密码国家选CN。想要固定IP可以在无线局域网设置里填IP、网关、DNS不填则默认走DHCP。保存并烧录等待完成。烧录完成后把TF卡插回树莓派接电源上电大约1到2分钟树莓派就会出现在局域网里。这套流程我给不下二十块板子装过系统基本可以做到全程不接屏幕、不接键盘。1.4 烧录报错排查Imager报错常见三类。一是TF卡读写失败大概率是卡本身是扩容卡或者读卡器太劣质换A2卡和高速读卡器基本解决。二是卡在某个进度的写入中不动把安全软件临时关掉再试杀毒软件有时会占用磁盘导致写入超时。三是烧录完成后提示校验失败这时候不要强制执行换卡或重新烧录一次多半是卡本身有问题。经验烧录完成后Windows经常会弹“需要格式化U盘”之类的提示点取消就行千万别格式化。看到这个弹窗恰恰说明系统分区已经成功写进去了是正常现象。2. 首次开机先搞定这三件事SSH、换源、输入法2.1 找到树莓派IP地址的三种办法无屏幕安装最大的问题是怎么找到树莓派的IP地址。三种办法按推荐优先级排路由器管理后台的已连接设备列表一般能看到raspberrypi这个主机名。同一网络下用nmap扫描nmap -sP 192.168.1.0/24识别出MAC地址厂商为Raspberry Pi的设备。实际网段以你的路由器为准常见的是192.168.0.x或192.168.31.x。路由器后台进不去的话用局域网IP扫描工具比如Advanced IP Scanner全段扫一遍也能定位到树莓派。拿到IP后Windows 10/11用户可以打开系统自带终端直接输入ssh 用户名IP连接。第三方工具里推荐MobaXterm免费版够用自带图形化文件管理左侧能看到树莓派整个文件系统传文件很顺手。SSH连接成功是后面所有远程开发的前提这一步一定要确认稳定后再继续。2.2 换源让apt快起来的实际配置新装的系统第一次执行sudo apt update会很慢尤其要下载桌面组件和Python库时等待时间让人抓狂。我习惯把软件源换成国内镜像源速度提升非常明显。具体操作是编辑/etc/apt/sources.list和/etc/apt/sources.list.d/raspi.list两个文件把默认源地址替换为对应镜像站的地址。这里有三个容易踩的细节不同系统版本的源格式不同。BookwormDebian 12之后的源组件名里包含non-free-firmware直接照抄旧教程里的buster源会报错。改完后执行sudo apt update如果出现404 Repository not found说明镜像源和你当前系统版本不匹配需要回去核对版本代号。动手前先备份sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak改错了能立刻还原。我自己一直用清华镜像源改完以后执行sudo apt update sudo apt upgrade -y顺手把系统更新到最新。update是更新软件包列表upgrade是真正升级已安装的包两个命令经常连用。2.3 中文输入法配置桌面环境下装中文输入法Bookworm建议直接上fcitx5不要再装老旧的ibus-pinyin后者在新版系统上问题不少。安装命令是sudo apt install fcitx5 fcitx5-chinese-addons装完以后在桌面设置里把fcitx5加入自启动注销重新登录一次就能正常切换中英文输入。如果习惯五笔输入法额外装一个fcitx5-table-wubi包。这一步和Python编程本身没有直接关系但对国内用户的使用体验影响非常大我每次帮人配置新系统都会顺手做掉不然人家连个中文注释都打不出来别提多难受了。3. Python环境搭建从系统自带Python到VSCode Remote3.1 树莓派OS的Python现状与venv树莓派OS自带Python 3Bookworm对应的是Python 3.11对入门项目来说完全够用。但有两个原则必须记住第一系统自带的Python是桌面环境和各种系统组件的依赖不要随意卸载、不要强制升级系统Python版本否则桌面、raspi-config这些工具可能集体崩掉第二不要直接用sudo pip3 install全局安装包无论包名是什么最好先建虚拟环境再安装。很多人刚接触树莓派会照着一知半解的教程执行sudo pip install结果装了一堆乱七八糟的包最后系统Python环境被搞乱。正确做法是给每个项目单独建venv虚拟环境python3 -m venv myenv source myenv/bin/activate pip install 包名退出虚拟环境用deactivate。树莓派上为什么不用Anaconda因为树莓派不是x86架构Anaconda官方并不支持armv7/arm64社区虽然有miniforge但入门阶段没必要增加负担venv足够应付绝大多数项目了。3.2 VSCode Remote SSH在PC上远程开发树莓派VSCode Remote-SSH插件可以在本地编辑代码、远程在树莓派上运行和调试体验非常接近直接在树莓派上操作这是目前最舒服的树莓派Python开发方式。配置流程本地电脑安装VSCode。在扩展市场搜索并安装Remote-SSH插件。按CtrlShiftP输入Remote-SSH: Connect to Host选择添加新主机。输入用户名IP连接时选择Linux平台。首次连接会自动在树莓派上安装VSCode Server需要等一两分钟。VSCode Server在树莓派上首次启动时可能需要编译速度取决于机器内存和网络耐心等就行。连上之后打开远程终端执行代码用的Python解释器就是树莓派上的那个文件也直接保存在树莓派文件系统里。如果树莓派内存只有1GB或2GBVSCode Server跑起来会比较吃力这时候退而求其次用系统自带的Thonny或者Geany内存稍大的4B/5设备完全可以流畅使用VSCode Remote。3.3 第一个Python程序验证环境SSH通了Python环境也确认好了先别急着跑外设写一个最基础的程序验证整条链路print(Hello from Raspberry Pi)命令行里执行python3 hello.py看到输出就说明系统、SSH、Python三层都已经正常。这一步看起来简单价值在于它能在后面所有GPIO实验前帮你确认问题到底出在环境还是代码。我见过不少人LED不亮第一反应是代码写错了折腾半天发现是SSH连接本身就不稳定白白浪费时间。4. GPIO实战用Python点亮LED、读按键、控制舵机4.1 引脚图与GPIO库的选择树莓派40针引脚图是入门第一张必须打印出来的图。引脚的编码方式有两种必须分清楚BCM编号对应的是SoC内部GPIO编号比如GPIO17在代码里就是17Board编号对应物理引脚位置比如第11脚。写代码推荐用BCM因为所有芯片资料和外设库默认都按BCM编号来写查起来方便接线时对照引脚图确认即可。Python操作GPIO的库主要有三个RPi.GPIO是老牌选手使用人数多、教程多但开发维护已经停滞很久在新内核和新型号上容易出现兼容问题gpiozero是树莓派官方维护的库API简洁还内置按钮消抖、状态事件触发等功能我用下来最顺手lgpio是底层库一般不需要直接操作。入门直接从gpiozero开始即可。重要安全提醒树莓派GPIO是3.3V逻辑电平单个引脚输出能力有限。不能直接驱动继电器线圈、电机、大功率LED。凡是电流需求超过一定阈值的负载都要通过三极管、MOS管或驱动板中转控制。新手最容易在这里翻车烧坏GPIO口往往不可逆。4.2 LED闪烁第一个硬件程序接线方式GPIO17物理第11脚串联一个330Ω电阻接LED正极LED负极接GND。电阻是保护LED用的不加电阻直接把LED接到3.3V上大概率会烧LED。gpiozero版代码非常简洁from gpiozero import LED from time import sleep led LED(17) while True: led.on() sleep(0.5) led.off() sleep(0.5)跑起来以后如果灯不亮按这个顺序排查电阻是不是串进去了LED正负极有没有接反面包板接触是否可靠最后再检查GPIO编号和引脚图是否对应。灯光亮灭稳定以后可以自己改改sleep的时长体会一下程序对硬件的控制时序。4.3 按键输入与软件消抖按键的典型接法一端接GPIO另一端接GND。gpiozero的Button默认启用内部上拉电阻所以不需要外接上拉接线比想象中简单。from gpiozero import Button def on_press(): print(pressed) button Button(18, bounce_time0.05) button.when_pressed on_pressbounce_time是消抖时间单位秒。机械按键在按下和松开的瞬间金属簧片会快速通断多次不处理就会一次按下触发好几次事件。自己用RPi.GPIO写事件检测也能做但要额外处理毛刺逻辑gpiozero一个参数就解决了。如果想要按键在松开时也响应可以继续用when_released回调实现长按、短按的组合逻辑这就能做到很多小车控制的前置基础了。4.4 舵机控制PWM入门SG90舵机是适合入门的PWM设备规格很典型5V供电信号线接GPIO控制信号频率固定为50Hz脉宽0.5ms到2.5ms对应0度到180度。gpiozero的Servo类默认把脉宽范围预设为1ms到2ms直接使用SG90可能转不到0度和180度所以需要手动指定完整范围from gpiozero import Servo from time import sleep servo Servo(17, min_pulse_width0.5/1000, max_pulse_width2.5/1000) servo.min() sleep(1) servo.mid() sleep(1) servo.max()如果舵机在目标角度附近抖动或发出滋滋声多半是供电不足或者脉宽范围与电机不完全匹配微调min/max参数即可。这里有个容易被忽略的点舵机转动瞬间电流不小最好单独供电并且把舵机电源负极和树莓派GND连在一起共地否则信号参考电平不一致舵机会表现得很诡异。5. 摄像头与小车把树莓派真正“用起来”的场景5.1 搞清CSI与USB摄像头别被luvcview带偏入门阶段最容易混淆的是两类摄像头。一类是树莓派官方推荐的CSI接口摄像头用排线直接连在主板的CSI接口上延迟低、体积小适合小车和监控另一类是通过USB连接的USB摄像头UVC协议即插即用通用性好但帧率和延迟一般不如CSI方案。OV5647是常见的CSI摄像头模组里的500万像素传感器型号很多商家直接叫它“树莓派摄像头”。系统里的查看工具也分两派这是新手最容易搞混的地方老教程常提到的luvcview是Linux下针对UVCUSB摄像头的查看工具只对USB摄像头有效。CSI摄像头在新系统上要用libcamera系列工具。如果拿luvcview去打开CSI摄像头当然会提示找不到设备不是摄像头坏了是工具不对口。5.2 用libcamera拍照和录像再谈推流新系统下CSI摄像头的基本操作是下面三条命令libcamera-hello libcamera-still -o test.jpg libcamera-vid -t 10s -o test.h264第一次运行可能会提示no camera available优先检查三件事排线有没有插到底排线方向是否正确系统设置里Camera是否被启用。树莓派5上有两个CSI接口要确认插的是系统识别的那个必要时可以用rpicam-hello --camera 0和rpicam-hello --camera 1轮流探测。需要把画面推流到局域网其他设备看的时候我常用libcamera-vid配合ffmpeg转发RTSP流或者编译运行mjpg-streamer。mjpg-streamer更适合USB摄像头。对入门者来说先学会cmake编译跑通mjpg-streamer其实也是借机体验了Linux下源码编译安装的完整流程这个技能后面装很多软件都能用上。5.3 4WD小车电机驱动与GPIO结合标准树莓派4WD小车套件包含这些组件4WD底盘、4个TT电机、电机驱动板常见L298N或DRV8833、电池盒、树莓派以及可选的摄像头模块。原理说起来不复杂树莓派GPIO输出3.3V电平的控制信号给驱动板驱动板用外部电池给电机供电两边只通过控制信号联系隔离功率和逻辑。L298N驱动板接电机的方式每个电机需要两个方向脚IN1、IN2再用一个PWM脚调速。基础前进代码大致如下import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) in1, in2, ena 23, 24, 25 GPIO.setup([in1, in2, ena], GPIO.OUT) pwm GPIO.PWM(ena, 1000) pwm.start(0) GPIO.output(in1, GPIO.HIGH) GPIO.output(in2, GPIO.LOW) pwm.ChangeDutyCycle(50) time.sleep(2) pwm.stop() GPIO.cleanup()这套代码里IN1高、IN2低电机正转反过来则反转改变PWM占空比就能调速。关键坑电机驱动板必须和树莓派共地也就是驱动板GND要接树莓派GND否则控制信号电平参考不一致电机会乱转甚至完全不转。用电池单独给电机供电时这个问题最容易出现。小车上的摄像头打开方式推流到浏览器是最省事的方案。电脑浏览器打开实时画面手机上也能看这样不需要额外配显示器树莓派放在地上跑人在电脑前就能控制。6. 新手最容易踩的坑从供电到挂载的实战记录6.1 供电不足的诡异表现与排查顺序树莓派4B建议5V 3A供电5代建议5V 5A。供电不足的表现非常诡异一会儿正常一会儿重启、USB设备随机断开、GPIO输出电平不稳定、Wi-Fi间歇性掉线。遇到这类症状第一反应应该是换电源和数据线而不是重装系统。树莓派对电源质量要求严格劣质充电头在负载起来后电压跌落CPU会主动降频甚至关机保护表现出来就是“系统不稳定”。还有一个容易忽略的细节有些USB数据线只有充电能力没有数据传输引脚连接USB硬盘或高速外设时会同时导致供电不稳定的假象。换一条短线、带完整数据通道的线问题往往当场解决。所以排查顺序要先硬件后软件先供电接触后系统配置最后才怀疑代码。6.2 U盘挂载位置与手动挂载插入U盘后桌面环境下默认自动挂载到/media/用户名/卷标不是/mnt/usb更不是/media/usb。很多教程直接写cd /mnt/usb在桌面版系统里根本找不到。命令行下查看挂载点用df -h或lsblk一目了然。如果插入U盘后没有自动挂载手动挂载命令是sudo mkdir -p /mnt/usb sudo mount /dev/sda1 /mnt/usb注意设备名不一定总是sda1需要通过lsblk确认。这个操作在入门时接触不多但后面做摄像头视频存储、迁移代码到U盘时会频繁用到提前知道能少搜半天。6.3 GPIO操作权限与系统资源以普通用户运行GPIO程序时如果报permission denied先确认自己是不是在gpio用户组里sudo usermod -aG gpio 用户名把用户名替换成实际登录名然后注销重新登录生效。另外编译大型项目或者长时间跑桌面时内存不够可以调整swap交换分区大小但入门阶段不建议乱动除非确实遇到了Out of Memory进程被杀的情况。对树莓派5代来说内存不足的情况会直观很多观察htop里的内存占用即可。6.4 常见问题速查表现象原因方向处理办法烧录报错“写入失败”TF卡扩容卡或读卡器劣质换A2卡、换高速读卡器重新烧录SSH连接超时树莓派没联网或路由器AP隔离检查Wi-Fi配置、IP地址、路由器设备列表apt update报404软件源与系统版本不匹配确认bookworm还是bullseye换对应源摄像头找不到设备CSI排线没插好或系统未启用Camera重插排线raspi-config启用CameraGPIO permission denied当前用户不在gpio组usermod -aG gpio重新登录生效舵机抖动或滋滋响供电不足或脉宽范围不对单独供电调整Servo的min/max脉宽参数这些坑大多在入门阶段会反复横跳记录下来能省大量时间。我实际帮人处理树莓派问题时发现绝大多数故障最终都能归到三类源头供电不足、接触不良、系统版本和教程不匹配。如果你在入门过程中遇到其他怪问题建议按“硬件连接-系统配置-代码逻辑”三层去排查先确认硬件连接和供电再确认系统层面最后才怀疑代码。这条路走通了后面的GPIO进阶、摄像头视觉、运动控制都会顺很多。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进