With this seeming so popular, i thought I should get to work on the nest version.
I am in the process of moving this design from the inkscape/123d process I was using before to fully parametric Openscad. I haven't inserted the correct braille specs in yet, but this will be easy to adjust. When done it will take just changing a few variables at the top to change between standard/large print as well as being able to specify how many cells wide and how may lines you need. I am also adding optional slip case and drawer. As well as the code I will release a couple of printable STL files based on popular suggestions for the less technical. I also added a variable for your printers tolerance so everything will fit snugly and not waste filament on bad prints.
![]()
Here is my code so far....
lines=8;
cellsWide=12;
drawer=true;
framethickness=3;
basethickness=1;
cellthickness=3;
cellheight=5;
cellwidth=6;
linespace=2;
tolerence=0.3;
dotheight=0.6;
dotdiameter=1;
dotdistancex=2;
resize(newsize=[(((cellsWide*cellwidth)+(framethickness*basethickness))/(cellsWide*cellwidth))*((cellsWide*cellwidth)+tolerence),(framethickness*2)+(lines*cellheight)+((lines-1)*linespace)*(((lines*cellheight)+(tolerence*lines))/(lines*cellheight)),framethickness+basethickness]) frame();
sleve();
drawer();
translate([0,0,cellthickness+basethickness+10]) fullbar();
translate([0,cellheight+10,cellthickness+basethickness+10]) blankcell();
translate([cellwidth+10,cellheight+10,cellthickness+basethickness+10]) onedot();
translate([(cellwidth*2)+20,cellheight+10,cellthickness+basethickness+10]) twodots();
module frame(){
module barrepeat(num) {
for (i = [0 : num-1])
translate([ 0, i*(cellheight+linespace), 0 ]) children(0);
}
module notches(){
module notchrepeat(num2) {
for (i2 = [0 : num2-1])
translate([ 0, (i2*(cellheight/3)), 0 ]) children(0);
}
notchrepeat(3) rotate([0,90,0]) cylinder(cellwidth*cellsWide,dotdiameter/2,dotdiameter/2);
}
difference() {
cube([(framethickness*2)+(cellsWide*cellwidth),(framethickness*2)+(lines*cellheight)+((lines-1)*linespace),basethickness+cellthickness]);
translate([framethickness,framethickness,basethickness]) {
barrepeat(lines) fullbar();
}
translate([framethickness,framethickness+((cellheight/3)/2),basethickness]) {
barrepeat(lines) notches();
}}}
module sleve(){
}
module drawer(){
}
module fullbar(){
cube([cellsWide*cellwidth,cellheight,cellthickness]);
}
module onedot(){
cube([cellwidth,cellheight/3,cellthickness]);
translate([(cellwidth-dotdistancex)/2,cellheight/3/2,cellthickness]){
cylinder(dotheight,dotdiameter/2,dotdiameter/2);
}}
module twodots(){
cube([cellwidth,cellheight/3,cellthickness]);
translate([(cellwidth-dotdistancex)/2,cellheight/3/2,cellthickness]){
cylinder(dotheight,dotdiameter/2,dotdiameter/2);
translate([dotdistancex,0,0]){
cylinder(dotheight,dotdiameter/2,dotdiameter/2);
}}}
module blankcell(){
cube([cellwidth,cellheight,cellthickness]);
}
Hi, how about using the space between the rows, for the seeing people? Like putting the normal letters as "engraving" into the dead space. Here is some quick openscad mockup for this:
module letterA(){ // Hope it is really an A
difference(){
cube([cellwidth+7,cellheight,cellthickness]);
translate([cellwidth+5,0.7,cellthickness-0.4])scale(0.4)rotate([0,0,90])linear_extrude(height = 1)text("A");
translate([cellwidth,0,-3])cube([7,5,5]); // this is for the alignment on the bars
}
translate([(cellwidth-dotdistancex)/2,cellheight/3/2,cellthickness]){
cylinder(dotheight,dotdiameter/2,dotdiameter/2);
}
}
This way, humans who can't read braille can use it too :). (Maybe redraw the engraving after printing with a pen for more contrast).
Also, I would suggest of putting some notches into the drawer, so the blocks will not fall out by accident. It would also allow you to skip the step with the paper and just leave the populated drawer to be read.
How do you transfer the dots into the paper? Would suspect, a rubber paint roller would do the job perfectly.
Spinning the idea further, you could also write a small generator for often used words, making it less work to use :)