尧图精选

130英镑低成本树莓派水下探测器DIY实战:从密封到网页控制全解析

🕒 发布时间:2026/10/1 20:40:10 📁 来源:尧图网络
说到用树莓派做水下探测器很多人的第一反应是这东西是不是特别烧钱、特别难搞。其实真上手之后你会发现130英镑就能搭出一个实用且好玩的ROV遥控潜航器雏形。我用Raspberry Pi做了一台水下探测器花了大概130英镑在自家泳池和附近水域试了大半个月整体表现让我挺意外。这篇文章把我踩过的坑、换过的方案、最终稳定的配置全部整理出来从外壳水密处理到网页控制端搭建一条线讲完想做水下机器人又不知道从哪下手的朋友可以直接照着抄。1. 整体架构与方案选型130英镑怎么花得明白1.1 为什么是系缆式水下探测器先聊清楚一个原则问题水下设备到底应该做成自主式的还是系缆式的市面上那些水下无人机、水底探测机器人大部分其实是系缆式也就是有一根线连接水面母船或岸基控制台。这跟很多DIY爱好者的直觉正好相反他们总想着用无线通信解决一切。实际原因是水对无线电波的衰减极其严重。2.4GHz的Wi-Fi信号在空气中能传几十米到水下哪怕是清水半米之内就基本断流。蓝牙、LoRa、433MHz这些射频方案在水下也都好不到哪去只有极低频的声纳或者超低频无线电才能穿透水体而那些设备的成本和复杂度显然不是130英镑预算能覆盖的。所以系缆是这个预算下最合理的选择。一根线同时搞定三件事给水下端供电不用担心电池续航焦虑实时传视频信号延迟可控制在数百毫秒内传控制指令不会因为水深深浅而丢失整个系统的架构其实很直白水面端电脑或手机浏览器→ 网线/系缆 → 水下端树莓派摄像头推进器。我在设计初期就确定了有缆ROV这条路线这样不但省下了一套昂贵的通信模块还能把省下的预算投入到摄像头和密封舱上。1.2 预算拆解与关键器件选型130英镑不是拍脑袋定的数字而是我把所有必需物料过了一遍之后得出的一个非常紧绷但不将就的预算。下面这个表格就是我当时的实际开销误差在几英镑之内部件具体选型预算英镑主控板Raspberry Pi Zero 2 W18摄像头树莓派官方CSI摄像头模块500万像素12推进电机小型370直流减速电机 x232电机驱动DRV8833模块6系缆八芯防水网线10米 加粗硅胶供电线14耐压舱110mm PVC给水管及管帽12密封件丁腈O型圈、环氧树脂、道康宁真空硅脂10LED照明双头水下LED灯组12V8电源12V/5A开关电源 DC-DC降压模块16骨架与杂项3D打印支架、不锈钢螺丝、热缩管、防水接头12主控为什么选Zero 2 W而不是性能更强的树莓派4B除了价格因素更关键的是发热和尺寸。水下密闭舱内几乎没有空气流动主动散热也做不了Pi 4B在满载时发热量明显更大Zero 2 W满载功耗也就1.5瓦左右常温下贴着散热片就能稳住温度。另外110mm内径的PVC管塞一块Pi 4B和一堆线材会很勉强而Zero 2 W的尺寸只有65x30mm配套的CSI排线在狭小空间里走线的难度也小很多。摄像头方面官方摄像头模块比USB摄像头更适合这个场景因为USB在密闭舱内会多一个插头松动的隐患。CSI接口是板载排线固定好之后几乎没有位移耐震动耐折腾而且串行传输在舱内的电磁干扰也更好控制。1.3 核心性能参数与预期讲参数之前先道个明白DIY级别的系缆ROV物理天花板很清楚。我的目标不是去挑战蛟龙号而是用手边材料做一个能在浅水区看清水下情况的工具。下面是这台探测器的设计参数最大潜深静态密封条件下理论可承受10米水压实际建议控制在2到3米以内巡航速度约0.3至0.4米/秒靠两个直流电机差速驱动视频640x48015帧/秒MJPEG硬编码实时流控制延迟局域网环境下约200至300毫秒供电系缆岸电模式可无限续航也预留了电池仓位应急使用大概能跑40分钟在设计阶段就把这些参数定下来不是为了炫技而是为了给后面所有环节的取舍提供一个准绳。举个例子有了潜深3米这个目标水压大约是0.3个标准大气压PVC管和环氧灌封就完全够用完全没必要去买昂贵的专业防水连接器。有了双电机差速这个方向软件的转向控制逻辑也就非常清晰了。参数定死之后整台机器从外观到内部布局基本都在脑子里成形了一根漂亮的透明管前头是镜头和灯光中间是大脑后头是线缆束。剩下的就是一步步把它落地。2. 耐压舱与水密处理整个项目最关键的部分2.1 舱体结构与观察窗设计水下探测器的外壳是整个项目最考验手艺的环节也是决定成败的关键。我使用的方案是110mm内径的PVC给水管做主舱体前段嵌入一段亚克力透明管做观察窗。选PVC管首先是因为便宜好买任何五金建材商店都有其次加工方便手锯加砂纸就能搞定尺寸最后耐压性能对3米以内的水深来说绰绰有余这就像用饭店里那种玻璃扎啤杯去装水一样极大富余。具体结构是这样的舱体从前到后依次是透明观察窗段、主电子舱段、穿线密封段。透明观察窗就是摄像头前面那个眼睛我用亚克力管和内径相同的PVC管对接接缝处先用生料带缠绕打底再涂两层环氧树脂。注意环氧树脂不要一次厚涂等第一层表面固化大约4到6小时再涂第二层否则容易起泡开裂。电子舱内部有一个3D打印的支架按Zero 2 W主板、DRV8833驱动模块、DC-DC降压模块的实际尺寸开了槽位。这个支架的作用一是固定二是隔离避免电路板直接贴在PVC管壁上万一管壁内侧有冷凝水也不会立刻短路。后段穿线舱盖是整机最薄弱的地方。系缆要从这里进入舱内电源线和信号线会在这里分出多头。我做了一个直径12mm的穿线孔用卡夫特环氧AB胶把所有线束灌封固定。这个过程一定要有耐心灌封时分两次进行第一次灌到线束根部固化后再补一次确保线芯缝隙间没有气泡残留。气泡在水压下会被压缩形成渗水通道这是新手漏水最容易被忽略的原因。2.2 密封工艺O型圈、环氧灌封与硅脂密封是一个系统工程绝不是打胶两个字能概括的。我的做法是把密封分成两类需要反复拆装的部位用O型圈永久固定的部位用灌封胶。先说O型圈。主舱盖后盖和观察窗前盖都采用O型圈密封。选用丁腈橡胶NBR材质的O型圈截面直径2.65mm外径和端盖法兰槽匹配。安装O型圈之前在凹槽和O型圈表面薄薄涂一层道康宁真空硅脂。硅脂的作用不是粘接而是填充表面微细不平整同时防止O型圈在旋转压紧时被剪切撕裂。如果你手边没有硅脂用一点医用凡士林也能应急但效果和持久性比专用硅脂差不少。再说灌封胶。所有需要穿过舱壁的线缆我统一用环氧树脂灌封。灌封前先用细砂纸把穿线孔周边的PVC表面打磨粗糙增加环氧的粘接面积。然后把线束按顺序穿过孔洞调整到最终位置用电工胶带在舱外缠绕一圈做临时定位再从舱内方向灌注环氧。前面提到的两次灌封法第一次只需要覆盖线束底部2至3毫米厚等它完全固化后再灌第二层把线束空隙全部填满厚度控制在8毫米以上。最后说上电测试前的密封验证。正式下水前一定要做纸巾测试把一团干燥的白色纸巾放进舱内盖好所有盖板然后把整个探测器丢进装满水的水槽或塑料整理箱里静置10分钟。取出后打开舱盖如果纸巾完全干燥、颜色不变说明这一版密封合格如果有任何受潮迹象当场就不要下水了拆开重新检查处理。这个测试成本几乎为零却能避免电子设备在水下直接报废强烈建议每一位DIY玩家不要跳过。2.3 重心配平与浮力计算密封舱做好以后接下来的问题非常实际它会不会浮怎么保持姿态这部分如果有偏差推进器再好也白搭。先说计算。把舱体完整体装配好包括电池、线束、支架、线缆出舱段放在电子秤上实测总质量我那次装完大约为1.35公斤。浸没状态下排开水的体积大概为1.35升。按淡水密度每升1公斤计算浮力约13.2牛顿重力约13.2牛顿正好处于中性浮力附近。但中性浮力并不是理想状态。我建议把配平目标定在略微正浮力让整机在水下静止时倾向于缓慢上浮而不是下沉。原因是设备一旦断电系缆断裂或者你手忙脚乱操作失误微正浮力能保证它慢慢浮出水面而不是直接沉到水底这个安全冗余对DIY样机来说至关重要。配重和姿态调整我放在了两侧舱体左右各装一个3D打印吊舱里面可以塞钢螺母或钓鱼用的铅坠。实际流程是先在浅水区关掉推进器让探测器自然飘浮观察它是左倾、右倾、低头还是抬头再通过调整配重螺母的位置来微调姿态。注意一点配重不要只考虑重量对称还要考虑整个系统的重心高度。如果重心明显低于浮心探测器在水流扰动下会像不倒翁一样来回摆动运动性能大幅下降所以配重位置尽量向下靠近推进器底部浮心尽量向上观察窗端朝上这样的姿态最稳。推进器安装角度也要配合重心。我的两台推进器对称安装在舱体后部两侧推力轴线略微下压约5度使推进时产生一个轻微的低头力矩抵消加速时舰首上仰的趋势。这个角度不需要太精确但方向要正确否则在水下经常会莫名其妙地朝某个方向跑偏。3. 推进系统与电子控制让树莓派学会游泳3.1 双电机差速方案与防水轴封水下推进方案我对比过三个方向一是买成品水下推进器成品一套下去就小一百英镑直接淘汰二是用无刷电机搭配防水电调成本高且安装复杂三是自己动手做直流电机加轴封的土法推进器便宜、可控、修起来方便我最终选了这个。选电机时用了常见的370减速电机。370电机本身不贵转速不高、扭矩够用配合减速箱以后低速稳定性很好非常适合水下这种阻力大的环境。更关键的是它体积小两个电机可以并排安装在舱体尾部的支架上整机宽度完全受控。电机防水是整个推进系统最容易翻车的地方。我的做法是让电机本身待在舱内、只让转轴穿过舱壁驱动螺旋桨。这样电机完全不接触水穿过舱壁的只是一根细轴。轴和舱壁之间的密封用一个简易的轴封套实现取一节直径8mm的黄铜管内孔6.2mm里面塞入石墨自润滑轴承也可以用车模用的氧化铜粉末烧结轴承代替再把转轴从轴承中穿过。轴承内侧靠近电机的部分涂满硅脂相当于一道软密封舱内侧再加一枚小O型圈做第二道防线。联轴器部分也值得说。电机轴和螺旋桨轴之间不要刚性直连因为细微的安装偏差会在高速旋转时引起偏心震动。我用热缩管双层加热做了一小段柔性联轴器能吸收轻微对中偏差实际航行时整机噪声和震动都比刚性连接小很多。螺旋桨直接买船模用的三叶铜桨或尼龙桨直径30mm配2mm轴孔用顶丝固定。推力测试时我把推进器装在一个小铁架子上通上不同电压用弹簧秤粗略拉了拉力12V下单机拉力约600克两个加起来1.2公斤推力拖动这台1.35公斤的设备绰绰有余水下速度能跑到0.4米每秒左右在潜水区里拍东西完全够用了。3.2 视频链路搭建mjpg-streamer实测树莓派对摄像头的支持非常成熟官方摄像头模块只要在raspi-config里打开相机接口就能用。但要把视频流从水下送到水面上用一个稳定、轻量的方案很关键。我试过直接在网页里用H.264播放效果并不好。树莓派Zero 2 W虽然带H.264硬件编码器但那只是编码网络播放解码端的兼容性、首帧延迟、浏览器插件限制都非常折腾。后来我换成了最经典也最有效的MJPG方案用mjpg-streamer把摄像头采集的画面做成MJPEG流浏览器里用一个img标签就能播放延迟低且稳。编译安装mjpg-streamer的过程sudo apt update sudo apt install -y cmake libjpeg8-dev git cd ~ git clone https://github.com/jacksonliam/mjpg-streamer.git cd mjpg-streamer/mjpg-streamer-experimental make sudo make install启动服务的命令我放到了开机自启脚本里export LD_LIBRARY_PATH/usr/local/bin mjpg_streamer -i input_raspicam.so -x 640 -y 480 -fps 15 -quality 75 \ -o output_http.so -w /usr/local/www -p 8080这里有几个参数特别值得注意。分辨率640x480、帧率15、质量75这三个数是我在画质和流畅度之间平衡出来的结果。试过720p 30帧在零线水下环境看确实更清晰但码率上到3Mbps以后遇到网线质量稍差或者水质浑浊干扰时画面就会卡顿甚至频繁断流。降到640x480后码率能压到1.5Mbps左右整个系统的网络余量非常充裕实际操控体验反而更好。水下画面本质上光线差、动静不大720p和640x480观感差距没有想象中明显。如果你用的是更新的树莓派Zero 2 W官方摄像头在低光下的表现会比早期版本好不少但依然建议开一点增益。水下光线主要依靠前端的LED灯组拍摄距离控制在1米以内画面细节非常有保障。3.3 系缆供电与数据通信方案系缆是整个系统的血管和神经。我用一根八芯超六类网线做数据链路外加两根16AWG硅胶软线做12V供电线外面再套一层耐磨编织网管整体直径大概12mm长度做到10米。为什么要用超六类而不是普通五类水下环境的抗拉、抗弯折性能要求更高超六类线芯更粗、双绞密度更高信号完整性更好。数据链路具体怎么跑树莓派Zero 2 W板载Wi-Fi和USB但我没有在水下用Wi-Fi而是用了一个USB转以太网适配器。岸端用一个小交换机把树莓派和操作电脑接到同一局域网电脑上直接访问http://192.168.x.x:8080观看画面。这个方案绕开了Wi-Fi信号在水中的衰减同时还把控制延迟压到了最低水平。供电方面岸端12V/5A开关电源通过两根硅胶线送电到舱内经过一个DC-DC降压模块把12V变成5V给树莓派和摄像头供电。12V同时直接驱动电机驱动模块VCC和LED灯组。注意压降问题10米硅胶线16AWG内阻约0.04欧/米双线回路就是0.08欧电机全力时电流可达1.5安培线损大概0.12伏这个损耗在可接受范围内。如果你用更细的线比如24AWG网线芯来供电线损会飙到1伏以上树莓派很容易因欠压重启这就是很多人下水就死机的一个隐藏原因。树莓派电源管理里面还可以加一个兜底措施在/boot/config.txt里把usb_max_current_enable设置为1并确保供电模块输出电流至少2.5A。这样即使瞬时波动也不至于触发欠压保护。4. 控制软件与手感调校从能开到好开是关键4.1 网页控制端与GPIO驱动水面控制端我选择了一个不需要安装任何客户端的方案网页。树莓派上跑一个Flask服务提供控制页面和API接口。页面里放了两个滑杆分别控制左右推进器的速度值范围从-100到100拖动滑杆就通过Ajax请求向树莓派发送指令。树莓派侧GPIO控制核心代码我写了个精简框架import RPi.GPIO as GPIO from flask import Flask, request app Flask(__name__) # 电机AGPIO17PWMGPIO22方向 # 电机BGPIO23PWMGPIO24方向 GPIO.setmode(GPIO.BCM) GPIO.setup(17, GPIO.OUT) GPIO.setup(22, GPIO.OUT) GPIO.setup(23, GPIO.OUT) GPIO.setup(24, GPIO.OUT) pwm_a GPIO.PWM(17, 50) pwm_b GPIO.PWM(23, 50) pwm_a.start(0) pwm_b.start(0) def set_motor(pwm, direction_pin, speed): if speed 0: GPIO.output(direction_pin, GPIO.HIGH) else: GPIO.output(direction_pin, GPIO.LOW) pwm.ChangeDutyCycle(abs(speed)) app.route(/) def index(): return open(index.html).read() app.route(/api/control) def control(): left int(request.args.get(left, 0)) right int(request.args.get(right, 0)) set_motor(pwm_a, 22, left) set_motor(pwm_b, 24, right) return OK if __name__ __main__: app.run(host0.0.0.0, port5000, threadedTrue)电机驱动模块我用的是DRV8833它支持双路H桥逻辑输入接树莓派GPIO即可。供电注意要把12V接到驱动模块VS端逻辑电源VD端接5V一段时间跑下来模块表面的温度可以接受但裸奔容易进灰进水我在模块外面套了一段热缩管做简易防护。网页端的设计就一招鲜滑杆控速按键转向。滑杆数值映射到电机的PWM占空比0到100表示正转-100到0表示反转。实际操作中键盘上的W/A/S/D也可以用我加了一个转向按压灵敏度参数按键时长越长转向越猛松开后立即归零。4.2 缓起动、松杆回中与操作手感水下操作和开车完全是两个手感。水下设备的惯性非常大电机响应再快水的阻力也不会让速度突变。如果你把滑杆直接拖到100%推进器会猛转但设备只是缓慢加速反过来你松手让它归零设备还要向前滑行一大段才停下来。如果控制软件不做任何缓冲操作者会觉得这东西不听指挥特别容易撞到障碍物或者把水底搅浑。我的解决方案是加入斜坡控制每次收到目标速度不是马上让电机直接输出这个值而是让实际速度按固定步长逐步逼近目标。比如目标速度80当前速度0每次控制循环增加2大约40个周期后才达到目标输出。这样整机动静看起来柔和了很多打杆不再突兀。同时我要在网页端和树莓派端各做一层松杆回中。网页端检测到按键松开或滑杆长时间无操作就把目标值改为0树莓派端则开启看门狗逻辑如果连续超过500毫秒没有收到任何控制指令强制所有电机停机。这个看门狗非常重要有一次我调试时网线被水面的船桨轻轻碰了一下瞬时断连如果没有看门狗探测器会继续保持原来的推力方向直接冲着水底扎下去。斜坡参数和看门狗超时时间需要根据实际下水微调。我的经验是步长设为满行程的2%500毫秒的看门狗超时漂移感和响应速度之间平衡得比较好。如果步长太小操作会迟钝得像喝醉了步长太大又没有缓冲效果。这一个参数值得多下水试几次调出属于自己的手感。4.3 传感器信息叠加深度、姿态与温度视频画面只是眼睛要让水下探测器真正好用还需要一些基础传感器数据。我在这一版里加了三个便宜且实用的传感器MSS803压力传感器、MPU6050陀螺仪加速度计、DS18B20温度传感器。MSS803模块可以测绝压水面大气压约103千帕每下潜1米增加约10千帕所以通过压力读数差值就能算出深度精度能到0.1米完全够用于浅水观察。MPU6050我用它来测姿态角判断探测器是低头还是浮平避免摄像头一直冲着泥底拍。DS18B20则是顺手接上去的水路温度对拍摄条件判断有参考价值而且它接一根线就行成本不到一英镑。传感器数据我會在视频推流端叠加显示。推荐一个最轻量的办法用GStreamer的textoverlay插件在视频流上实时绘制文字再把叠加后的流推给mjpg-streamer输出。这样网页端只需接收一个视频流不需要额外做前端渲染。叠加的内容包括深度米、俯仰角度、横滚角度、水温摄氏度、系统运行时间。界面清爽实用性强。调试的时候还能多叠一个电机的实时PWM数值方便在地面站查看动力分配是否正常。5. 下水实测与问题排查5.1 首航记录三次下水三个问题调试阶段我经历了三次下水每次都能遇到新问题有必要把这些情况记录下来。第一次下水在水槽里测试通电后电机没有反应。检查了网页控制API返回OK但电机就是不动。排查下来发现是GPIO方向引脚没有初始化电平DRV8833的逻辑输入悬空模块直接进入不使能状态。解决办法是代码里加了一行初始化代码把所有方向引脚初始设置为低电平。这就是那个经典教训GPIO上电默认状态不一定是你想要的状态任何外设都要显式初始化。第二次下水在浴缸里试机视频流几秒后出现花屏和帧内色块。怀疑是CSI排线在密闭舱内受到电机线缆的电磁干扰尤其是DRV8833在PWM高频切换时电流突变会在线路上激发出射频噪声。我把CSI排线换成了带屏蔽的地线版本并在排线两侧用铜箔胶带包了一圈接地花屏问题当场消失。注意铜箔胶带一定要和地导通否则就是一个天线反而放大干扰。第三次下水在某浅水水域正式试航回来打开舱盖发现O型圈边缘有水痕。原因是我装配前没有清洁法兰槽槽里残留了一小粒3D打印的支架碎屑导致O型圈没有完全贴合。清理碎屑后重新涂硅脂再泡水测试10分钟一切正常。这就验证了那句老话水下设备的每一个密封面都必须像做手术一样注意洁净度。5.2 常见故障速查表整理一个速查表里面的故障情况我全部亲眼见过或者身边朋友DIY时遇到过故障现象可能原因解决方案电机无反应但网页正常GPIO方向引脚未初始化上电时把所有输出引脚显式设为低电平电机转向不一致电机驱动输入线接反检查DRV8833的IN1/IN2映射同时核对代码方向位视频流花屏或雪花CSI排线受干扰或接触不良换屏蔽排线、铜箔接地、重新插拔排线并固定视频延迟高于1秒分辨率帧率过高或网络拥塞降到640x480 15fps检查网线水晶头和交换机端口状态树莓派反复重启供电压降过大或电流不足更换16AWG供电线DC-DC输出端并一个2200uF电容舱内出现冷凝水珠密封舱内空气湿度大封舱前放入干燥剂包或抽真空再封口探测器向一侧跑偏两侧推进器推力不一致进BIOS其实是配置脚本里给单侧电机加校准偏移量深度读数明显偏大压力传感器零点漂移程序里每30秒自动做一次水面零点校正5.3 水下安全与省钱避坑提示最后聊一些容易被忽视但很重要的安全细节。水下测试绝对不能一个人单干这是硬性要求。至少有一个同伴在水边盯着设备动态另一个操作控制器发现问题能立刻拉系缆把设备拽回来。第一次试航必须用系绳把探测器绑在岸边的固定桩上防止失控漂走这条绳子的长度比实际需要潜深的一半还要短一些更稳妥。任何涉及水域测试的操作都要在提前确认无人员落水、无水草缠绕、无障碍物的情况下进行。预算上也有几个可以省钱的地方。PVC管和管帽完全可以在建材市场买落水管余料两三英镑就能搞定O型圈不要单独去模型店买上电商平台搜氟胶O型圈套装几英镑一大包各种线径都有3D打印支架如果你没有打印机可以在网上找开源公版模型到学校创客空间或者本地图书馆打印基本就是原料成本。反过来系缆和电源线这两样别省因为它们是整机最容易被拉伸、弯折、浸泡的部件质量不好随时会让整个项目泡汤。有一点小经验值得分享封舱之前把所有螺钉逐个点一遍硅胶等固化后再合盖。这看起来微不足道但螺孔位置往往就是漏水的高发点因为力矩过大会在PVC表面产生细微裂纹水压一上来就会渗漏。我已经被这种细裂纹坑过两次后来的做法是打孔前先在孔位拧入自攻螺钉预压一遍再退出后用环氧填补内部孔壁最后重新攻丝这样能大大降低开裂风险。还有一个对水质拍摄很有帮助的改法水下光线昏暗摄像头白平衡容易偏色你在代码里固定白平衡为日光或者水下模式视频会比自动白平衡更接近真实色彩。加上LED灯组的色温选择偏暖白4000K左右水下悬浮颗粒反光会少一些整体画面干净度明显提升。目前这10米系缆的版本已经稳定用了不少时间后续我想在浮标中继和无线遥传方向再扩展一下比如在水面加一个带4G模块的浮标把树莓派的视频信号通过局域网转发到手机端这样人就不用守在电脑旁边了。另外如果有朋友想低成本复刻这个项目我强烈建议先从水池或浴缸开始把水密和推进手感调顺之后再进入公开水域的实操阶段千万别一上来就挑战深水区。我亲眼见过好几个DIY项目因为在浅水测试时没有耐心反复调整结果到了深水区直接报废那个心情真的是又可惜又恼火。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →