Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
442 changes: 5 additions & 437 deletions LICENSE.md

Large diffs are not rendered by default.

67 changes: 63 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,74 @@
textclock
=========

# Introduction

textclock is a parametric 3d-printable textclock. It's currently in development.

It's designed to be used with a 60 led/m SK6812 led-strip, and an esp8266 (using micropython)
for control. Using an ESP32 is also possible, but timer handling and pins
might need to be changed.
It's designed to be used with a 60 led/m SK6812 led-strip, and an esp8266 using micropython for control.
Using an ESP32 or any other micropython-capable board is also possible, but timer handling and pins might
need to be changed.

The letterface is available in English and German, but can be easily adapted to other languages, as well as your
specific needs. The letters "stamped" into clock are just configuration files with text - look at the
[english one](hardware/config_sk6812_english_minimal.scad) for a glimpse.

The letterface is available in English and German, but can be easily adapted to other languages.
The configuration for most parameters is also adjustable in the [config_common.scad](hardware/config_common.scad) file.

![rendering](doc/render.png)

# Requirements

## Parts / BOM

In the default configuration the clock requires the following parts:

### 3d printed parts

__Note: Please read the Printed parts (IMPORTANT!)" section before you print them__

- letter plate (front face of the clock, includes the letters shown and separation between them)
- led holder plate (used with fixation plate to clamp the led strips between them)
- led fixation plate (used to clamp strips & serves as mount for electronics)
- backplate/wallmount (to close the case and enable mounting it to a wall)

### hardware
- M2.5 brass threaded inserts
- M2.5 machine screws (short, maybe 6mm?)

### electronics
- ESP8266 (or ESP32) NodeMCU-style board
- SK6812 60 LEDs/m RGBW strip
- DS1307 RTC module (I used a dual module called "Tiny RTC" that additionally includes an eeprom, and just didn't it)
- THT angled pin headers (2.54mm)
- Jumper wires (F-F, just cut them up)
- misc. cables (you can use the jumper wire remains)

Since the 3d files are written in OpenSCAD, you can modify them to your needs and available electronics or led strips.

## Printed parts (IMPORTANT!)

- 0.15mm layer height (some parameters in `config_common.scad` need to be changed if you want to use a different height)
- 0.4mm nozzle (for more detailed letters, you could potentially use a smaller nozzle)
- Filament: __Your filament choice is crucial for success.__ It must be opaque enough to block the light at ~1mm height,
but let light through at 0.15mm (single layer height). You can print a smaller test print
to determine if your filament is suitable.

# Assembly

## Printed parts

### Install threaded inserts

### Install led strips

## Electronics

### Prepare ESP8266

First step is to solder the angled pin headers to the ESP8266 board. Please note, that you may need to remove the
standard headers first.

## Software

The process of installing the software is described in the [software-folders README](software/README.md)
10 changes: 10 additions & 0 deletions hardware/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
### Recreate required stls

To recreate the required STL-files, you can run `build.bat`. Please note, that OpensCAD needs to be installed in `%PROGRAMFILES%\OpenSCAD\openscad.exe`.

If you want to manually recreate the files, you need to open, render & export the following files in OpenSCAD:
- led_fixation_plate.scad
- led_holder_plate.scad
- backplate_wall.scad
- letter_plate.scad

19 changes: 15 additions & 4 deletions hardware/backplate_wall.scad
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ CABLE_SLOT_WIDTH = 30;
CABLE_SLOT_HEIGHT = 50;
CABLE_ROUND_EDGES = 2;

REDUCED_SIZE = 2*OUTER_WALL_THICKNESS + INNER_PLATE_TOLERANCE;

module wall_mount_holes() {
translate([TOTAL_WIDTH/2, TOTAL_HEIGHT/5*4, -0.05])
Expand All @@ -22,14 +23,24 @@ module wall_mount_holes() {
module backplate_wall() {
difference() {
intersection() {
round_edges_cube();
cube([TOTAL_WIDTH,
TOTAL_HEIGHT,
translate([REDUCED_SIZE/2, REDUCED_SIZE/2, 0])
cube([TOTAL_WIDTH - REDUCED_SIZE,
TOTAL_HEIGHT - REDUCED_SIZE,
WALLMOUNT_PLATE_THICKNESS]);
}
wall_mount_holes();
corner_holes(offset=20, d=SCREW_DIAMETER, h=100);
corner_holes(offset=WALLMOUNT_PLATE_THICKNESS+0.01, d=SCREW_DIAMETER*2, h=WALLMOUNT_PLATE_THICKNESS-1.5);
corner_holes(offset=WALLMOUNT_PLATE_THICKNESS+0.01,
d=SCREW_DIAMETER*2,
h=WALLMOUNT_PLATE_THICKNESS-1.5);
translate([OUTER_WALL_THICKNESS,OUTER_WALL_THICKNESS, 1.5])
cube([SCREW_DIAMETER, SCREW_DIAMETER, WALLMOUNT_PLATE_THICKNESS], center=false);
translate([TOTAL_WIDTH-2*OUTER_WALL_THICKNESS,OUTER_WALL_THICKNESS, 1.5])
cube([SCREW_DIAMETER, SCREW_DIAMETER, WALLMOUNT_PLATE_THICKNESS], center=false);
translate([TOTAL_WIDTH-2*OUTER_WALL_THICKNESS,TOTAL_HEIGHT-2*OUTER_WALL_THICKNESS, 1.5])
cube([SCREW_DIAMETER, SCREW_DIAMETER, WALLMOUNT_PLATE_THICKNESS], center=false);
translate([OUTER_WALL_THICKNESS,TOTAL_HEIGHT-2*OUTER_WALL_THICKNESS, 1.5])
cube([SCREW_DIAMETER, SCREW_DIAMETER, WALLMOUNT_PLATE_THICKNESS], center=false);
translate([TOTAL_WIDTH/2-CABLE_SLOT_WIDTH/2,-CABLE_ROUND_EDGES,-0.01])
rounded_cube([CABLE_SLOT_WIDTH, CABLE_SLOT_HEIGHT+CABLE_ROUND_EDGES, WALLMOUNT_PLATE_THICKNESS+0.1], CABLE_ROUND_EDGES);
}
Expand Down
2 changes: 1 addition & 1 deletion hardware/build.bat
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ RD /Q /S %OUTPUT_DIRECTORY%
IF NOT EXIST "%OUTPUT_DIRECTORY%" ( MKDIR %OUTPUT_DIRECTORY% )

ECHO Creating STLs
FOR /F %%x IN (files_to_print.txt) DO (
FOR %%x IN (led_fixation_plate led_holder_plate backplate_wall letter_plate) DO (
ECHO - %%x.stl
%OPENSCAD% -o %OUTPUT_DIRECTORY%\%%x.stl %%x.scad
)
4 changes: 3 additions & 1 deletion hardware/common.scad
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,9 @@ module triangle(point1, point2, depth) {
}

module round_edges_cube(offset=0) {
translate([0, 0, -50]) rounded_cube([TOTAL_WIDTH, TOTAL_HEIGHT, 100], r=ROUND_EDGES_RADIUS, offset=offset);
translate([0, 0, -50])
rounded_cube([TOTAL_WIDTH, TOTAL_HEIGHT, 100],
r=ROUND_EDGES_RADIUS, offset=offset);
}

module fit_inner_cube() {
Expand Down
1 change: 1 addition & 0 deletions hardware/config.scad
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
include <config_common.scad>
include <config_sk6812_english_minimal.scad>
//include <config_sk6812_german.scad>
//include <config_tester.scad>
include <constants_calculated.scad>
29 changes: 22 additions & 7 deletions hardware/config_common.scad
Original file line number Diff line number Diff line change
@@ -1,35 +1,45 @@
$fn=20;

// Distance between two leds on a strip - depending on your mounting direction, only one is actually relevant,
// but to keep the clock square, they should be the
LED_STRIPE_HORIZ_DISTANCE = 16.66;
LED_STRIPE_VERT_DISTANCE = 16.66;

LED_STRIPE_LED_WIDTH = 8; // The stripe-segments are soldered together, at those points the distance between leds varies a lot, sometimes resoldering is required
// The size of a single led module on that strip

// The stripe-segments are soldered together, at those points the distance between leds varies a lot,
// sometimes resoldering is required, so the distances between the leds match up
LED_STRIPE_LED_WIDTH = 8;
LED_STRIPE_LED_HEIGHT = 8;

// Since there are small capacitors right next to the leds, we need to provide a little space for them
LED_STRIPE_CAP_WIDTH = 3;
LED_STRIPE_CAP_HEIGHT = 5;
LED_STRIPE_CAP_DEPTH = 1.5; // 1;

// Defines the offset for those capacitors from the leds
LED_STRIPE_CAP_OFFSET_X = -4;
LED_STRIPE_CAP_OFFSET_Y = 0;

// Parameters for the screw holes
LETTER_PLATE_SCREW_INSERT_HEIGHT = 6; // 3.5;
LETTER_PLATE_SCREW_INSERT_WALL_THICKNESS = 2;
LETTER_PLATE_SCREW_INSERT_DIAMETER = 4;
LETTER_PLATE_SCREW_INSERT_DIAMETER = 4; // M3 threaded insert diameter
LETTER_PLATE_SCREW_WALL_DIAMETER = LETTER_PLATE_SCREW_INSERT_DIAMETER + LETTER_PLATE_SCREW_INSERT_WALL_THICKNESS;
SCREW_DIAMETER = 3.2; // M3 plus tolerance
SCREW_DIAMETER = 3.2; // M3 screw diameter with tolerance

// Parameters for the corner holes (used to mount wallplate)
CORNER_MOUNTING_HOLE_INSERT_HEIGHT = LETTER_PLATE_SCREW_INSERT_HEIGHT;
CORNER_MOUNTING_HOLE_INSERT_DIAMETER = LETTER_PLATE_SCREW_INSERT_DIAMETER;
CORNER_MOUNTING_HOLE_INSERT_WALL_THICKNESS = LETTER_PLATE_SCREW_INSERT_WALL_THICKNESS;
CORNER_MOUNTING_HOLE_WALL_DIAMETER = CORNER_MOUNTING_HOLE_INSERT_DIAMETER + CORNER_MOUNTING_HOLE_INSERT_WALL_THICKNESS;
CORNER_MOUNTING_HOLE_WALL_DIAMETER = CORNER_MOUNTING_HOLE_INSERT_DIAMETER + CORNER_MOUNTING_HOLE_INSERT_WALL_THICKNESS + 1;
CORNER_MOUNTING_HOLE_OFFSET = 1.85;

OUTER_HOLES_DIST = 2;
INNER_HOLES_DIST = 4;

LETTER_PLATE_LETTER_BOTTOM = 0.15;
LETTER_PLATE_THICKNESS = 1;
LETTER_PLATE_THICKNESS = 1.05;
LETTER_SEPARATOR_THICKNESS = 2;
LETTER_SEPARATOR_HEIGHT = 10;

Expand All @@ -43,16 +53,21 @@ LED_FIXATION_CUTOUT_HEIGHT = 11;
LED_FIXATION_CUTOUT_WIDTH = 6;
LED_FIXATION_PLATE_THICKNESS = 2;

// Height of the backplate
WALLMOUNT_PLATE_THICKNESS = 6;

ELECTRONICS_HEIGHT = 15;

OUTER_WALL_THICKNESS = 2;
OUTER_WALL_HEIGHT = 2 + LETTER_SEPARATOR_HEIGHT + (LED_HOLDER_PLATE_HEIGHT-LED_HOLDER_PLATE_DIVIDER_CUTOUT_DEPTH) + LED_FIXATION_PLATE_THICKNESS +
ELECTRONICS_HEIGHT;
OUTER_WALL_HEIGHT = 2 + LETTER_SEPARATOR_HEIGHT +
(LED_HOLDER_PLATE_HEIGHT-LED_HOLDER_PLATE_DIVIDER_CUTOUT_DEPTH) +
LED_FIXATION_PLATE_THICKNESS + ELECTRONICS_HEIGHT;
// 2mm height tolerance to adjust fitting and led-stripe height

ROUND_EDGES_RADIUS = 3;

CONFIG_HORIZ_EXTRA = 0;
CONFIG_VERT_EXTRA = 0;


TESTER_MODE = false;
15 changes: 15 additions & 0 deletions hardware/config_tester.scad
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
// https://creativecommons.org/licenses/by-nc-sa/4.0/
// (c) 2018 Florian Roks <florian.roks (a) gmail.com>

FONT_NAMES = ["DejaVu Sans Mono"];

FONT_SIZES = [10];

LETTERFACE = ["LO",
"VE"];

LETTERFACE_FONTS = ["00",
"00"];

TESTER_MODE = true;
4 changes: 2 additions & 2 deletions hardware/constants_calculated.scad
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@ TOTAL_WIDTH = LED_STRIPE_HORIZ_DISTANCE * LETTER_MATRIX_WIDTH + 2 * HORIZ_SIDE_E
TOTAL_HEIGHT = LED_STRIPE_VERT_DISTANCE * LETTER_MATRIX_HEIGHT + 2 * VERT_SIDE_EXTRA;
TOTAL_DEPTH = OUTER_WALL_HEIGHT;

echo("WIDTH=", TOTAL_WIDTH, "HEIGHT=", TOTAL_HEIGHT);
//echo("WIDTH=", TOTAL_WIDTH, "HEIGHT=", TOTAL_HEIGHT);

LETTER_PLATE_MOUNTING_HOLE_POSITIONS = [
[OUTER_HOLES_DIST, OUTER_HOLES_DIST],
[OUTER_HOLES_DIST, OUTER_HOLES_DIST],
[OUTER_HOLES_DIST, LETTER_MATRIX_HEIGHT - OUTER_HOLES_DIST],
[LETTER_MATRIX_WIDTH - OUTER_HOLES_DIST, OUTER_HOLES_DIST],
[LETTER_MATRIX_WIDTH - OUTER_HOLES_DIST, LETTER_MATRIX_HEIGHT - OUTER_HOLES_DIST],
Expand Down
4 changes: 0 additions & 4 deletions hardware/files_to_print.txt

This file was deleted.

40 changes: 29 additions & 11 deletions hardware/letter_plate.scad
Original file line number Diff line number Diff line change
Expand Up @@ -90,9 +90,10 @@ module screw_holes(z_offset, d) {
module corner_hole_wall(offset=0,h=OUTER_WALL_HEIGHT) {
translate([CORNER_MOUNTING_HOLE_WALL_DIAMETER/2,
CORNER_MOUNTING_HOLE_WALL_DIAMETER/2,
h/2])
cylinder(h=h,
d=CORNER_MOUNTING_HOLE_WALL_DIAMETER+offset,
(h - WALLMOUNT_PLATE_THICKNESS)/2])
cube(size = [CORNER_MOUNTING_HOLE_WALL_DIAMETER+offset,
CORNER_MOUNTING_HOLE_WALL_DIAMETER+offset,
h - WALLMOUNT_PLATE_THICKNESS],
center=true);
}

Expand Down Expand Up @@ -132,14 +133,14 @@ module corner_holes_walls_bump() {
}
}

module outer_walls_bump() {
module outer_walls_bump(additional_height=0) {
union() {
cube([TOTAL_WIDTH, OUTER_WALL_THICKNESS+1, LETTER_SEPARATOR_HEIGHT]);
cube([OUTER_WALL_THICKNESS+1, TOTAL_HEIGHT, LETTER_SEPARATOR_HEIGHT]);
cube([TOTAL_WIDTH, OUTER_WALL_THICKNESS+1, LETTER_SEPARATOR_HEIGHT + additional_height]);
cube([OUTER_WALL_THICKNESS+1, TOTAL_HEIGHT, LETTER_SEPARATOR_HEIGHT + additional_height]);
translate([0,TOTAL_HEIGHT-OUTER_WALL_THICKNESS-1,0])
cube([TOTAL_WIDTH, OUTER_WALL_THICKNESS+1, LETTER_SEPARATOR_HEIGHT]);
cube([TOTAL_WIDTH, OUTER_WALL_THICKNESS+1, LETTER_SEPARATOR_HEIGHT + additional_height]);
translate([TOTAL_WIDTH-OUTER_WALL_THICKNESS-1,0,0])
cube([OUTER_WALL_THICKNESS+1, TOTAL_HEIGHT, LETTER_SEPARATOR_HEIGHT]);
cube([OUTER_WALL_THICKNESS+1, TOTAL_HEIGHT, LETTER_SEPARATOR_HEIGHT + additional_height]);
}
}

Expand All @@ -157,22 +158,39 @@ module clock_front() {
inner_separator_grid();
outer_walls_bump();
screw_hole_walls(z_offset=LETTER_SEPARATOR_HEIGHT - LETTER_SEPARATOR_HEIGHT);
corner_holes_walls_bump();
// corner_holes_walls_bump();

corner_holes_walls();
}
}
letter_cutouts();
screw_holes(z_offset=LETTER_SEPARATOR_HEIGHT - LETTER_PLATE_SCREW_INSERT_HEIGHT, d=LETTER_PLATE_SCREW_INSERT_DIAMETER);
corner_holes(d=CORNER_MOUNTING_HOLE_INSERT_DIAMETER,
h=CORNER_MOUNTING_HOLE_INSERT_HEIGHT,
offset=OUTER_WALL_HEIGHT);
offset=OUTER_WALL_HEIGHT - WALLMOUNT_PLATE_THICKNESS);
translate([TOTAL_WIDTH/2, 0, OUTER_WALL_HEIGHT-ELECTRONICS_HEIGHT/2+CABLE_SLOT_CORNERS])
rotate([90,90,0])
translate([-ELECTRONICS_HEIGHT/2, -CABLE_SLOT_WIDTH/2, -100/2]) rounded_cube([ELECTRONICS_HEIGHT, CABLE_SLOT_WIDTH, 100], CABLE_SLOT_CORNERS);
}

}

module tester_plate() {
difference() {
intersection() {
round_edges_cube();

union() {
front_plate();
inner_separator_grid();
outer_walls_bump(1.6);
}
}
letter_cutouts();
}

}

// arranged for 3d-printing / stl-export
clock_front();
if (TESTER_MODE == true) { tester_plate(); } else { clock_front(); }

8 changes: 4 additions & 4 deletions hardware/textclock.scad
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ use <letter_plate.scad>;
use <backplate_wall.scad>;
include <config.scad>

exploded_view = false;
exploded_view = true;

exploded_offset_diff = 10;
exploded_offset_diff = 30;

led_holder_plate_z_offset = LETTER_SEPARATOR_HEIGHT-LED_HOLDER_PLATE_DIVIDER_CUTOUT_DEPTH;

Expand All @@ -30,6 +30,6 @@ translate([0,
(exploded_view ? 3*exploded_offset_diff : 0) + led_fixation_plate_z_offset])
led_fixation_plate();

translate([0, 0, OUTER_WALL_HEIGHT])
#backplate_wall();
translate([0, 0, exploded_view ? 4*exploded_offset_diff : 0 ])
backplate_wall();

2 changes: 1 addition & 1 deletion software/README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
## Installing micropython on the clock

### Prerequisites
1. Make sure python is installed
1. Make sure python is installed on your computer
2. [Install esptool](https://docs.espressif.com/projects/esptool/en/latest/esp8266/index.html)
```
pip3 install esptool
Expand Down
Loading