Python控制Arduino与树莓派:从串口通信到智能小车实战
2026/9/10 18:10:20 网站建设 项目流程

1. 方案选型:Arduino 还是树莓派,还是全都要

先说个背景。我折腾Python控制硬件这条路,最早是从一块Arduino Uno入手的。当时手里有一堆传感器、舵机、电机驱动板,想做个自动浇水的东西,但Arduino的C++写起来有点费劲,尤其遇到字符串处理、HTTP请求这种活,在8位单片机上简直是灾难。后来想干脆让电脑上的Python直接指挥Arduino算了,于是走了几条不同的路,踩过不少坑。

现在再回头看,很多人一开始都会纠结同一个问题:Python操作硬件,到底选Arduino还是树莓派?我的答案是:这俩根本不是二选一的关系,而是在不同场景下各有各的不可替代性

Arduino本质是一块STM32或AVR单片机开发板,裸机运行,没有操作系统,实时性极强。舵机PWM调速、电机闭环控制、传感器中断响应这类对时序要求苛刻的任务,Arduino拿手。但它资源少得可怜——Uno只有2KB SRAM、32KB Flash,跑不了Python解释器(microPython除外,那是另一种玩法)。所以"Python控制Arduino"的真实含义,不是让Python跑在Arduino上,而是让Python跑在电脑或树莓派上,通过串口、网络去指挥Arduino干活。Arduino扮演的是"手和脚",Python扮演的是"大脑"。

树莓派则是一个完整的Linux系统,可以装Python 3、OpenCV、TensorFlow,直接操作GPIO管脚驱动LED、读取温湿度传感器、接摄像头跑视觉程序。它性能强,能并行处理复杂逻辑,但它最致命的短板是实时性不够稳定。因为Linux系统内核调度有不确定性,关键信号可能延迟几毫秒甚至几十毫秒,这在电机控制、高速脉冲采样场景下就是硬伤。另外树莓派的GPIO是3.3V电平,直接驱动12V的电机驱动板也需要额外的电平转换逻辑,并不像很多人想的那样"插上就能用"。

所以在我的无人机悬停、智能小车这类项目里,最靠谱的架构是:树莓派做上位机,负责视觉识别、路径规划、人机交互;Arduino或ESP32做下位机,负责舵机、电机的实时控制。两者通过USB串口或Wi-Fi通信。这就是目前业内常说的"主从式架构",也是我最推荐初学者优先学习和复刻的组合。

关于硬件选型再补充两个实操经验。第一,如果你只做简单教学实验,比如点个灯、读个按键,几十块钱的Arduino Nano就够用,别一上来就买一堆昂贵的外设套件。第二,如果考虑以后做具身智能小车这种项目,树莓派建议直接选4GB内存以上的版本,我实测树莓派4B 2GB版跑轻量级目标检测模型时内存几乎打满,8GB版会从容很多,后面加一个UPS电源扩展板,可以实现断电保护,避免SD卡文件系统损坏。

2. 环境搭建与开发准备

Python控制硬件,环境搭建这一步决定了你后面是顺风顺水还是处处踩雷。我见过太多人卡在第一步,不是串口驱动装不上,就是Python库版本冲突。这里把两套环境分开讲清楚。

2.1 Python 开发环境:别再用系统自带Python

不管你用Windows、macOS还是Linux,都建议优先安装Python 3.10以上版本。原因有两个:一是很多新的硬件库已经停止支持旧版Python,二是虚拟环境功能在3.10以后更稳定。

在Windows上,去Python官网下载安装包,安装时一定勾选"Add Python to PATH",否则命令行里敲python会提示找不到命令。macOS用户强烈建议用Homebrew安装,别直接用系统自带的Python,因为那是Apple系统工具依赖的旧版本,乱动会有系统权限风险。Linux用户(包括树莓派)一般自带Python 3,但版本可能偏旧,建议用源码编译或官方仓库源更新。

装好后,第一件事是创建一个虚拟环境,把硬件开发依赖隔离起来:

# Windows/macOS/Linux 通用 python -m venv hardware_env # Windows激活 hardware_env\Scripts\activate # macOS/Linux激活 source hardware_env/bin/activate

然后安装核心依赖库。这里有一个很坑的点要提醒:不要一次性用requirements.txt安装一堆库,因为硬件库之间经常存在依赖冲突,比如RPi.GPIO和gpiozero在某些版本会互相干扰。我的习惯是先装核心的,跑通再按需补充:

pip install pyserial pip install pyfirmata pip install gpiozero pip install opencv-python

VSCode是管理这套环境最顺手的IDE,装上Python扩展后,Ctrl+Shift+P选择解释器,指向刚才创建的虚拟环境,后面写代码调试就都在同一个环境里,不会出现"命令行能跑、编辑器里Import报错"的问题。

2.2 Arduino 环境:固件烧录与开发板管理

Arduino这块有两个方向:一是用Arduino IDE直接写C++,把固件烧录进去;二是用Python库(PyFirmata)通过标准Firmata协议去控制。强烈建议初学者先走第一条路,哪怕只是烧录一个空程序或Blink示例,因为这一步能帮你确认串口驱动是否正常、板子是否识别。常见问题有两个:

  • 在设备管理器里能看到Arduino对应串口,但pySerial打开时报"PermissionError"。Linux下需要把当前用户加到dialout组:sudo usermod -a -G dialout $USER,然后重新登录。
  • Arduino IDE下载板卡慢,尤其是ESP32、ESP8266的板卡包。这通常是因为访问国外服务器,解决办法是把开发板管理地址换成国内镜像源。具体配置方式各社区都有总结,核心是修改偏好设置里的Additional Boards Manager URLs,我用的是清华和阿里云的镜像地址,实测下载速度能提升几十倍。

另外提一下,如果你手头暂时没有物理板子,可以用Wokwi仿真平台在浏览器里跑Arduino代码,它支持ESP32、ESP8266、Arduino Uno,可以和真实板卡用同样的代码逻辑。在线仿真适合快速验证思路,但很多硬件时序问题仿真模拟不出来,比如舵机抖动、传感器噪声,所以最终还是建议买块板子实测。

2.3 树莓派系统准备:从烧录到远程访问

树莓派的系统安装,现在官方Raspberry Pi Imager工具已经做得非常友好,可以一键烧录系统到SD卡。有几个细节我每次都会强调:

第一,烧录前在Imager里提前开启SSH、配置Wi-Fi、设置用户名密码。这样你不用接显示器和键盘,插电后就能从电脑上用SSH远程登进去,省掉一堆麻烦。

第二,树莓派到手后第一件事是改软件源。默认官方源在国外,apt update慢得让人崩溃。把/etc/apt/sources.list/etc/apt/sources.list.d/raspi.list里的源地址替换为国内镜像,再执行sudo apt update && sudo apt full-upgrade

第三,VNC远程桌面是个高频坑。树莓派打不开VNC,90%的原因是未在sudo raspi-config里启用VNC服务,或者RealVNC Viewer连接时输入了错误的IP地址。正确方式是先确保树莓派和电脑在同一局域网,然后通过hostname -I查看IP,在VNC Viewer里输入IP:5900。如果还连不上,检查一下防火墙或者重启VNC服务:sudo systemctl restart vncserver-x11-serviced

树莓派的桌面环境还需要装一个顺手的中文输入法,否则在浏览器里搜资料没法打中文,运行sudo apt install fcitx5 fcitx5-chinese-addons,装完重启即可。

3. 用Python控制Arduino:串口通信与硬件实操

真正动手用Python控制Arduino,核心就两个字——通信。Python把指令打包成数据,通过串口发给Arduino,Arduino解析后驱动硬件,再把传感器数据回传。这一节我讲两种最主流的方案,并给出可以直接抄的代码。

3.1 方案一:PySerial + 自定义串口协议,最"硬核"的通信

PySerial是Python串口通信的工业级解决方案。用它开发,开发板侧的结构是固定的:在setup()里初始化串口,在loop()里读取字符、解析指令、执行动作、回传结果。这里给出一个我实际项目中用到的精简版模板:

