feat: coins arrondis (hull/spheres CORNER_RADIUS=6mm) + gorge joint O-ring normalisée
This commit is contained in:
parent
c341de345a
commit
c976b7182e
2 changed files with 125 additions and 47 deletions
|
|
@ -39,7 +39,7 @@ SHOW_ELECTRONICS = true; // PCB central + batterie (visualisation)
|
||||||
SHOW_PCBS = true; // PCBs anneau + bouchon dans les faces
|
SHOW_PCBS = true; // PCBs anneau + bouchon dans les faces
|
||||||
SHOW_SECTION = false; // Coupe en section pour voir l'intérieur
|
SHOW_SECTION = false; // Coupe en section pour voir l'intérieur
|
||||||
|
|
||||||
EXPLODE = 0; // 0 = assemblé, 1 = vue éclatée (0 à 1 progressif)
|
EXPLODE = 1; // 0 = assemblé, 1 = vue éclatée (0 à 1 progressif)
|
||||||
|
|
||||||
// Distance d'éclatement
|
// Distance d'éclatement
|
||||||
EXPLODE_DIST = 40 * EXPLODE;
|
EXPLODE_DIST = 40 * EXPLODE;
|
||||||
|
|
@ -60,28 +60,11 @@ module frame() {
|
||||||
|
|
||||||
difference() {
|
difference() {
|
||||||
union() {
|
union() {
|
||||||
// --- 12 arêtes du cube ---
|
// --- Squelette arrondi (12 arêtes + 8 coins sphériques) ---
|
||||||
// Arêtes selon X (4)
|
_rounded_frame_skeleton();
|
||||||
for (y = [-1, 1], z = [-1, 1]) {
|
|
||||||
translate([0, y * (half - edge_d/2), z * (half - edge_d/2)])
|
|
||||||
cube([CUBE_SIZE - 2*edge_d, edge_w, edge_d], center=true);
|
|
||||||
}
|
|
||||||
// Arêtes selon Y (4)
|
|
||||||
for (x = [-1, 1], z = [-1, 1]) {
|
|
||||||
translate([x * (half - edge_d/2), 0, z * (half - edge_d/2)])
|
|
||||||
cube([edge_d, CUBE_SIZE - 2*edge_d, edge_w], center=true);
|
|
||||||
}
|
|
||||||
// Arêtes selon Z (4)
|
|
||||||
for (x = [-1, 1], y = [-1, 1]) {
|
|
||||||
translate([x * (half - edge_d/2), y * (half - edge_d/2), 0])
|
|
||||||
cube([edge_d, edge_w, CUBE_SIZE - 2*edge_d], center=true);
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- 8 coins ---
|
// --- Corniches de contact (surface plane pour joint O-ring) ---
|
||||||
for (x = [-1, 1], y = [-1, 1], z = [-1, 1]) {
|
_frame_contact_ledges();
|
||||||
translate([x * (half - edge_d/2), y * (half - edge_d/2), z * (half - edge_d/2)])
|
|
||||||
cube([edge_d, edge_d, edge_d], center=true);
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- Plots de fixation (4 par face, 6 faces) ---
|
// --- Plots de fixation (4 par face, 6 faces) ---
|
||||||
// Face +Z (dessus) et -Z (dessous)
|
// Face +Z (dessus) et -Z (dessous)
|
||||||
|
|
@ -231,6 +214,91 @@ module _all_mount_holes() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Cube arrondi (hull de 8 sphères aux coins)
|
||||||
|
module _rounded_cube(size, r) {
|
||||||
|
hull() {
|
||||||
|
c = size/2 - r;
|
||||||
|
for (x = [-1, 1], y = [-1, 1], z = [-1, 1])
|
||||||
|
translate([x*c, y*c, z*c])
|
||||||
|
sphere(r=r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Squelette arrondi : coque arrondie évidée + ouvertures pour les 6 faces
|
||||||
|
module _rounded_frame_skeleton() {
|
||||||
|
half = CUBE_SIZE / 2;
|
||||||
|
r = CORNER_RADIUS;
|
||||||
|
edge_d = FRAME_EDGE_DEPTH;
|
||||||
|
opening = CUBE_SIZE - 2 * edge_d;
|
||||||
|
|
||||||
|
difference() {
|
||||||
|
// Coque extérieure arrondie
|
||||||
|
_rounded_cube(CUBE_SIZE, r);
|
||||||
|
|
||||||
|
// Évidement intérieur
|
||||||
|
cube([opening, opening, opening], center=true);
|
||||||
|
|
||||||
|
// Ouvertures pour les 6 faces (traversées)
|
||||||
|
cube([opening, opening, CUBE_SIZE + 2], center=true); // ±Z
|
||||||
|
cube([CUBE_SIZE + 2, opening, opening], center=true); // ±X
|
||||||
|
cube([opening, CUBE_SIZE + 2, opening], center=true); // ±Y
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Corniches plates sur chaque face du squelette
|
||||||
|
// Surface de contact plane pour l'assise du joint O-ring et la fixation
|
||||||
|
module _frame_contact_ledges() {
|
||||||
|
half = CUBE_SIZE / 2;
|
||||||
|
edge_d = FRAME_EDGE_DEPTH;
|
||||||
|
lw = FRAME_LEDGE_WIDTH;
|
||||||
|
lh = FRAME_LEDGE_HEIGHT;
|
||||||
|
opening = CUBE_SIZE - 2 * edge_d;
|
||||||
|
outer = opening + 2 * lw;
|
||||||
|
|
||||||
|
// Corniche sur chaque face : anneau plat (outer - opening)
|
||||||
|
// +Z et -Z
|
||||||
|
for (z = [-1, 1]) {
|
||||||
|
translate([0, 0, z * (half - edge_d + (z > 0 ? 0 : -lh))])
|
||||||
|
difference() {
|
||||||
|
linear_extrude(lh)
|
||||||
|
offset(r=CORNER_RADIUS)
|
||||||
|
offset(delta=-CORNER_RADIUS)
|
||||||
|
square([outer, outer], center=true);
|
||||||
|
translate([0, 0, -0.5])
|
||||||
|
linear_extrude(lh + 1)
|
||||||
|
square([opening, opening], center=true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// +Y et -Y
|
||||||
|
for (y_dir = [-1, 1]) {
|
||||||
|
translate([0, y_dir * (half - edge_d + (y_dir > 0 ? 0 : -lh)), 0])
|
||||||
|
rotate([90, 0, 0])
|
||||||
|
difference() {
|
||||||
|
linear_extrude(lh)
|
||||||
|
offset(r=CORNER_RADIUS)
|
||||||
|
offset(delta=-CORNER_RADIUS)
|
||||||
|
square([outer, outer], center=true);
|
||||||
|
translate([0, 0, -0.5])
|
||||||
|
linear_extrude(lh + 1)
|
||||||
|
square([opening, opening], center=true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// +X et -X
|
||||||
|
for (x_dir = [-1, 1]) {
|
||||||
|
translate([x_dir * (half - edge_d + (x_dir > 0 ? 0 : -lh)), 0, 0])
|
||||||
|
rotate([0, 90, 0])
|
||||||
|
difference() {
|
||||||
|
linear_extrude(lh)
|
||||||
|
offset(r=CORNER_RADIUS)
|
||||||
|
offset(delta=-CORNER_RADIUS)
|
||||||
|
square([outer, outer], center=true);
|
||||||
|
translate([0, 0, -0.5])
|
||||||
|
linear_extrude(lh + 1)
|
||||||
|
square([opening, opening], center=true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Canaux pour le passage des nappes/câbles JST vers chaque face
|
// Canaux pour le passage des nappes/câbles JST vers chaque face
|
||||||
module _cable_channels() {
|
module _cable_channels() {
|
||||||
ch_w = 10; // Largeur du canal
|
ch_w = 10; // Largeur du canal
|
||||||
|
|
@ -275,18 +343,20 @@ module face_standard() {
|
||||||
|
|
||||||
difference() {
|
difference() {
|
||||||
union() {
|
union() {
|
||||||
// --- Coque extérieure ---
|
// --- Coque extérieure (coins arrondis) ---
|
||||||
// Plaque principale
|
|
||||||
difference() {
|
difference() {
|
||||||
// Plaque pleine
|
// Parois extérieures avec coins arrondis
|
||||||
translate([0, 0, FACE_TOTAL_DEPTH / 2])
|
linear_extrude(FACE_TOTAL_DEPTH)
|
||||||
cube([face_size - 2*edge_d + 6, face_size - 2*edge_d + 6, FACE_TOTAL_DEPTH], center=true);
|
offset(r=CORNER_RADIUS)
|
||||||
|
offset(delta=-CORNER_RADIUS)
|
||||||
// Évidement intérieur (laisser les parois)
|
square([face_size - 2*edge_d + 6, face_size - 2*edge_d + 6], center=true);
|
||||||
translate([0, 0, FACE_TOTAL_DEPTH / 2 + WALL_THICKNESS])
|
// Évidement intérieur
|
||||||
cube([face_size - 2*edge_d + 6 - 2*WALL_THICKNESS,
|
translate([0, 0, WALL_THICKNESS])
|
||||||
face_size - 2*edge_d + 6 - 2*WALL_THICKNESS,
|
linear_extrude(FACE_TOTAL_DEPTH)
|
||||||
FACE_TOTAL_DEPTH], center=true);
|
offset(r=max(0.5, CORNER_RADIUS - WALL_THICKNESS))
|
||||||
|
offset(delta=-max(0.5, CORNER_RADIUS - WALL_THICKNESS))
|
||||||
|
square([face_size - 2*edge_d + 6 - 2*WALL_THICKNESS,
|
||||||
|
face_size - 2*edge_d + 6 - 2*WALL_THICKNESS], center=true);
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- Membrane tactile (centre, amincie) ---
|
// --- Membrane tactile (centre, amincie) ---
|
||||||
|
|
@ -321,15 +391,11 @@ module face_standard() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Plaque extérieure de la face (la surface visible)
|
// Plaque extérieure de la face (surface visible, coins arrondis)
|
||||||
module _face_outer_plate(size) {
|
module _face_outer_plate(size) {
|
||||||
// Plaque pleine, épaisseur = WALL_THICKNESS, avec le centre aminci
|
|
||||||
difference() {
|
|
||||||
cube([size, size, WALL_THICKNESS], center=true);
|
|
||||||
// Le centre sera aminci séparément
|
|
||||||
}
|
|
||||||
translate([0, 0, -WALL_THICKNESS/2])
|
|
||||||
linear_extrude(WALL_THICKNESS)
|
linear_extrude(WALL_THICKNESS)
|
||||||
|
offset(r=CORNER_RADIUS)
|
||||||
|
offset(delta=-CORNER_RADIUS)
|
||||||
square([size, size], center=true);
|
square([size, size], center=true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -381,15 +447,24 @@ module _face_mount_holes() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Rainure pour joint torique périphérique
|
// Rainure pour joint torique O-ring
|
||||||
|
// Gorge rectangulaire continue suivant le contour arrondi de la face
|
||||||
|
// Dimensions selon norme : largeur ~1.4ר cordon, profondeur ~0.7ר cordon
|
||||||
module _seal_groove(size) {
|
module _seal_groove(size) {
|
||||||
w = FACE_SEAL_GROOVE_W;
|
w = FACE_SEAL_GROOVE_W;
|
||||||
d = FACE_SEAL_GROOVE_D;
|
d = FACE_SEAL_GROOVE_D;
|
||||||
offset = size/2 - w - 1;
|
inset = 3; // Retrait depuis le bord extérieur
|
||||||
|
|
||||||
|
linear_extrude(d + 0.1)
|
||||||
difference() {
|
difference() {
|
||||||
cube([size - 2, size - 2, d], center=true);
|
// Contour extérieur de la gorge (suit l'arrondi des coins)
|
||||||
cube([size - 2 - 2*w, size - 2 - 2*w, d + 1], center=true);
|
offset(r=CORNER_RADIUS - inset)
|
||||||
|
offset(delta=-(CORNER_RADIUS - inset))
|
||||||
|
square([size - 2*inset, size - 2*inset], center=true);
|
||||||
|
// Contour intérieur de la gorge
|
||||||
|
offset(r=max(0.5, CORNER_RADIUS - inset - w))
|
||||||
|
offset(delta=-max(0.5, CORNER_RADIUS - inset - w))
|
||||||
|
square([size - 2*inset - 2*w, size - 2*inset - 2*w], center=true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,13 +20,16 @@ FRAME_MOUNT_DIAM = 3.2; // Diamètre des trous de fixation M3
|
||||||
FRAME_MOUNT_HEAD = 5.8; // Diamètre de la tête de vis M3
|
FRAME_MOUNT_HEAD = 5.8; // Diamètre de la tête de vis M3
|
||||||
FRAME_MOUNT_DEPTH = 3; // Profondeur du lamage tête de vis
|
FRAME_MOUNT_DEPTH = 3; // Profondeur du lamage tête de vis
|
||||||
FRAME_SCREWS_PER_FACE = 4; // Nombre de vis par face
|
FRAME_SCREWS_PER_FACE = 4; // Nombre de vis par face
|
||||||
|
FRAME_LEDGE_WIDTH = 5; // Largeur corniche de contact (face ↔ squelette)
|
||||||
|
FRAME_LEDGE_HEIGHT = 3; // Épaisseur de la corniche plate
|
||||||
|
|
||||||
// --- Faces ------------------------------------------------------------------
|
// --- Faces ------------------------------------------------------------------
|
||||||
FACE_TOTAL_DEPTH = 14; // Profondeur totale d'un module face (du bord ext.)
|
FACE_TOTAL_DEPTH = 14; // Profondeur totale d'un module face (du bord ext.)
|
||||||
FACE_CENTER_DIAM = 40; // Diamètre de la zone tactile centrale
|
FACE_CENTER_DIAM = 40; // Diamètre de la zone tactile centrale
|
||||||
FACE_MEMBRANE_T = 1.0; // Épaisseur de la membrane tactile (centre)
|
FACE_MEMBRANE_T = 1.0; // Épaisseur de la membrane tactile (centre)
|
||||||
FACE_SEAL_GROOVE_W = 1.5; // Largeur de la rainure joint torique
|
SEAL_CORD_DIAM = 2.0; // Diamètre du cordon torique (joint O-ring)
|
||||||
FACE_SEAL_GROOVE_D = 1.5; // Profondeur de la rainure joint torique
|
FACE_SEAL_GROOVE_W = 2.8; // Largeur rainure = ~1.4 × cordon
|
||||||
|
FACE_SEAL_GROOVE_D = 1.4; // Profondeur rainure = ~0.7 × cordon
|
||||||
|
|
||||||
// --- LEDs (PCB Anneau — Étage B) --------------------------------------------
|
// --- LEDs (PCB Anneau — Étage B) --------------------------------------------
|
||||||
LED_COUNT = 12; // Nombre de WS2812B par face
|
LED_COUNT = 12; // Nombre de WS2812B par face
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue