Character platform and retainer ring

This commit is contained in:
2026-01-10 16:12:43 +01:00
parent 68bd7537ff
commit c418623cd0
5 changed files with 74 additions and 5 deletions

View File

@@ -0,0 +1,21 @@
// This is the base of the character used to play a story.
// It is meant to be pressed on the retainer ring on the Fabula Storyteller and snap in place.
// The retainer ring has tree bumps that snap in the gap at 4mm height
module character_retainer_platform() {
$fn = 128;
cylinder(d1 = 38, d2 = 40, h = 2);
translate([0, 0, 2]) cylinder(d2 = 38, d1 = 40, h = 1);
translate([0, 0, 3]) cylinder(d = 38, h = 1);
translate([0, 0, 4]) cylinder(d1 = 38, d2 = 40, h = 1);
difference() {
translate([0, 0, 5]) cylinder(d = 40, h = 3);
// This is the gap to place a 2,5cm diameter adhesive NFC tag.
// Set your slicer to pause the print at 5,5mm height and insert
// the tag during the print
translate([0, 0, 5]) cylinder(d = 28, h = 1);
}
}
character_retainer_platform();

View File

@@ -0,0 +1,27 @@
// The support the character is inserted in when playing a story.
// Mounted on the shell with two screws.
// To be printed in clear plastic because it receives the light from the RGB led.
module character_retainer_ring() {
$fn = 128;
screw_hole_diameter = 2;
difference() {
// Body
cylinder(d = 59.5, h = 4);
cylinder(d = 40.5, h = 10, center = true);
// 5mm LED hole
translate([0, 25, 0]) sphere(d = 5, center = true);
// Screw holes
translate([25, 0, 0]) cylinder(d = screw_hole_diameter, h = 6, center = true);
translate([-25, 0, 0]) cylinder(d = screw_hole_diameter, h = 6, center = true);
}
// Retainers
translate([0, 0, 3]) {
rotate([0, 0, 30])translate ([19, -2, 0]) cube([1.5, 4, 1]);
rotate([0, 0, 150]) translate ([19, -2, 0]) cube([1.5, 4, 1]);
rotate([0, 0, 270]) translate ([19, -2, 0]) cube([1.5, 4, 1]);
}
}
character_retainer_ring();

View File

@@ -24,7 +24,17 @@ module keycap() {
cylinder(h = 10, d = 20, $fn = 128);
}
module character_retainer_cutout() {
$fn = 128;
// Ring cutout
cylinder(d = 60, h = 5);
// 5mm LED hole
translate([0, 25, 10]) cylinder(d = 5, h = 15, center = true);
// Screw holes
translate([25, 0, 10]) cylinder(d = screw_hole_diameter, h = 15, center = true);
translate([-25, 0, 10]) cylinder(d = screw_hole_diameter, h = 15, center = true);
}
//usb_cutout();
//speaker_grille();
character_retainer_cutout();

View File

@@ -4,7 +4,7 @@ use <cutouts.scad>
// FABULA open source storyteller enclosure
// TODO: open hardware logo, Fabula logo, move switch cutout, tag slot with led mount
// TODO: open hardware logo, Fabula logo, tag slot with led mount
box_cut_height = 10;
pcb_screw_size = 3;
@@ -53,6 +53,7 @@ module fabula_enclosure_top() {
translate([35.5, -12.5, -30]) keycap();
translate([44.5, 23.5, -30]) keycap();
translate([61, -2, -30]) keycap();
translate([-50, 0, -30.5]) rotate([0, 0, 90]) character_retainer_cutout();
}
}

View File

@@ -3,6 +3,9 @@
use <internal_components.scad>
use <fabula_enclosure.scad>
use <keys.scad>
use <character_retainer_ring.scad>
explode_view = false;
module test_fit_components() {
@@ -18,8 +21,15 @@ module test_fit_components() {
translate([12.6, -35.6, 43]) next_keycap();
translate([-23.4, -44.6, 43]) prev_keycap();
translate([2.05, -61.05, 43]) vol_down_keycap();
// Components mounted on the external shell
translate([0, 50, 45]) character_retainer_ring();
}
//test_fit_components();
translate([0, 0, 20]) rotate([0, 0, -90]) rotate([180, 0, 0]) fabula_enclosure_bottom();
translate([0, 0, 20]) rotate([0, 0, -90]) rotate([180, 0, 0]) fabula_enclosure_top();
//translate([0, 0, explode_view ? -20 : 20]) rotate([0, 0, -90]) rotate([180, 0, 0]) fabula_enclosure_bottom();
translate([0, 0, explode_view ? 100 : 20]) rotate([0, 0, -90]) rotate([180, 0, 0]) fabula_enclosure_top();
//DEBUG
//translate([0, 50, 45]) character_retainer_ring();
//DEBUG