added cryptex designs

This commit is contained in:
Joe Arndt 2025-12-17 15:28:17 -06:00
parent 11e3d2186a
commit d336b04c67
137 changed files with 26 additions and 0 deletions

Binary file not shown.

View file

@ -0,0 +1,63 @@
$fn=180;
// ACE Screen Dimensions
screen_width=120.25;
screen_height=81;
screen_depth=10;
screen_radius=5; // Est. - need to actually measure
left_long_edge=62;
left_short_edge=40;
// Screen Cover Frame Dimensions
frame_thickness=1;
frame_width=screen_width+(frame_thickness*2);
frame_height=screen_height+(frame_thickness*2);
frame_depth=screen_depth+frame_thickness;
// Screen Cover Object Dimensions
cover_width=frame_width-(frame_thickness*10);
cover_height=frame_height-(frame_thickness*10);
cover_depth=frame_thickness;
// Screen Cover Frame Object
module screen_cover_frame() {
cube([frame_width, frame_height, frame_depth], center=true);
}
// Screen Cover Frame Cutout Object
module screen_cover_frame_cutout() {
coords=[
[0,0],
[0,(frame_height-left_long_edge)],
[frame_depth,(frame_height-left_short_edge)],
[frame_depth,0]
];
translate([0, -(frame_height-left_short_edge)/2, (frame_depth/2)])
rotate([0,90,0])
linear_extrude(height = frame_thickness, center = true)
polygon(points=coords);
}
// Screen Cover Object
module screen_cover() {
cube([cover_width, cover_height, cover_depth], center=true);
}
// ACE Screen Object
module ace_screen() {
cube([screen_width, screen_height, screen_depth], center=true);
}
difference(){
screen_cover_frame();
translate([0, 0, (frame_depth-frame_thickness)/2])
screen_cover();
translate([-((frame_width-frame_thickness)/2), -(frame_height-(frame_height-left_short_edge))/2, 0])
screen_cover_frame_cutout();
translate([0, 0, -(frame_thickness/2)])
ace_screen();
}

Binary file not shown.

BIN
my_designs/cryptex/Core.stl Normal file

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,26 @@
# Cryptex
A cryptex designed by me, Joe Arndt, completely open source using "The Unlicense"
# What is this and why did I make it?
A cryptex is simply a cylindrical safe that uses rotating rings to form a combination, once set correctly it pulls apart to reveal an internal chamber. See the following link for additional information: https://en.wikipedia.org/wiki/Cryptex
This is my own custom design. While I spent a lot of time reading about and reviewing other designs online, I couldn't find exactly what I wanted. My main requirements are: 1) changeable combination, 2) metal construction, 3) open source/free plans. I found plenty of designs out there, but none that met all my requirements, so I designed my own. The current design only has 5 rings with 10 faces, however I don't see a reason why the dimensions cannot be adjusted without using the same design principles. The unique parts of this design are primarily the use of Ball Plungers to "lock" the rings as they rotate, and the Spacer/Ring/Code Sleeve design that allows them to fit together in an interchangeable way.
# Part list
* 01 Housing
* 01 Core
* 05 Rings
* 05 Code Sleeves
* 06 Spacers
* 10 Ball Plungers ()(http://www.springandballplungers.com/-c-50_55_160.html)
* 12 Grub Screws (Cone-point, M2x3mm) (https://www.amazon.com/20pcs-STAINLESS-SCREWS-SOCKET-DIN914/dp/B0176N4BC6)
# Assembly
1. To assemble the cryptex start with the Housing. Slide the first Spacer over the Housing being sure to align the keyway on both pieces. Once it is all the way down, install 2 Grub Screws into the Spacer, the screws should protrude on the inside of the Spacer, resting in the dimples in the Housing, locking it in place.
2. Next slide the first Ring over the Housing, being sure the smooth side is touching the Spacer, leaving the 10 notches exposed. Once it is against the Spacer, install 2 Ball Plungers in the ring. The spring-loaded ball should protrude on the inside of the ring, and should rest in the dimples in the Housing. This will hold the ring in place, but still allow rotation around the Housing.
3. Now it is time to install the Code Sleeve. The Code Sleeve has 10 ribs on the inside, which will fit into the notches on the Ring. It is designed so that any of the 10 faces of the Code Sleeve can be set or changed for a custom combination. The face aligned opposite of the keyway on the Ring is what the combination will use.
4. Repeat steps 2 & 3 until the last Spacer is installed.
5. The cryptex is now assembled, and the Core can be inserted and locked into place.
# WARNING
I am not an engineer, designer, machinist, or manufacturer. My design could be perfect, or, more likely, it could have many flaws making it an unusable piece of garbage. I make no promises in regards to accuracy or correctness of design. Feel free to download the files and use them, or modify them, or whatever. If you think you can improve my design, I would love to know, although you are not required to do so per "The Unlicense". And although not required, I would recommend you maintain "The Unlicense" if you do change this, in the spirit of open source.

BIN
my_designs/cryptex/Ring.stl Normal file

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,9 @@
# Parametric Radius (and Thickness) Gauge
This is a simple guage that has both concave and convex corner radius. Optionally, it can also be used as a thickness gauge, although the SCAD file defaults to a thickness of 1.5 (mm). The default file is designed for a range of 1-30mm with an overall width and height of each guage at 65x35mm. However, this can be adjusted very easily.
There are also a couple of handy scripts provided for generating rendered objects (3mf & STL files). These are Python scripts that use the OpenSCAD command line utility, so of course both are a prerequisite for using these scripts.
In addition there is a paramatric box to accompany your guages. The SCAD file has parameters to easily adjust for how many and what size, but the provided 3mf and STL files are a match for the 30 provided gauge files.
# License?
There is no license. There are no restrictions. I don't care what you do with these files. I don't care if modify them and claim them as your own. I don't care if you make money with them. I don't care if you think they are stupid. Literally do whatever you want with them.

View file

@ -0,0 +1,99 @@
$fn = 128;
module tray(gauge_width, gauge_height, guage_thickness, gauge_range, t_radius, wall_thickness) {
gauge_slots_length = ((gauge_range[1] - 1) * wall_thickness) + (gauge_range[1] * guage_thickness);
gauge_slots_height = gauge_height * 0.25;
tray_length = gauge_slots_length + (wall_thickness * 2);
tray_width = gauge_width + (wall_thickness * 2);
tray_height = gauge_slots_height;
lip_length = tray_length + (wall_thickness * 2);
lip_width = tray_width + (wall_thickness * 2);
union() {
difference() {
cube([gauge_width, gauge_slots_length, gauge_slots_height], center = true);
for(count = [gauge_range[0] : gauge_range[1]]) {
start_y = -(gauge_slots_length / 2);
wall_offset = (count - 1) * wall_thickness;
gauge_offset = (count - 1) * guage_thickness;
y_pos = start_y + gauge_offset + wall_offset;
translate([-(gauge_width / 2), y_pos, -(gauge_height / 2)])
cube([gauge_width, guage_thickness, gauge_height]);
};
};
difference() {
cube([tray_width, tray_length, tray_height], center = true);
cube([gauge_width, gauge_slots_length, gauge_slots_height], center = true);
};
translate([0, 0, -(wall_thickness / 2)])
linear_extrude(tray_height - wall_thickness, center = true)
difference() {
offset(r = t_radius) {
square([(lip_width - (t_radius * 2)), (lip_length - (t_radius * 2))], center = true);
};
square([tray_width, tray_length], center = true);
};
translate([0, 0, -((tray_height / 2) + (wall_thickness / 2))])
difference() {
minkowski() {
cube([tray_width, tray_length, wall_thickness], center = true);
cylinder(h = wall_thickness, r1 = 0, r2 = t_radius);
};
translate([0, 0, wall_thickness])
cube([lip_width, lip_length, wall_thickness], center = true);
};
};
};
module lid(gauge_width, gauge_height, guage_thickness, gauge_range, t_radius, wall_thickness, p_tolerance) {
outer_length = ((gauge_range[1] - 1) * wall_thickness) + (gauge_range[1] * guage_thickness) + (wall_thickness * 4);
outer_width = gauge_width + (wall_thickness * 4);
inner_height = (gauge_height * 0.75) + wall_thickness;
inner_width = outer_width - (wall_thickness * 2);
inner_length = outer_length - (wall_thickness * 2);
union() {
linear_extrude(inner_height, center = true)
difference() {
offset(r = t_radius) {
square([(outer_width - (t_radius * 2)), (outer_length - (t_radius * 2))], center = true);
};
square([inner_width + p_tolerance, inner_length + p_tolerance], center = true);
};
translate([0, 0, -((inner_height / 2) + (wall_thickness / 2))])
difference() {
minkowski() {
cube([inner_width, inner_length, wall_thickness], center = true);
cylinder(h = wall_thickness, r1 = 0, r2 = t_radius);
};
translate([0, 0, wall_thickness])
cube([outer_width, outer_length, wall_thickness], center = true);
};
};
};
tolerance = 0.5;
radius = 2;
w_thickness = 2;
g_width = 65 + (tolerance);
g_height = 35 + (tolerance);
g_thickness = 1.5 + (tolerance);
g_range = [1, 30];
translate([40, 0, 0])
tray(g_width, g_height, g_thickness, g_range, radius, w_thickness);
translate([-40, 0, 0])
lid(g_width, g_height, g_thickness, g_range, radius, w_thickness, tolerance);

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,67 @@
$fn = 128;
module gauge(gauge_size, gauge_width, gauge_height, gauge_thickness, hole_size) {
body_radius = 5;
difference() {
union() {
difference(){
union() {
minkowski() {
cube([gauge_width - body_radius, gauge_height - body_radius, gauge_thickness / 2], center = true);
cylinder(d = body_radius, h = gauge_thickness / 2, center = true);
};
translate([-((gauge_width / 2) - (body_radius / 2)), (gauge_height / 2) - (body_radius / 2), 0])
cube([body_radius, body_radius, gauge_thickness], center = true);
translate([(gauge_width / 2) - (body_radius / 2), (gauge_height / 2) - (body_radius / 2), 0])
cube([body_radius, body_radius, gauge_thickness], center = true);
};
translate([-(gauge_width / 2), gauge_height / 2, 0])
cylinder(h = gauge_thickness, r1 = gauge_size, r2 = gauge_size, center = true);
translate([gauge_width / 2, gauge_height / 2, 0])
cylinder(h = gauge_thickness, r1 = gauge_size, r2 = gauge_size, center = true);
};
translate([(gauge_width / 2) - gauge_size, gauge_height / 2 - gauge_size, 0])
difference() {
cylinder(h = gauge_thickness, r1 = gauge_size, r2 = gauge_size, center = true);
translate([-gauge_size/2, -gauge_size/2, 0])
cube([gauge_size, gauge_size, gauge_thickness], center = true);
translate([-gauge_size/2, gauge_size/2, 0])
cube([gauge_size, gauge_size, gauge_thickness], center = true);
translate([gauge_size/2, -gauge_size/2, 0])
cube([gauge_size, gauge_size, gauge_thickness], center = true);
};
};
if (hole_size > 0) {
translate([(gauge_width / 2) - 3.5, -((gauge_height / 2) - 3.5), 0])
cylinder(h = gauge_thickness, d = hole_size, center = true);
};
translate([0, -(gauge_height / 3), 0])
linear_extrude(gauge_thickness, center = true)
text(str(gauge_size, "mm"), size = 6, valign = "center", halign = "center", font = "OpenSans:style=Extrabold");
};
};
thickness = false;
hole = 5.5;
size = 30;
g_width = 65;
g_height = 35;
g_thickness = 1.5;
if(thickness) {
gauge(size, g_width, g_height, size, hole);
}
else {
gauge(size, g_width, g_height, g_thickness, hole);
}

View file

@ -0,0 +1,9 @@
import subprocess
for number in range(1,31):
cmd = f'openscad -o 3mf_gauges/{number}mm_radius.3mf -D size={number} gauge.scad'
subprocess.run(cmd, shell=True)
for number in range(1,31):
cmd = f'openscad -o stl_gauges/{number}mm_radius.stl -D size={number} gauge.scad'
subprocess.run(cmd, shell=True)

View file

@ -0,0 +1,10 @@
import subprocess
for number in range(1,31):
cmd = f'openscad -o 3mf_gauges_with_thickness/{number}mm_radius_and_thickness.3mf -D size={number} -D thickness=true gauge.scad'
subprocess.run(cmd, shell=True)
for number in range(1,31):
cmd = f'openscad -o stl_gauges_with_thickness/{number}mm_radius_and_thickness.stl -D size={number} -D thickness=true gauge.scad'
subprocess.run(cmd, shell=True)

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

Some files were not shown because too many files have changed in this diff Show more