Skip to content

Instantly share code, notes, and snippets.

@prozacchiwawa
Last active December 14, 2024 04:30
Show Gist options
  • Save prozacchiwawa/d91e20b7e5a125c1ef63ce48513e8b06 to your computer and use it in GitHub Desktop.
Save prozacchiwawa/d91e20b7e5a125c1ef63ce48513e8b06 to your computer and use it in GitHub Desktop.
An openscad description of a mechanical 4 bit function
$fn=30;
module disc(td, od, id) {
color("green") {
union() {
cylinder(h = 0.5, r = 1.5, center=true);
translate([id, 0, -0.6]) {
cylinder(h = 1.2, r = 0.25, center=true);
}
translate([0, od/2, -0.05]) {
cube([0.45,od+0.2,0.45],center=true);
}
translate([0, od, 0.4]) {
cylinder(h = 0.7, r = 0.25, center=true);
}
translate([0,0,-0.2]) {
cylinder(h = 1, r = 0.25, center=true);
}
}
}
}
module pusher(id,angle,lr) {
bar_offset = 1.5;
color("blue") {
translate([0,-sin(angle)*id,0]) {
difference() {
union() {
translate([0.75,0,0]) {
cube([1.5,15,0.5],center=true);
}
translate([bar_offset-(lr/2),0,0]) {
cube([lr,1.5,0.5],center=true);
}
}
union() {
translate([bar_offset-(lr/2),0,0]) {
cube([lr - 1,0.6,100],center=true);
}
}
}
}
}
}
module row(c0,c1,c2,c3,c4,c5,c6) {
color0 = c0 ? "white" : "black";
color1 = c1 ? "white" : "black";
color2 = c2 ? "white" : "black";
color3 = c3 ? "white" : "black";
color4 = c4 ? "white" : "black";
color5 = c5 ? "white" : "black";
color6 = c6 ? "white" : "black";
color(color0) {
translate([0,1.5,0.25]) {
cylinder(h=0.5,r=0.25,center=true);
}
}
color(color1) {
translate([0,1.0,0.25]) {
cylinder(h=0.5,r=0.25,center=true);
}
}
color(color2) {
translate([0,0.5,0.25]) {
cylinder(h=0.5,r=0.25,center=true);
}
}
color(color3) {
translate([0,0.0,0.25]) {
cylinder(h=0.5,r=0.25,center=true);
}
}
color(color4) {
translate([0,-0.5,0.25]) {
cylinder(h=0.5,r=0.25,center=true);
}
}
color(color5) {
translate([0,-1.0,0.25]) {
cylinder(h=0.5,r=0.25,center=true);
}
}
color(color6) {
translate([0,-1.5,0.25]) {
cylinder(h=0.5,r=0.25,center=true);
}
}
}
module slide_plate(n, off, lr, od, id, angle, angle2, angle3, angle4) {
translate([8 + off,0,0]) {
pusher(id, angle, lr);
}
color("gray") {
translate([2.64,0,0.5]) {
difference() {
cylinder(h=0.40,r=0.55,center=true);
cylinder(h=0.40,r=0.26,center=true);
}
rotate([0,0,45]) {
translate([-1.8,0,0]) {
cube([3,0.5,0.5],center=true);
}
}
rotate([0,0,-45]) {
translate([-1.8,0,0]) {
cube([3,0.5,0.5],center=true);
}
}
translate([-2.2,0,-0.5]) {
difference() {
cube([0.7,5,1],center=true);
cube([10,4,10],center=true);
}
}
}
}
translate([2.64,0,1]) {
rotate([0,0,-angle]) {
disc(5, od, id);
}
}
translate([sin(angle)*od,0,1]) {
difference() {
translate([0,0,0.5]) {
cube([8+3*n,10,0.5],center=true);
}
union() {
translate([2.6,2.84,0]) {
cube([0.55,5,10],center=true);
}
}
}
if (n < 3) {
translate([0,0,1]) {
slide_plate(n + 1, off-sin(angle)*od, lr, od / 2, id, angle2, angle3, angle4, 0);
}
} else {
translate([4,0,0]) {
translate([2,0,0.5]) {
row(1,1,1,0,1,1,1);
}
translate([1.4,0,0.5]) {
row(0,0,1,0,0,1,0);
}
translate([0.9,0,0.5]) {
row(1,0,1,1,1,0,1);
}
translate([0.4,0,0.5]) {
row(1,0,1,1,0,1,1);
}
translate([-0.1,0,0.5]) {
row(0,1,1,1,0,1,0);
}
translate([-0.7,0,0.5]) {
row(1,1,0,1,0,1,1);
}
translate([-1.2,0,0.5]) {
row(1,1,0,1,1,1,1);
}
translate([-1.7,0,0.5]) {
row(1,0,1,0,0,1,0);
}
translate([-2.3,0,0.5]) {
row(1,1,1,1,1,1,1);
}
translate([-2.9,0,0.5]) {
row(1,1,1,1,0,1,1);
}
translate([-3.4,0,0.5]) {
row(1,1,1,1,1,1,0);
}
translate([-3.9,0,0.5]) {
row(0,1,0,1,1,1,1);
}
translate([-4.4,0,0.5]) {
row(1,1,0,0,1,0,1);
}
translate([-5.0,0,0.5]) {
row(0,0,1,1,1,1,1);
}
translate([-5.5,0,0.5]) {
row(1,1,0,1,1,0,1);
}
translate([-6.0,0,0.5]) {
row(1,1,0,1,1,0,0);
}
}
}
}
}
module mechanism(a,b,c,d) {
angle = a ? 45 : -45;
bngle = b ? 45 : -45;
cngle = c ? 45 : -45;
dngle = d ? 45 : -45;
translate([0,0,0.45]) {
slide_plate(0, 0, 12.5, 3, 1, angle, bngle, cngle, dngle);
}
color("#990000c0") {
translate([0,0,3]) {
difference() {
translate([0,0,1.5]) {
cube([25.0,11,10],center=true);
}
union() {
translate([2,0,4]) {
cube([0.5,4,10],center=true);
}
translate([0,0,1.5]) {
cube([50,9,8.9],center=true);
}
translate([-2,0,2]) {
cube([19,13,1],center=true);
}
translate([-2,0,0]) {
cube([19,13,1],center=true);
}
translate([-2,0,-2]) {
cube([19,13,1],center=true);
}
}
}
}
}
}
mechanism(0,1,0,0);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment