Compare commits

30 Commits

Author SHA1 Message Date
804f012b19 Fix size in pogo plug 2023-02-17 17:59:02 -03:00
2baebe8895 Added pogo plug connector 2023-02-17 17:55:20 -03:00
8d962eba14 Cadquery 2 2023-02-17 14:32:01 -03:00
d4e309f081 Battery and CPU holder adjustments 2023-02-17 10:08:05 -03:00
424396a266 Adjust battery holder dimensions 2023-02-16 15:58:30 -03:00
9840e6ad70 Make base taller so battery fits 2023-02-16 15:08:21 -03:00
ccb3220b1b Tweak battery positioning 2023-02-16 15:00:40 -03:00
31630ab1b0 lint 2023-02-16 14:57:51 -03:00
64db220a46 Integrated Battery holder 2023-02-16 14:57:32 -03:00
4624a2531f Integrated CPU holder 2023-02-16 14:42:31 -03:00
be6245aa3b Removed cable hole in screen mount
This cut is not needed with the lower keyboard position.
2023-02-01 10:28:58 -03:00
4b0cf1cfa0 Cleanup and adjustments for rev2
* Removed holes that make no sense anymore
* Made case shorter to avoid unsightly gap between screen and keyboard
* Added comments
2023-02-01 10:21:29 -03:00
6eb3eba4f2 Re-add back strip so mounting pillars print easier 2023-01-30 18:01:50 -03:00
dbaa9832f8 Move USB hole up a little 2023-01-30 16:09:48 -03:00
76af86ac70 Added 6th screen mounting pillar, improved kbd cable hole placement and screen mounting code 2023-01-30 10:57:33 -03:00
6cbd7e2b15 Tweaks 2023-01-27 17:01:37 -03:00
459021ff83 Playing with screen mount parameters, angle to 20 degrees 2023-01-27 16:11:28 -03:00
4f2c1e35f6 Redesigned screen holder for 30 degree screen 2023-01-27 15:43:54 -03:00
1e89b41995 Redesigned screen holder for 30 degree screen 2023-01-27 15:32:04 -03:00
37d96b0e4f Bring the keyboard 1.5 mm lower INTO the case 2023-01-27 13:16:09 -03:00
b85ba1f3e1 2-level kbd mounting pillars 2023-01-27 11:23:04 -03:00
a6d3f32797 larger hole for kbd mounting screws 2023-01-27 11:16:40 -03:00
92291013c6 Smaller kbd pillars, fix base splitting 2023-01-26 15:11:16 -03:00
d048e19cec Starting rev 2
* Adjusted sizes and other parameters for the new 65% keyboard
* Commented battery holder (waiting on the 18650 charger)
2023-01-26 11:08:58 -03:00
bebc4d5729 Move keyboard cable hole 6mm to the left 2022-12-02 11:26:52 -03:00
26dc83baf9 Larger kbd cable hole makes shape simpler 2022-12-02 10:05:27 -03:00
29e2464bef Bring back missing screen mounting pillar 2022-12-02 10:04:23 -03:00
4386b1c017 Split the screen mount so it needs fewer supports 2022-12-01 15:20:57 -03:00
8058118491 Slightly larger hole for power switch 2022-12-01 12:29:33 -03:00
4279547773 Refactor screen_mount script a bit 2022-11-30 14:29:42 -03:00
18 changed files with 205 additions and 53342 deletions

View File

@@ -0,0 +1,27 @@
import cadquery as cq
cpu_stand_positions = [(0, 0), (58, 0), (58, 49), (0, 49)]
lower_stands = cq.Sketch().push(cpu_stand_positions).circle(3, mode="a")
higher_stands = cq.Sketch().push(cpu_stand_positions).circle(2.65 / 2, mode="a")
# This is a holder for DuPont cables so they connect to this
# things' pogo pins which are used to power the CPU
if __name__ == "__main__":
pin_positions = [(0, 0), (4 * 2.54, 0)]
width = 5 * 2.54 + 1
height = 7
model = (
cq.Workplane("XY")
.workplane()
.box(width, height, 2.54 + 1)
.faces(">Z")
.workplane(centerOption="CenterOfBoundBox")
.center(-width / 2 + 1.3 + .5, 0)
.placeSketch(cq.Sketch().push(pin_positions).trapezoid(2.60, 10, 90, mode="a"))
.cutBlind(-2.54)
)
cq.exporters.export(model, "pogo_plug.stl")

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@@ -1,28 +1,7 @@
import cadquery2 as cq import cadquery as cq
from cadquery2 import exporters
lower_stands = ( cpu_stand_positions = [(0, 0), (23, 0), (23, 58), (0, 58)]
cq.Sketch().push([(0, 0), (58, 0), (58, 23), (0, 23)]).circle(3, mode="a")
)
higher_stands = ( lower_stands = cq.Sketch().push(cpu_stand_positions).circle(3, mode="a")
cq.Sketch().push([(0, 0), (58, 0), (58, 23), (0, 23)]).circle(2.65 / 2, mode="a")
)
model = ( higher_stands = cq.Sketch().push(cpu_stand_positions).circle(2.65 / 2, mode="a")
cq.Workplane("XY")
.workplane()
.box(75, 40, 2)
.edges("+Z")
.fillet(3)
.faces(">Z")
.workplane(centerOption="CenterOfBoundBox")
.center(-29, -11.5)
.placeSketch(lower_stands)
.extrude(4)
.workplane()
.placeSketch(higher_stands)
.extrude(9)
)
exporters.export(model, "cpu_holder.stl")

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,5 +1,8 @@
import cadquery2 as cq import cadquery as cq
from cadquery2 import exporters from cadquery import exporters
import battery_holder
import cpu_holder
# Base for the notebook. Basically a kbd base that extends back # Base for the notebook. Basically a kbd base that extends back
# as much as possible # as much as possible
@@ -8,36 +11,48 @@ from cadquery2 import exporters
shell_t = 3 shell_t = 3
# Size of the kbd board # Size of the kbd board
kbd_height = 98 kbd_height = 95.5
kbd_width = 286 kbd_width = 305
kbd_angle = 5 kbd_angle = 5
# Size of the whole object # Size of the whole object
width = kbd_width + 2 * shell_t width = kbd_width + 2 * shell_t
height = 164 # Max bed size height = 159
thickness = 20 + shell_t # 20 inside thickness = 27 + shell_t # 27 inside
# Insert Positions # Insert Positions
ti_radius = 2.35 ti_radius = 2.35
ti_depth = 6.25 ti_depth = 6.25
# Positions are determined by measuring the keyboard # Positions are determined by measuring the keyboard
# mounting holes
kbd_pillar_positions = [
(18.25, -16),
(142.5, -25.5),
(kbd_width - 20, -16),
(23.5, -79.5),
(145.5, -82.5),
(kbd_width - 19, -79.5),
]
# 2-level mounting pillars for the kbd
# Width of these need to be tweaked for
# each specific keyboard
kbd_pillars = ( kbd_pillars = (
cq.Sketch() cq.Sketch()
.push( .push(kbd_pillar_positions)
[ .circle(2.2, mode="a")
(19, -16.5), # Holes for self-tapping screws
(133, -16.5), .circle(1.1, mode="s")
(247.5, -16.5), )
(24, -86),
(142.5, -91), kbd_lower_pillars = (
(261.5, -86), cq.Sketch()
] .push(kbd_pillar_positions)
) .circle(4, mode="a")
.circle(6, mode="a") # Holes for self-tapping screws
# Holes for M3 threaded inserts .circle(1.1, mode="s")
.circle(ti_radius, mode="s")
) )
# These are placed where convenient, and are used to join the top and bottom # These are placed where convenient, and are used to join the top and bottom
@@ -45,10 +60,11 @@ kbd_pillars = (
# Measured from top-left corner OUTSIDE # Measured from top-left corner OUTSIDE
mounting_pillar_positions = [ mounting_pillar_positions = [
(6, -6), (6, -6),
(width - 6, -6), (6, -40),
(width - 6, -40),
(120, -6), (120, -6),
(170, -6), (170, -6),
(width - 6, -6),
(width - 6, -40),
] ]
mounting_pillars = ( mounting_pillars = (
@@ -60,32 +76,21 @@ mounting_pillars = (
screw_holes = cq.Sketch().push(mounting_pillar_positions).circle(3, mode="a") screw_holes = cq.Sketch().push(mounting_pillar_positions).circle(3, mode="a")
battery_holder = ( # Hole for the USB hub's exposed port
cq.Sketch() usb_in = cq.Sketch().trapezoid(13, 5.5, 90, mode="a")
.polygon(
[(-67, 5), (0, 5), (0, -12), (-67, -12), (-67, 5)], # Holes for the battery power cable and button
mode="a", power_in = cq.Sketch().trapezoid(10, 5.5, 90, mode="a")
) power_button_cut = cq.Sketch().trapezoid(7, 7, 90, mode="a")
.trapezoid(83, 83, 90, mode="a")
.trapezoid(80, 80, 90, mode="s") # CPU stand pins
.polygon( lower_stands = (
[(-67, 3), (0, 3), (0, -10), (-67, -10), (-67, 3)], cq.Sketch().push([(0, 0), (58, 0), (58, 23), (0, 23)]).circle(3, mode="a")
mode="s",
)
# Cutout for the
.polygon(
[(-67, 30), (0, 30), (0, 12), (-67, 12), (-67, 30)],
mode="s",
)
) )
higher_stands = (
power_in = cq.Sketch().circle(5, mode="a") cq.Sketch().push([(0, 0), (58, 0), (58, 23), (0, 23)]).circle(2.65 / 2, mode="a")
usb_in = cq.Sketch().trapezoid(13, 5.5, 90, mode="a") )
switch_in = cq.Sketch().trapezoid(13.5, 8, 90, mode="a")
# Motherboard mount
def model(): def model():
@@ -99,38 +104,44 @@ def model():
.fillet(2) .fillet(2)
.faces(">Z") .faces(">Z")
.shell(-shell_t) .shell(-shell_t)
# Battery holder # Power inlet
.workplaneFromTagged("mid_height") .faces(">Y")
.center(-width / 2 + shell_t + 65, height / 2 - shell_t - 45)
.placeSketch(battery_holder)
.extrude(-height / 2)
# Power cable inlet
.faces("<X")
.workplane(centerOption="CenterOfBoundBox") .workplane(centerOption="CenterOfBoundBox")
.center(-height / 2 + shell_t + 48.5, -3) # The position is arbitrary, based on the components available
.center(width / 2 - 15 - 21, -8.5)
.placeSketch(power_in) .placeSketch(power_in)
.cutBlind(-shell_t) .cutBlind(-shell_t)
# Power button
.faces(">Y")
.workplane(centerOption="CenterOfBoundBox")
# The position is arbitrary, based on the components available,
.center(width / 2 - 67 - 21, -1)
.placeSketch(power_button_cut)
.cutBlind(-shell_t)
# USB inlet # USB inlet
.faces(">X") .faces(">X")
.workplane(centerOption="CenterOfBoundBox") .workplane(centerOption="CenterOfBoundBox")
.center(-height / 2 + shell_t + 50, -5) # The position is arbitrary, based on the components
# available, keyboard height, cable length, etc.
.center(-height / 2 + shell_t + 60, -8)
.placeSketch(usb_in) .placeSketch(usb_in)
.cutBlind(-shell_t) .cutBlind(-shell_t)
# Hole for power switch
.faces(">Y")
.workplane(centerOption="CenterOfBoundBox")
.center(0, 0)
.placeSketch(switch_in)
.cutBlind(-shell_t)
# Slanted mounting pillars on the kbd top # Slanted mounting pillars on the kbd top
.faces(">Z") .faces(">Z")
.workplane(centerOption="CenterOfBoundBox") .workplane(centerOption="CenterOfBoundBox")
# Top-left kbd corner inside the box # Top-left kbd corner inside the box
.center(-width / 2 + shell_t, kbd_height - height / 2 + shell_t) .center(-width / 2 + shell_t, kbd_height - height / 2 + shell_t)
.transformed(rotate=cq.Vector(kbd_angle, 0, 0)) .transformed(rotate=cq.Vector(kbd_angle, 0, 0))
# These two offsets push the keyboard "down" into the case
# and need to be adjusted per-keyboard
.tag("sloped") .tag("sloped")
.workplane(offset=-2.5)
.placeSketch(kbd_pillars) .placeSketch(kbd_pillars)
.extrude(-1000) .extrude(-1000)
.workplaneFromTagged("sloped")
.workplane(offset=-5.5)
.placeSketch(kbd_lower_pillars)
.extrude(-1000)
# Remove the excess extrusion # Remove the excess extrusion
.workplaneFromTagged("mid_height") .workplaneFromTagged("mid_height")
.transformed(offset=cq.Vector(0, 0, -thickness / 2)) .transformed(offset=cq.Vector(0, 0, -thickness / 2))
@@ -151,13 +162,41 @@ def model():
.placeSketch(screw_holes) .placeSketch(screw_holes)
# 13 is 20-7 (screw thread length - threaded insert depth) # 13 is 20-7 (screw thread length - threaded insert depth)
.cutBlind(thickness - 13) .cutBlind(thickness - 13)
# CPU Stands (lower)
# The -65, -40 is the position of the CPU,
# and should be a parameter (TODO)
.workplaneFromTagged("mid_height")
.workplane(offset=-thickness / 2, centerOption="CenterOfBoundBox")
.center(width / 2 - 40, height / 2 - 65)
.placeSketch(cpu_holder.lower_stands)
.extrude(7)
# CPU Stands (higher)
.workplaneFromTagged("mid_height")
.workplane(offset=-thickness / 2, centerOption="CenterOfBoundBox")
.center(width / 2 - 40, height / 2 - 65)
.placeSketch(cpu_holder.higher_stands)
.extrude(13)
# Battery Stands (lower)
# The +18, -55 is the position of the battery system,
# and should be a parameter (TODO)
.workplaneFromTagged("mid_height")
.workplane(offset=-thickness / 2, centerOption="CenterOfBoundBox")
.center(-width / 2 + 21, height / 2 - 56)
.placeSketch(battery_holder.lower_stands)
.extrude(shell_t + 5)
# Battery Stands (higher)
.workplaneFromTagged("mid_height")
.workplane(offset=-thickness / 2, centerOption="CenterOfBoundBox")
.center(-width / 2 + 21, height / 2 - 56)
.placeSketch(battery_holder.higher_stands)
.extrude(shell_t + 11)
) )
if __name__ == "__main__": if __name__ == "__main__":
left_cutout = cq.Sketch().polygon( left_cutout = cq.Sketch().polygon(
[(0, 0), (160, 0), (160, -100), (135, -100), (135, -200), (0, -200), (0, 0)], [(0, 0), (width / 2, 0), (width / 2, -height), (0, -height), (0, 0)],
mode="a", mode="a",
) )
@@ -175,13 +214,11 @@ if __name__ == "__main__":
right_cutout = cq.Sketch().polygon( right_cutout = cq.Sketch().polygon(
[ [
(160, 0), (width / 2, 0),
(width, 0), (width, 0),
(width, -height), (width, -height),
(135, -height), (width / 2, -height),
(135, -100), (width / 2, 0),
(160, -100),
(160, 0),
], ],
mode="a", mode="a",
) )

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,5 +1,5 @@
import cadquery2 as cq import cadquery as cq
from cadquery2 import exporters from cadquery import exporters
from modelo import ( from modelo import (
kbd_height, kbd_height,
@@ -10,12 +10,11 @@ from modelo import (
ti_radius, ti_radius,
) )
ti_radius = 2.5
# Size of the whole object # Size of the whole object
width = kbd_width + 2 * shell_t width = kbd_width + 2 * shell_t
height = 59 height = 66
thickness = 62 # Will be shorter after construction height_bottom = 59
thickness = 48 # Will be shorter after construction
# Visible screen size # Visible screen size
vis_w = 220 vis_w = 220
@@ -28,6 +27,9 @@ scr_h = 65
scr_thickness = 5.5 scr_thickness = 5.5
screen_cutout = cq.Sketch().trapezoid(scr_w, scr_h, 90, mode="a") screen_cutout = cq.Sketch().trapezoid(scr_w, scr_h, 90, mode="a")
# Screen angle
scr_angle = 20
# Circuit board and cable hole. # Circuit board and cable hole.
# This is in the back of the screen, and is a bit shorter in height than the # This is in the back of the screen, and is a bit shorter in height than the
# screen. It's wider so it removes enough material to make the shape simpler. # screen. It's wider so it removes enough material to make the shape simpler.
@@ -38,13 +40,14 @@ board_cutout = cq.Sketch().trapezoid(
mode="a", mode="a",
) )
kbd_cable_hole = cq.Sketch().trapezoid(15, 5, 90, mode="a").vertices().fillet(1) kbd_cable_hole = cq.Sketch().trapezoid(20, 9, 90, mode="a").vertices().fillet(1)
mounting_pillars = ( mounting_pillars = (
cq.Sketch() cq.Sketch()
.polygon([(0, 0), (width, 0), (width, -12), (0, -12), (0, 0)], mode="a")
.push(mounting_pillar_positions) .push(mounting_pillar_positions)
.trapezoid(-12, 12, 90, mode="a")
.circle(ti_radius, mode="s") .circle(ti_radius, mode="s")
.clean()
) )
@@ -54,9 +57,9 @@ def model():
.workplane() .workplane()
.tag("mid_height") .tag("mid_height")
.box(width, height, thickness) .box(width, height, thickness)
# The screen goes at a 45 degree angle # The screen goes rotated
.faces(">Z") .faces(">Z")
.transformed(rotate=(45, 0, 0)) .transformed(rotate=(scr_angle, 0, 0))
# Move the screen "lower" so it doesn't interfere # Move the screen "lower" so it doesn't interfere
# so much with the back # so much with the back
.center(0, -2) .center(0, -2)
@@ -65,6 +68,35 @@ def model():
# of the inclined screen # of the inclined screen
.placeSketch(cq.Sketch().trapezoid(1000, 1000, 90, mode="a")) .placeSketch(cq.Sketch().trapezoid(1000, 1000, 90, mode="a"))
.cutBlind(1000) .cutBlind(1000)
# Trim the top
.workplaneFromTagged("mid_height")
.workplane(offset=21)
.placeSketch(cq.Sketch().trapezoid(1000, 1000, 90, mode="a"))
.cutBlind(100)
# Make bottom smaller to fit with base
.faces(">X")
.workplane(centerOption="CenterOfBoundBox")
.center(-height / 2, -thickness / 2)
.placeSketch(
cq.Sketch()
.polygon(
[
(height_bottom, 0),
(height_bottom, thickness / 3),
(height, thickness - 21),
(height, thickness),
(height + 5, thickness + 5),
(height + 5, 0),
(height_bottom, 0),
]
)
.vertices()
.fillet(3)
)
.cutBlind(-1000)
# Fillet top of the object
.edges("|X and >Z")
.fillet(3)
# Cut off viewport hole so we can see the screen # Cut off viewport hole so we can see the screen
.workplaneFromTagged("slanted") .workplaneFromTagged("slanted")
.placeSketch(viewport_cutout) .placeSketch(viewport_cutout)
@@ -76,11 +108,6 @@ def model():
.center(-3, 0) .center(-3, 0)
.placeSketch(screen_cutout) .placeSketch(screen_cutout)
.cutBlind(-scr_thickness) .cutBlind(-scr_thickness)
# Trim the top
.workplaneFromTagged("mid_height")
.workplane(offset=21)
.placeSketch(cq.Sketch().trapezoid(1000, 1000, 90, mode="a"))
.cutBlind(100)
# Make it hollow # Make it hollow
.faces("<Z") .faces("<Z")
# Can't be exactly shell_t because cq fails # Can't be exactly shell_t because cq fails
@@ -90,44 +117,43 @@ def model():
.workplane(offset=-scr_thickness, centerOption="CenterOfBoundBox") .workplane(offset=-scr_thickness, centerOption="CenterOfBoundBox")
.placeSketch(board_cutout) .placeSketch(board_cutout)
.cutBlind(-6) .cutBlind(-6)
# Fillet top of the object # # Make small hole for the keyboard cable
.edges(">Z and |X") # # not needed with this keyboard
.fillet(5) # .faces("<Y")
# Make small hole for the keyboard cable # .workplane(centerOption="CenterOfBoundBox")
.faces(">Y") # .center(width / 2 - 175, -4)
.workplane(offset=-5, centerOption="CenterOfBoundBox") # .placeSketch(kbd_cable_hole)
.center(-width / 2 + 128, -23) # .cutBlind(-height / 2)
.placeSketch(kbd_cable_hole)
.cutBlind(-1000)
# Pillars to join with bottom half # Pillars to join with bottom half
.workplaneFromTagged("mid_height") .workplaneFromTagged("mid_height")
.workplane(offset=-thickness / 2, centerOption="CenterOfBoundBox") .workplane(offset=-thickness / 2, centerOption="CenterOfBoundBox")
.center(-width / 2, height / 2) .center(-width / 2, height_bottom - height / 2)
.placeSketch(mounting_pillars) .placeSketch(mounting_pillars)
.extrude(10) .extrude(10)
) )
exporters.export(model(), "screen_mount.stl") if __name__ == "__main__":
split_offset = -133 print("Exporting")
exporters.export(model(), "screen_mount.stl")
right_side = ( offset_width = -width / 2
right_side = (
model() model()
.faces(">X") .faces(">X")
.workplane(centerOption="CenterOfBoundBox", offset=split_offset) .workplane(centerOption="CenterOfBoundBox", offset=offset_width)
.center(0, height / 2)
.split(keepTop=True) .split(keepTop=True)
) )
exporters.export(right_side, "right_screen_mount.stl") exporters.export(right_side, "right_screen_mount.stl")
left_side = ( left_side = (
model() model()
.faces(">X") .faces(">X")
.workplane(centerOption="CenterOfBoundBox", offset=split_offset) .workplane(centerOption="CenterOfBoundBox", offset=offset_width)
.center(0, height / 2)
.split(keepBottom=True) .split(keepBottom=True)
) )
exporters.export(left_side, "left_screen_mount.stl") exporters.export(left_side, "left_screen_mount.stl")

Binary file not shown.

View File

@@ -1 +1 @@
cadquery cadquery2