资讯详情

资讯详情

树莓派CM4+4G+CSI摄像头:野外无人值守采集终端完整搭建指南

1. 为什么我最终选了CM4加微雪底板而不是直接买4B1.1 CM4和树莓派4B到底差在哪先说结论如果你的项目是拿来做固定桌面小主机、跑个家用服务器、练手学习Linux那树莓派4B足够。但我的项目是一个需要部署在野外的采集终端要求体积小、供电相对集中、对接4G模块和CSI摄像头并且以后可能批量做几台这种情况下CM4的价值一下就出来了。CM4的完整名字是Compute Module 4它本质上是一块没有对外接口的核心板把CPU、内存、eMMC或者不带eMMC的版本封装在一个SO-DIMM形态的板卡上。所有对外功能都依赖底板你自己选什么底板就决定这块板子能接什么外设。这跟集成度高的4B完全不同4B把网口、USB、HDMI、音频、GPIO都焊死了你做嵌入项目反而觉得累赘。从我实际使用的体验来看CM4有几个4B替代不了的点接口按需扩展我需要Mini PCIe接口插4G模块这是4B不具备的网上有人用USB转接卡凑合但稳定性很差。eMMC比SD卡可靠得多野外环境震动、温度变化大SD卡容易松动或掉数据eMMC是焊在核心板上的存储省心。结构灵活核心板加底板整体尺寸可控装在工业导轨盒或者3D打印外壳里都很方便。一个型号用几年不变4B随时可能停产改版但CM4的形态在工业产品里生命周期会长很多做毕设可能无所谓做小批量产品就要考虑这一点。当然CM4也有代价。最大的问题是你不能买回来插电就用必须自己配底板、自己烧系统、自己解决散热和电源门槛比4B高了一截。我觉得这个门槛反而是好事迫使我们把系统的每一层都搞清楚。1.2 微雪底板选型你需要哪些接口就配哪块板市面上CM4底板很多原装的树莓派Compute Module 4 IO Board功能最全有PCIe x1、双HDMI、双千兆网口、USB 2.0等但价格贵而且很多接口在我这个项目里用不上。微雪Waveshare的底板主要有几个系列CM4-IO-BASE-B带千兆网口、USB 2.0 x 4、HDMI、Mini PCIe、CSI/DSI接口尺寸接近4BCM4-IO-BASE-C功能类似但把网口和USB排列得更紧凑CM4-IO-POE-BASE-B支持PoE供电适合有网线环境的项目CM4-DUAL-GE双千兆网口版本适合软路由场景我的选择是CM4-IO-BASE-B。核心原因是它能同时满足三个关键需求Mini PCIe插4G模块、原生CSI接口接摄像头、带eMMC烧录切换开关。这些接口都是焊在底板上的比飞线稳定得多。微雪底板还有一个容易被忽略的细节上面的Mini PCIe插槽默认是PCIe总线接口并不是标准的USB引脚定义。这意味着你要用4G模块得看底板规格书里是否单独留出了USB信号线。我当时差点踩坑后来翻微雪官方Wiki才发现BASE-B板卡上4G模块是通过USB 2.0通道通信的而PCIe通道是独立给NVMe或者加速卡用的。简单说同一个物理接口走什么协议取决于底板布线买之前一定去官网查对应型号的原理图或Wiki。1.3 我这套硬件的最终清单给准备抄作业的同学一个参考清单都是我实测跑通的组合部件型号/规格备注核心板树莓派CM44GB内存32GB eMMC根据需求选2GB/8GBeMMC强烈建议要底板微雪CM4-IO-BASE-B带Mini PCIe、CSI、eMMC切换开关4G模块广和通L610或者SIM7600系列国内4G全网通支持移动/联通/电信摄像头OV5647 500万像素CSI摄像头常见树莓派摄像头模块性价比高天线LTE棒状天线 IPEX转SMA线4G信号弱时主要靠它SIM卡物联网卡或普通流量卡注意确认APN参数电源5V/3A以上建议带开关的工业级电源USB供电仅用于调试不能用于野外长期运行散热铝合金散热外壳或主动风扇CM4满载温度不低全部加起来成本比4B整套贵不了多少但可靠性和接口适配性完全不是一个级别。2. 组装与首次烧录eMMC启动模式里藏着第一个坑2.1 先把CM4核心板和底板装好组装本身没什么难度CM4插在底板上的SO-DIMM槽注意金手指方向和缺口对齐斜着插入后往下按卡扣会固定住。但有几个细节我要专门提醒插之前用手碰一下金属水龙头放掉静电CM4上的器件密度很高静电损坏的返修率不低。检查底板上的铜柱如果核心板背面有元器件不要让铜柱直接压到元件。接摄像头排线时FPC排线的金属触点一面要朝下插入CSI接口的锁扣槽很多人第一次都插反了导致摄像头完全无法识别。如果装了散热外壳先装外壳后插排线否则排线弯折角度太大会把触点弄断。2.2 eMMC烧录模式怎么进这是微雪底板一个很方便的设计。CM4核心板如果是eMMC版本出厂时eMMC里可能是空的或带测试系统。我的操作流程是这样的断电状态把底板侧面的eMMC切换开关拨到USB BOOT挡位也就是靠近USB OTG口那边。用Micro USB线必须是数据线不是只有供电的充电线连接电脑。给底板通电此时CM4会进入烧录模式在电脑上表现为一个USB设备。使用树莓派官方烧录工具Raspberry Pi Imager选择对应的CM4型号和系统镜像直接写入。这里有个很容易搞混的点进入烧录模式后如果电脑上没有任何反应多半是驱动问题。Windows下需要安装rpiboot驱动Linux和macOS则可以运行开源的rpiboot工具把设备识别出来。我当时在Windows上卡了很久换了一台Ubuntu电脑后用一条命令搞定了git clone https://github.com/raspberrypi/usbboot cd usbboot sudo ./rpiboot执行之后就能在lsblk里看到一个移动存储设备再用dd或者Raspberry Pi Imager写入镜像都可以。用Imager的好处是可以预置SSH、Wi-Fi和用户名密码省去后续接显示器的麻烦。我个人建议新手在第一次烧录时就直接用Raspberry Pi OS Lite64位不要桌面版。这个项目最终是要无人值守跑的桌面环境只会增加占用和崩溃概率而且无桌面系统在4G拨号和摄像头配置上少踩很多坑。2.3 从烧录到首次SSH登录我做了什么烧录完成后把eMMC开关拨回正常启动挡位插上电源系统就启动了。Raspberry Pi Imager里有两个选项可以提前预置启用SSH服务并设置用户名、密码配置Wi-Fi的SSID和密码也可以写wpa_supplicant.conf但如果你的项目后续靠4G上网调试阶段还是建议先用网线或者Wi-Fi把网络搞通因为第一次开机连IP都不知道在哪。我实际操作中会在路由器后台找树莓派的IP或者用arp-scan扫局域网sudo arp-scan --local然后SSH登录第一件事是换源否则后续安装软件包会慢到怀疑人生。树莓派OS默认用的是官方源国内访问很不稳定。我通常把/etc/apt/sources.list里的deb.debian.org替换成国内镜像地址同时把/etc/apt/sources.list.d/raspi.list里的archive.raspberrypi.org也换掉。换完源之后执行sudo apt update sudo apt full-upgrade -y把系统更新到最新。这一步很重要因为树莓派的固件、内核和libcamera这些组件更新很快旧系统跑新摄像头模块经常会有莫名其妙的兼容性问题。3. 4G模块接入从驱动确认到拨号上网的完整链路3.1 4G模块在Linux下的呈现方式把4G模块插到微雪底板的Mini PCIe插槽里插好SIM卡槽、接上天线正常开机后先确认模块有没有被系统识别。因为微雪这个底板把4G模块走USB通道所以模块会以USB设备的形式出现用lsusb可以看到类似下面的设备Bus 001 Device 004: ID 2cb7:0104 Fibocom L610如果lsusb里能看到厂商ID说明模块硬件供电和USB枚举都正常。这时候再检查系统里有没有对应的tty设备ls /dev/ttyUSB*一般会看到ttyUSB0、ttyUSB1这样的设备。有些4G模块还会生成多个USB串口分别对应AT指令口、PPP口和日志口具体哪个用哪个得查模块手册。广和通L610常见的是ttyUSB0和ttyUSB1SIM7600系列则可能是ttyUSB0到ttyUSB3多个。如果lsusb看不到设备不要急着怀疑模块坏了先检查这几个地方SIM卡是否插到位注意金属触点朝向天线是否接上不接天线不会导致识别不到但信号会非常差模块的USB通道在底板上是不是独立供电有些底板需要额外跳线帽选择电压系统内核是否缺少option或usb_wwan驱动模块3.2 用AT指令先确认模块活着在拨号之前先通过AT指令和模块对话是必须的一步。我用串口工具minicom来做sudo minicom -D /dev/ttyUSB0 -b 115200进入串口后输入AT如果返回OK说明模块的AT口是通的。接下来按顺序测试ATI ATCPIN? ATCSQ ATCREG?ATI返回模块型号和固件版本ATCPIN?查询SIM卡状态返回READY表示卡已识别ATCSQ查信号强度返回类似CSQ: 18,99第一个数字越大越好一般大于10才有相对稳定的通信ATCREG?查网络注册状态返回0,1表示注册上当前网络如果ATCPIN?返回ERROR或者SIM not inserted大概率是SIM卡接触问题或者卡槽方向弄反了。我遇到过一次原因是SIM卡没有完全推入卡槽底部卡扣虽然合上了但触点没对准。3.3 拨号方案对比PPP脚本、NetworkManager、QMI我最后留了哪个4G模块拨号上网Linux下主要有三种方式传统PPP拨号通过pppd配置拨号脚本再配合chat脚本发送AT指令NetworkManager ModemManager图形化/命令行集成管理适合桌面系统QMI/ECM协议拨号使用qmi工具或ModemManager的QMI模式靠内核网卡直接上网我一开始按照网上文章试了PPP拨号但发现一个很现实的问题pppd虽然能拨上去但连接不稳定几分钟后会掉线而且重拨逻辑要自己写shell脚本效率很低。在野外场景下掉线重连是个大事我不想天天跑过去重启。后来我换成了NetworkManager加ModemManager的组合这个方案在Raspberry Pi OS上简直舒服。安装如下sudo apt install modemmanager network-manager然后关闭系统的dhcpcd服务让NetworkManager接管网络sudo systemctl disable dhcpcd sudo systemctl enable NetworkManager sudo systemctl restart NetworkManager接着用mmcli管理模块sudo mmcli -L sudo mmcli -m 0mmcli -m 0会列出模块的详细信息包括SIM卡状态、运营商、信号强度。如果一切正常直接执行sudo mmcli -m 0 --simple-connectapncmnetapn参数根据你的SIM卡运营商设置移动物联网卡一般是cmnet或专用APN电信是ctnet联通是3gnet。执行成功后NetworkManager会自动把4G模块注册为一个以太网口比如wwan0然后系统就能上网了。这种方式最大的优势是**NetworkManager本身有自动重连机制模块掉线后它会尝试重新注册网络不太需要自己维护重拨服务。**这是我最终选它的核心原因。3.4 开机自动重连与掉线检测虽然NetworkManager能自动重连但野外场景下我还是加了一个看门狗脚本来防意外状态比如模块死机、SIM卡无网络等情况。脚本逻辑很简单#!/bin/bash while true; do if ! ping -c 3 -W 5 114.114.114.114 /dev/null 21; then sudo mmcli -m 0 --simple-disconnect sleep 3 sudo mmcli -m 0 --simple-connectapncmnet fi sleep 60 done用systemd服务把脚本拉到后台跑比cron可靠。这里有一个细节ping外面的IP一定要选不会被墙的稳定IP114.114.114.114是国内常用的公共DNS延迟低且稳定。另外一个经验是4G模块长时间工作后可能有小概率进入“假死”状态lsusb能看到设备但AT指令无响应。这种时候软件层只能通过模块的硬件复位引脚或者USB重新枚举来恢复。微雪底板上如果有模块复位按钮可以飞线接一个GPIO出来通过GPIO定时拉低复位这是我在第二版设备上才加上去的功能。4. CSI摄像头与图像采集OV5647的真实表现4.1 接线的位置和固定方式OV5647摄像头模块是树莓派生态里最常见的CSI摄像头500万像素接口是15pin的FPC排线。接在微雪底板上的CSI接口时有个点必须注意**排线的金属触点一面要面向主板PCB板的方向而不是朝上。**如果插反了系统里完全检测不到摄像头而且不会报任何错误。插好后在系统里执行vcgencmd get_camera这个命令在较新的系统里可能会显示不支持因为树莓派官方已经全面切换到libcamera栈老工具链逐渐被淘汰。现在更可靠的方式是直接运行libcamera-hello看能不能出图像。还有一个容易被忽略的问题OV5647模块的FPC排线很脆弱弯折半径不能太小而且插好后要用胶带或者热熔胶固定一下防止震动导致接触不良。野外项目尤其要注意我第一块摄像头模块就是因为排线松动在设备运输过程中触点磨损了最后只能换新的。4.2 内核设备树与libcamera的关系CSI摄像头在Linux下不是插上就能用的它需要内核设备树里配置对应的驱动节点。树莓派OS的官方内核已经内置了OV5647的驱动但必须通过/boot/config.txt或者新系统里的/boot/firmware/config.txt使能。我用的配置是start_x1 gpu_mem128 camera_auto_detect1其中camera_auto_detect1是新版系统里的自动探测选项内核会根据CSI接口上检测到的摄像头型号自动加载驱动。如果这个自动探测失效也可以手动指定dtoverlayov5647改完配置重启再执行libcamera-hello --list-cameras如果输出里能看到OV5647的设备节点和它支持的分辨率列表说明摄像头链路已经通了。libcamera这套新框架和老的raspistill完全不同后者已经退出官方主线新项目建议直接学libcamera工具链不要走回头路。4.3 静态拍摄和视频流测试摄像头识别成功后几条核心命令我列出来# 实时预览在本地显示器或VNC上查看画面 libcamera-hello # 拍照保存为JPEG libcamera-still -o test.jpg # 录制10秒视频 libcamera-vid -t 10000 -o test.h264 # 指定分辨率和帧率 libcamera-vid --width 1280 --height 720 --framerate 15 -t 0 -o test.h264无头模式下libcamera-hello的预览窗口是出不来的因为没有显示器。这时候可以用libcamera-still -n参数禁用预览直接拍照。我用实测数据说明一下OV5647的表现分辨率输出帧率上限应用场景2592x194415fps静态拍照细节捕捉1920x108030fps视频监控取景范围广1280x72030-60fps实时视频流网络传输640x48060fps以上低延迟图像处理适合OpenCV对这个项目来说4G上行带宽有限所以我最终跑的是1280x720分辨率、10-15fps。再高的话4G链路会成为瓶颈画面卡顿反而严重。4.4 把摄像头画面传到PC的两种思路很多人问树莓派怎么把图像传到电脑上我做过的方案有两条路思路一简单粗暴按帧抓图传文件写一个定时任务每隔5秒用libcamera-still拍一张照片然后通过rclone或者curl上传到服务器。这种做法适合做定时采集项目比如农田监控、工地巡检照片精度高但实时性差。思路二视频流推送更推荐的做法是用libcamera-vid推RTSP流配合软件或者服务器中转。例如libcamera-vid -t 0 --width 1280 --height 720 --framerate 10 --codec h264 --inline -o udp://192.168.1.100:5000如果树莓派和PC在同一个局域网直接往PC的IP推UDP流PC端用VLC打开网络串流就能看。跨公网的话则要依赖中转服务4G模块本身有公网IP通常是CGNAT不能直接做服务端所以我的方案是把视频流推给一台云服务器再由服务器转发到手机端。这个过程和摄像头本身无关完全是网络链路的架构问题。我个人不推荐在树莓派上用OpenCV的VideoCapture直接读CSI摄像头因为OpenCV的V4L2后端和libcamera栈对接效率不高CPU占用高且延迟大。更好的做法是让libcamera负责采集和编码然后通过共享内存或者网络套接字把H264帧数据送给上层应用。5. 4G加CSI同时跑的联调问题电源、串口、干扰5.1 供电不足的典型症状和排查当4G模块和摄像头同时工作时最核心的系统性问题就是供电。CM4的CPU在峰值时功耗可以到7W左右4G模块在发射功率最大时瞬间电流可能冲到2A级别这两个同时叠加对电源的要求很高。我第一版用的是USB-C手机充电器供电用电压表测5V轨有掉压到4.6V的情况具体表现是4G模块频繁掉线、摄像头偶尔初始化失败、系统日志里出现大量 undervoltage 警告。这个问题的排查思路很清晰输入电源必须达到5V/3A以上而且要选真材实料的电源劣质电源标称3A实际压降严重尽量用带电压补偿的工业级电源模块而不是普通手机充电器检查底板的电源走线如果4G模块和核心板共用同一路5V加一个大电容在电源入口处能明显改善瞬态响应我后来换成了工业导轨式5V/5A电源电压稳定在5.08V所有症状都消失了。所以这个坑一定不要省。5.2 4G模块占用串口和GPIO时怎么和摄像头共存4G模块通过USB通道和主机通信后往往还会以调制解调器副口的形式占用额外的GPIO、复位引脚或指示灯引脚。微雪底板上默认把4G模块的复位引脚接到了指定GPIO如果你在设备树或Python脚本里误用了这个GPIO就会导致模块被意外复位。检查方式是看底板原理图确认哪些GPIO被底板的4G模块、网口、电源管理等功能占用。在/boot/firmware/config.txt里也可以用gpioxxop,dh之类的参数预留保护但这属于进阶操作普通项目只要不去碰这些引脚的复用功能就行。CSI摄像头和4G模块在硬件层其实不冲突因为它们走的是完全不同的总线——CSI是专用摄像头接口4G是USB。冲突主要发生在软件配置上比如libcamera要占用的系统内存和ModemManager的日志同时写入时内存不足会导致其中一边挂掉。所以我在config.txt里把gpu_mem设到128MB给摄像头ISP留够缓冲4G侧则限制ModemManager的日志级别减少无谓的IO消耗。5.3 远程场景下的稳定性调优野外无人值守场景设备稳定性的优先级远高于功能堆叠。我测试了几天之后总结出几个必须做的优化给树莓派加硬件看门狗使用bcm2835_wdt内核模块系统死机后能自动重启给4G拨号脚本加上掉线重连逻辑而不是依赖NetworkManager自带的重试摄像头长时间运行后偶尔会出现输出停帧写个定时任务监控libcamera-vid进程状态超过一定时间没有输出就重启进程降低视频编码码率4G上行带宽有限把码率控制在1Mbps以内在1280x720分辨率下能保持清晰度我还做了一件事把系统日志转到一个文件并定期清理避免日志写满导致系统卡死。logrotate配一下日志文件保留3天超过了就自动删。6. 这套组合还能延伸出哪些玩法6.1 毕设和项目开发中常见的扩展方向树莓派CM4加4G模块加CSI摄像头这个组合几乎是为“移动数据采集终端”量身定做的。我在实际项目中看到过的延伸方向包括野外环境监测摄像头定时拍照4G上传到云平台结合温度湿度传感器移动巡检机器人CM4做主机4G做远程通信摄像头做视觉识别通过GPIO控制舵机转动车辆辅助监控OV5647摄像头做广角拍摄基于OpenCV做车道或障碍物检测ADS-B飞机追踪系统接SDR接收机结合树莓派把航班数据传到云端这也是网上很火的一个方向这几个方向里如果做毕设我强烈建议在图像或数据上加入一点AI推理比如用YOLOv5跑目标检测。CM4的内存选择很重要4GB版本跑轻量模型没问题8GB版本能稍微宽裕一点2GB版本就不要勉强了。树莓派5本身性能更强但就这个项目形态而言CM4的接口可定制性仍然是不可替代的优势。6.2 软件层面的优化思路跑了一段时间后我深刻体会到硬件组合只是基础软件的健壮性才决定系统的寿命。几个优化方向供参考把整个SD卡或eMMC做成只读文件系统防止意外断电导致文件系统损坏用Docker封装业务服务4G拨号和摄像头采集作为两个独立容器运行互不干扰部署一套网页管理界面通过4G网络远程查看设备状态、信号强度、摄像头画面对视频流做移动侦测只在画面变化时上传图片或录像大幅减少流量消耗移动侦测这个我多说一句。野外部署的4G流量卡流量有限持续推视频流一天可能跑几个G太浪费了。用OpenCV做帧差法检测画面里没动静就不传有动静才拍照和通知一个月可能都用不完1G流量。6.3 一点过来人的最终建议这套配置到最后稳定运行我的体会有几条特别直白的经验第一不要迷信网上那些“一键脚本”。4G模块在树莓派上的拨号方案五花八门不同芯片、不同模块厂商的配置差异很大照抄别人的脚本大概率失败。最可靠的做法是花一点时间读懂mmcli的输出理解自己的模块到底是什么状态。第二SIM卡要选正规物联网卡。我刚开始用的是一张普通手机流量卡结果运行时被运营商限速拨号能上但网速极慢。换了物联网卡之后速度和稳定性都好了很多。APN参数务必和卡商确认填错APN往往能注册网络但上不了网。第三排线、天线这些“小件”才是最容易出问题的。4G天线接口如果接触不良信号强度直接从30掉到5摄像头排线接触不良时有时还会导致系统开机卡在彩虹屏。这些不如驱动程序那么“技术”但在实际项目里翻车的概率更高。如果你准备在自己的项目里上这套组合我建议按这个顺序验证先是系统能启动接着摄像头能出图然后4G能拨号上网最后再去测7x24小时稳定性。每步都确认干净了再进入下一步否则问题混在一起排查起来会非常痛苦。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →