4 Commits
Author SHA1 Message Date
penguin86 41c2ac7038 Label for characters box 2026-09-08 00:15:53 +02:00
penguin86 fea80a1b08 Updated README 2026-08-19 21:52:55 +02:00
penguin86 239007d1d4 Added foot to leave a gap below the Fabula to help sound spread 2026-05-30 13:07:49 +02:00
penguin86 926aecebf5 Updated README 2026-05-17 10:07:49 +02:00
3 changed files with 45 additions and 1 deletions
+6 -1
View File
@@ -17,6 +17,8 @@ The toy has an internal lithium-ion battery that can be charged via USB-C and pr
It can also be monitored and controlled via Home Assistant or with a web interface in local network.
It is privacy-friendly: it works completely localy and sends no data to any external service.
> Disclaimer: this is a prototype and its design may change substantially at any time. If you plan on building one, please start from the last tagged commit (e.g. `1.0.1` and take note of the tag for future references.
## How does it work?
![Take apart](images/take_apart.jpg)
@@ -57,10 +59,13 @@ Then, model the character:
- Start the print, wait the printer to pause and insert an NFC tag in the compartment. Stick it using the adhesive side so the 3D printer cooling fan does not displace it during the print.
- Restart the print and let it finish.
You can also instruct your slicer to pause the print for you. Check your slicer preview to see at what height make it pause. If you're printing at 0.2mm resolution, pause at end of layer 30 to insert the tag and end of layer 40 to change the color.
### Add the MP3 file to the SDCard
Add the MP3 file to the sdcard, in a directory named like the integer you placed in the tag, with **a single** leading zero.
Add the MP3 file to the sdcard, in a directory named like the integer you placed in the tag, with **a single** leading zero (e.g. 01, 02, 03 ... 10, 11, 12 ... 99)
The folder to be played is selected based on the TAG content, but may contain more than one MP3 file. In that case, the files must be named as integers with **two leading zeros**, from `001.mp3` to `999.mp3`.
Full path example: `/12/001.mp3`
## NFC Tag format
+18
View File
@@ -0,0 +1,18 @@
use <../enclosure/box.scad>
// A label to screw on a wooden box to keep all the characters
difference() {
scale([0.6, 0.6, 0.02])
main_body();
translate([-39, -6, -1])
linear_extrude(height=2)
text("ƒabula", font="URW Bookman", size=16);
// Screw holes
translate([-46, -19, -0.5])
cylinder(h=1, d1=2, d2=4);
translate([46, 19, -0.5])
cylinder(h=1, d1=2, d2=4);
}
+21
View File
@@ -29,6 +29,12 @@ module fabula_enclosure_bottom() {
// Logos
translate([45, -18, 28.1]) linear_extrude(height = 1, center = true) rotate([0, 0, 90]) scale([0.15, 0.15, 0.15]) import("oshw-logo-filled-black.svg");
translate([66, -25, 28.1]) linear_extrude(height = 1, center = true) rotate([0, 0, 90]) text("a Luna, con ♥", size = 6);
// Foot screw holes
translate([-75, -30, 0]) {
translate([0, 10, -3.9]) cylinder(h = 40, d = pcb_screw_size*1.5);
translate([0, 40, -3.9]) cylinder(h = 40, d = pcb_screw_size*1.5);
}
}
// Speaker grille reinforcements
@@ -68,5 +74,20 @@ module fabula_enclosure_top() {
}
}
module fabula_enclosure_foot() {
// A foot to leave a gap under the shell for a better sound
difference(){
hull(){
sphere(d = 10, $fn = 64);
translate([0, 50, 0]) sphere(d = 10, $fn = 64);
}
translate([-5, -5, 0]) cube([10, 50 + 10, 5]);
// Screw holes
translate([0, 10, -3.9]) cylinder(h = 4, d = pcb_screw_size);
translate([0, 40, -3.9]) cylinder(h = 4, d = pcb_screw_size);
}
}
translate([0, -60, 0]) rotate([180, 0, 0]) fabula_enclosure_bottom();
translate([0, 60, 0]) fabula_enclosure_top();
translate([-120, -80, -30]) fabula_enclosure_foot();