Enter Your Electronics & Design Project for a chance to win a $100 Shopping Cart! | Project14 Home | |
Monthly Themes | ||
Monthly Theme Poll |
It's all very well deciding that the PCB itself will be the front panel for my lock, but it will still need an enclosure. I decided that I'd tackle the simplest lock first - and that was my garage door. The reason for this is that all I have to do is simulate a button press, At worst a relay across the existing push-button would do. Of course, that still leaves the issue of how to mount it outside the garage. Once again, this is probably the simplest use case. I can go with a 3D printer box and route the cable straight through the single-skin brickwork of my garage.
Being a coder at heart, my tool of choice for 3D modelling is OpenSCAD. It's very different from the more artistic modelling tools, but particularly suits a parametric design. I've tuned my workflow over the years and this is what I find works for me:
- Make sure anything I think I might change is a variable. Depth of the enclosure, PCB thickness, clearances - all of these are easy to change after a bit of trial and error.
- Use Visual Studio Code as an editor and set OpenSCAD to auto-preview whenever it is saved.
- Include things like the PCB itself as a component. It will never be printed, but it helps visualize what;s going on.
- Model the pieces (e.g. the main upper bit and the lower) in-place. Render them together and comment out all but one when doing a final export
<Here's the code for my enclosure. Notice that the PCB module is prefixed with %. This makes it partially transparent. Notice also that the lower is shifted with one (optional) line so I can visualise the whole thing.
$fn=50; pcbThick = 1.65; pcbX = 60; pcbY = 100; pcbZ = 1; fit = .2; wallThick = 3; wallSlot=1; wallInner = wallThick-wallSlot; cutY = wallThick+1; boxX = pcbX + 2* wallInner; boxY = pcbY + 2* wallInner; boxZ = 25; fixZ = boxZ-12; fixY = 7; module main() { difference() { cube([boxX, boxY, boxZ]); translate([wallThick, wallThick+fixY, wallThick]) cube([boxX-2*wallThick, boxY-2*wallThick-fixY, boxZ]); translate([wallThick, wallThick, fixZ]) cube([boxX-2*wallThick, boxY-2*wallThick, boxZ]); slot(); cable(); mounting(); translate([15,-0.1,10]) m3screw(); translate([boxX-15,-0.1,10]) m3screw(); } } module upper() { difference() { main(); translate ([-1,-1,-1]) cube([boxX+2, cutY+1, boxZ+2]); } } module fixture() { cube([boxX,cutY+fixY,fixZ]); } module m3screw() { rotate([-90,0,0]) { cylinder(r=3,h=2); cylinder(r=1.75,h=cutY+.1); cylinder(r=1.4,h=cutY+fixY+1); } } module cable() { cableY=62; translate([wallThick, (boxY-cableY)/2, -1]) cube([boxX-2*wallThick,cableY, boxZ]); } module mounting() { translate([boxX/2,boxY/2+35,-1]) cylinder(r=2,h=boxZ); translate([boxX/2,boxY/2-35,-1]) cylinder(r=2,h=boxZ); } module lower() { translate([0,0,-boxZ-1]) { // Move so you can see both difference() { main(); translate ([-1,cutY,-1]) cube([boxX+2, boxY, boxZ+2]); } } } module PCB() { translate([wallInner+fit, wallInner+fit,boxZ-pcbZ-pcbThick]) cube([pcbX,pcbY,pcbThick]); } module slot() { minkowski() { translate([0,0,-fit/2]) cylinder(r=fit, h=fit); PCB(); } } upper(); lower(); %PCB();
It took a few iterations. I didn't have enough clearance for the connections to the bottom of the PCB. The PCB was a bit too snug of a fit first time round, and I decided to have the back fairly open rather than just a hole for the cable. I prototyped in a yellow filament as I tend to use up too much of the black. I was almost tempted to leave it in yellow to make it easier to find in the dark, but I'm glad I went with the black in the end.
I didn't make a firm decision as to how I'd connect to the board when designing it. I created some SMT pads on a 0.05" spacing. Initially I soldered on a single row of through-hole header pins that I'd bent at an angle to make them surface mount. I worked pretty well, but I suspected that a attaching a female header a few times might left the pads. Also it stuck out a bit too much and fouled the enclosure I'd printed. I decided to make it lower profile by soldering wires directly. I used a bit of hot glue for strain relief - especially when sliding into the enclosure from below. I can detach the PCB from the rest of the circuit with a Molex microfit connector that pushed through the hole in the garage wall.
All in all, I'm pretty happy how it turned out. I was tempted to use a resin printer to get a nicer finish, but I've found from experience that it can be hard to get nice flat shapes printed without warping, and I think the end result is good enough - especially as it's hidden round the side of the garage out of view. This was the easiest place to drill through the wall.