淘宝买的壳装不进去,我干脆自己用chipcode写了个
第四次了。
淘宝买的「STM32 通用外壳」,图上看着挺合适,收到货一装——板子放得下,USB 口对不上,差 4 毫米。拿锉刀修了半小时,修完发现螺丝柱正好压在晶振上。
后来我放弃了。买壳这事儿的根本问题是:卖家不知道你板子上有什么,你也不知道卖家的模具是什么尺寸。中间隔着一个「通用」二字,而通用在硬件里通常意味着谁都不合适。
于是开始自己建模。用的不是 SolidWorks,是 OpenSCAD——一个用代码写模型的工具。
为什么用代码建模
先说为什么不用鼠标拖。
机械建模软件(Fusion 360、SolidWorks)画起来直观,但改尺寸麻烦。老板子换个更大的电容,你得重新调一堆草图、重新约束、等它重算。改三次之后你就开始害怕打开那个文件了。
OpenSCAD 的逻辑是参数化:先把所有尺寸写成变量,模型由这些变量算出来。改一个数字,整个模型重新长出来。
对硬件项目来说这特别对味——板子会改版,元件会换,接口位置会挪,这些变化最后都表现为「某几个数字变了」。
先量三个尺寸
建模之前,卡尺量三样东西,一个都不能省:
- PCB 的长和宽。量板边,不含排针。
- 最高的那个元件。通常是电解电容或者继电器,量它顶面到板面的距离。这一项决定了盒子内高,估小了盖不上。
- 所有对外接口的位置和尺寸。USB、DC 座、排针、天线。量它们相对板子左下角的坐标,不是相对盒子。
第三个最容易翻车。我第一次做的时候按「USB 在板子中间」建模,实际它在偏右 8mm 的位置,盒子做出来口子开错了地方。
一个能跑的盒子
下面这段可以直接存成 .scad 打开,改开头的参数就是你自己的盒子。
// ============ 参数:改这里 ============
pcb_w = 62; // 板宽
pcb_d = 38; // 板深
comp_h = 18; // 最高元件高度
wall = 2; // 壁厚
floor = 2; // 底板厚度
tol = 0.4; // 装配公差
r = 3; // 外圆角
// 对外接口:x 是沿板宽方向的位置,从板左边算起
usb_x = 46; // USB 中心离板左边多远
usb_w = 10;
usb_h = 4;
usb_z = 3.2; // USB 中心离板面的高度
inner_w = pcb_w + tol * 2;
inner_d = pcb_d + tol * 2;
inner_h = comp_h + tol + 2;
// 圆角矩形柱体
module rrect(w, d, h, rad) {
hull() {
for (x = [rad, w - rad], y = [rad, d - rad])
translate([x, y, 0]) cylinder(r = rad, h = h, $fn = 48);
}
}
module box() {
difference() {
// 外壳
rrect(inner_w + wall * 2, inner_d + wall * 2, inner_h + floor, r);
// 掏空
translate([wall, wall, floor])
rrect(inner_w, inner_d, inner_h + 1, r - 0.5);
// USB 开口:从右侧壁往外挖
translate([wall + usb_x - usb_w / 2, inner_d + wall - 0.1, floor + usb_z - usb_h / 2])
cube([usb_w, wall + 0.2, usb_h]);
// 散热孔(可选,不要就删掉这块)
for (i = [0 : 4])
translate([inner_w / 2 + wall - 22 + i * 11, inner_d / 2 + wall - 1, floor + 3])
cube([5, 2.2, inner_h - 6]);
}
// 四角螺丝柱
for (p = [[7, 7], [inner_w + wall * 2 - 7, 7],
[7, inner_d + wall * 2 - 7], [inner_w + wall * 2 - 7, inner_d + wall * 2 - 7]])
translate([p[0], p[1], floor])
difference() {
cylinder(d = 7, h = inner_h, $fn = 32);
cylinder(d = 2.9, h = inner_h + 1, $fn = 32); // M3 自攻
}
}
box();
几个地方解释一下。
tol = 0.4 是单边装配间隙。FDM 打印出来的孔永远比设计小,0.4 是保守值——想紧一点用 0.3,想松用 0.5。别设 0,设 0 你就装不进去。
hull() 那个圆角技巧:四个角各放一个圆柱,然后取凸包。这是 OpenSCAD 里做圆角矩形最省事的写法,比 minkowski() 快得多。
螺丝孔给的是 2.9,M3 自攻螺丝直接拧进塑料,靠塑料变形咬住。如果要反复拆装,把这个孔改成 4.2,塞 M3 热熔铜螺母进去。
USB 开口的 z 值是从板面算的,不是从盒底算的。这点很重要——floor + usb_z,算错的话口子会开在底板里。
打印的时候还会翻车
模型对了,打印未必对。
壁厚 2mm 是底线,别为了省料做 1.2,一拧螺丝就裂。
开孔朝上打。USB 那个开口如果悬在中间,切片软件会给你加支撑,拆支撑的时候容易把薄壁拉坏。把盒子翻过来,让开口朝底面,就不用支撑了。
PLA 够用。除非你的板子发热严重(比如带了 DCDC 或继电器),那就上 PETG,PLA 在 60 度以上会软。
层高 0.2、壁数 3。不用追求 0.1 的精度,这种盒子 0.2 完全看不出来,还能省一半时间。
说回 AI
上面那段代码,最早是我自己一行行敲的。现在大部分时候是让 AI 写初稿,我改参数。
它写 OpenSCAD 有两个好处:语法简单不容易错,而且改起来是纯文本操作,不依赖任何图形界面。你说「把 USB 口往右挪 3 毫米、高度再加 1」,它直接改那两行,不用你重新拖草图。
ChipCode 里的 OpenSCAD 插件还有个我挺喜欢的细节:它会让 AI 渲染三个视角的图看一眼再交给你。因为 AI 写 .scad 经常犯一种错——代码能跑,但开口开在盒子里面。它自己看一眼图就发现了,不用等我打印出来才发现。
最后
自己建模这件事,第一次大概要花两小时,从第二块板子开始就是二十分钟。
而且你会有个副产品:一套参数化的盒子模板。下次换个板子,改五个数字,比逛淘宝快。
淘宝那个壳还在,我留着当反面教材。