Compare commits

..

3 Commits

Author SHA1 Message Date
Arnaud Morin
e29f86fa70 Inscread plate strap size
Also fix mass printing on all objects

Signed-off-by: Arnaud Morin <arnaud.gfpv@mailops.fr>
2026-09-21 22:22:01 +02:00
Arnaud Morin
e70d2abed2 Increase motor_base hole clearance to 5mm
Signed-off-by: Arnaud Morin <arnaud.gfpv@mailops.fr>
2026-09-14 22:05:05 +02:00
Arnaud Morin
d241613ed9 Finish standoff
Signed-off-by: Arnaud Morin <arnaud.gfpv@mailops.fr>
2026-09-14 22:00:56 +02:00
9 changed files with 52 additions and 66 deletions

6
arm.py
View File

@@ -147,7 +147,5 @@ if "show_object" not in globals(): # running outside CQ-editor
show_object(result)
if __name__ == "__main__":
vol = result.val().Volume()
m = vol * CF_DENSITY
print(f"arm mass {m:.2f} g each, {4*m:.2f} g for four")
v = result.val().Volume()
print("%-12s %.2f g" % ("arm", v * CF_DENSITY))

View File

@@ -4,6 +4,7 @@
import cadquery as cq
from math import sqrt
from frame_params import TPU_DENSITY
def camera_mount():
@@ -130,9 +131,5 @@ if "show_object" not in globals(): # running outside CQ-editor
show_object(result)
if __name__ == "__main__":
TPU_DENSITY = 1.21e-3 # g/mm3
solid = result.val()
print("camera_mount %.2f g in TPU"
% (solid.Volume() * TPU_DENSITY))
v = result.val().Volume()
print("%-12s %.2f g" % ("camera mount", v * TPU_DENSITY))

14
fc.py
View File

@@ -3,13 +3,7 @@
#
import cadquery as cq
# A flight controller is not a material, it is a stack: two boards, their
# spacers, and everything soldered to them. This models only the envelope, as
# one solid, so the density is FR4's -- bare PCB -- and the dense parts (FETs,
# inductors, connectors) stand in for the air between the boards. It lands the
# block at about 12 g, which is what a real 25.5 mm FC plus 4-in-1 ESC weighs.
PCB_DENSITY = 1.85e-3 # g/mm3, FR4
from frame_params import PCB_DENSITY
def fc():
@@ -76,8 +70,6 @@ if "show_object" not in globals(): # running outside CQ-editor
show_object(result)
if __name__ == "__main__":
print("fc %.2f g" % (result.val().Volume() * PCB_DENSITY))
v = result.val().Volume()
print("%-12s %.2f g" % ("fc", v * PCB_DENSITY))

View File

@@ -7,7 +7,10 @@ from math import cos, radians, sin, sqrt
# --- material ---------------------------------------------------------------
THICKNESS = 2.0
CF_DENSITY = 1.55e-3 # g/mm3, for mass reporting
CF_DENSITY = 1.55e-3 # g/mm3
TPU_DENSITY = 1.21e-3 # g/mm3
PCB_DENSITY = 1.85e-3 # g/mm3
ALU_DENSITY = 2.70e-3 # g/mm3, for mass reporting
# --- joint fit --------------------------------------------------------------

View File

@@ -3,6 +3,7 @@
#
import cadquery as cq
from frame_params import TPU_DENSITY
def lollipop():
@@ -126,6 +127,5 @@ show_object(result)
if __name__ == "__main__":
TPU_DENSITY = 1.21e-3 # g/mm3
print("lollipop %.2f g in TPU" % (result.val().Volume() * TPU_DENSITY))
v = result.val().Volume()
print("%-12s %.2f g" % ("lollipop", v * TPU_DENSITY))

View File

@@ -31,7 +31,7 @@ SPAR_MORTISE_ANGLE = 45.0 # +-45 deg to the arm axis
MORTISE_L = TENON_L + FIT # 4.2
MORTISE_W = THICKNESS
BORE_D = 4.0 # 1404 bell / boss clearance
BORE_D = 5.0 # 1404 bell / boss clearance
BOLT_SQ = 9.0 # 1404/1105 M2 pattern -- the DIAGONAL between
# opposite bolt holes, not the square's side
BOLT_D = 2.2 # M2 clearance
@@ -114,11 +114,6 @@ if "show_object" not in globals(): # running outside CQ-editor
show_object(result)
# Mass report
def report():
vol = result.val().Volume()
print(f" Mass = {vol * CF_DENSITY:5.2f} g")
print(f" Mass x4 = {4 * vol * CF_DENSITY:5.2f} g")
if __name__ == "__main__":
report()
v = result.val().Volume()
print("%-12s %.2f g" % ("motor base", v * CF_DENSITY))

View File

@@ -106,33 +106,37 @@ def plate():
p = p.cut(bones.rotate((0, 0, 0), (0, 0, 1), a).translate((x, y, 0)))
# Triangle cuts to reduce weight
# the small one near center
cut1 = (
cq.Workplane("XY")
.polyline([
(6.5, -9),
(6.5, 9),
(1, 0),
(7, -7),
(7, 7),
(1.5, 0),
]).close()
.extrude(THICKNESS)
.edges("|Z")
.fillet(1.0)
)
# strap holes
cut2 = (
cq.Workplane("XY")
.polyline([
(9.5, -9),
(9.5, 9),
(15, 0),
(11, -8),
(11, 8),
(13, 8),
(13, -8),
]).close()
.extrude(THICKNESS)
.edges("|Z")
.fillet(1.0)
.fillet(0.99)
)
# the big one
cut3 = (
cq.Workplane("XY")
.polyline([
(11, 15),
(-11, 15),
(10, 15),
(-10, 15),
(0, 4),
]).close()
.extrude(THICKNESS)
@@ -168,6 +172,5 @@ show_object(result)
if __name__ == "__main__":
v = result.val().Volume()
print("plate mass %.2f g each, %.2f g for two" % (v * CF_DENSITY, 2 * v * CF_DENSITY))
print("%-12s %.2f g" % ("plate", v * CF_DENSITY))

View File

@@ -111,12 +111,6 @@ result = spar()
assert result.solids().size() == 1, "spar is not one solid"
# Mass report
def report():
vol = result.val().Volume()
print(f" Mass = {vol * CF_DENSITY:5.2f} g")
print(f" Mass x4 = {4 * vol * CF_DENSITY:5.2f} g")
# Running outside CQ-editor
if "show_object" not in globals():
def show_object(*args, **kwargs):
@@ -125,4 +119,5 @@ if "show_object" not in globals():
show_object(result)
if __name__ == "__main__":
report()
v = result.val().Volume()
print("%-12s %.2f g" % ("spar", v * CF_DENSITY))

View File

@@ -4,16 +4,22 @@
import cadquery as cq
from frame_params import PLATE_GAP
from frame_params import (ALU_DENSITY, PLATE_GAP)
OD = 3.5 # round M2 standoff
ALU_DENSITY = 2.70e-3 # g/mm3, for mass reporting
def standoff():
p = (cq.Workplane("XY")
.circle(OD / 2.0)
.extrude(PLATE_GAP))
.extrude(PLATE_GAP)
)
cut = (cq.Workplane("XY")
.circle(1)
.extrude(PLATE_GAP)
)
p = p.cut(cut)
return p
@@ -30,8 +36,5 @@ show_object(result)
if __name__ == "__main__":
solid = result.val()
print("standoff %.3f g each, %.3f g for four"
% (solid.Volume() * ALU_DENSITY,
4 * solid.Volume() * ALU_DENSITY))
v = result.val().Volume()
print("%-12s %.2f g" % ("standoff", v * ALU_DENSITY))