我是一个把树莓派当“万能插座”折腾了快八年的老玩家,从最早的树莓派1代B型一路玩到CM4,踩过的坑比吃过的盐还多。这次收到一套树莓派CM4核心板,配的是微雪(Waveshare)CM4 IoT底板、4G模块和CSI摄像头,算是物联网项目里非常经典的“远程数据采集终端”组合。整篇内容适合三类人看:一是准备拿CM4做毕业设计的在校生,二是想搭一套远程监控/数据上传设备但不想用云服务商的开发者,三是纯粹对“核心板+扩展底板”玩法好奇、想换换口味的树莓派老用户。
1. 整体设计思路与硬件选型拆解
1.1 为什么选树莓派CM4而不是普通树莓派4B
如果你只是想在屋里跑个桌面系统、看个视频,CM4的意义不大,树莓派4B甚至5B省心得多。但一旦项目要面向工业场景、嵌入式设备、或者要“长在”自己的PCB板子上,CM4的优势就出来了。
CM4本质上是一块把CPU、内存、eMMC(可选)、无线模块全部集成在一起的“核心板”,它自己没有IO接口,必须通过底板引出。这意味着你可以按需选择不同的底板,做出完全符合自己项目形态的设备。比如这次用的微雪CM4 IoT底板,就是专门为工业物联网场景设计的,上面直接集成了4G模块M.2插槽、双路CSI摄像头接口、千兆以太网、RS485/RS232串口、以及两路HDMI输出。
另一个很实际的原因是供货和成本。在过去几年芯片紧张的时候,CM4比整机树莓派更容易到手,而且如果你只需要“一台能联网、能拍图、能传数据的Linux小主机”,CM4 Lite版(无eMMC)加一张好一点的TF卡,成本要比买一台树莓派4B低不少。
1.2 微雪CM4 IoT底板上有哪些关键接口
微雪这块底板在我用过的一堆CM4底板里,算是在“接口齐全”和“体积可控”之间平衡得比较好的一款。拆开包装第一眼就能看到:
- 标准的40Pin GPIO排针,兼容树莓派原有的HAT扩展板,这一点很关键,意味着以前给树莓派买的传感器扩展板、继电器模块都能直接插上用。
- 双路MIPI CSI摄像头接口,都是22Pin的软排线座。CM4核心板本身引出两路CSI,一块底板全引出来了,不用自己飞线,做双目视觉或者“一个拍环境、一个拍操作面”很方便。
- M.2 B-Key插槽,这是给4G/5G模块预留的,同时底板上有nano SIM卡槽和两路4G天线接口(IPEX座)。
- 千兆以太网口和USB 3.0/2.0混合接口,实测千兆网口走的是PCIe通道,带宽不是问题。
- 带电源管理,支持12V DC供电,配合板上的DC-DC降压电路,能给4G模块稳定供出3.8V/4V左右的工作电压,不用像用USB转接板那样担心供电不足。
有一点需要注意:不是所有CM4底板都带M.2插槽,如果你用的是其他品牌底板,4G模块可能还得通过USB转接,稳定性和走线都会差一些。微雪这块底板的优势就是“物联网全家桶”思维,把所有模块一次性安排到位。
1.3 4G模块与CSI摄像头的选型思路
4G模块我这次用的是广和通的L610-EU,市面上兼容的模块多得很,比如移远EC20、EC25,SIMCom A7600系列,还有微雪自家主推的SIM7600系列。选模块的核心标准有三个:
第一是协议栈支持。现在的4G LTE模块通信模式已经从传统的AT命令拨号演进到了QMI、MBIM这些高速网卡模式。QMI模式需要linux内核里装qmi_wwan驱动,MBIM模式需要cdc_mbim驱动。这次用的L610走的是QMI,内核5.10以上基本都内置了qmi_wwan驱动,免去了自己编译内核的麻烦。
第二个标准是频段。如果你在国内用,必须选支持国内运营商的B1/B3/B5/B8这些FDD-LTE频段,同时最好兼容TDD-LTE的B38/B39/B40/B41。如果是给国外项目用,就要换对应地区频段的版本,买错版本模块插卡没信号最让人头疼。
第三是接口形态。微雪这块底板是M.2 B-Key接口,所以模块也得选M.2封装,不能直接买那种老式的Mini PCIe封装,虽然有人卖转接卡,但物理上还要多一层转接,信号和稳定都打了折扣。
摄像头这边,我选的是最常见的OV5647,就是树莓派官方Camera Module V1用的那颗传感器,500万像素,在树莓派生态里驱动最成熟。同样是500万像素的IMX219性能更好一些,但OV5647价格便宜、资料多,搭配CM4做远程监控完全够用。其实只要接口是标准的MIPI CSI-2,驱动做好后用什么传感器只是改个设备树的问题。
1.4 我这套配置的完整清单
给新入坑的朋友一个参考,我这套整机的配置如下:
- 树莓派CM4,选的是2GB内存 + 16GB eMMC版本,跑无桌面系统绰绰有余。
- 微雪CM4 IoT底板,12V/2A DC电源适配器供电。
- 广和通L610-EU 4G模块,配了一根棒状天线和一根PCB天线。
- OV5647 CSI摄像头,接CSI-0接口。
- 一张Sandisk Extreme 32GB TF卡,虽然eMMC做主存储,但我还是习惯放一张TF卡做备份系统。
- 散热片 + 5V风扇,CM4跑起来发热不小,不加散热长跑会降频。
这套配置整体下来,主要成本在CM4和底板上,4G摄像头都是百元级配件。做一台“能远程拍照、能拨号上网、能自动上报数据”的物联网核心设备,预算基本能控制住。
2. 系统安装与eMMC烧录
2.1 eMMC版和Lite版怎么选
CM4按存储方式分两个大版本:带eMMC的版本和Lite版(无eMMC)。带eMMC的版本好处是系统装在板载存储上,读写速度比TF卡快,抗震动、抗掉电性能更好,非常适合设备装好之后长期通电运行的场景。Lite版则适合那些想用自己手里的NVMe固态、或者想用大容量TF卡当系统盘的玩家。
这次我选的是16GB eMMC版本,理由很简单:跑一个精简的Debian系统、装几个Python服务、存一些图片缓存,16GB完全够用。如果你后面想往里面塞机器学习模型或者大容量媒体文件,那就建议直接上32GB,差价不算大,但能省掉后期扩容的折腾。
需要注意的是,eMMC版本在第一次烧录系统时比Lite版麻烦一些。Lite版很简单,用树莓派Imager把镜像写到TF卡上,插卡就能开机。eMMC版则需要让CM4进入USB Device模式,把整块eMMC当作一个U盘挂载到电脑上,再用Imager或dd命令写镜像。
2.2 通过USB烧录eMMC的实际操作
CM4进入USB烧录模式的原理是:eMMC支持一个特殊的USB boot协议,树莓派官方在GitHub上开源了usbboot工具,运行rpiboot脚本后,会把一个特殊固件下发到CM4内部,让eMMC以USB Mass Storage的形式暴露出来。
具体操作步骤是这样的:
在电脑上下载usbboot工具,并安装依赖库。Debian/Ubuntu系统执行:
sudo apt install git libusb-1.0-0-dev pkg-config build-essential git clone https://github.com/raspberrypi/usbboot cd usbboot sudo make用跳线帽或者拨码开关,把微雪底板上的BOOT模式设置为USB烧录模式。我这块底板上有两个启动模式选择针脚(位置在HDMI接口附近),把跳线帽跳到BOOT位,核心板加电后就会等待USB主机下发固件。
用一条高质量Micro-USB线连接电脑和底板侧面的USB Device口。需要注意,这个Micro-USB口并不是所有微雪底板都有,我手里这块IoT底板上是专门留了的,如果你用的是其他底板,可能得自己用串口模块连。
在电脑上运行烧录工具:
sudo ./rpiboot此时终端会输出大量枚举、传输固件的信息,如果一切正常,最后你的电脑会多出一个U盘设备,容量就是你CM4 eMMC的大小。
打开树莓派Imager,选择对应的系统镜像,把目标磁盘选成刚识别出来的CM4 eMMC,点击写入。这里的写入速度取决于USB2.0带宽,16GB镜像大概需要5到10分钟,耐心等完就好。
如果你在Linux下不想用图形界面的Imager,也可以直接dd:
sudo dd if=2024-11-18-raspios-bookworm-arm64.img of=/dev/sdX bs=4M status=progress sync烧录完成后,断电,把BOOT跳线帽恢复到默认的eMMC启动模式,重新上电,CM4就会从eMMC启动系统。
我在这里吃过一个亏:第一次烧录时忘记装libusb依赖,make虽然成功了,但rpiboot运行时提示设备无法打开,折腾了半天才发现是pkg-config没装全。建议严格按照官方仓库的README来装依赖,别跳步骤。
2.3 首次开机与基础系统设置
首次开机建议先不插4G模块和摄像头,用HDMI接显示器、键盘鼠标接USB口,先确认系统能正常启动。这样能缩小问题排查范围,等基础系统稳定了,再逐步添加外设。
我这次刷的是Raspberry Pi OS Lite(即无桌面版本),完全是为了远程项目考虑,桌面环境能省则省。开机后默认用户名是pi,密码raspberry,第一次通过SSH连接之前,建议先用显示器把密码改掉,并启用SSH:
sudo raspi-config在Interface Options里把SSH打开。
顺手做几件事:把系统时区改成Asia/Shanghai,把hostname改成有业务含义的名称,比如cm4-iot-01,后期多台设备管理起来不容易串。这些在raspi-config里都能快速完成。
2.4 国内网络环境下必做的软件源更换
这一步必须放在最前面,否则后面apt装包、pip装库全部卡到怀疑人生。树莓派系统默认软件源指向官方服务器,国内访问速度非常不稳定,尤其是编译一些较大依赖包的时候,一旦网络中断就得从头再来。
修改/etc/apt/sources.list,把默认的deb.debian.org替换成国内镜像地址。我这里用的是清华源:
sudo sed -i 's|deb.debian.org|mirrors.tuna.tsinghua.edu.cn|g' /etc/apt/sources.list同时注意/etc/apt/sources.list.d/目录下可能还有树莓派专用的源文件,同样替换:
sudo sed -i 's|archive.raspberrypi.com|mirrors.tuna.tsinghua.edu.cn/raspberrypi|g' /etc/apt/sources.list.d/raspi.list更新源并升级系统:
sudo apt update && sudo apt upgrade -yPython的pip也要一起配置好镜像源,建议直接写进全局配置文件/etc/pip.conf:
[global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple extra-index-url = https://mirrors.cloud.tencent.com/pypi/simple实测换了源之后,apt下载速度能从几十KB/s飙到几MB/s,整个开发效率完全不一样。
3. CSI摄像头配置与实时视频流
3.1 硬件接线:双CSI接口怎么接
微雪CM4 IoT底板把CM4的两路CSI接口都用排线座引出来了,两个座子都标了序号,一个叫CSI-0,一个叫CSI-1。OV5647摄像头模组用的是22Pin柔性排线,排线的金属触点朝哪边在板子上有标注,插的时候一定要看仔细。
排线插法是这个项目第一个容易踩坑的点。柔性排线的金属引脚很薄,插反或者没插到底,轻则识别不到摄像头,重则损坏排线座。正确做法是:先掰开排线座的卡扣,把排线平推进去,注意排线末端的金手指要完全进入座子内部,然后按回卡扣固定。插好后轻轻拉一下排线,确认不会脱落。
我习惯把摄像头接到CSI-0接口上,因为树莓派官方很多示例默认读取CSI-0,可以少改配置。如果你的底板有两个接口且都接了摄像头,那就要在设备树里分别配置,这个稍后说。
还有一点要注意供电和信号线的距离。摄像头排线本身不长,但如果你把摄像头用延长线往外拉了好几米,MIPI信号会衰减甚至完全丢失。官方建议延长线别超过1米,我实测超过60厘米就开始出现花屏现象,所以摄像头尽量靠近底板安装,或者用支持长线传输的串行器方案。
3.2 内核设备树:让系统认识OV5647
在老版本树莓派系统里,摄像头的驱动是走/boot/config.txt里的dtoverlay配置加载的。到了Bookworm及更新版本,配置文件和目录结构有了变化,不再是单一的/boot/config.txt,而是改成了/boot/firmware/config.txt,不过核心机制还是一样的。
对于OV5647这款传感器,在config.txt里加上这一行:
dtoverlay=ov5647如果摄像头的I2C地址和供电引脚有特殊需求,还可以追加参数,比如:
dtoverlay=ov5647,i2c_pin_0=0,i2c_pin_1=1但在我这次实际使用中发现,树莓派OS较新版本对OV5647已经做到了“接上就能识别”,即使不写dtoverlay,系统也能通过自动探测机制加载驱动。这归功于设备树的运行时探测逻辑,它会扫描I2C总线上是否存在OV5647的ID,如果探测成功,自动挂载驱动。
如果你用的是CSI-1接口,那么可能需要在摄像头枚举失败时尝试在config.txt里指定:
dtoverlay=ov5647,cam1或者manually改/boot/firmware/config.txt里的相关配置,然后重启。
检查摄像头是否被正确识别,用这个命令:
sudo dmesg | grep -i camera通常能看到类似“imx219/ov5647: chip found @ 0x36”之类的日志。如果没有任何输出,基本可以断定排线没插好、座子接触不良,或者传感器型号不对。
3.3 libcamera:拍照和测试的完整流程
树莓派OS从Bullseye开始,默认的摄像头工具栈换成了libcamera。以前好用的raspistill和raspivid在新版系统里已经废弃了,官方推荐用的是libcamera-hello、libcamera-still、libcamera-vid这一套命令。
先用libcamera-hello做一个最简单的连通性测试:
libcamera-hello如果正常,屏幕上会短暂出现摄像头预览画面,终端里会打印出摄像头传感器信息,比如OV5647的像素尺寸、格式列表等。如果摄像头没有画面,大概率是线序、供电或者驱动层的问题。
拍照用:
libcamera-still -o test.jpg保存的图片默认在当前目录下,可以用Python的PIL库或者直接拷贝到电脑上看。如果照片出现偏色,大概率是自动白平衡还没有收敛,可以加参数强制连续自动白平衡:
libcamera-still --awb auto -o test.jpg录制视频用:
libcamera-vid -t 10s -o test.h264 -v这条命令录制10秒H.264编码视频。注意H.264裸流文件不是标准MP4,用VLC播放需要右键选择“从URL打开”,或者后期封装成MP4。
Python调用摄像头是很多项目实际要用的。用libcamera的Python绑定:
from libcamera import CameraManager, Camera from picamera2 import Picamera2 picam2 = Picamera2() camera_config = picam2.create_still_configuration() picam2.configure(camera_config) picam2.start() picam2.capture_file("photo.jpg") picam2.stop()picamera2是官方针对新摄像头栈发布的Python库,接口比老版的picamera更清晰,而且支持流式回调,非常适合二次开发。
3.4 局域网内视频实时推流
摄像头调试通过后,最常用的需求就是把视频画面实时传到电脑或手机上。最简单的方案是用GStreamer或者ffmpeg把摄像头画面编码后推到RTSP服务器。
我这次用的方案是ffmpeg推到本机RTSP服务,客户端用VLC拉流。先安装必要工具:
sudo apt install -y ffmpeg v4l2loopback-dkms在树莓派上启动RTSP服务(可以用mediamtx,以前叫rtsp-simple-server),下载好对应Linux ARM64版本的可执行文件后,直接运行:
./mediamtx然后在另一个终端启动推流:
ffmpeg -f libcamera_vid -framerate 30 -c:v libx264 -preset ultrafast -tune zerolatency -b:v 1000k -f rtsp rtsp://192.168.1.100:8554/camera需要注意FFmpeg新版本对libcamera的输入封装名有了变化,如果你的FFmpeg版本是5.x以上,可以改用:
ffmpeg -f libcamera_vid -i /base/soc/i2c0mux/i2c-1/1-002c -c:v libx264 -f rtsp rtsp://0.0.0.0:8554/camera这个写法是在部分ARM平台上兼容libcamera视频源的方式。如果上述命令都不可用,还有一个兜底方案是用手动方式跑视频采集:
libcamera-vid --codec yuv420 --width 1280 --height 720 --framerate 30 --inline -o - | ffmpeg -f rawvideo -pix_fmt yuv420p -s 1280x720 -i - -c:v libx264 -f rtsp rtsp://0.0.0.0:8554/camera比较下来,我最终用的是libcamera-vid输出管道传输给ffmpeg处理,这套流程最稳定。直推RTSP时如果频繁断开,可以考虑把帧率从30降到15,负载会明显下降。
4. 4G模块从识别到拨号上网全记录
4.1 模块安装、SIM卡与天线
4G模块的硬件安装相对简单,M.2模块插进底板上的M.2 B-Key插槽,用底板的螺丝固定。插的时候注意模块缺口的位置要和插槽的凸起对应,方向搞反了会损坏插针。
SIM卡装在底板背面的nano SIM卡座里,注意插卡方向。有的卡座是有弹簧机制的,插进去之后要往下按一下才能锁住。我遇到过几次因为SIM卡没插到位导致无法识别SIM卡的情况,拨号软件报了“no SIM card”的错误,排查到最后发现是卡片没压到底。
天线安装是我觉得最容易被新手忽略但实际影响最大的一环。4G模块一般有两个天线接口:主天线(MAIN)和分集天线(DIV)。主天线必须接,我用了一根棒状天线,信号强度在室内大概-85dBm左右,勉强够用。如果信号差,分集天线也得接上。有的模块还有GNSS天线接口,如果你需要定位功能,单独接一根GNSS天线就好。
天线的射频连接头是IPEX接口,很小,装的时候要垂直按压进去,然后可以听到“咔哒”一声。千万别用力斜着推,不然接口很容易断。
4.2 确认系统识别到了4G模块
把4G模块、SIM卡、天线都装好后,CM4先断电再重新上电。启动成功后,先查看USB设备列表:
lsusb正常会看到类似这样的输出:
Bus 001 Device 002: ID 2cb7:0104 Fibocom L610 4G modem如果lsusb里找不到设备,大概率是M.2插槽接触不良或者模块供电没起来。
然后看内核日志:
sudo dmesg | grep -E "qmi|wwan|option|cdc"L610默认加载的是option和qmi_wwan驱动。启动完成后,系统里会出现一个名叫wwan0的网络接口,用ip link查看:
ip link看到wwan0接口存在,说明模块已经被系统识别并进入了QMI网卡模式。
这个时候如果系统里还没有ModemManager,建议先装一个:
sudo apt install -y modemmanagerModemManager是Linux下统一管理调制解调器的服务,它能把SIM卡状态、信号强度、网络注册状态这些信息都规范化管理起来,方便后续用nmcli拨号。
用mmcli查看模块状态:
sudo mmcli -L sudo mmcli -m 0能看到模块型号、IMEI、SIM卡状态、运营商信息等。
4.3 AT指令手动拨号与PPP拨号
如果你的项目是嵌入式精简系统,不想装ModemManager那一大堆东西,可以用比较“原始”的AT指令方式拨号。L610模块的串口设备一般是/dev/ttyUSB2,这是AT命令端口。
先用串口工具进入AT模式(我习惯用minicom):
sudo apt install -y minicom sudo minicom -D /dev/ttyUSB2 -b 115200输入AT回车,模块返回OK,说明通信正常。
查看SIM卡状态:
AT+CPIN?返回+CPIN: READY表示SIM卡正常。如果返回+CME ERROR: SIM not inserted或者+CPIN: NOT INSERTED,就检查SIM卡插接。
查询信号强度:
AT+CSQ返回值格式是+CSQ: 19,99,第一个数字越大信号越好。19对应约-79dBm,属于比较理想的水平。第二个数字99表示不适用,如果第一位接近99就是无信号。
设置APN并拨号:
AT+CGDCONT=1,"IP","cmnet" ATD*99#第一条命令是把PDP上下文设置好,第二条是发起数据呼叫。国内移动的APN是cmnet,联通是3gnet,电信是ctnet,根据自己的SIM卡运营商来写。
AT指令方式最难的是拨号成功后要自己处理PPP协议。传统做法是用pppd:
sudo pppd call gprs其中/etc/ppp/peers/gprs文件里配置好串口、波特率和拨号参数。这是个很成熟的方案,但现在有更好的方式,下面说。
4.4 用ModemManager+NetworkManager管理蜂窝连接
在我的实践里,技术选型是:ModemManager + NetworkManager。这套组合的优点是统一配置、操作简单、状态可视化,而且对断电重启后的自动重连支持非常友好。
首先确认两个服务都在运行:
systemctl status ModemManager systemctl status NetworkManager然后启用wwan0接口:
sudo nmcli radio wwan on查看ModemManager是否枚举出蜂窝连接:
sudo mmcli -L返回类似/org/freedesktop/ModemManager1/Modem/0的路径。
接下来创建并激活蜂窝连接:
sudo nmcli connection add type gsm ifname wwan0 con-name lte-apn apn cmnet sudo nmcli connection up lte-apn这里ifname wwan0要和ip link里看到的接口保持一致。如果APN和PIN码有特殊要求,还可以在add命令里追加参数:
sudo nmcli connection modify lte-apn gsm.pin 1234连接激活之后,用nmcli connection show lte-apn查看IP地址。如果看到IPv4地址已经从运营商那边获取到了(通常是一个10.x.x.x或者100.x.x.x的私网地址),说明拨号已经成功。
4.5 配置路由与DNS
拨号成功后,最重要的一个环节是让流量真正走4G接口出去。检查路由表:
ip route show默认会多出一条默认路由,走的是wwan0。但如果你同时连着以太网或者WiFi,系统可能出现路由优先级问题,默认流量仍然走以太网。
我项目里需要同时用4G和有线连接,我的做法是把有线链接设成低优先级甚至直接断开不用的后端,或者按目标网段分流。如果你的设备同时有以太网和4G,且希望主用4G,可以给wwan0的默认路由加一个metric:
sudo ip route add default dev wwan0 metric 100数字越小优先级越高,只要以太网的default路由metric大于100,4G就会优先生效。
DNS配置也要检查。NetworkManager在激活gsm连接后会自动下发运营商的DNS服务器地址,但如果网络环境特殊,也可以手动指定,比如改全局配置/etc/resolv.conf或者用nmtui设置对应连接的DNS服务器。
测试联网:
ping -I wwan0 -c 3 223.5.5.5 curl --interface wwan0 -s https://api.ipify.orgcurl返回的IP就是你4G线路出去的出口IP。如果这个测试通过了,基本可以宣告你的CM4已经是一台“装上SIM卡就能上网”的物联网核心设备。
4.6 信号质量检查与自动重连策略
产品级设备不能靠手动拨号养活,得能自己重连、自己恢复。这一步我用的是脚本+systemd服务方案。
信号查询可以用mmcli:
sudo mmcli -m 0 --command="AT+CSQ"或者直接看Modem状态:
sudo mmcli -m 0里面有Signal quality、Access tech这些字段。
我写了一个异常检测脚本,每分钟检查一次wwan0接口的IP是否存在,如果连续3次没有IP,就重置4G模块并重新激活连接:
#!/bin/bash # /usr/local/bin/network_watchdog.sh INTERFACE=wwan0 CONN_NAME=lte-apn COUNTER=0 while true do IP=$(ip -4 addr show $INTERFACE | grep -oP '(?<=inet\s)\d+(\.\d+){3}') if [ -z "$IP" ] then COUNTER=$((COUNTER+1)) if [ $COUNTER -ge 3 ] then systemctl restart ModemManager nmcli connection up $CONN_NAME COUNTER=0 fi else COUNTER=0 fi sleep 60 done加上systemd服务让它后台运行:
[Unit] Description=4G network watchdog After=NetworkManager.service [Service] ExecStart=/usr/local/bin/network_watchdog.sh Restart=always [Install] WantedBy=multi-user.target这个方案跑了大半个月,遇到信号波动、SIM卡偶发拒网等场景都能自动恢复,比单纯依赖NetworkManager自动重连可靠得多。
5. 常见问题与排查技巧实录
5.1 eMMC烧录失败速查
- 症状1:rpiboot提示
Failed to connect to device。通常是因为BOOT跳线帽没设对,或者Micro-USB线插到了别的USB口上。部分粗线的Micro-USB线只能充电不能传数据,直接换一根短一点的、确定支持数据传输的线。 - 症状2:写入镜像到一半提示I/O错误。eMMC此时可能已经被之前多次擦写折腾出坏块,但这概率不高。更常见的是USB供电不稳,电脑端USB口供电不足,换一个直连主板的USB接口,不要用USB Hub。
- 症状3:烧录完成后拔电重新上电,显示器没有画面。检查config.txt里是否配置了HDMI输出,无桌面系统默认是串口控制台,接显示器本来就不该有画面,此时直接用SSH连上来验证系统是否起来了。
5.2 CSI摄像头不识别怎么办
摄像头排查顺序非常重要,很多人一上来就改配置,其实问题往往出在物理接触上。
我总结的五步排查法:第一步拔下排线重插,这一步能解决一半以上的问题;第二步用dmesg确认I2C总线上有没有传感器回应;第三步检查config.txt里有没有明显错误的dtoverlay配置,有过就删掉;第四步确认摄像头接的是CSI-0还是CSI-1,配置里对应的接口必须一致;第五步换一根排线,排线弯折次数多了内部容易断裂,这是隐形故障。
还要注意,OV5647模组虽然引脚兼容IMX219,但不同厂家的模组在原厂驱动支持上有差异。如果你买的摄像头是“兼容版”而不是树莓派官方版,驱动的回调地址可能不一样,需要自己查资料确认传感器ID。
5.3 4G模块不识别或联网失败
- lsusb看不到模块:优先检查M.2插入方向、SIM卡是否安装、底板供电功率够不够。一个容易忽略的细节是,很多4G模块上电初期的功耗非常高,峰值电流能到2A,如果底板供电不足,模块会反复重启,USB枚举自然不稳定。
- 拨号成功但分配不到IP:大概率是APN配置错了。比如你用的是物联网卡,APN可能不是常规的
cmnet,而是一串自定义字符串,这个得找运营商确认。我因为APN写错排查了整整一个晚上,最后发现是物联网卡的APN和普通SIM卡不一样。 - 能PING通IP但DNS解析失败:检查
/etc/resolv.conf,如果被别的配置覆盖了,用nmcli connection modify lte-apn ipv4.dns 223.5.5.5直接给连接指定DNS。 - 信号强度显示很弱:天线位置决定一切。棒状天线要垂直于地面,别贴着金属壳子放。如果信号仍然差,先接上天线延长线,把天线挪到窗边试一下。如果模块本身没问题,这个操作通常会有明显改善。
- 模块温度过高导致断流:4G模块本身发热不小,如果底板散热不好,长时间满载传输时会热保护掉线。给模块贴上散热片或者加强机箱风道,比改什么软件配置都实在。
5.4 供电与散热的血泪教训
这个项目的供电问题非常隐蔽。CM4整机功耗本身不算大,但加上4G模块、摄像头、WiFi,整机峰值功耗能到7瓦左右。如果用一个5V/2A的普通手机充电器供电,开机瞬间可能因为电流不足而反复重启,而且这种现象是随机的,有时候能跑几个小时才重启,排查起来非常恶心。
我最后是用12V/2A的DC电源接微雪底板,底板自带DC-DC降压电路,把电压稳定地分配到各个模块。这一步把整机稳定性提升了一大截。
散热方面,CM4核心板我加了一个官方主动散热套件,除了顶部散热片,还加了一个小风扇。平时待机温度大概45度,满载跑视频编码时能到65度,虽然不至于过热降频,但温度越低对eMMC寿命越友好。风扇噪音在室内完全可接受,如果对噪音敏感,可以买支持PWM调速的版本,用GPIO控制转速。
5.5 其他几个我踩过的坑
- 第一次插入摄像头后发现摄像头的排线座被旁边的散热片挡住了。微雪底板布局紧凑,有些元器件离得很近,装散热片之前必须先规划好摄像头排线和4G天线的走线路径,否则后期返工很麻烦。
- 搞混了两种RTSP推流工具。老教程里推荐用
rtsp-simple-server,新版本改名叫mediamtx,配置文件的格式也有变化。如果你下载的是老版本教程的配置文件,新程序可能直接拒绝加载。 - 用了树莓派Imager刷写但烧录后系统无法启动。检查镜像是32位还是64位、以及对应的系统版本。CM4用Raspberry Pi OS Lite 64位是没问题的,但如果你用了老旧的第三方精简镜像,驱动缺失、启动失败都很正常。
- 某天早上发现摄像头不工作了,检查了半小时,结果是排线从座子里松出来了一点点。所以设备长期震动或者温度变化比较大的环境下,建议用胶带在排线上做固定防脱处理。
6. 最后再分享一点心得
整套流程走下来,我最想对新手说的是:树莓派CM4这种核心板项目,80%的难度不在软件配置,而在硬件基础工作是否扎实——电源给足、排线插牢、天线摆好位置,这三点做到了,后面就顺藤摸瓜的事。真正会反复折腾你的,反而是那些看起来不起眼的接触不良和供电抖动,所以别嫌麻烦,该做的检查一步都不能省。
如果你想在这个基础上继续扩展,还有几个非常有价值的方向:一是接入MQTT协议,把采集到的数据直接发送到自建的MQTT Broker;二是用Python写一个多线程任务,一边采集摄像头图像,一边走4G上传到云服务器,做轻量AI识别;三是把这套设备做成“移动节点”,配上电池和GPS模块,变成一个真正能移动的室外数据采集器。
我自己接下来准备做的事情,是把这个CM4节点放到老家的鱼塘边,接一个温湿度传感器和摄像头,靠4G网络定时上报水质和环境数据。树莓派这类板卡真正吸引人的地方,不是参数多好看,而是它能用极低的成本,把一个“远程在线”的想法变成现实。这大概就是为什么这么多年过去,我还会时不时掏出一块CM4来折腾——它永远能接住你脑子里冒出来的那些奇奇怪怪的点子。