树莓派酱の吃灰日常

分割线

首次接入 (无屏幕)

刚到手的树莓派裸机, 没屏幕也没 Mini-HDMI 线. 通过 boot 分区预置文件让它自动连 WiFi + 开启 SSH, 之后所有操作都走远程.

boot 分区预置文件

用手机或电脑开 2.4G 热点 (树莓派旧型号不支持 5G), 然后在桌面新建个文件夹存这两个文件:

  • 空文件 ssh — 无后缀名、无内容, 出现在 boot 根目录就会触发开启 SSH 服务.
  • WiFi 配置 wpa_supplicant.conf:
country=GB
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="你的Wifi名称,注意大小写"
psk="你的Wifi密码"
}

现成模板

20201203110651

用读卡器把 TF 卡插进电脑, 把这两个文件复制到名叫 boot 的分区根目录. 开鸡, 等一会就会发现手机/电脑端被树莓派蹭上来, 路由器面板/手机热点页面里看到一个 raspberrypi 设备, 顺手记下分配到的内网 IP:

20201203110842 Screenshot20201203112505

SSH 连接

  • 连接三要素: IP 地址 + 用户名 + 密码
  • 树莓派系统默认账号 pi, 密码 raspberry

详细操作可参照 ✨SSH 远程连接
连接后第一时间改密码: 💧 一些常用终端命令


VNC 连接

纯 SSH 不够用 (要操作图形界面、看桌面) 时改走 VNC.

20201204103758 20201204103843

分割线

系统初始化

进系统后第一件事是把源换掉, 之后装啥包都不至于卡半天.

apt 换源 (USTC)

sudo nano /etc/apt/sources.list
deb http://mirrors.ustc.edu.cn/debian bookworm main contrib non-free non-free-firmware
deb http://mirrors.ustc.edu.cn/debian-security/ bookworm-security main contrib non-free non-free-firmware
deb http://mirrors.ustc.edu.cn/debian bookworm-updates main contrib non-free non-free-firmware

# Uncomment deb-src lines below then 'apt-get update' to enable 'apt-get source'
#deb-src http://mirrors.ustc.edu.cn/debian bookworm main contrib non-free non-free-firmware
#deb-src http://mirrors.ustc.edu.cn/debian-security/ bookworm-security main contrib non-free non-free-firmware
#deb-src http://mirrors.ustc.edu.cn/debian bookworm-updates main contrib non-free non-free-firmware
sudo apt update && sudo apt upgrade -y

raspi-config 系统设置

官方的 TUI 配置面板, 改 hostname / 时区 / SSH-VNC 开关 / 显示分辨率 / 扩展根分区都从这里进:

sudo raspi-config

Screenfetch 系统信息

显示发行版、内核、主题信息, 截图截了好看:

sudo apt install screenfetch
screenfetch

当年没用 Neofetch 是因为旧版 Debian repo 地址过期, 装着麻烦. 现在新系统直接 apt install fastfetch 更主流.

20201205143342 20201203115807

分割线

网络

WiFi 故障排查

新版树莓派系统 (Bookworm 起) 默认改用 NetworkManager 管理网络, 旧的 wpa_supplicant + 配置文件方式可能不再生效. 如果 wpa_cli -i wlan0 reconfigure 直接 FAIL, 大概率就是这个原因, 配置没问题但服务没接管 wlan0.

先确认谁在管 wlan0:

ps aux | grep wpa
nmcli dev status

如果 NetworkManager 在跑, 就别再折腾 wpa_supplicant.conf 了, 直接 nmcli 连:

# 扫描可用 WiFi
nmcli dev wifi list

# 连接
nmcli dev wifi connect "your-wifi-ssid" password "your-wifi-password"

# 验证
ip a

国内地区把 country=CN 写进 /etc/wpa_supplicant/wpa_supplicant.conf, 否则部分 5GHz 信道扫不到.

强制使用 wpa_supplicant

如果坚持走配置文件路线 (比如系统镜像没装 NetworkManager), 先把 NM 停掉清场:

sudo systemctl stop NetworkManager
sudo systemctl disable NetworkManager

# 手动接管
sudo wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf
sudo dhclient wlan0

排查 RFKill 软关闭:

rfkill list
# 若 Soft blocked: yes
sudo rfkill unblock wifi

运营商热点 (CMCC-xxxChinaNet-xxx 这种) 一般有 portal 网页认证或限制设备数, 连上但不能上网是正常现象, 别误以为是配置问题.


有线直连 PC (无路由器/交换机)

没有路由器或交换机时, 用一根网线把树莓派和 PC 直接对接. 没有 DHCP 服务, 双方需要手动配静态 IP. 这套配置也是后面 WoL 直连场景的前置条件.

安装 dhcpcd

sudo apt update
sudo apt install dhcpcd5
sudo systemctl enable --now dhcpcd

配静态 IP

PC 端 (Windows IPv4 属性):

IP:   192.168.50.2
掩码: 255.255.255.0
网关: 留空

树莓派端 (sudo nano /etc/dhcpcd.conf):

interface eth0
static ip_address=192.168.50.1/24
nohook wpa_supplicant

接口名通常是 eth0, 在某些镜像下会是基于 MAC 的长名 (例如 enxb827ebeb0a18), 用 ip a 查实际名字.
改完重启 (sudo reboot), 在树莓派 ping 192.168.50.2, 通了再继续.

启用 IP 转发 (可选)

如果想让 PC 通过树莓派 (它的 WiFi) 转发上外网:

sudo nano /etc/sysctl.conf
# 加入这行:
# net.ipv4.ip_forward=1

sudo sysctl -p

分割线

内网文件共享 (Samba)

把外接硬盘挂到树莓派, 通过 SMB 协议共享给局域网. Windows 资源管理器输 \\<ip> 就能当网盘用, 比折腾 NAS 系统轻量.

挂载外接磁盘

sudo apt update && sudo apt install exfat-fuse exfatprogs ntfs-3g samba samba-common-bin

# 确认 exfat / ntfs 驱动到位
dpkg -l | grep -E "exfat|ntfs"

sudo blkid 拿到硬盘的 UUID, 写进 /etc/fstab 实现开机自动挂载:

UUID=749C-1C4F /mnt/storage exfat defaults,auto,users,rw,nofail,uid=1000,gid=1000 0 0
UUID=026815AC5FEFC0F7 /mnt/stack ntfs defaults,auto,users,rw,nofail,uid=1000,gid=1000 0 0

nofail 很重要, 没插盘时不至于系统起不来.

Samba 服务配置

/etc/samba/smb.conf 末尾追加共享段:

# 共享 exFAT 硬盘 (/dev/sdb1)
[storage]
path = /mnt/storage
browseable = yes
read only = no
valid users = weidows
create mask = 0775
directory mask = 0775

# 共享 NTFS 硬盘 (/dev/sda1)
[stack]
path = /mnt/stack
browseable = yes
read only = no
valid users = weidows
create mask = 0775
directory mask = 0775

设 SMB 用户密码 (这个密码独立于系统密码) 并重启服务:

sudo smbpasswd -a weidows
sudo systemctl restart smbd

Windows 客户端连接

资源管理器地址栏直接输 \\192.168.xxx.xxx 回车, 弹窗里填上面 smbpasswd 设的用户名密码.

不建议用 macOS 连, 会在每个目录里生成一堆 .DS_Store 污染文件.

分割线

网络唤醒 PC (WoL)

树莓派 24h 常开, 可以当作"远程电源按钮"触发主机的 Wake-on-LAN. 出门在外想用桌面机时随手开一下就行, 不必让台式机一直耗电待命.

PC 端配置

BIOS

不同主板叫法略有不同, 都要打开:

  • Wake on LAN / Power On By PCI-E
  • PME Event Wake Up
  • ErP / EuP 关闭 (开了会切断 S5 状态下的网卡待机供电, 魔术封包根本进不来)

Windows 系统

设备管理器 → 网卡 → 电源管理:

  • 勾选: 允许此设备唤醒计算机
  • 勾选: 仅允许魔术封包唤醒

高级选项里把 Wake on Magic Packet 改成 Enabled.

状态能否 WoL
睡眠 (S3)可以
休眠 (S4)可以
完全关机 (S5)看主板, 一般要关 ErP

先在局域网里用手机 App Wake On Lan 测一次, 这一步过不了后面都白搭.


树莓派发包

sudo apt update
sudo apt install wakeonlan

# 在 PC 上 ipconfig /all 拿到 MAC 地址
wakeonlan XX:XX:XX:XX:XX:XX

同一局域网下一般这一句就够了.


直连场景: 定向广播 / 单播

树莓派 ←→ PC 用网线点对点直连 (网络配置见 有线直连 PC), 没有 DHCP 也没有广播域. 默认的 255.255.255.255 广播包发不出去, 必须改成定向广播或单播:

# 定向广播 (到 /24 子网的广播地址)
wakeonlan -i 192.168.50.255 XX:XX:XX:XX:XX:XX

# 部分网卡支持单播, 直接打 PC 的 IP
wakeonlan -i 192.168.50.2 XX:XX:XX:XX:XX:XX

留意网口指示灯: PC 关机后必须还亮 (至少闪一下), 否则说明网卡被断电了, 魔术封包根本收不到, 回去检查 BIOS 的 ErP.


HTTP API 远程唤醒

懒得每次 SSH 进树莓派敲命令, 写个 Flask 小接口:

sudo apt install python3-flask
from flask import Flask
import os

app = Flask(__name__)

@app.route('/wake')
def wake():
os.system('wakeonlan XX:XX:XX:XX:XX:XX')
return "OK"

app.run(host='0.0.0.0', port=5000)

挂 Cloudflare Tunnel 或反代到自己域名, 出门在外打开浏览器/快捷指令就能唤醒.

部署到公网一定要加鉴权 (token 或 basic auth), 不然别人扫到接口也能开你的电脑.

自动唤醒兜底

让树莓派定期 ping 主机, 不在线就发 WoL:

ping -c 1 192.168.50.2 || wakeonlan -i 192.168.50.255 XX:XX:XX:XX:XX:XX

丢进 crontab 即可, 适合"主机意外掉电后自动复活"的场景. 别在正常关机的机器上开, 否则你永远关不掉电脑.

分割线

硬件项目: WS2812B 彩色灯带

用树莓派 GPIO 驱动一条 WS2812B 灯带, 进阶版还能接 USB 声卡做音乐频谱可视化. 本人用的 Pi 3B / 4B.

硬件连接

WS2812B 灯带分三根线 (颜色可能并不一致, 红 / 黑 / 绿 / 白): VCC、信号、GND. 淘宝买条杜邦共对母口线连, 不嫌粗暴的直接拿小刀豁开绝缘皮插也行.

树莓派 GPIO 抽象示意 (这里只用第一行, 编号是自己临时排的, 不是标准物理引脚号)
_____________________
| 1 2 3 4 5 6 7 ....
| 1 2 3 4 5 6 7 ....
|
| CPU
|
_____________________

接线 (按上图自定义编号):

灯带线接到位置
红线 (+5V)2
中间线 (信号)6
另一根 (GND)3

标准 WS2812B 接法走 GPIO18 (物理 Pin 12), 用 rpi_ws281x 默认配置时按此对应; 上面的编号是自定义示意, 实际接线以你买的灯带/驱动配置为准.


安装工具链与驱动

sudo apt-get -y install python3-pip git scons swig
sudo pip install rpi-ws281x --break-system-packages

pip 装完很可能 importModuleNotFoundError: No module named 'rpi_ws281x', 需要下载源码本地编译:

git clone https://github.com/jgarff/rpi_ws281x.git
cd rpi_ws281x
scons
cd ./python/
sudo python3 ./setup.py install

千万不要在父目录上跑 sudo python ./python/setup.py install — 会因为找不到 rpi_ws281x.i 直接 swig 报错退出.


修改配置文件

examples/strandtest.py 是官方示例, 需要改两处:

  1. 顶部 import 加一行:
from neopixel import *
  1. LED 灯珠数 (LED_COUNT) 改成实际灯带的数量.

把改好的脚本复制出来 (别在 examples 目录里跑, import 路径会出问题):

sudo cp ./examples/strandtest.py .

测试运行

sudo python3 ./strandtest.py

第一次在公司点亮的样子:

1632587136736

进阶: 音乐频谱可视化

需要额外硬件: 树莓派没有板载输入声卡, 必须配 USB 免驱声卡 + 3.5mm 有线可录音耳机. 调查过没有更轻的替代方案, 拓展坞有时会附带声卡, 可以一刀切.

装环境

sudo apt-get install portaudio19-dev libatlas-base-dev
# 注意是 pip3, 运行时也必须是 python3
sudo pip3 install numpy scipy pyqtgraph pyaudio --break-system-packages

跑起来

git clone https://github.com/scottlawsonbc/audio-reactive-led-strip.git
sudo python3 audio-reactive-led-strip/python/visualization.py

灯带检测

灯带是否损坏: 一头接上 +5V + GND, 另一头短接信号线试试.

  • 树莓派重启 → 灯带本体没问题, 是信号线或电压不足导致不亮.
  • 树莓派毫无反应 → 大概率灯带本体坏了.

分割线

借物表