// Arduino 端代码 const int LED_PIN = 13; String received = ""; bool commandReady = false; void setup() { pinMode(LED_PIN, OUTPUT); Serial.begin(115200); // 波特率必须和Python端一致 } void loop() { while (Serial.available() > 0) { char c = Serial.read(); if (c == '\n') { commandReady = true; break; } received += c; } if (commandReady) { received.trim(); if (received.startsWith("LED_ON")) { digitalWrite(LED_PIN, HIGH); Serial.println("OK:LED_ON"); } else if (received.startsWith("LED_OFF")) { digitalWrite(LED_PIN, LOW); Serial.println("OK:LED_OFF"); } else if (received.startsWith("SERVO")) { // 解析 "SERVO:角度" 指令,控制舵机 int angle = received.substring(6).toInt(); // 舵机控制代码,见下文 Serial.println("OK:SERVO:" + String(angle)); } else { Serial.println("ERROR:unknown command"); } received = ""; commandReady = false; } }

Python端就简单多了:

import serial import time ser = serial.Serial( port='/dev/ttyUSB0', # Windows填COM3之类的串口号 baudrate=115200, timeout=0.5 ) def send_command(cmd: str) -> str: ser.write((cmd + '\n').encode()) time.sleep(0.1) resp = ser.readline().decode().strip() return resp print(send_command('LED_ON')) print(send_command('SERVO:90'))

这里有几个关键点,都是踩过坑才明白的:

  • 波特率必须两端一致。我用115200比较多,因为9600在大数据量时容易阻塞。
  • 支持中文编码其实是个大坑,Python那边如果用Windows控制台传中文,编码会乱,建议所有指令都设计成纯ASCII字符串。
  • 换行符\r\n vs \n:Windows换行是\r\n,Linux是\n,Arduino Serial.parse/read会把\r带进去,导致比较失败。最好的办法是Python发\n,Arduino端在比较前统一trim。
  • 通信要有超时和重试机制,因为USB串口偶尔会丢包,尤其是用CH340转串口芯片时。我在项目里加了一个简单的重试逻辑:发指令后1秒内没回OK,就再发一次。

3.2 方案二:PyFirmata,一条命令让硬件"活"起来

如果你不想写任何C++代码,PyFirmata是另一个选择——先在Arduino里烧录一个StandardFirmata固件,然后Python端直接用库控制引脚。我在舵机控制demo里常用这种方式快速验证:

import pyfirmata import time board = pyfirmata.Arduino('/dev/ttyUSB0') # 舵机控制引脚(假设在第9脚) servo = board.get_pin('d:9:s') # d=digital, 9=pin, s=servo servo.write(90) # 旋转到90度 time.sleep(1) servo.write(0) # 回到0度

PyFirmata的最大优势是上手极快,适合做教学、快速原型。但它的致命缺点是实时性差——Firmata协议通过字节码逐条解释执行,控制多个PWM引脚时CPU占用率和延迟都明显。我的建议是:想快速验证硬件能不能用,选PyFirmata;做正式项目、要稳定精准控制,一定选PySerial自定义协议。

3.3 舵机控制的实用细节

热搜词里频繁出现"Arduino控制舵机",说明这是入门必做实验。舵机(SG90这类)的核心是50Hz、0.5ms~2.5ms的PWM脉冲控制。用Arduino内置的Servo库最省心,它会自动生成PWM信号,不需要自己算timing。但有个很现实的坑:Arduino Uno的Servo库和analogWrite引脚有冲突,如果第9、10脚用了Servo,再在那些引脚上执行analogWrite()会导致信号错乱。所以布局时务必把舵机和LED/电机分开引脚。

树莓派Pico控制舵机是另一个方向。Pico的MicroPython环境中,用machine.PWM()生成PWM信号需要手动设置频率和占空比,逻辑更底层的,但可配置性更强。我做机械臂时就是用Pico做多路舵机舵控板,因为Pico的PWM通道多、价格便宜,20多个舵机也不卡顿。

3.4 定时器与数码管:给Arduino加"时间观念"

在入手自动化项目之后,你会发现定时器和数码管是绕不开的。Arduino的delay()是最简单的延时,但它是阻塞式的——延时期间CPU干不了任何其他事,这在实际项目中非常致命。用millis()做非阻塞定时是必备技能:

const unsigned long interval = 500; unsigned long previousMillis = 0; void loop() { unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; // 每500ms执行一次 } // 其他任务照常执行 }

基于这个原理,我做过一个Arduino数码管计时器。4位数码管用TM1637驱动芯片,只需两根数据线和一根电源线,库文件也简单。如果直接驱动7段数码管,要搞清楚共阴还是共阳,每个段码需要加限流电阻,否则数码管亮度不均甚至烧毁。我记得第一次用1k电阻做共阳数码管,全亮时发现亮度明显不足,换成220Ω才正常,这个细节值得新手注意。

3.5 Arduino与ESP32:从有线到无线

如果你的项目需要把传感器数据传到远程服务器,或者通过手机App控制,可以考虑用ESP32代替Arduino作为下位机。ESP32自带Wi-Fi和蓝牙,还支持Micro-ROS。Micro-ROS是ROS 2在微控制器上的实现,它让ESP32可以以极轻量的方式接入ROS 2环境,跟树莓派上的ROS 2节点直接通信。我去年用Micro-ROS搭过一个ESP32小车底盘,树莓派订阅摄像头数据,计算出转向指令后发布到ROS 2话题,ESP32订阅话题解析后驱动电机,整个链路延时在20ms以内,实时性勉强够用。

但是要警示一下:ESP32的Arduino开发环境搭建要下载大量板卡包,国内网络慢是常态。我建议用Arduino IDE 2.x版本,把板卡管理地址换成可用的国内镜像后再安装,或者去乐鑫官网下载离线包,这能为你节省大量时间。

4. 用Python直接操作树莓派GPIO与摄像头

树莓派上的Python操作GPIO,最主流的三个库是RPi.GPIO、gpiozero和pigpio。RPi.GPIO是最老牌的,几乎任何教程都会提,但它已经多年没更新,树莓派5上无法正常工作,官方建议用gpiozero替代。gpiozero是树莓派官方推荐的库,语法更简洁,还内置了设备抽象——一个LED对象就是LED(17),一个按钮就是Button(2)。pigpio则是通过守护进程提供PWM和中断回调,精度最高,适合需要软PWM的场景。

LED点灯实验是树莓派GPIO的Hello World。在树莓派5上,用gpiozero的写法是:

from gpiozero import LED from time import sleep led = LED(17) # 物理引脚11, GPIO17 while True: led.on() sleep(1) led.off() sleep(1)

这里要注意一个常见坑:gpiozero的引脚编号默认是BCM编号,不是物理引脚编号。如果你按照网上教程把线插到物理第11脚,代码里写的却是LED(17),那其实是GPIO17,刚好对应物理第11脚,没问题。但如果你用的是树莓派40pin排针的其它位置,务必对照引脚图确认。我写过一个函数从物理引脚号转BCM编号,但多数情况下直接查官方引脚图更直观。

读取传感器数据是GPIO的另一大类应用。比如DHT11温湿度传感器,它有单总线协议,时序敏感,Python库可能不稳定。我建议用DHT22(更精确)加一个合适的库,或者改用I2C接口的传感器,比如BMP280、AHT20,因为它们有官方驱动库,数据准确度更高,也少了很多微妙的信号问题。

4.1 树莓派摄像头OV5647实战

热词里的"树莓派OV5647摄像头模块",就是市面上最常见的500万像素Raspberry Pi Camera Module。在树莓派上,用它有两种方式:旧版raspistill/raspivid工具(树莓派5已经取消,只能用libcamera),新版推荐用libcamera工具链和picamera2Python库。这里只讲新版方法:

# 启用摄像头,然后重启 sudo raspi-config # 测试 libcamera-hello

Python拍照:

from picamera2 import Picamera2 import time picam2 = Picamera2() camera_config = picam2.create_still_configuration(main={"size": (3280, 2464)}) picam2.configure(camera_config) picam2.start() time.sleep(2) # 给摄像头预曝光时间 picam2.capture_file("test.jpg") picam2.stop()

这个过程我踩过一个大坑:装好pycamera2后一运行就提示找不到picamera2模块。排查到最后发现是系统Python路径问题——系统里同时存在系统自带Python和通过apt安装的Python,包被装到了另一个环境。解决办法很简单:始终用虚拟环境,并且在虚拟环境里先pip install picamera2确认成功后再跑程序。

4.2 树莓派5供电与稳定性:UPS电源扩展板

树莓派5的功耗比前代明显提高,官方建议用5V 5A的电源,否则电压跌落会导致外设识别异常和数据损坏。我买了一块5V 6A输出的UPS扩展板,它除了提供稳定电源,还能在断电时自动切换到电池供电,给你足够时间安全关机,防止SD卡文件系统损坏。这在野外巡检小车、无人机地面站这类场景里是救命功能。

4.3 如何让树莓派管理更多设备

树莓派作为上位机,需要跟Arduino、ESP32、传感器等一堆下位机连接。我的做法是:把所有USB设备在/etc/udev/rules.d/里设置固定别名,比如/dev/arduino_uno/dev/esp32_ros,避免每次重启后设备节点名称随机变化,导致Python代码里串口端口不稳定。这个配置在多人协作或长期运行的项目里特别重要。

4.4 Python量化交易与树莓派:一个有趣的"偏门"用法

虽然这条和硬件不直接相关,但搜索"python量化交易策略代码"的一大群人,其实有很大比例会把策略跑在树莓派上——因为树莓派功耗低、可以7x24小时运行,适合做沪深股市收盘后的复盘计算,或者跑一些低频的定时交易信号。我在树莓派4B上跑过一个简单的双均线策略回测,代码逻辑完全一样,就是数据量大的时候内存吃紧。如果你只是做每日收盘后的一小时计算,2GB内存版的树莓派够用;但如果要跑分钟级的数据抓取和实时计算,还是建议用4GB以上版本,避免频繁swap拖慢速度。

5. 协同实战:一架"人狗大作战"级别的智能小车

说了这么多基础内容,现在串一个完整的综合项目来演示"Python控制Arduino或树莓派"到底能做什么,以及这套组合拳怎么打。我选了智能小车这个题目,因为它的核心需求覆盖了舵机、电机、摄像头、串口通信、异步调度,几乎把前面所有知识点都串起来了。

5.1 系统架构设计

我的小车整体分三层:

  • 感知层:树莓派 + OV5647摄像头,负责采集画面并跑一个轻量级的目标检测模型,识别特定颜色物体(比如红色小球)。
  • 决策层:树莓派上的Python程序根据识别结果计算目标中心与视野中心的偏移量,通过一个简单的PID控制器算出转向角度和速度值,然后生成控制指令发给下位机。
  • 执行层:Arduino舵控板接收指令,控制两个直流电机(通过L298N驱动板)和一个小舵机(控制摄像头云台角度)。如果选ESP32,则可以通过Wi-Fi订阅ROS 2话题,省掉USB串口线的束缚。

指令协议我用的是前面讲的PySerial自定义串口协议,格式类似MOVE:100:30(速度100、转向角30),以及SERVO:90(云台转到90度)。每帧指令以换行符结尾,小于50字节,串口115200波特率下传输时间不到5ms,完全满足20Hz控制频率的需求。

5.2 Python端多线程处理

这里有一个特别重要的程序设计经验:Python端不要在主循环里边处理摄像头帧边发串口指令,否则摄像头帧率下降、串口发送堵塞,整个系统会卡死。正确做法是拆成多个线程

import threading import queue import serial cmd_queue = queue.Queue(maxsize=10) def camera_thread(): # 摄像头采集、目标识别 # 计算出转向角后,构造指令加入 cmd_queue cmd_queue.put("MOVE:100:30") def serial_thread(): # 从 cmd_queue 取指令,通过串口发送 while True: cmd = cmd_queue.get() ser.write((cmd + '\n').encode())

摄像头线程和串口线程之间用queue解耦,这样即便摄像头某一帧处理超时,串口线程也能继续发送上一帧的指令,小车不会突然失控。实际运行时我还会给指令加时间戳,超过200ms的旧指令直接丢弃,保证控制时效。

5.3 把"识别"和"控制"跑通

目标检测具体怎么跑,我用的方案是:在树莓派上装好OpenCV,利用颜色阈值提取目标轮廓(HSV颜色空间),计算轮廓中心坐标,然后和图像中心做偏差。这个方法的识别稳定性尚可,但光照变化会有影响。如果想更稳,可以考虑训练一个YOLOv5-lite模型,8GB版树莓派实测能跑10帧左右,勉强达到控制需求。

整体调通之后,小车能追着目标球走。但真正把PID参数调好花了整整一下午。比例项太大会抖动,积分项太大会超调。我的经验是:Kp先设0.3,Ki设0.01,Kd设0.1,按照实际抖动情况微调,这个方向基本错不了。从"识别出目标"到"小车平滑跟上",这中间其实隔着一个PID调参的坎。

5.4 从"能跑"到"具身智能"

如果你想把小车升级成"具身智能"设备,方向就不只是追踪小球了。可以在树莓派上接入语音识别模块或者接入大模型API,让车听懂语音指令。当下比较主流的方向是:用树莓派跑LLM推理或连云端大模型,将自然语言指令解析成具体的运动指令序列,再下发给Arduino或ESP32执行。像"前进两秒然后左转"这种指令,现在可以用比较简单的prompt工程实现。但是有一点必须说清楚:把大模型塞进树莓派这件事,对内存和算力要求很高,8GB内存版树莓派也只能跑极小体量的模型,更多场景还是选择把推理放到云端,树莓派只做端侧采集和执行转发,这样整体延迟和成本才可控。

6. 常见问题与排查技巧实录

硬件调试最耗时的不是在写代码,而是排查那些"看起来玄学"的问题。我把这几年遇到的高频问题整理成一个"速查表",希望能帮你省下大量时间。

常见现象可能原因解决思路
Python报serial.serialutil.SerialException: PermissionError当前用户没有串口访问权限Linux把用户加入dialout组,Windows检查驱动是否正确
串口能打开,但发指令没反应波特率不一致,或Arduino没上电/没复位核对两端波特率一致,按一下Arduino复位键,检查串口监视器是否显示OK
舵机抖动或位置不准电源电流不够,或PWM源不稳定舵机独立供电,与主控共地即可;树莓派3.3V引脚不能直接驱动大舵机
树莓派绿灯一直闪、系统无法启动SD卡启动镜像损坏或供电不足重新烧录系统,检查电源(树莓派5需要5V 5A),通电时不要热拔SD卡
VNC连接树莓派黑屏分辨率分辨率不兼容或VNC服务未启动/etc/xdg/autostart中设置分辨率,重启VNC服务
Python运行sudo时找不到包系统Python和虚拟环境Python混淆which python查位置,务必激活虚拟环境后再装包
GPIO控制LED没反应引脚号用错,或GPIO复用冲突对照官方引脚图,用pinout命令查看当前管脚状态
摄像头画面严重偏色/过暗未配置白平衡或曝光时间libcamera-still -o test.jpg测试,必要时手动设置AWB模式
Arduino IDE下载板卡包很慢国外服务器连接不畅更换国内镜像源,或离线安装包;有条件多留备份
串口发送中文乱码Python字符串编码问题简化协议为纯ASCII;发送前encode('ascii'),Arduino端trim
树莓派GPIO控制时PWM输出不稳定使用RPi.GPIO软PWM导致jitter改用gpiozero或pigpio的硬件PWM,或接PWM驱动板

除了这个表,再写几个具体场景的排查过程。

6.1 树莓派打不开VNC的完整排查

我遇到过最闹心的情况是:VNC Viewer能连到树莓派,但画面一直卡在登录界面,点进去黑屏。排查了很久,最后发现是系统升级后RealVNC服务和桌面会话冲突。解决方式:先确认VNC服务在运行——sudo systemctl status vncserver-x11-serviced,如果没运行就sudo systemctl start vncserver-x11-serviced。然后sudo raspi-config-> Interface Options -> VNC 确认使能。还不行,就改一下VNC虚拟桌面分辨率,在VNC Server配置里把分辨率改成1280x720固定值,一般能正常出画面。

6.2 树莓派中文输入法装不上的问题

在树莓派上装中文输入法,如果你只apt install fcitx不装fcitx-chinese-addons,系统菜单里根本找不到拼音输入方案。另外,装完以后还必须在系统设置里"Input Method"切换激活,否则打字时还是英文。这两个步骤都做完后,重启桌面环境才生效。

6.3 Arduino IDE占用C盘空间问题

很多人在电脑上安装Arduino IDE时,会发现C盘空间骤降。原因是板卡编译缓存、库文件、下载的板卡包默认全往用户目录里塞,尤其是ESP32全家桶安装后可能占几个GB。解决方式:在Arduino IDE偏好设置里把"Sketchbook location"和暂存目录都指到D盘或其它非系统盘,另外定期清理%LOCALAPPDATA%/Arduino15下的旧包。有条件的话,用Arduino CLI命令行工具,管理更灵活,也更省空间。

6.4 树莓派Pico控制舵机的坑

Pico控制舵机比Arduino多一个坑:Pico的PWM频率默认是1kHz,但舵机期望50Hz,所以必须手动设置PWM.freq(50)。很多人直接用占空比就说舵机没反应,其实就是频率设置错。还有一个坑是Pico的GPIO输出电压是3.3V,但很多舵机的控制信号兼容性还不错,可以直接驱动,但供电一定要足够。如果是9g小舵机,用Pico的5V输出勉强能转;接到大舵机(比如MG995),必须先外接5V~6V电源,否则Pico会被拉死,直接重启。

6.5 树莓派3B上跑Windows的"伪需求"

你可能也搜到过"树莓派3B Win10",其实这是可以在树莓派上安装Windows IoT Core,但那个系统并不是完整桌面Windows,能跑的应用极其有限。如果你指望用树莓派3B当一台Windows电脑用,那基本是不现实的。树莓派日常使用建议还是装Linux系统,执行Python脚本、跑服务器、挂PT、做网络监控,这才是它的正确打开方式。

6.6 树莓派上运行HMCL(我的世界启动器)

这个也经常被搜索到。HMCL是Hello Minecraft! Launcher,可以在树莓派上跑Minecraft Java版,但树莓派的CPU性能摆在那里,帧率很低,属于"能开、能玩但卡顿明显"的状态。更多时候大家是在树莓派上开一个Minecraft服务器,而不是客户端。服务器性能反而更好,带几个朋友玩没问题。

7. 让Python控制硬件这条路走得更远

最后分享一些比较个人化的体会。

我用Python控制Arduino和树莓派这几年,最深的感受是:不要过度纠结"用哪个板子"或"用哪个语言"。Arduino和树莓派本质上都是工具,真正的核心是"你手里有哪些传感器,你要解决什么问题"。Python的巨大价值在于,它能把从"单片机交互"到"算法处理"到"云端服务"整条链路都串起来,你不需要在C++、汇编、JavaScript之间来回切换,有一种"用一套语言搞定所有事"的痛快感。

如果你刚入门,我的建议是:先买一个Arduino Uno或ESP32,跑通串口通信;再搞一块树莓派,点亮一个LED、拍一张照片。然后做个小项目,比如做一个智能温室控制器,树莓派上跑Python数据分析,Arduino控制温湿度传感器和浇水泵。等这个项目完整跑通,你对Python控制硬件这件事的整个地图也就清晰了。

再顺手分享最后一个小技巧:一定要养成写"串口协议文档"的习惯。哪怕只是自己开发的小项目,把指令格式、波特率、引脚定义都记录下来,否则过了三个月回看代码,你会对着自己当初写的十六进制数据一脸懵。在我自己的项目里,这些文档常常比代码更有价值。

动手去做,把手里那块板子当成玩具,这个领域没有太多玄学,踩过坑、看过日志、修好bug之后,它会变成你最顺手的一件工具。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询