verzameling oude spullen

This commit is contained in:
Manfred 2017-07-09 19:58:38 +02:00
commit 7ed9544283
119 changed files with 1288059 additions and 0 deletions

47
arduino/SafetyBoard Normal file
View file

@ -0,0 +1,47 @@
void pulseCounter(); //
void setupFlowMeter(); //
void checkFlow() ;
void getInfo(); //here we get info like temp etc
void checkMenu();
void pwdKeypadEvent();
void menuKeypadEvent();
int laserEnablePin = 50;
int waterCoolerPin = 51;
int airAssistPin = 52;
int ventilationPin = 53;
int lichtPin = 49;
//int lichtPin = 48; spare
int testEnablePin = 47;
int potMeterEnable = 46;
LiquidCrystal lcd(12, 11, 7, 6, 5, 4);
int passwordCorrect = false;
Password password = Password( "123456" );
const byte ROWS = 4; // Four rows
const byte COLS = 3; // Three columns
char keys[ROWS][COLS] = { // Define the Keymap
{ '1','2','3' } ,
{ '4','5','6' } ,
{ '7','8','9' } ,
{ '*','0','#' } };
byte rowPins[ROWS] = { 15, 20, 17, 19 }; // Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte colPins[COLS] = { 18, 14, 16 }; // Connect keypad COL0, COL1 and COL2 to these Arduino pins.
Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); // Create the Keypad
float tempIn;
float tempOut;
int tempPinIn = 0;
int tempPinOut = 0;
volatile int pulseCount; //measuring the rising edges of the signal
int Calc;
int hallsensor = 2; //The pin location of the sensor
unsigned long loopTime;

Binary file not shown.

View file

@ -0,0 +1,41 @@
#include <LiquidCrystal.h>
#include <Keypad.h>
#include <Password.h>
#include "safetyboard.h";
void setup() {
pinMode(airAssistPin, OUTPUT); // sets the digital pin as output
pinMode(ventilationPin, OUTPUT); // sets the digital pin as output
pinMode(waterCoolerPin, OUTPUT); // sets the digital pin as output
pinMode(laserEnablePin, OUTPUT); // sets the digital pin as output
pinMode(lichtPin, OUTPUT); // sets the digital pin as output
pinMode(testEnablePin, OUTPUT); // sets the digital pin as output
pinMode(potMeterEnable, OUTPUT); // sets the digital pin as output
digitalWrite(airAssistPin, LOW); // sets the airAssist on
digitalWrite(ventilationPin, LOW); // sets the air ventilation on
digitalWrite(waterCoolerPin, LOW); // sets the watercooler on
digitalWrite(laserEnablePin, LOW); // sets the laserEnable on
digitalWrite(lichtPin, HIGH); // sets the licht pin (inverted) on
digitalWrite(testEnablePin, LOW); // sets the test enable pin ()
digitalWrite(potMeterEnable, LOW); // sets the watercooler fans on
Serial.begin(9600);
lcd.begin(16, 4); // set up the LCD's number of columns and rows:
lcd.setCursor(0, 0);
lcd.print("Bitlair lasercutter"); // Print a message to the LCD.
lcd.setCursor(0, 1);
lcd.print("Password?");
lcd.setCursor(0, 2);
lcd.print("Press * to confirm");
kpd.addEventListener(pwdKeypadEvent); //add an event listener for this keypad
}
void loop() {
if (passwordCorrect) {
checkMenu();
checkFlow();
} else {
kpd.getKey();
}
}

View file

@ -0,0 +1,30 @@
//*******************************************************
// FlowMeter
//*******************************************************
void setupFlowMeter() {
pinMode(hallsensor, INPUT); //initializes digital pin 2 as an input
attachInterrupt(0, pulseCounter, RISING); //and the interrupt is attached
loopTime = millis();
sei(); //enable interupts
}
void pulseCounter() { //This is the function that the interupt calls
pulseCount++; //This function measures the rising and falling edge of the hall effect sensors signal
}
void checkFlow() {
if(millis() >= (loopTime + 2000)){
Calc = (pulseCount * 60 / (7.5 * 2)); //(Pulse frequency x 60) / 7.5Q, = flow rate in L/hour
Serial.print (Calc, DEC); //Prints the number calculated above
Serial.print (" L/hour\r\n"); //Prints "L/hour" and returns a new line
lcd.setCursor(18, 3);
lcd.print(" "); //Prints the number calculated above
//lcd.setCursor(15, 1);
//lcd.print(millis()/1000);
lcd.setCursor(11, 3);
lcd.print(Calc, DEC); //Prints the number calculated above
lcd.print (" L/h "); //Prints "L/hour" a
//lcd.print(pulseCount);
//lcd.print (" "); //Prints "L/hour" a
pulseCount = 0;
loopTime = millis();; // Updates loopTime
}
}

View file

@ -0,0 +1,78 @@
//******************************************************
// M
//******************************************************
void getInfo() {
//HERE WE WILL GET THE INFO LIKE TEMP etc
}
void checkMenu() {
lcd.setCursor(0,0);
lcd.print("press * for info ");
lcd.setCursor(0,1);
lcd.print("1 air-assist 2 vent");
lcd.setCursor(0,2);
lcd.print("3 watercool 4 laser");
lcd.setCursor(0,3);
lcd.print("0 off 9 on");
char key = kpd.getKey();
}
void menuKeypadEvent(KeypadEvent eKey) {
switch (kpd.getState()){
case PRESSED:
switch (eKey){
case '*':
getInfo();
break;
case '#':
password.reset();
break;
case '0':
digitalWrite(airAssistPin, LOW);
digitalWrite(ventilationPin, LOW);
digitalWrite(waterCoolerPin, LOW);
digitalWrite(laserEnablePin, LOW);
digitalWrite(lichtPin, HIGH); // sets the licht pin (inverted) on
digitalWrite(testEnablePin, LOW); // sets the test enable pin ()
digitalWrite(potMeterEnable, LOW); // sets the watercooler fans on
break;
case '9':
digitalWrite(airAssistPin, HIGH);
digitalWrite(ventilationPin, HIGH);
digitalWrite(waterCoolerPin, HIGH);
digitalWrite(laserEnablePin, HIGH);
digitalWrite(lichtPin, LOW); // sets the licht pin (inverted) on
// digitalWrite(testEnablePin, LOW); // sets the test enable pin ()
// digitalWrite(potMeterEnable, LOW); // sets the watercooler fans on
break;
case '1':
digitalWrite(airAssistPin, !digitalRead(airAssistPin));
break;
case '2':
digitalWrite(ventilationPin, !digitalRead(ventilationPin));
break;
case '3':
digitalWrite(waterCoolerPin, !digitalRead(waterCoolerPin));
break;
case '4':
digitalWrite(laserEnablePin, !digitalRead(laserEnablePin));
break;
case '5':
digitalWrite(lichtPin, !digitalRead(lichtPin));
break;
case '6':
digitalWrite(testEnablePin, !digitalRead(testEnablePin));
break;
case '7':
digitalWrite(potMeterEnable, !digitalRead(potMeterEnable));
break;
default:
password.append(eKey);
}
}
}

View file

@ -0,0 +1 @@
//

View file

@ -0,0 +1,47 @@
//#include "safetyboard.h";
//******************************************************
// Password related stuff
//******************************************************
//take care of some special events
void pwdKeypadEvent(KeypadEvent eKey) {
switch (kpd.getState()){
case PRESSED:
Serial.print("Pressed: ");
Serial.println(eKey);
lcd.setCursor(0, 4);
lcd.print(" "); //empty "Wrong"
switch (eKey){
case '*':
checkPassword();
break;
case '#':
password.reset();
break;
default:
password.append(eKey);
}
}
}
void checkPassword() {
if (password.evaluate()) {
Serial.println("Success");
passwordCorrect = true;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Menu"); // Print a message to the LCD.
setupFlowMeter();
digitalWrite(airAssistPin, HIGH); // sets the airAssist on
digitalWrite(ventilationPin, HIGH); // sets the air ventilation on
digitalWrite(waterCoolerPin, HIGH); // sets the watercooler fans on
digitalWrite(laserEnablePin, HIGH); // sets the watercooler fans on
kpd.addEventListener(menuKeypadEvent); //add an event listener for this keypad
} else {
Serial.println("Wrong");
password.reset();
lcd.setCursor(0, 4);
lcd.print("Wrong");
}
}

View file

@ -0,0 +1,47 @@
void pulseCounter(); //
void setupFlowMeter(); //
void checkFlow() ;
void getInfo(); //here we get info like temp etc
void checkMenu();
void pwdKeypadEvent();
void menuKeypadEvent();
int laserEnablePin = 50;
int waterCoolerPin = 51;
int airAssistPin = 52;
int ventilationPin = 53;
int lichtPin = 49;
//int lichtPin = 48; spare
int testEnablePin = 47;
int potMeterEnable = 46;
LiquidCrystal lcd(12, 11, 7, 6, 5, 4);
int passwordCorrect = false;
Password password = Password( "123456" );
const byte ROWS = 4; // Four rows
const byte COLS = 3; // Three columns
char keys[ROWS][COLS] = { // Define the Keymap
{ '1','2','3' } ,
{ '4','5','6' } ,
{ '7','8','9' } ,
{ '*','0','#' } };
byte rowPins[ROWS] = { 15, 20, 17, 19 }; // Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte colPins[COLS] = { 18, 14, 16 }; // Connect keypad COL0, COL1 and COL2 to these Arduino pins.
Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); // Create the Keypad
float tempIn;
float tempOut;
int tempPinIn = 0;
int tempPinOut = 0;
volatile int pulseCount; //measuring the rising edges of the signal
int Calc;
int hallsensor = 2; //The pin location of the sensor
unsigned long loopTime;

BIN
arduino/SafetyBoard4/.DS_Store vendored Normal file

Binary file not shown.

View file

@ -0,0 +1,20 @@
//*******************************************************
// FlowMeter
//*******************************************************
void setupFlowMeter() {
pinMode(hallsensor, INPUT); //initializes digital pin 2 as an input
attachInterrupt(0, pulseCounter, RISING); //and the interrupt is attached
loopTime = millis();
sei(); //enable interupts
}
void pulseCounter() { //This is the function that the interupt calls
pulseCount++; //This function measures the rising and falling edge of the hall effect sensors signal
}
void checkFlow() {
if(millis() >= (loopTime + 2000)){
Calc = (pulseCount * 60 / (7.5 * 2)); //(Pulse frequency x 60) / 7.5Q, = flow rate in L/hour
flowMenu();
pulseCount = 0;
loopTime = millis();; // Updates loopTime
}
}

Binary file not shown.

View file

@ -0,0 +1,106 @@
void firstMenu() {
lcd.begin(20, 4); // set up the LCD's number of columns and rows:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Manfreds lasercutter"); // Print a message to the LCD.
lcd.setCursor(0, 1);
lcd.print("Password?");
lcd.setCursor(0, 2);
lcd.print("Press * to confirm");
}
void menuPasswordReset(){
lcd.setCursor(0, 4);
lcd.print(" "); //empty "Wrong"
}
void menuPasswordWrong(){
lcd.setCursor(0, 3);
lcd.print("Wrong");
}
void checkMenu() {
if (menuType==1) {
lcd.setCursor(0,0);
lcd.print("Manfreds lasercutter");
lcd.setCursor(0,1);
lcd.print("press * for choices ");
} else {
lcd.setCursor(0,0);
lcd.print("press * for back ");
lcd.setCursor(0,1);
lcd.print("1 air-assist 2 vent ");
lcd.setCursor(0,2);
lcd.print("3 watercool 4 laser ");
lcd.setCursor(0,3);
lcd.print("6 testmode 0 off 9 on ");
}
char key = kpd.getKey();
}
void flowMenu(){
if (menuType==1) {
lcd.setCursor(0, 3);
lcd.print(" Water");
lcd.setCursor(11, 3);
lcd.print(Calc, DEC); //Prints the number calculated abov
lcd.print (" L/h "); //Prints "L/hour" a
}
}
void menuKeypadEvent(KeypadEvent eKey) {
switch (kpd.getState()){
case PRESSED:
switch (eKey){
case '*':
if (menuType==1) {
menuType=2;
lcd.clear();
} else {
menuType = 1;
lcd.clear();
}
break;
case '#':
password.reset();
break;
case '9':
digitalWrite(airAssistPin, LOW);
digitalWrite(ventilationPin, LOW);
digitalWrite(waterCoolerPin, LOW);
digitalWrite(laserEnablePin, LOW);
digitalWrite(lichtPin, LOW); // sets the licht pin (inverted) on
digitalWrite(testEnablePin, HIGH); // sets the test enable pin ()
digitalWrite(potMeterEnable, HIGH); // sets the watercooler fans on
break;
case '0':
digitalWrite(airAssistPin, HIGH);
digitalWrite(ventilationPin, HIGH);
digitalWrite(waterCoolerPin, HIGH);
digitalWrite(laserEnablePin, HIGH);
digitalWrite(lichtPin, HIGH); // sets the licht pin (inverted) on
digitalWrite(testEnablePin, HIGH); // sets the test enable pin ()
digitalWrite(potMeterEnable, HIGH); // sets the watercooler fans off
break;
case '1':
digitalWrite(airAssistPin, !digitalRead(airAssistPin));
break;
case '2':
digitalWrite(ventilationPin, !digitalRead(ventilationPin));
break;
case '3':
digitalWrite(waterCoolerPin, !digitalRead(waterCoolerPin));
break;
case '4':
digitalWrite(laserEnablePin, !digitalRead(laserEnablePin));
break;
case '5':
digitalWrite(lichtPin, !digitalRead(lichtPin));
break;
case '6':
digitalWrite(testEnablePin, !digitalRead(testEnablePin));
digitalWrite(potMeterEnable, !digitalRead(potMeterEnable));
break;
case '7':
break;
default:
password.append(eKey);
}
}
}

View file

@ -0,0 +1,41 @@
//#include "safetyboard.h";
//******************************************************
// Password related stuff
//******************************************************
//take care of some special events
void pwdKeypadEvent(KeypadEvent eKey) {
switch (kpd.getState()){
case PRESSED:
menuPasswordReset();
switch (eKey){
case '*':
checkPassword();
break;
case '#':
password.reset();
break;
default:
password.append(eKey);
}
}
}
void checkPassword() {
if (password.evaluate()) {
Serial.println("Success");
lcd.clear();
passwordCorrect = true;
setupFlowMeter();
digitalWrite(airAssistPin, LOW); // sets the airAssist on
digitalWrite(ventilationPin, LOW); // sets the air ventilation on
digitalWrite(waterCoolerPin, LOW); // sets the watercooler fans on
digitalWrite(laserEnablePin, LOW); // sets the watercooler fans on
digitalWrite(lichtPin, LOW); // sets the licht pin (inverted) on
digitalWrite(powerWH, LOW); // sets the waterpump and high voltage on
menuType = 1; // inportant information
kpd.addEventListener(menuKeypadEvent); //add an event listener for this keypad
} else {
Serial.println("Wrong");
password.reset();
menuPasswordWrong();
}
}

View file

@ -0,0 +1,46 @@
void pulseCounter(); //
void setupFlowMeter(); //
void checkFlow() ;
void flowMenu();
void getInfo(); //here we get info like temp etc
void checkMenu();
void firstMenu();
void pwdKeypadEvent();
void menuKeypadEvent();
void choiceMenu() ;
int menuType = 0;
int potMeterEnable = 46;
int testEnablePin = 47;
int lichtPin = 49;
int laserEnablePin = 50;
int waterCoolerPin = 51;
int airAssistPin = 52;
int ventilationPin = 53;
int powerWH = 48;
LiquidCrystal lcd(12, 11, 7, 6, 5, 4);
int passwordCorrect = false;
Password password = Password( "123456" );
const byte ROWS = 4; // Four rows
const byte COLS = 3; // Three columns
char keys[ROWS][COLS] = { // Define the Keymap
{ '1','2','3' } ,
{ '4','5','6' } ,
{ '7','8','9' } ,
{ '*','0','#' } };
byte rowPins[ROWS] = { 15, 20, 17, 19 }; // Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte colPins[COLS] = { 18, 14, 16 }; // Connect keypad COL0, COL1 and COL2 to these Arduino pins.
Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); // Create the Keypad
float tempIn;
float tempOut;
int tempPinIn = 0;
int tempPinOut = 0;
volatile int pulseCount; //measuring the rising edges of the signal
int Calc;
int hallsensor = 2; //The pin location of the sensor
unsigned long loopTime;

View file

@ -0,0 +1,36 @@
#include <LiquidCrystal.h>
#include <Keypad.h>
#include <Password.h>
#include "safetyboard.h"
void setup() {
pinMode(airAssistPin, OUTPUT); // sets the digital pin as output
pinMode(ventilationPin, OUTPUT); // sets the digital pin as output
pinMode(waterCoolerPin, OUTPUT); // sets the digital pin as output
pinMode(laserEnablePin, OUTPUT); // sets the digital pin as output
pinMode(lichtPin, OUTPUT); // sets the digital pin as output
pinMode(testEnablePin, OUTPUT); // sets the digital pin as output
pinMode(potMeterEnable, OUTPUT); // sets the digital pin as output
pinMode(powerWH, OUTPUT); // sets the digital pin as output
digitalWrite(airAssistPin, HIGH); // sets the airAssist off
digitalWrite(ventilationPin, HIGH); // sets the air ventilation off
digitalWrite(waterCoolerPin, HIGH); // sets the watercooler off
digitalWrite(laserEnablePin, HIGH); // sets the laserEnable off
digitalWrite(lichtPin, HIGH); // sets the licht pin (inverted) off
digitalWrite(testEnablePin, HIGH); // sets the test enable pin () off
digitalWrite(potMeterEnable, HIGH); // sets the watercooler fans off
digitalWrite(powerWH, HIGH); // sets the waterpump and high voltage off
Serial.begin(9600);
firstMenu();
kpd.addEventListener(pwdKeypadEvent); //add an event listener for this keypad
}
void loop() {
if (passwordCorrect) {
checkMenu();
checkFlow();
} else {
kpd.getKey();
}
}

Binary file not shown.

Binary file not shown.

BIN
arduino/safety/Keypad.zip Normal file

Binary file not shown.

BIN
arduino/safety/Password.zip Normal file

Binary file not shown.

File diff suppressed because it is too large Load diff

104
arduino/safety/menu.txt Normal file
View file

@ -0,0 +1,104 @@
password
password set = false
msg "Bitlair Lasercutter"
msg "Bitlair Lasercutter"
information page
* for menu
Ready to burn? status
watertemp
tube in
tube out
menu
manual control
details
waterflow
high voltage power status
airflow status
status laser enable (emergency button)
watertemp in tank
high voltage power
off/on (default on)
airflow
off/on (default on)
checks -
waterflow
watertemp-tube-in > 50° => warning
watertemp-tube-in > 60° => turn off
pins (renumber to better pins)
D05 lcd data1
D04 lcd data2
D03 lcd data3
D02 lcd data4
D11 lcd Register Select (RS). RS=0: Command, RS=1: Data
D12 lcd Clock (Enable). Falling edge triggered
VCC lcd Vcc
GND lcd gnd
d15 keyb row 1
d20 keyb row 2
d19 keyb row 3
d17 keyb row 4
d16 keyb col 1
d14 keyb col 2
d18 keyb col 3
A01 watertemp-tube-in
A02 watertemp-tube-in
/*****************************************/
float temp;
int tempPin = 0;
void setup()
{
Serial.begin(9600);
}
void loop()
{
temp = analogRead(tempPin);
temp = temp * 0.48828125;
Serial.print("TEMPRATURE = ");
Serial.print(temp);
Serial.print("*C");
Serial.println();
delay(1000);
}
/*******************************************/
// reading liquid flow rate using Seeeduino and Water Flow Sensor from Seeedstudio.com
// Code adapted by Charles Gantt from PC Fan RPM code written by Crenn @thebestcasescenario.com
// http:/themakersworkbench.com http://thebestcasescenario.com http://seeedstudio.com
volatile int NbTopsFan; //measuring the rising edges of the signal
int Calc;
int hallsensor = 2; //The pin location of the sensor
void rpm () //This is the function that the interupt calls
{
NbTopsFan++; //This function measures the rising and falling edge of the hall effect sensors signal
}
// The setup() method runs once, when the sketch starts
void setup() //
{
pinMode(hallsensor, INPUT); //initializes digital pin 2 as an input
Serial.begin(9600); //This is the setup function where the serial port is
initialised,
attachInterrupt(0, rpm, RISING); //and the interrupt is attached
}
// the loop() method runs over and over again,
// as long as the Arduino has power
void loop ()
{
NbTopsFan = 0; //Set NbTops to 0 ready for calculations
sei(); //Enables interrupts
delay (1000); //Wait 1 second
cli(); //Disable interrupts
Calc = (NbTopsFan * 60 / 7.5); //(Pulse frequency x 60) / 7.5Q, = flow rate in L/hour
Serial.print (Calc, DEC); //Prints the number calculated above
Serial.print (" L/hour\r\n"); //Prints "L/hour" and returns a new line
}

BIN
arduino/safety/now.mjpg Normal file

Binary file not shown.

File diff suppressed because it is too large Load diff

2234
beplating/TopBack.dxf Normal file

File diff suppressed because it is too large Load diff

2962
beplating/TopCover.dxf Normal file

File diff suppressed because it is too large Load diff

1970
beplating/TopLeft.dxf Normal file

File diff suppressed because it is too large Load diff

2114
beplating/TopRightBack.dxf Normal file

File diff suppressed because it is too large Load diff

5074
beplating/TopRightFront.dxf Normal file

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

BIN
beplating/beplating.ods Normal file

Binary file not shown.

975
beplating/frontview.svg Normal file

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,202 @@
// ISO Metric Thread Implementation
// Trevor Moseley
// 23/08/2012
// For thread dimensions see
// http://en.wikipedia.org/wiki/File:ISO_and_UTS_Thread_Dimensions.svg
//hex_nut(6);
//hex_nut(8);
//hex_nut(10);
//hex_bolt(6,12);
//hex_bolt(8,16);
//hex_bolt(10,16);
//hex_bolt(12,24);
//thread_out(8,16);
defQ = 32;
// function for thread quality
function get_thr_qual(dia) = lookup(dia, [
[5,10],[6,12],[7,14],[8,16],[10,20],[12,12],[14,28],[16,32],[18,36],[20,40],[22,44],[24,48],[27,54],[30,60],[33,66],[36,72],[39,78],[42,84],[45,90],[48,96],[52,104],[56,112],[60,120],[64,128],[78,156]]);
// function for shaft quality
function get_sh_qual(dia) = lookup(dia, [
[5,10],[6,12],[7,14],[8,16],[10,20],[12,24],[14,28],[16,32],[18,36],[20,40],[22,44],[24,48],[27,54],[30,60],[33,66],[36,72],[39,78],[42,84],[45,90],[48,96],[52,104],[56,112],[60,120],[64,128],[78,156]]);
module hex_nut(dia)
{
$fn = get_sh_qual(dia);
thr = get_thr_qual(dia);
hi = hex_nut_hi(dia);
difference()
{
cylinder(r = hex_nut_dia(dia)/2,h = hi, $fn=6);
translate([0,0,-0.1]) cylinder(r = dia/2, h =hi + 0.2);
}
translate([0,0,0.1]) thread_in(dia,hi-0.2,thr);
}
module hex_bolt(dia,hi)
{
$fn = get_sh_qual(dia);
thr = get_thr_qual(dia);
hhi = hex_bolt_hi(dia);
cylinder(r = hex_bolt_dia(dia)/2,h = hhi, $fn=6);
translate([0,0,hhi-0.1]) thread_out(dia,hi+0.1,thr);
}
// function for thread pitch
function get_coarse_pitch(dia) = lookup(dia, [
[1,0.25],[1.2,0.25],[1.4,0.3],[1.6,0.35],[1.8,0.35],[2,0.4],[2.5,0.45],[3,0.5],[3.5,0.6],[4,0.7],[5,0.8],[6,1],[7,1],[8,1.25],[10,1.5],[12,1.75],[14,2],[16,2],[18,2.5],[20,2.5],[22,2.5],[24,3],[27,3],[30,3.5],[33,3.5],[36,4],[39,4],[42,4.5],[45,4.5],[48,5],[52,5],[56,5.5],[60,5.5],[64,6],[78,5]]);
// function for hex nut diameter from thread size
function hex_nut_dia(dia) = lookup(dia, [
[3,6.4],[4,8.1],[5,9.2],[6,11.5],[8,16.0],[10,19.6],[12,22.1],[16,27.7],[20,34.6],[24,41.6],[30,53.1],[36,63.5]]);
// function for hex nut height from thread size
function hex_nut_hi(dia) = lookup(dia, [
[3,2.4],[4,3.2],[5,4],[6,3],[8,5],[10,5],[12,10],[16,13],[20,16],[24,19],[30,24],[36,29]]);
// function for hex bolt head diameter from thread size
function hex_bolt_dia(dia) = lookup(dia, [
[3,6.4],[4,8.1],[5,9.2],[6,11.5],[8,14.0],[10,16],[12,22.1],[16,27.7],[20,34.6],[24,41.6],[30,53.1],[36,63.5]]);
// function for hex bolt head height from thread size
function hex_bolt_hi(dia) = lookup(dia, [
[3,2.4],[4,3.2],[5,4],[6,3.5],[8,4.5],[10,5],[12,10],[16,13],[20,16],[24,19],[30,24],[36,29]]);
module thread_out(dia,hi,thr=defQ)
{
p = get_coarse_pitch(dia);
h = (cos(30)*p)/8;
Rmin = (dia/2) - (5*h); // as wiki Dmin
s = 360/thr;
t = (hi-p)/p; // number of turns
n = t*thr; // number of segments
//echo(str("dia=",dia," hi=",hi," p=",p," h=",h," Rmin=",Rmin," s=",s));
cylinder(r = Rmin, h = hi);
for(sg=[0:n])
th_out_pt(Rmin-0.1,p,s,sg,thr,h,(hi-p)/n);
}
module th_out_pt(rt,p,s,sg,thr,h,sh)
// rt = radius of thread (nearest centre)
// p = pitch
// s = segment length (degrees)
// sg = segment number
// thr = segments in circumference
// h = ISO h of thread / 8
// sh = segment height (z)
{
as = (sg % thr) * s; // angle to start of seg
ae = as + s - (s/100); // angle to end of seg (with overlap)
z = sh*sg;
cas=cos(as);
sas=sin(as);
cae=cos(ae);
sae=sin(ae);
rtp=rt+(5*h);
casrt=cas*rt;
sasrt=sas*rt;
caert=cae*rt;
saert=sae*rt;
// 1,4
// |\
// | \ 2,5
// | /
// |/
// 0,3
// view from front (x & z) extruded in y by sg
//
//echo(str("as=",as,", ae=",ae," z=",z));
polyhedron(
points = [
[casrt,sasrt,z], // 0
[casrt,sasrt,z+(3/4*p)], // 1
[cas*rtp,sas*rtp,z+(3/8*p)], // 2
[caert,saert,z+sh], // 3
[caert,saert,z+(3/4*p)+sh], // 4
[cae*rtp,sae*rtp,z+sh+(3/8*p)]], // 5
triangles = [
[0,1,2], // near face
[3,5,4], // far face
[0,3,4],[0,4,1], // left face
[0,5,3],[0,2,5], // bottom face
[1,4,5],[1,5,2]]); // top face
}
module thread_in(dia,hi,thr=defQ)
{
p = get_coarse_pitch(dia);
h = (cos(30)*p)/8;
Rmin = (dia/2) - (5*h); // as wiki Dmin
s = 360/thr;
t = (hi-p)/p; // number of turns
n = t*thr; // number of segments
//echo(str("dia=",dia," hi=",hi," p=",p," h=",h," Rmin=",Rmin," s=",s));
difference()
{
cylinder(r = (dia/2)+0.5,h = hi);
translate([0,0,-1]) cylinder(r = (dia/2)+0.1, h = hi+2);
}
for(sg=[0:n])
th_in_pt(Rmin+0.2,p,s,sg,thr,h,(hi-p)/n);
}
module th_in_pt(rt,p,s,sg,thr,h,sh)
// rt = radius of thread (nearest centre)
// p = pitch
// s = segment length (degrees)
// sg = segment number
// thr = segments in circumference
// h = ISO h of thread / 8
// sh = segment height (z)
{
// as = 360 - (((sg % thr) * s) - 180); // angle to start of seg
// ae = as - s + (s/100); // angle to end of seg (with overlap)
as = ((sg % thr) * s - 180); // angle to start of seg
ae = as + s -(s/100); // angle to end of seg (with overlap)
z = sh*sg;
cas=cos(as);
sas=sin(as);
cae=cos(ae);
sae=sin(ae);
rtp=rt+(5*h);
casrt=cas*rt;
casrtp=cas*rtp;
sasrt=sas*rt;
sasrtp=sas*rtp;
caert=cae*rt;
caertp=cae*rtp;
saert=sae*rt;
saertp=sae*rtp;
// 2,5
// /|
// 1,4 / |
// \ |
// \|
// 0,3
// view from front (x & z) extruded in y by sg
//
polyhedron(
points = [
[casrtp,sasrtp,z], //0
[casrt,sasrt,z+(3/8*p)], //1
[casrtp,sasrtp,z+(3/4*p)], //2
[caertp,saertp,z+sh], //3
[caert,saert,z+(3/8*p)+sh], //4
[caertp,saertp,z+(3/4*p)+sh]], //5
triangles = [
[0,1,2], // near face
[3,5,4], // far face
[0,3,4],[0,4,1], // left face
[0,5,3],[0,2,5], // bottom face
[1,4,5],[1,5,2]]); // top face
}

View file

@ -0,0 +1,202 @@
// ISO Metric Thread Implementation
// Trevor Moseley
// 23/08/2012
// For thread dimensions see
// http://en.wikipedia.org/wiki/File:ISO_and_UTS_Thread_Dimensions.svg
//hex_nut(6);
//hex_nut(8);
//hex_nut(10);
hex_bolt(6,12);
//hex_bolt(8,16);
//hex_bolt(10,16);
//hex_bolt(12,24);
//thread_out(8,16);
defQ = 32;
// function for thread quality
function get_thr_qual(dia) = lookup(dia, [
[5,10],[6,12],[7,14],[8,16],[10,20],[12,12],[14,28],[16,32],[18,36],[20,40],[22,44],[24,48],[27,54],[30,60],[33,66],[36,72],[39,78],[42,84],[45,90],[48,96],[52,104],[56,112],[60,120],[64,128],[78,156]]);
// function for shaft quality
function get_sh_qual(dia) = lookup(dia, [
[5,10],[6,12],[7,14],[8,16],[10,20],[12,24],[14,28],[16,32],[18,36],[20,40],[22,44],[24,48],[27,54],[30,60],[33,66],[36,72],[39,78],[42,84],[45,90],[48,96],[52,104],[56,112],[60,120],[64,128],[78,156]]);
module hex_nut(dia)
{
$fn = get_sh_qual(dia);
thr = get_thr_qual(dia);
hi = hex_nut_hi(dia);
difference()
{
cylinder(r = hex_nut_dia(dia)/2,h = hi, $fn=6);
translate([0,0,-0.1]) cylinder(r = dia/2, h =hi + 0.2);
}
translate([0,0,0.1]) thread_in(dia,hi-0.2,thr);
}
module hex_bolt(dia,hi)
{
$fn = get_sh_qual(dia);
thr = get_thr_qual(dia);
hhi = hex_bolt_hi(dia);
cylinder(r = hex_bolt_dia(dia)/2,h = hhi, $fn=6);
translate([0,0,hhi-0.1]) thread_out(dia,hi+0.1,thr);
}
// function for thread pitch
function get_coarse_pitch(dia) = lookup(dia, [
[1,0.25],[1.2,0.25],[1.4,0.3],[1.6,0.35],[1.8,0.35],[2,0.4],[2.5,0.45],[3,0.5],[3.5,0.6],[4,0.7],[5,0.8],[6,1],[7,1],[8,1.25],[10,1.5],[12,1.75],[14,2],[16,2],[18,2.5],[20,2.5],[22,2.5],[24,3],[27,3],[30,3.5],[33,3.5],[36,4],[39,4],[42,4.5],[45,4.5],[48,5],[52,5],[56,5.5],[60,5.5],[64,6],[78,5]]);
// function for hex nut diameter from thread size
function hex_nut_dia(dia) = lookup(dia, [
[3,6.4],[4,8.1],[5,9.2],[6,11.5],[8,16.0],[10,19.6],[12,22.1],[16,27.7],[20,34.6],[24,41.6],[30,53.1],[36,63.5]]);
// function for hex nut height from thread size
function hex_nut_hi(dia) = lookup(dia, [
[3,2.4],[4,3.2],[5,4],[6,3],[8,5],[10,5],[12,10],[16,13],[20,16],[24,19],[30,24],[36,29]]);
// function for hex bolt head diameter from thread size
function hex_bolt_dia(dia) = lookup(dia, [
[3,6.4],[4,8.1],[5,9.2],[6,11.5],[8,14.0],[10,16],[12,22.1],[16,27.7],[20,34.6],[24,41.6],[30,53.1],[36,63.5]]);
// function for hex bolt head height from thread size
function hex_bolt_hi(dia) = lookup(dia, [
[3,2.4],[4,3.2],[5,4],[6,3.5],[8,4.5],[10,5],[12,10],[16,13],[20,16],[24,19],[30,24],[36,29]]);
module thread_out(dia,hi,thr=defQ)
{
p = get_coarse_pitch(dia);
h = (cos(30)*p)/8;
Rmin = (dia/2) - (5*h); // as wiki Dmin
s = 360/thr;
t = (hi-p)/p; // number of turns
n = t*thr; // number of segments
//echo(str("dia=",dia," hi=",hi," p=",p," h=",h," Rmin=",Rmin," s=",s));
cylinder(r = Rmin, h = hi);
for(sg=[0:n])
th_out_pt(Rmin-0.1,p,s,sg,thr,h,(hi-p)/n);
}
module th_out_pt(rt,p,s,sg,thr,h,sh)
// rt = radius of thread (nearest centre)
// p = pitch
// s = segment length (degrees)
// sg = segment number
// thr = segments in circumference
// h = ISO h of thread / 8
// sh = segment height (z)
{
as = (sg % thr) * s; // angle to start of seg
ae = as + s - (s/100); // angle to end of seg (with overlap)
z = sh*sg;
cas=cos(as);
sas=sin(as);
cae=cos(ae);
sae=sin(ae);
rtp=rt+(5*h);
casrt=cas*rt;
sasrt=sas*rt;
caert=cae*rt;
saert=sae*rt;
// 1,4
// |\
// | \ 2,5
// | /
// |/
// 0,3
// view from front (x & z) extruded in y by sg
//
//echo(str("as=",as,", ae=",ae," z=",z));
polyhedron(
points = [
[casrt,sasrt,z], // 0
[casrt,sasrt,z+(3/4*p)], // 1
[cas*rtp,sas*rtp,z+(3/8*p)], // 2
[caert,saert,z+sh], // 3
[caert,saert,z+(3/4*p)+sh], // 4
[cae*rtp,sae*rtp,z+sh+(3/8*p)]], // 5
triangles = [
[0,1,2], // near face
[3,5,4], // far face
[0,3,4],[0,4,1], // left face
[0,5,3],[0,2,5], // bottom face
[1,4,5],[1,5,2]]); // top face
}
module thread_in(dia,hi,thr=defQ)
{
p = get_coarse_pitch(dia);
h = (cos(30)*p)/8;
Rmin = (dia/2) - (5*h); // as wiki Dmin
s = 360/thr;
t = (hi-p)/p; // number of turns
n = t*thr; // number of segments
//echo(str("dia=",dia," hi=",hi," p=",p," h=",h," Rmin=",Rmin," s=",s));
difference()
{
cylinder(r = (dia/2)+0.5,h = hi);
translate([0,0,-1]) cylinder(r = (dia/2)+0.1, h = hi+2);
}
for(sg=[0:n])
th_in_pt(Rmin+0.2,p,s,sg,thr,h,(hi-p)/n);
}
module th_in_pt(rt,p,s,sg,thr,h,sh)
// rt = radius of thread (nearest centre)
// p = pitch
// s = segment length (degrees)
// sg = segment number
// thr = segments in circumference
// h = ISO h of thread / 8
// sh = segment height (z)
{
// as = 360 - (((sg % thr) * s) - 180); // angle to start of seg
// ae = as - s + (s/100); // angle to end of seg (with overlap)
as = ((sg % thr) * s - 180); // angle to start of seg
ae = as + s -(s/100); // angle to end of seg (with overlap)
z = sh*sg;
cas=cos(as);
sas=sin(as);
cae=cos(ae);
sae=sin(ae);
rtp=rt+(5*h);
casrt=cas*rt;
casrtp=cas*rtp;
sasrt=sas*rt;
sasrtp=sas*rtp;
caert=cae*rt;
caertp=cae*rtp;
saert=sae*rt;
saertp=sae*rtp;
// 2,5
// /|
// 1,4 / |
// \ |
// \|
// 0,3
// view from front (x & z) extruded in y by sg
//
polyhedron(
points = [
[casrtp,sasrtp,z], //0
[casrt,sasrt,z+(3/8*p)], //1
[casrtp,sasrtp,z+(3/4*p)], //2
[caertp,saertp,z+sh], //3
[caert,saert,z+(3/8*p)+sh], //4
[caertp,saertp,z+(3/4*p)+sh]], //5
triangles = [
[0,1,2], // near face
[3,5,4], // far face
[0,3,4],[0,4,1], // left face
[0,5,3],[0,2,5], // bottom face
[1,4,5],[1,5,2]]); // top face
}

View file

@ -0,0 +1,11 @@
$fn=60;
union(){
difference(){
translate([-20,-40,0])cube([40,60,5]);
translate([0,5,-7])cylinder(r=8.5,h=20);
# translate([10,-30,-2])cube([4,20,10]);
# translate([-14,-30,-2])cube([4,20,10]);
}
}

View file

@ -0,0 +1,14 @@
$fn=60;
union(){
difference(){
translate([0,0,0])cube([40,57,5]);
translate([20,41,0])cylinder(r=8.5,h=20);
#translate([10,10,0])cylinder(r=3,h=20);
#translate([30,10,0])cylinder(r=3,h=20);
//translate([10,-30,-2])cube([4,20,10]);
//translate([-14,-30,-2])cube([4,20,10]);
//translate([-20,-37,0])cube([30,20,10]);
}
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,39 @@
buisdikte=86;
hoogte=20;
bloklengte=40;
blokdikte=20;
bd = 2; // dikte vevestigingsbout
tm = 75; //afstand tussen mitsumi's onder buis
mh = 20; //mitsumi height
$fn=200;
/***************************************/
include <ISOThread_20120823.scad>
/***************************************/
dia=buisdikte/2;
module tubeholder(){
union(){
difference(){
union(){
cylinder(r=dia+hoogte/2,h=hoogte);
translate([-dia-8,-20-tm/2,0])cube([40,tm+40,20]);
}
translate([0,0,-0.1])cylinder(r=dia,h=hoogte+0.2);
}
translate([-20,dia,0])rotate([0,0,0])cube([bloklengte,15,hoogte]);
translate([-20,-dia-blokdikte+5,0])cube([bloklengte,15,hoogte]);
}
}
module fastner() {
difference() {
cube([10,20,20]); //holder1
translate([-10,10,10])rotate([0,90,0])cylinder(r=3,h=40);
}
}
difference(){
tubeholder();
translate([0,-110,-20])cube([100,235,50]);
//translate([-100,-110,-10])cube([100,235,30]);
}
translate([-dia-mh-8,-tm/2,0])cube([mh,tm,mh]); //20*20 voor tussen mitsumi
#translate([-51,37.5,20])fastner();
#translate([-51,-57.5,20])fastner();

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

View file

@ -0,0 +1,39 @@
buisdikte=86;
hoogte=20;
bloklengte=40;
blokdikte=20;
bd = 2; // dikte vevestigingsbout
tm = 75; //afstand tussen mitsumi's onder buis
mh = 20; //mitsumi height
$fn=200;
/***************************************/
include <ISOThread_20120823.scad>
/***************************************/
dia=buisdikte/2;
module tubeholder(){
union(){
difference(){
union(){
cylinder(r=dia+hoogte/2,h=hoogte);
translate([-dia-8,-20-tm/2,0])cube([40,tm+40,20]);
}
translate([0,0,-0.1])cylinder(r=dia,h=hoogte+0.2);
}
translate([-20,dia,0])rotate([0,0,0])cube([bloklengte,15,hoogte]);
translate([-20,-dia-blokdikte+5,0])cube([bloklengte,15,hoogte]);
}
}
module fastner() {
difference() {
cube([14,20,20]); //holder1
translate([-10,10,10])rotate([0,90,0])cylinder(r=3,h=40);
}
}
difference(){
tubeholder();
translate([0,-110,-20])cube([100,235,50]);
//translate([-100,-110,-10])cube([100,235,30]);
}
translate([-dia-mh-2+10,-20-tm/2,0])cube([4,115,20]); //20*20 voor tussen mitsumi
#translate([-55,37.5,20])fastner();
#translate([-55,-57.5,20])fastner();

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

After

Width:  |  Height:  |  Size: 57 KiB

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

After

Width:  |  Height:  |  Size: 123 KiB

2286
beplating/metaal/back.dxf Normal file

File diff suppressed because it is too large Load diff

2516
beplating/metaal/bottom.dxf Normal file

File diff suppressed because it is too large Load diff

11286
beplating/metaal/front r2.dxf Normal file

File diff suppressed because it is too large Load diff

11026
beplating/metaal/front.dxf Normal file

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

5664
beplating/metaal/panel.dxf Normal file

File diff suppressed because it is too large Load diff

1919
beplating/rookkanaal.svg Normal file

File diff suppressed because it is too large Load diff

After

Width:  |  Height:  |  Size: 75 KiB

199
beplating/rookkanaalsvg.svg Normal file
View file

@ -0,0 +1,199 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="744.094488189"
height="1052.36220472"
id="svg2"
version="1.1"
inkscape:version="0.48.4 r9939"
sodipodi:docname="onderbuisrechts.dxf">
<metadata
id="metadata74">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1766"
inkscape:window-height="480"
id="namedview72"
showgrid="false"
inkscape:zoom="0.27769373"
inkscape:cx="372.04724"
inkscape:cy="526.18109"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="0"
inkscape:current-layer="g20" />
<desc
id="desc4">/mnt/hd2/Data/projecten/prive/lasercutter/frame/onderbuisrechts.dxf - scale = 1.000000</desc>
<defs
id="defs6">
<marker
id="DistanceX"
orient="auto"
refX="0.0"
refY="0.0"
style="overflow:visible">
<path
d="M 3,-3 L -3,3 M 0,-5 L 0,5"
style="stroke:#000000; stroke-width:0.5"
id="path9" />
</marker>
<pattern
height="8"
id="Hatch"
patternUnits="userSpaceOnUse"
width="8"
x="0"
y="0">
<path
d="M8 4 l-4,4"
linecap="square"
stroke="#000000"
stroke-width="0.25"
id="path12" />
<path
d="M6 2 l-4,4"
linecap="square"
stroke="#000000"
stroke-width="0.25"
id="path14" />
<path
d="M4 0 l-4,4"
linecap="square"
stroke="#000000"
stroke-width="0.25"
id="path16" />
</pattern>
<symbol
id="*Model_Space" />
<symbol
id="*Paper_Space" />
</defs>
<g
inkscape:groupmode="layer"
inkscape:label="0"
id="g20">
<path
d="M 0.000000,1052.362205 0.000000,698.031496"
style="stroke:#000000;stroke-width:0.5;fill:none;stroke-linecap: round"
id="path22" />
<path
d="M 0.000000,698.031496 141.732283,698.031496"
style="stroke:#000000;stroke-width:0.5;fill:none;stroke-linecap: round"
id="path24" />
<path
d="M 141.732283,698.031496 141.732283,634.251969"
style="stroke:#000000;stroke-width:0.5;fill:none;stroke-linecap: round"
id="path26" />
<path
d="M 0.000000,1052.362205 1119.685039,1052.362205"
style="stroke:#000000;stroke-width:0.5;fill:none;stroke-linecap: round"
id="path28" />
<path
d="M 1119.685039,1052.362205 1119.685039,981.496063"
style="stroke:#000000;stroke-width:0.5;fill:none;stroke-linecap: round"
id="path30" />
<path
d="M 1119.685039,981.496063 1084.251969,981.496063"
style="stroke:#000000;stroke-width:0.5;fill:none;stroke-linecap: round"
id="path32" />
<path
d="M 1084.251969,981.496063 1084.251969,946.062992"
style="stroke:#000000;stroke-width:0.5;fill:none;stroke-linecap: round"
id="path34" />
<path
d="M 1084.251969,946.062992 1119.685039,946.062992"
style="stroke:#000000;stroke-width:0.5;fill:none;stroke-linecap: round"
id="path36" />
<path
d="M 1119.685039,775.984252 1119.685039,946.062992"
style="stroke:#000000;stroke-width:0.5;fill:none;stroke-linecap: round"
id="path38" />
<path
d="M 977.952756,775.984252 1119.685039,775.984252"
style="stroke:#000000;stroke-width:0.5;fill:none;stroke-linecap: round"
id="path40" />
<path
d="M 977.952756,634.251969 977.952756,775.984252"
style="stroke:#000000;stroke-width:0.5;fill:none;stroke-linecap: round"
id="path42" />
<path
d="M 729.921260,634.251969 729.921260,775.984252"
style="stroke:#000000;stroke-width:0.5;fill:none;stroke-linecap: round"
id="path44" />
<path
d="M 676.771654,634.251969 676.771654,829.133858"
style="stroke:#000000;stroke-width:0.5;fill:none;stroke-linecap: round"
id="path46" />
<path
d="M 141.732283,634.251969 676.771654,634.251969"
style="stroke:#000000;stroke-width:0.5;fill:none;stroke-linecap: round"
id="path48" />
<path
d="M 729.921260,634.251969 977.952756,634.251969"
style="stroke:#000000;stroke-width:0.5;fill:none;stroke-linecap: round"
id="path50" />
<path
d="M 676.771654,829.133858 818.503937,829.133858"
style="stroke:#000000;stroke-width:0.5;fill:none;stroke-linecap: round"
id="path52" />
<path
d="M 818.503937,829.133858 818.503937,775.984252"
style="stroke:#000000;stroke-width:0.5;fill:none;stroke-linecap: round"
id="path54" />
<path
d="M 729.921260,775.984252 818.503937,775.984252"
style="stroke:#000000;stroke-width:0.5;fill:none;stroke-linecap: round"
id="path56" />
<path
d="M 359.645669,933.661417 A 5.314961,5.314961 -0.000000 1 0 349.015748,933.661417 5.314961,5.314961 -0.000000 1 0 359.645669,933.661417 z"
style="stroke:#000000;stroke-width:0.5;fill:none;stroke-linecap: round"
id="path58" />
<path
d="M 643.110236,933.661417 A 5.314961,5.314961 -0.000000 1 0 632.480315,933.661417 5.314961,5.314961 -0.000000 1 0 643.110236,933.661417 z"
style="stroke:#000000;stroke-width:0.5;fill:none;stroke-linecap: round"
id="path60" />
<path
d="M 116.929134,1016.929134 A 10.629921,10.629921 -0.000000 1 0 95.669291,1016.929134 10.629921,10.629921 -0.000000 1 0 116.929134,1016.929134 z"
style="stroke:#000000;stroke-width:1.0;fill:none;stroke-linecap: round"
id="path62" />
<path
d="M 1024.015748,1016.929134 A 10.629921,10.629921 -0.000000 1 0 1002.755906,1016.929134 10.629921,10.629921 -0.000000 1 0 1024.015748,1016.929134 z"
style="stroke:#000000;stroke-width:1.0;fill:none;stroke-linecap: round"
id="path64" />
<path
d="M 917.716535,669.685039 A 10.629921,10.629921 -0.000000 1 0 896.456693,669.685039 10.629921,10.629921 -0.000000 1 0 917.716535,669.685039 z"
style="stroke:#000000;stroke-width:1.0;fill:none;stroke-linecap: round"
id="path66" />
<path
d="M 651.968504,669.685039 A 10.629921,10.629921 -0.000000 1 0 630.708661,669.685039 10.629921,10.629921 -0.000000 1 0 651.968504,669.685039 z"
style="stroke:#000000;stroke-width:1.0;fill:none;stroke-linecap: round"
id="path68" />
<path
d="M 187.795276,669.685039 A 10.629921,10.629921 -0.000000 1 0 166.535433,669.685039 10.629921,10.629921 -0.000000 1 0 187.795276,669.685039 z"
style="stroke:#000000;stroke-width:1.0;fill:none;stroke-linecap: round"
id="path70" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.3 KiB

2128
beplating/stand1.dxf Normal file

File diff suppressed because it is too large Load diff

2124
beplating/stand2.dxf Normal file

File diff suppressed because it is too large Load diff

216
beplating/stands 4.5cm.svg Normal file
View file

@ -0,0 +1,216 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="744.094488189"
height="1052.36220472"
id="svg3004"
version="1.1"
inkscape:version="0.48.4 r9939"
sodipodi:docname="stands 8cm.svg">
<metadata
id="metadata3051">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1185"
inkscape:window-height="943"
id="namedview3049"
showgrid="false"
inkscape:zoom="0.96253025"
inkscape:cx="378.42688"
inkscape:cy="180.13987"
inkscape:window-x="138"
inkscape:window-y="27"
inkscape:window-maximized="0"
inkscape:current-layer="g3023" />
<desc
id="desc3006">/home/mro/prive/lasercutter/stand1.dxf - scale = 1.000000</desc>
<defs
id="defs3008">
<marker
id="DistanceX"
orient="auto"
refX="0.0"
refY="0.0"
style="overflow:visible">
<path
d="M 3,-3 L -3,3 M 0,-5 L 0,5"
style="stroke:#000000; stroke-width:0.5"
id="path3011" />
</marker>
<pattern
height="8"
id="Hatch"
patternUnits="userSpaceOnUse"
width="8"
x="0"
y="0">
<path
d="M8 4 l-4,4"
linecap="square"
stroke="#000000"
stroke-width="0.25"
id="path3014" />
<path
d="M6 2 l-4,4"
linecap="square"
stroke="#000000"
stroke-width="0.25"
id="path3016" />
<path
d="M4 0 l-4,4"
linecap="square"
stroke="#000000"
stroke-width="0.25"
id="path3018" />
</pattern>
<symbol
id="*Model_Space" />
<symbol
id="*Paper_Space" />
<symbol
id="*Paper_Space0" />
</defs>
<g
inkscape:groupmode="layer"
inkscape:label="0"
id="g3023">
<path
d="m 0.49641089,1052.1836 105.93986911,0"
style="fill:none;stroke:#000000;stroke-width:0.35827053;stroke-linecap:round"
id="path3025"
inkscape:connector-curvature="0" />
<path
d="m 53.149606,981.80262 0,-123.51173"
style="fill:none;stroke:#000000;stroke-width:0.66009235;stroke-linecap:round"
id="path3027"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.460163;stroke-linecap:round"
d="m 0.05775225,981.45972 0,70.40428 0,-70.40428 z"
id="path3029"
inkscape:connector-curvature="0" />
<path
d="m 106.26858,1051.9474 0,-98.99685"
style="fill:none;stroke:#000000;stroke-width:0.28864416;stroke-linecap:round"
id="path3031"
inkscape:connector-curvature="0" />
<path
d="m 0.29762843,981.19841 53.14960557,0"
style="fill:none;stroke:#000000;stroke-width:0.59525687;stroke-linecap:round"
id="path3033"
inkscape:connector-curvature="0" />
<path
d="m 106.76626,952.97776 13.23913,0"
style="fill:none;stroke:#000000;stroke-width:0.34364527;stroke-linecap:round"
id="path3035"
inkscape:connector-curvature="0" />
<path
d="m 120.11836,1052.1944 0,-98.87708"
style="fill:none;stroke:#000000;stroke-width:0.44909185;stroke-linecap:round"
id="path3037"
inkscape:connector-curvature="0" />
<path
d="m 53.149998,856.98029 120.472002,0"
style="fill:none;stroke:#000000;stroke-width:0.99999821;stroke-linecap:round"
id="path3039"
inkscape:connector-curvature="0" />
<path
d="m 173.62205,981.80247 0,-123.51291"
style="fill:none;stroke:#000000;stroke-width:0.66009551;stroke-linecap:round"
id="path3041"
inkscape:connector-curvature="0" />
<path
d="m 173.5689,982.26494 53.25324,0"
style="fill:none;stroke:#000000;stroke-width:0.00352411;stroke-linecap:round"
id="path3043"
inkscape:connector-curvature="0" />
<path
d="m 226.95236,1052.1821 0,-69.88006"
style="fill:none;stroke:#000000;stroke-width:0.36074919;stroke-linecap:round"
id="path3045"
inkscape:connector-curvature="0" />
<path
d="m 120.93882,1052.4751 105.36645,0"
style="fill:none;stroke:#000000;stroke-width:0.00141601;stroke-linecap:round"
id="path3047"
inkscape:connector-curvature="0" />
<path
d="m 248.90325,1052.0707 226.00734,0"
style="fill:none;stroke:#000000;stroke-width:0.52329022;stroke-linecap:round"
id="path3025-5"
inkscape:connector-curvature="0" />
<path
d="m 301.35343,981.68968 0,-123.51173"
style="fill:none;stroke:#000000;stroke-width:0.66009235;stroke-linecap:round"
id="path3027-6"
inkscape:connector-curvature="0" />
<path
style="fill:none;stroke:#000000;stroke-width:0.460163;stroke-linecap:round"
d="m 248.26158,981.34678 0,70.40432 0,-70.40432 z"
id="path3029-9"
inkscape:connector-curvature="0" />
<path
d="m 354.4724,956.54857 0,-98.99689"
style="fill:none;stroke:#000000;stroke-width:0.28864416;stroke-linecap:round"
id="path3031-0"
inkscape:connector-curvature="0" />
<path
d="m 248.50145,981.08547 53.14961,0"
style="fill:none;stroke:#000000;stroke-width:0.59525687;stroke-linecap:round"
id="path3033-2"
inkscape:connector-curvature="0" />
<path
d="m 354.97008,952.97776 13.23913,0"
style="fill:none;stroke:#000000;stroke-width:0.34364527;stroke-linecap:round"
id="path3035-7"
inkscape:connector-curvature="0" />
<path
d="m 368.32218,956.46835 0,-98.87712"
style="fill:none;stroke:#000000;stroke-width:0.44909185;stroke-linecap:round"
id="path3037-7"
inkscape:connector-curvature="0" />
<path
d="m 301.35382,856.86735 120.472,0"
style="fill:none;stroke:#000000;stroke-width:0.99999821;stroke-linecap:round"
id="path3039-8"
inkscape:connector-curvature="0" />
<path
d="m 421.82587,981.68953 0,-123.51291"
style="fill:none;stroke:#000000;stroke-width:0.66009551;stroke-linecap:round"
id="path3041-8"
inkscape:connector-curvature="0" />
<path
d="m 421.77272,982.152 53.25324,0"
style="fill:none;stroke:#000000;stroke-width:0.00352411;stroke-linecap:round"
id="path3043-4"
inkscape:connector-curvature="0" />
<path
d="m 475.15618,1052.0692 0,-69.8801"
style="fill:none;stroke:#000000;stroke-width:0.36074919;stroke-linecap:round"
id="path3045-9"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.2 KiB

332
beplating/stands 8cm.svg Normal file
View file

@ -0,0 +1,332 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="744.094488189"
height="1052.36220472"
id="svg3004"
version="1.1"
inkscape:version="0.48.4 r9939"
sodipodi:docname="stand1.dxf">
<metadata
id="metadata3051">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1185"
inkscape:window-height="943"
id="namedview3049"
showgrid="false"
inkscape:zoom="1.2900929"
inkscape:cx="378.42688"
inkscape:cy="180.13987"
inkscape:window-x="617"
inkscape:window-y="38"
inkscape:window-maximized="0"
inkscape:current-layer="g3023" />
<desc
id="desc3006">/home/mro/prive/lasercutter/stand1.dxf - scale = 1.000000</desc>
<defs
id="defs3008">
<marker
id="DistanceX"
orient="auto"
refX="0.0"
refY="0.0"
style="overflow:visible">
<path
d="M 3,-3 L -3,3 M 0,-5 L 0,5"
style="stroke:#000000; stroke-width:0.5"
id="path3011" />
</marker>
<pattern
height="8"
id="Hatch"
patternUnits="userSpaceOnUse"
width="8"
x="0"
y="0">
<path
d="M8 4 l-4,4"
linecap="square"
stroke="#000000"
stroke-width="0.25"
id="path3014" />
<path
d="M6 2 l-4,4"
linecap="square"
stroke="#000000"
stroke-width="0.25"
id="path3016" />
<path
d="M4 0 l-4,4"
linecap="square"
stroke="#000000"
stroke-width="0.25"
id="path3018" />
</pattern>
<symbol
id="*Model_Space" />
<symbol
id="*Paper_Space" />
<symbol
id="*Paper_Space0" />
</defs>
<g
inkscape:groupmode="layer"
inkscape:label="0"
id="g3023">
<path
d="M 0.000000,1052.362205 106.299213,1052.362205"
style="stroke:#000000;fill:none;stroke-linecap: round"
id="path3025" />
<path
d="m 53.149606,981.62238 0,-211.85106"
style="fill:none;stroke:#000000;stroke-width:0.86450183;stroke-linecap:round"
id="path3027"
inkscape:connector-curvature="0" />
<path
style="stroke:#000000;fill:none;stroke-linecap: round"
d="M 0 981.5 L 0 1052.375 L 0 981.5 z "
id="path3029" />
<path
d="M 106.299213,1052.362205 106.299213,875.196850"
style="stroke:#000000;fill:none;stroke-linecap: round"
id="path3031" />
<path
d="M 0.000000,981.496063 53.149606,981.496063"
style="stroke:#000000;fill:none;stroke-linecap: round"
id="path3033" />
<path
d="M 106.299213,875.196850 120.472441,875.196850"
style="stroke:#000000;fill:none;stroke-linecap: round"
id="path3035" />
<path
d="M 120.472441,1052.362205 120.472441,875.196850"
style="stroke:#000000;fill:none;stroke-linecap: round"
id="path3037" />
<path
d="m 53.15,768.39762 120.47244,0"
style="fill:none;stroke:#000000;stroke-linecap:round"
id="path3039"
inkscape:connector-curvature="0" />
<path
d="m 173.62205,981.62062 0,-212.84676"
style="fill:none;stroke:#000000;stroke-width:0.86653107;stroke-linecap:round"
id="path3041"
inkscape:connector-curvature="0" />
<path
d="M 173.622047,981.496063 226.771654,981.496063"
style="stroke:#000000;fill:none;stroke-linecap: round"
id="path3043" />
<path
d="M 226.771654,1052.362205 226.771654,981.496063"
style="stroke:#000000;fill:none;stroke-linecap: round"
id="path3045" />
<path
d="M 120.472441,1052.362205 226.771654,1052.362205"
style="stroke:#000000;fill:none;stroke-linecap: round"
id="path3047" />
<path
inkscape:connector-curvature="0"
d="m 329.65817,981.27936 0,-212.84676"
style="fill:none;stroke:#000000;stroke-width:0.86653107;stroke-linecap:round"
id="path3099" />
<path
inkscape:connector-curvature="0"
d="m 276.50856,1052.0209 0,-70.8661"
style="fill:none;stroke:#000000;stroke-linecap:round"
id="path3101" />
<path
inkscape:connector-curvature="0"
d="m 276.50856,981.1548 53.14961,0"
style="fill:none;stroke:#000000;stroke-linecap:round"
id="path3103" />
<path
inkscape:connector-curvature="0"
d="m 382.80777,768.55611 0,177.16535"
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round"
id="path3105" />
<path
inkscape:connector-curvature="0"
d="m 329.65817,768.5561 53.1496,0"
style="fill:none;stroke:#000000;stroke-linecap:round"
id="path3107" />
<path
inkscape:connector-curvature="0"
d="m 382.80777,945.72146 14.17323,0"
style="fill:none;stroke:#000000;stroke-linecap:round"
id="path3109" />
<path
inkscape:connector-curvature="0"
d="m 396.981,768.55611 0,177.16535"
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round"
id="path3111" />
<path
inkscape:connector-curvature="0"
d="m 396.981,768.5561 53.14961,0"
style="fill:none;stroke:#000000;stroke-linecap:round"
id="path3113" />
<path
inkscape:connector-curvature="0"
d="m 450.13061,981.27936 0,-212.84676"
style="fill:none;stroke:#000000;stroke-width:0.86653107;stroke-linecap:round"
id="path3115" />
<path
inkscape:connector-curvature="0"
d="m 450.13061,981.1548 53.1496,0"
style="fill:none;stroke:#000000;stroke-linecap:round"
id="path3117" />
<path
inkscape:connector-curvature="0"
d="m 503.28021,1052.0209 0,-70.8661"
style="fill:none;stroke:#000000;stroke-linecap:round"
id="path3119" />
<path
inkscape:connector-curvature="0"
d="m 276.50856,1052.0209 226.77165,0"
style="fill:none;stroke:#000000;stroke-linecap:round"
id="path3121" />
<path
inkscape:connector-curvature="0"
d="m 194.00903,763.52913 0,212.84677"
style="fill:none;stroke:#000000;stroke-width:0.86653107;stroke-linecap:round"
id="path3099-1" />
<path
inkscape:connector-curvature="0"
d="m 140.85942,692.78763 0,70.8661"
style="fill:none;stroke:#000000;stroke-linecap:round"
id="path3101-5" />
<path
inkscape:connector-curvature="0"
d="m 140.85942,763.65373 53.14961,0"
style="fill:none;stroke:#000000;stroke-linecap:round"
id="path3103-8" />
<path
inkscape:connector-curvature="0"
d="m 247.15863,976.25239 0,-177.16536"
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round"
id="path3105-2" />
<path
inkscape:connector-curvature="0"
d="m 194.00903,976.2524 53.1496,0"
style="fill:none;stroke:#000000;stroke-linecap:round"
id="path3107-6" />
<path
inkscape:connector-curvature="0"
d="m 247.15863,799.08703 14.17323,0"
style="fill:none;stroke:#000000;stroke-linecap:round"
id="path3109-4" />
<path
inkscape:connector-curvature="0"
d="m 261.33186,976.25239 0,-177.16536"
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:round"
id="path3111-8" />
<path
inkscape:connector-curvature="0"
d="m 261.33186,976.2524 53.14961,0"
style="fill:none;stroke:#000000;stroke-linecap:round"
id="path3113-6" />
<path
inkscape:connector-curvature="0"
d="m 314.48147,763.52913 0,212.84677"
style="fill:none;stroke:#000000;stroke-width:0.86653107;stroke-linecap:round"
id="path3115-8" />
<path
inkscape:connector-curvature="0"
d="m 314.48147,763.65373 53.1496,0"
style="fill:none;stroke:#000000;stroke-linecap:round"
id="path3117-4" />
<path
inkscape:connector-curvature="0"
d="m 367.63107,692.78763 0,70.8661"
style="fill:none;stroke:#000000;stroke-linecap:round"
id="path3119-5" />
<path
inkscape:connector-curvature="0"
d="m 140.85942,692.78763 226.77165,0"
style="fill:none;stroke:#000000;stroke-linecap:round"
id="path3121-4" />
<path
inkscape:connector-curvature="0"
d="m 406.73174,691.87285 106.29921,0"
style="fill:none;stroke:#000000;stroke-linecap:round"
id="path3025-4" />
<path
d="m 459.88135,762.61265 0,211.8511"
style="fill:none;stroke:#000000;stroke-width:0.86450183;stroke-linecap:round"
id="path3027-4"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
style="fill:none;stroke:#000000;stroke-linecap:round"
d="m 406.73174,762.73505 0,-70.875 0,70.875 z"
id="path3029-6" />
<path
inkscape:connector-curvature="0"
d="m 513.03095,691.87285 0,177.1654"
style="fill:none;stroke:#000000;stroke-linecap:round"
id="path3031-8" />
<path
inkscape:connector-curvature="0"
d="m 406.73174,762.73905 53.14961,0"
style="fill:none;stroke:#000000;stroke-linecap:round"
id="path3033-2" />
<path
inkscape:connector-curvature="0"
d="m 513.03095,869.03825 14.17323,0"
style="fill:none;stroke:#000000;stroke-linecap:round"
id="path3035-5" />
<path
inkscape:connector-curvature="0"
d="m 527.20418,691.87285 0,177.1654"
style="fill:none;stroke:#000000;stroke-linecap:round"
id="path3037-0" />
<path
d="m 459.88174,975.83745 120.47244,0"
style="fill:none;stroke:#000000;stroke-linecap:round"
id="path3039-4"
inkscape:connector-curvature="0" />
<path
d="m 580.35379,762.61445 0,212.84676"
style="fill:none;stroke:#000000;stroke-width:0.86653107;stroke-linecap:round"
id="path3041-0"
inkscape:connector-curvature="0" />
<path
inkscape:connector-curvature="0"
d="m 580.35379,762.73905 53.1496,0"
style="fill:none;stroke:#000000;stroke-linecap:round"
id="path3043-5" />
<path
inkscape:connector-curvature="0"
d="m 633.50339,691.87285 0,70.8662"
style="fill:none;stroke:#000000;stroke-linecap:round"
id="path3045-2" />
<path
inkscape:connector-curvature="0"
d="m 527.20418,691.87285 106.29921,0"
style="fill:none;stroke:#000000;stroke-linecap:round"
id="path3047-1" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

BIN
beplating/stands.plf Normal file

Binary file not shown.

BIN
beplating/stands2.plf Normal file

Binary file not shown.

View file

@ -0,0 +1,6 @@
beide zijplaten 2cm te hoog, gaten meeverplaatsen + doorvoer draad leds
voorste zijplaat mitsumi 40 ipv 20
plaat onder laserbuis 2* extra gaatje 1.5 cm naar voren (voor tyraps)
staandetr achterplaat 472 van uiterste tand tot achterwand
staanse achterplaat 285 van kortste tand (op bodemplaat)
plaatje 65*75 hart 50 2 gaten op 15*15 en 10*16 (10 is op mitsumi)

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,47 @@
// PRUSA Mendel
// Belt clamp
// GNU GPL v3
// Josef Průša
// josefprusa@me.com
// prusadjs.cz
// http://www.reprap.org/wiki/Prusa_Mendel
// http://github.com/prusajr/PrusaMendel
//
// modified by neurofun
include <configuration.scad>
module beltclamp(){
clamp_height = 3;
clamp_width = 10;
clamp_length = 16; // distance between the center of the 2 holes
belt_pitch = 2;
belt_width = 10;
tooth_width = 1.3;
tooth_heigth = .75;
offset = belt_pitch/4;
// uncomment next line for a symetric clamp
//offset = 0;
difference(){
// basic shape
union(0){
translate(v = [0,0,clamp_height/2]) cube([clamp_length,clamp_width,clamp_height], center=true);
translate(v = [-clamp_length/2, 0, 0]) cylinder(r=clamp_width/2,h=clamp_height);
translate(v = [clamp_length/2, 0, 0]) cylinder(r=clamp_width/2,h=clamp_height);
}
// screw holes
translate(v = [-clamp_length/2, 0, -1])polyhole(m3_diameter, clamp_height+2);
translate(v = [clamp_length/2, 0, -1]) polyhole(m3_diameter, clamp_height+2);
// belt grip
translate(v = [0,offset,clamp_height-tooth_heigth])
for ( i = [round(-clamp_width/belt_pitch/2) : round(clamp_width/belt_pitch/2)]){
translate(v = [0,belt_pitch*i,tooth_heigth])cube(size = [belt_width, tooth_width, tooth_heigth*2], center = true);
}
}
}
beltclamp();

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,62 @@
// PRUSA Mendel
// Configuration file
// GNU GPL v3
// Josef Průša
// josefprusa@me.com
// prusadjs.cz
// http://www.reprap.org/wiki/Prusa_Mendel
// http://github.com/prusajr/PrusaMendel
// PLEASE SELECT ONE OF THE CONFIGURATIONS BELOW
// BY UN-COMMENTING IT
// Uncomment for metric settings
// METRIC METRIC METRIC METRIC METRIC METRIC METRIC METRIC
include <metric.scad>;
// CUSTOM CUSTOM CUSTOM CUSTOM CUSTOM CUSTOM CUSTOM CUSTOM CUSTOM
thin_wall = 3;
// Linear bearing version
linear = false;
// set false for LM-8UU, true for LM-E-8UU (ignore if linear is set to false)
lme8uu = false;
// CHANGE ONLY THE STUFF YOU KNOW
// IT WILL REPLACE DEFAULT SETTING
// RODS
// threaded_rod_diameter = 0;
// threaded_rod_diameter_horizontal = 0;
// smooth_bar_diameter = 0;
// smooth_bar_diameter_horizontal = 0;
// Nuts and bolts
// m8_diameter = 0;
// m8_nut_diameter = 0;
// m4_diameter = 0;
// m4_nut_diameter = 0;
// m3_diameter = 0;
// m3_nut_diameter = 0;
// Bushing holder
// bushing_core_diameter = smooth_bar_diameter;
// bushing_material_thickness = 0;
///counted stuff
m3_nut_diameter_bigger = ((m3_nut_diameter / 2) / cos (180 / 6))*2;
// functions
include <functions.scad>

View file

@ -0,0 +1,35 @@
// PRUSA Mendel
// Functions used in many files
// GNU GPL v3
// Josef Průša
// josefprusa@me.com
// prusadjs.cz
// http://www.reprap.org/wiki/Prusa_Mendel
// http://github.com/prusajr/PrusaMendel
module nut(d,h,horizontal=true){
cornerdiameter = (d / 2) / cos (180 / 6);
cylinder(h = h, r = cornerdiameter, $fn = 6);
if(horizontal){
for(i = [1:6]){
rotate([0,0,60*i]) translate([-cornerdiameter-0.2,0,0]) rotate([0,0,-45]) cube(size = [2,2,h]);
}}
}
// Based on nophead research
module polyhole(d,h) {
n = max(round(2 * d),3);
rotate([0,0,180])
cylinder(h = h, r = (d / 2) / cos (180 / n), $fn = n);
}
module roundcorner(diameter){
difference(){
cube(size = [diameter,diameter,99], center = false);
translate(v = [diameter, diameter, 0]) cylinder(h = 100, r=diameter, center=true);
}
}

View file

@ -0,0 +1,38 @@
// PRUSA Mendel
// Default metric sizes
// GNU GPL v3
// Josef Průša
// josefprusa@me.com
// prusadjs.cz
// http://www.reprap.org/wiki/Prusa_Mendel
// http://github.com/prusajr/PrusaMendel
// DONT CHANGE THIS FILE! ALTER VALUES IN CONFIGURATION.SCAD INSTEAD
// RODS
threaded_rod_diameter = 8.7;
threaded_rod_diameter_horizontal = 8.7;
smooth_bar_diameter = 8;
smooth_bar_diameter_horizontal = 8.5;
// Nuts and bolts
m8_diameter = 9;
m8_nut_diameter = 14.1;
m4_diameter = 4.5;
m4_nut_diameter = 9;
m3_diameter = 3.6;
m3_nut_diameter = 5.3;
m3_nut_diameter_horizontal = 6.1;
// Bushing holder
bushing_core_diameter = smooth_bar_diameter;
bushing_material_thickness = 1;
// Motors
motor_shaft = 5.5;

View file

@ -0,0 +1,782 @@
use <vwheel_single_bearing_b17001_rev_2.scad>;
use <makerslide.scad>;
use <carriage_plate_standard_c14005_rev_2.scad>;
use <misumi_2020.scad>;
use <misumi_2040.scad>;
use <skins.scad>;
PI=3.14159265358979323846;
// Specify the dimensions of the usable cutting envelope you need:
xtravel = 1300;
ytravel = 640;
ztravel = 60;
// That's it. Configured. Hit F5.
// Check the console window for parts list with scaled dimensions.
// Check the display to see if everything really does line up.
// Set the folowing items to 1 or 0 to display or hide different
// sections of the assembly. Probaly the first thing you want to
// turn off is the skins, to get a better look at everything
// else inside.
xy_gantry = 0 ;
xbelt = 1 ;
ybelts = 1 ;
driveshafts = 1 ;
zsystem = 0 ;
frame = 1 ;
cover = 0 ; cover_is_open = 1 ;
skins = 0 ;
skins_flat = 1 ; // hi-res 2D layout, for DXF export
//(disables rendering of everything else)
// press F6 for this one, then "Design"
// menu --> "Export as DXF".
//////////////////////////////////
// bitlair additions //
//////////////////////////////////
tube = 1;
reservoir = 1;
voeding = 1;
luchtcompressor = 1;
waterpomp = 1;
radiator = 1;
///////////
// INTRO //
///////////
// This is a parametric three axis motion system
// based on Barton Dring's Buildlog.net Laser 2.0 design
// and MakerSlide V rail system.
// (www.buildlog.net) (www.makerslide.com)
// I've tried to identify all the parts that need to scale
// to adjust the cutting envelope. This script calculates
// the new dimensions required just for the parts that need
// to change, and lists those results in the console window.
// Combine these results with the Laser 2.0 BOM at Buildlog.net
// to work up your parts orders for your own custom-sized machine.
// (To copy the text in the console, you might have to
// right click --> Select All --> Copy.)
// The scaled skin panels can be rendered flat and exported as
// 2D DXF files, suitable for generating cut files for a CNC
// router, or patterns to print and cut by hand.
// Is it all correct? Will this really give a workable set of
// scaled parts? Explore the model and consider it. I'm not
// making any claims - I can only attest to my intent. I'll
// be using it though, if I come up with money for a build soon.
// This work is Copyright 2011 by Michael Sheldrake
// and licensed under a Creative Commons Attribute-Share Alike 3.0 License
// http://creativecommons.org/licenses/by-sa/3.0/
// Thanks go to Barton Dring for releasing his designs under
// that same license.
////////////////////////////////
// SPECIFYING AXIS DIMENSIONS //
////////////////////////////////
// The Buildlog 2.0 Laser claims "just under" a 20"x12"x4"
// working envelope (508mm x 304.8mm x 101.6mm).
// If you specify those dimensions here (in millimeters), the parts
// generated should match the dimensions in bdring's Laser 2.0
// drawings.
//xtravel = 508.0; // everything in millimeters
//ytravel = 304.8; // These are the Buildlog.net
//ztravel = 101.6; // Laser 2.0 standard dimensions.
//// DON'T GO TOO BIG ///
// You want a 2'x2' system? 4'x4'? You can model that here.
// But don't count on that design to actually work.
// Maybe, though? Every extra inch makes it that much more
// difficult to align and maintain rigity of the system.
// Surely the Laser 2.0 design can add a half inch here or
// there and work about as well. But 12"? Yards?
// Probably not, but it's fun to look and dream:
//xtravel = 1500; // Way too big,
//ytravel = 1500; // probably.
//ztravel = 2500; // Or is it?
//// DON'T GO TOO SMALL ///
// ... because a laser tube and electronics won't fit in there.
// But if you're adapting the Laser 2.0 design to work as a
// plotter, or something else, here's a pretty small system:
//xtravel = 1; // We call this
//ytravel = 1; // "tugging the
//ztravel = 1; // envelope".
// OpenSCAD FUN //
// Animate the envelope - grow from 1x1x1 to standard Laser 2.0 size.
// Use OpenSCAD's Animate option in the View menu.
// (Normally animate just makes the x and y axes move.)
// (Make sure all other lines above that set
// xtravel, ytravel and ztravel are commented
// out before trying this animated version.)
//ztarg=101.6;
//xfact=508.0/ztarg;
//yfact=304.8/ztarg;
//xtravel = $t*ztarg * xfact;
//ytravel = $t*ztarg * yfact;
//ztravel = $t*ztarg;
/////////////////////////
// Constant Dimensions //
/////////////////////////
// Some frame dimensions don't change as we scale
// the cutting envelope. These are candidates for
// becoming parameters too, but I didn't do all the
// math with changing these in mind. So inspect
// results closely if you alter them.
beam_width = 20; // width of square aluminum extrusions
half_beam_width = beam_width/2; // handy
shaftmotorspan = 82; // stepper motor between two drive shafts
skinThickness = 3; // Alupanel, 3mm thick
control_space_X = 210; // width of where electroncs go
tube_space_Y = 80; // space for laser tube behind cutting area
top_space_Z = 140; // parts above z=0 don't scale
wheel_plate_thk = 0.125*25.4; // MakerSlide wheel plates / brackets, 1/8" Al
wheel_standoff = 0.25 *25.4; //
wheel_center_off= 3; // for single-bearing delrin vwheel
imperialFudge = 1.95; // Gantry assembly v wheel center to v wheel center comes
// out to 728.05mm on ref design. Frame bars that seem to
// match that length don't - they're 730mm.
// So this little extra gets us even frame dims that match
// reference, based on a metric span of MakerSlide, and then
// plates and vwheels that have some imperial dimensions mixed in.
///////////////////////////
/// THE SCALING MATH ///
///////////////////////////
// Here's the math to make the the Buildlog 2.0 reference dimensions adjustable,
// xyz reference frame parts - travel you get from that = base xyz vals to add your own desired travel dimensions to
// (x rail,y rail,frame height) - ( 12" , 20" , 4" )
// ( 703 , 560 , 310 ) - ( 508 , 304.8 , 101.6) = ( 195 , 255.2 , 208.4 )
// Note that we snap up to next whole mm:
MakerSlideXLength = ceil( 195.0 + xtravel ); // Note that we snap
MakerSlideYLength = ceil( 255.2 + ytravel ); // up to next whole
FrameHeight = ceil( 208.4 + ztravel ); // millimeter.
// similar for belts, except relative to roughly 1/2 belt length, since they loop
// original x,y = 60",40" (1524mm,1016mm); half: (762 , 508)
//(762 , 508) - ( 508 , 304.8 ) = ( 254 , 203.2)
BeltXLength = 2 * (254 + xtravel);
BeltYLength = 2 * (203.2 + ytravel);
// similar for Y drive shafts
// recently updated to 14" and 12"
// just split the difference of requested and reference ytravel between the shafts,
// but note that these shafts at McMaster mostly come in 2" increments (and 9 and 15, and not 22)
// original shaft sum - original xtravel
// 26" - 20" = 6"
shaftsum=ceil(6+(xtravel/25.4)); // inches here
ShaftOneLength=25.4 * floor(shaftsum/2 + 1); // longer shaft, back to mm
ShaftTwoLength=25.4 * ceil(shaftsum/2 - 1); // short shaft - there's more space
// in assy to make this one longer
///////////////////////////////////
// Derived and Scaled Dimensions //
///////////////////////////////////
to_vwheel_center= wheel_plate_thk + wheel_standoff + wheel_center_off;
scaledX = MakerSlideXLength + 2 * to_vwheel_center + imperialFudge;
halfScaledX = scaledX/2;
halfScaledXPlus = halfScaledX + half_beam_width;
scaledY = MakerSlideYLength;
halfScaledY = scaledY/2;
halfScaledYPlus = halfScaledY + half_beam_width;
shortHalfScaledY= halfScaledY - tube_space_Y - beam_width; // not really a half of anything
scaledZDown = FrameHeight - top_space_Z;
activeMakerSlideYLength = MakerSlideYLength - // this is just the portion that
tube_space_Y - // you would use if the beam didn't
beam_width; // reach back in to the tube space
// to the back of the machine
// and now ...
///////////////////////////////////
// RENDER THE SCALED SUBSECTIONS //
///////////////////////////////////
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
// ///
///
if (skins_flat==1) {skins_flat();}
else {
if (xy_gantry==1) xy_gantry();
if (xbelt==1) xbelt(BeltXLength);
if (ybelts==1) ybelts(BeltYLength);
if (driveshafts==1) driveshafts(ShaftOneLength,ShaftTwoLength);
if (zsystem==1) zsystem();
if (frame==1) frame();
if (cover==1) cover(open=(cover_is_open==1));
if (skins==1) skins();
if (tube==1) tube();
if (reservoir==1) reservoir();
if (voeding==1) voeding();
if (luchtcompressor==1) luchtcompressor();
if (waterpomp==1) waterpomp();
if (radiator==1) radiator();
}
///
///
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
///////////////////////////
// MakerSlide components //
///////////////////////////
makerslide_color=[0.6,0.6,0.7];
// These two modules are not used
// for the laser design, but might
// be useful for visualizing other
// non-laser concepts that use the
// standard MakerSlide wheel plates.
module wheel_plate_assy(flip=false) {
wheelelevation= (flip ? -1 : 1) * to_vwheel_center;
color([0.6,0.2,0.2]) rotate(a=180) translate([-55,-80,0])
import_stl("standard_wheel_carriage_plate.stl", convexity = 5);
translate([42.3, -70, wheelelevation]) vwheel();
translate([42.3, 70, wheelelevation]) vwheel();
translate([-22.3, 0, wheelelevation]) vwheel();
}
module tool_carriage_assy() {
wheelelevation= -(wheel_standoff + wheel_center_off);
translate([0.6,0,beam_width + -wheelelevation]) {
color([0.6,0.2,0.2]) translate([-80,45,0]) rotate([0,0,-90])
import_stl("standard_wheel_carriage_plate.stl",convexity=5);
translate([-32.663,0,wheelelevation]) rotate([180,0,0]) vwheel();
translate([32.3,-32.3,wheelelevation]) rotate([180,0,0]) vwheel();
translate([32.3, 32.3,wheelelevation]) rotate([180,0,0]) vwheel();
}
}
// These three modules bring in the laser-specific
// MakerSlide plates for the gantry assembly.
module left_bracket_assy() {
color([0.6,0.2,0.2]) import_stl("gantry_end_bracket_left_rev4_mm.stl", convexity = 10);
// Warning:
// The bracket plus the first wheel alone, cause OpenSCAD to crash on CGAL render.
// That region of the bracket is like a Bermuda Triangle for CGAL.
// There should be no need to CGAL-render this assembly, but if you do,
// comment out this first wheel.
translate([10 + 0.315 * 25.4 , -10 - 0.719 * 25.4 , to_vwheel_center]) vwheel();
translate([10 + 0.315 * 25.4 , 10 + 1.574 * 25.4 , to_vwheel_center]) vwheel();
translate([10 - 2.221 * 25.4 - 0.94 , 10 - 0.01 * 25.4 , to_vwheel_center]) vwheel();
}
module right_bracket_assy() {
color([0.6,0.2,0.2]) import_stl("gantry_end_bracket_right_rev_3_mm.stl", convexity = 5);
translate([10 + 0.315 * 25.4 , -10 - 0.719 * 25.4 , -to_vwheel_center]) rotate([180,0,0]) vwheel();
translate([10 + 0.315 * 25.4 , 10 + 1.574 * 25.4 , -to_vwheel_center]) rotate([180,0,0]) vwheel();
translate([10 - 2.221 * 25.4 - 0.94 , 10 + 0.236 * 25.4 , -to_vwheel_center]) rotate([180,0,0]) vwheel();
}
module laser_carriage_assy() {
wheelelevation= -(wheel_standoff + wheel_center_off);
translate([0.6,0,20 + -wheelelevation]) {
color([0.2,0.2,0.2]) rotate([0,0,-90]) import_stl("laser_carriage_plate_rev_4_mm.stl",convexity=5);
translate([ 32.163 , -34.925 , wheelelevation]) rotate([180,0,0]) vwheel();
translate([ 32.163 , 34.925 , wheelelevation]) rotate([180,0,0]) vwheel();
translate([-32.663 - 0.94 , 0 , wheelelevation]) rotate([180,0,0]) vwheel();
}
}
// Gantry assembly from wheel plates above and a piece of MakerSlide V rail extrusion.
module gantry(xref=400) {
echo(str("GANTRY"));
echo(str(" MakerSlide: 1 x ",MakerSlideXLength,"mm (",(MakerSlideXLength/25.4),"in)"));
translate([0,0,25])
rotate([0,0,-90])
rotate([-90,-90,0]) {
color(makerslide_color) makerslide(xref - 0.02); // minus 0.02 to avoid co-planar display glitches with end plates
translate([0,0, xref/2]) left_bracket_assy();
translate([0,0,-xref/2]) right_bracket_assy();
// you might use these standard plates instead, for a non-laser assembly
//translate([0,0, xref/2]) wheel_plate_assy();
//translate([0,0,-xref/2]) wheel_plate_assy(flip=true);
}
rotate([0,0,-90])
translate([0,sin(2*$t*360) * (xref/2 - 85),25]) { // for optional animation
//tool_carriage_assy(); // standard plate option
laser_carriage_assy();
}
}
// Gantry, with two pieces of MakerSlide to ride on.
// Note the belt model thrown in, so it can ride with the gantry when animated.
module xy_gantry() {
animlowy = -MakerSlideYLength/2 + 80;
animhalfspan = (MakerSlideYLength - (tube_space_Y+beam_width) - 160)/2;
translate([-imperialFudge/2,0,0]) { // to align the whole thing with the frame assembly
translate([0,(animlowy+animhalfspan)+sin(180+$t*360)*animhalfspan,0]) { // for animation
gantry(MakerSlideXLength);
}
echo(str(" MakerSlide: 2 x ",MakerSlideYLength,"mm (",(MakerSlideYLength/25.4),"in)"));
translate([-(MakerSlideXLength/2 + beam_width + to_vwheel_center),0,half_beam_width]) rotate([-90,0,0]) color(makerslide_color) makerslide(MakerSlideYLength);
translate([ (MakerSlideXLength/2 + beam_width + to_vwheel_center),0,half_beam_width]) rotate([-90,0,180]) color(makerslide_color) makerslide(MakerSlideYLength);
}
}
///////////////////////////
// Misumi components //
///////////////////////////
module frame(xref=MakerSlideXLength,yref=MakerSlideYLength,zref=FrameHeight) {
echo(str("FRAME"));
echo(str(" Misumi 2040:"));
d30027r3_9_length = scaledX + control_space_X + beam_width;
d30027r3_9_partno = str("HFS5-2040-",d30027r3_9_length);
d30027r3_9_count = 2;
echo(str(" ",d30027r3_9_count," x ",d30027r3_9_partno," ",d30027r3_9_length,"mm (",(d30027r3_9_length/25.4),"in)"));
for(i=[
[-halfScaledX , halfScaledYPlus , 0],
[-halfScaledX ,-halfScaledYPlus , 0],
]) {
translate(i) translate([0,0,half_beam_width]) rotate([0,90,0]) misumi_2040( d30027r3_9_length );
}
echo(str(" Misumi 2020:"));
d30027r3_4_length = zref;
d30027r3_4_partno = str("HFS5-2020-",d30027r3_4_length);
d30027r3_4_count = 4;
echo(str(" ",d30027r3_4_count," x ",d30027r3_4_partno," ",d30027r3_4_length,"mm (",(d30027r3_4_length/25.4),"in)"));
for(i=[
[-halfScaledXPlus , halfScaledYPlus ,-scaledZDown],
[-halfScaledXPlus ,-halfScaledYPlus ,-scaledZDown],
[ halfScaledXPlus + control_space_X + beam_width , halfScaledYPlus ,-scaledZDown],
[ halfScaledXPlus + control_space_X + beam_width ,-halfScaledYPlus ,-scaledZDown]
]) {
translate(i) misumi_2020(d30027r3_4_length);
}
d30027r3_8_length = scaledX + control_space_X + beam_width;
d30027r3_8_partno = str("HFS5-2020-",d30027r3_8_length);
d30027r3_8_count = 3;
echo(str(" ",d30027r3_8_count," x ",d30027r3_8_partno," ",d30027r3_8_length,"mm (",(d30027r3_8_length/25.4),"in)"));
for(i=[
[-halfScaledX ,-halfScaledYPlus ,-scaledZDown],
[-halfScaledX , halfScaledYPlus ,-scaledZDown],
[-halfScaledX , halfScaledYPlus , top_space_Z - beam_width],
]) {
translate(i) translate([0,0,half_beam_width]) rotate([0,90,0]) misumi_2020( d30027r3_8_length );
}
d30027r3_6_length = scaledX;
d30027r3_6_partno = str("HFS5-2020-",d30027r3_6_length);
d30027r3_6_count = 3;
echo(str(" ",d30027r3_6_count," x ",d30027r3_6_partno," ",d30027r3_6_length,"mm (",(d30027r3_6_length/25.4),"in)"));
for(i=[
[-halfScaledX ,-halfScaledYPlus , top_space_Z - 2*beam_width],
[-halfScaledX , halfScaledYPlus - (tube_space_Y+beam_width),-scaledZDown],
[-halfScaledX , halfScaledYPlus - (tube_space_Y+beam_width), top_space_Z - beam_width],
]) {
translate(i) translate([0,0,half_beam_width]) rotate([0,90,0]) misumi_2020( d30027r3_6_length );
}
d30027r3_notshown_length = scaledX - 5;
d30027r3_notshown_partno = str("HFS5-2020-",d30027r3_notshown_length);
d30027r3_notshown_count = 1;
echo(str(" ",d30027r3_notshown_count," x ",d30027r3_notshown_partno," ",d30027r3_notshown_length,"mm (",(d30027r3_notshown_length/25.4),"in)"));
for(i=[
[-halfScaledX ,halfScaledYPlus - (tube_space_Y+beam_width), half_beam_width],
]) {
translate(i) translate([0,0,half_beam_width]) rotate([0,90,0]) misumi_2020( d30027r3_notshown_length );
}
d30027r3_5_length = yref;
d30027r3_5_partno = str("HFS5-2020-",d30027r3_5_length);
d30027r3_5_count = 7; // drawing shows 6, coming revision has one more
echo(str(" ",d30027r3_5_count," x ",d30027r3_5_partno," ",d30027r3_5_length,"mm (",(d30027r3_5_length/25.4),"in)"));
for(i=[
[-halfScaledXPlus , halfScaledY ,-scaledZDown],
[-halfScaledXPlus , halfScaledY , top_space_Z-beam_width],
[ halfScaledXPlus , halfScaledY ,-scaledZDown],
[ halfScaledXPlus , halfScaledY , top_space_Z-beam_width],
[ halfScaledXPlus + control_space_X + beam_width , halfScaledY ,-scaledZDown],
[ halfScaledXPlus + control_space_X + beam_width , halfScaledY , half_beam_width],
[ halfScaledXPlus + control_space_X + beam_width , halfScaledY , top_space_Z-beam_width]
]) {
translate(i) translate([0,0,half_beam_width]) rotate([90,0,0]) misumi_2020(d30027r3_5_length);
}
d30027r3_3_length = control_space_X + beam_width;
d30027r3_3_partno = str("HFS5-2020-",d30027r3_3_length);;
d30027r3_3_count = 1;
echo(str(" ",d30027r3_3_count," x ",d30027r3_3_partno," ",d30027r3_3_length,"mm (",(d30027r3_3_length/25.4),"in)"));
translate([halfScaledX,-halfScaledYPlus, top_space_Z-half_beam_width]) rotate([0,90,0]) misumi_2020( d30027r3_3_length );
d30027r3_7_length = top_space_Z - beam_width - beam_width - half_beam_width;
d30027r3_7_partno = str("HFS5-2020-",d30027r3_7_length);
d30027r3_7_count = 1;
echo(str(" ",d30027r3_7_count," x ",d30027r3_7_partno," ",d30027r3_7_length,"mm (",(d30027r3_7_length/25.4),"in)"));
translate([halfScaledXPlus,-halfScaledYPlus,3*half_beam_width]) misumi_2020( d30027r3_7_length );
d30027r3_2_length = scaledZDown - half_beam_width;
d30027r3_2_partno = str("HFS5-2020-",d30027r3_2_length);
d30027r3_2_count = 1;
echo(str(" ",d30027r3_2_count," x ",d30027r3_2_partno," ",d30027r3_2_length,"mm (",(d30027r3_2_length/25.4),"in)"));
translate([half_beam_width,halfScaledYPlus - (tube_space_Y+beam_width),-scaledZDown + 2*half_beam_width]) misumi_2020( d30027r3_2_length );
}
/////////////////////
// cover, or lid //
/////////////////////
module cover(open=false) {
lidSideGap = 2.5; //mm
lidHingeGap = 0; //mm, maybe up to 1mm , based on Misumi hinge drawing
lidYPartLength=scaledY - tube_space_Y - 2*beam_width;
echo(str("COVER"));
d30013r3_8_length = scaledX - 2 * lidSideGap;
d30013r3_8_partno = str("HFS5-2020-",d30013r3_8_length);
d30013r3_8_count = 2;
echo(str(" ",d30013r3_8_count," x ",d30013r3_8_partno," ",d30013r3_8_length,"mm (",(d30013r3_8_length/25.4),"in)"));
d30013r3_7_length = lidYPartLength;
d30013r3_7_partno = str("HFS5-2020-",d30013r3_7_length);
d30013r3_7_count = 2;
echo(str(" ",d30013r3_7_count," x ",d30013r3_7_partno," ",d30013r3_7_length,"mm (",(d30013r3_7_length/25.4),"in)"));
// cover window panel
echo(str("COVER WINDOW PANEL"));
echo(str(" ",(2 * (halfScaledX - lidSideGap)),"mm x ",(lidYPartLength+2*beam_width),"mm (",((2 * (halfScaledX - lidSideGap))/25.4),"in x ",((lidYPartLength+2*beam_width)/25.4),"in)"));
ot=[0,-shortHalfScaledY,-top_space_Z-5];
or=[-92*(open?1:0),0,0];
translate(-1*ot) rotate(or) translate(ot) {
for(i=[
[-halfScaledX + lidSideGap , shortHalfScaledY - half_beam_width - lidHingeGap - beam_width - lidYPartLength, top_space_Z-beam_width],
[-halfScaledX + lidSideGap , shortHalfScaledY - half_beam_width - lidHingeGap, top_space_Z-beam_width],
]) {
translate(i) translate([0,0,half_beam_width]) rotate([0,90,0]) misumi_2020( d30013r3_8_length );
}
for(i=[
[-(halfScaledXPlus - 2*half_beam_width - lidSideGap) , shortHalfScaledY - beam_width - lidHingeGap , top_space_Z-beam_width],
[ (halfScaledXPlus - 2*half_beam_width - lidSideGap) , shortHalfScaledY - beam_width - lidHingeGap , top_space_Z-beam_width],
]) {
translate(i) translate([0,0,half_beam_width]) rotate([90,0,0]) misumi_2020( d30013r3_7_length );
}
color([0.7,0.7,1.0,0.5]) translate([-halfScaledX + lidSideGap,-halfScaledY - beam_width - lidHingeGap ,top_space_Z]) cube([(2 * (halfScaledX - lidSideGap)),(lidYPartLength+2*beam_width),skinThickness]);
}
}
///////////////////////////
// gantry timing belts //
///////////////////////////
module xbelt(beltlength=20) {
echo(str(" EconoBelt: 1 x ",beltlength,"mm (cut) (",ceil(beltlength/25.4),"in, rounded up)"));
animlowy = -MakerSlideYLength/2 + 80;
animhalfspan = (MakerSlideYLength - (tube_space_Y+beam_width) - 160)/2;
translate([-imperialFudge/2,(animlowy+animhalfspan)+sin(180+$t*360)*animhalfspan,0]) { // animation - should correspond to gantry motion
translate([-MakerSlideXLength/2 + 4,35,65]) rotate([90,0,0]) belt(beltlength);
}
}
module ybelts(beltlength=20) {
echo(str(" EconoBelt: 2 x ",beltlength,"mm (cut) (",ceil(beltlength/25.4),"in, rounded up)"));
translate([-MakerSlideXLength/2 + 5 ,(MakerSlideYLength)/2-55,-34]) rotate([90,0,-90]) belt(beltlength);
translate([ MakerSlideXLength/2 - 5 - imperialFudge,(MakerSlideYLength)/2-55,-34]) rotate([90,0,-90]) belt(beltlength);
}
module belt(ref) {
geardiam=25.4 * 0.489; //0.489" OD, but that might be for flange?
beltwidth=25.4/4;
beltthick=25.4/16;
halflength=ref/2;
gearcenter=(ref - (PI * geardiam)) / 2;
color([0.2,0.2,0.2])
difference() {
intersection() {
union() {
cylinder(r=geardiam/2,h=beltwidth*1.1,center=true);
translate([gearcenter,0,0]) cylinder(r=geardiam/2,h=beltwidth*1.1,center=true);
translate([0,-geardiam/2,-beltwidth*1.11/2]) cube([gearcenter,geardiam,beltwidth*1.11],center=false);
}
translate([(gearcenter + geardiam*2.2)/2 - geardiam,0,0]) cube([gearcenter + geardiam*2.2,geardiam*2.2,beltwidth],center=true);
}
union() {
translate([0,0,0]) cylinder(r=geardiam/2 - beltthick,h=beltwidth*1.2,center=true);
translate([gearcenter,0,0]) cylinder(r=geardiam/2-beltthick,h=beltwidth*1.2,center=true);
translate([0,-(geardiam-2*beltthick)/2,-beltwidth*1.12/2]) cube([gearcenter,geardiam-2*beltthick,beltwidth*1.21],center=false);
}
}
}
///////////////////////
// y drive shafts //
//////////////////////
module driveshafts(shaftlengthone=14*25.4,shaftlengthtwo=12*25.4) {
echo(str(" (shaft src): 1 x ",ShaftOneLength,"mm (",(ShaftOneLength/25.4),"in)"));
echo(str(" (shaft src): 1 x ",ShaftTwoLength,"mm (",(ShaftTwoLength/25.4),"in)"));
translate([-12.525,MakerSlideYLength/2 - (tube_space_Y+beam_width) + half_beam_width + 32.766,-34]) {
translate([-MakerSlideXLength/2,0,0]) driveshaft(shaftlengthone);
translate([-MakerSlideXLength/2+shaftlengthone+shaftmotorspan,0,0]) driveshaft(shaftlengthtwo);
}
}
module driveshaft(length=254) {
color([0.35,0.35,0.4]) rotate([0,90,0]) cylinder(r=25.4*0.125,h=length,center=false);
}
///////////////////////////////////////
// z table, leadscrews, drive belt //
///////////////////////////////////////
module zsystem() {
// z table frame - ref is 580 wide, with 370s butting
halfZsX = halfScaledX - 100;
halfZsOtherX = halfScaledX - 50; // from original specs, where 730 - (580 + 100) = right side spacing of z table = 50
zXSpan=halfZsOtherX + halfZsX;
zYGap=25;//from original specs, where[ (halfScaledY + (halfScaledYPlus - 100 - half_beam_width)) - (370+2*20) ] * 0.5 = gap
//[ (280 + (290 - 100 - 10)) - (370+2*20) ] * 0.5 = gap = (460 - 410) *0.5 = 25 = nice.
zYSpan=(halfScaledY + (halfScaledYPlus - (tube_space_Y+beam_width) - half_beam_width)) - 2*zYGap;
echo(str("Z TABLE"));
d30014r2_4_length = zXSpan;
d30014r2_4_partno = str("HFS5-2020-",d30014r2_4_length);
d30014r2_4_count = 2;
echo(str(" ",d30014r2_4_count," x ",d30014r2_4_partno," ",d30014r2_4_length,"mm (",(d30014r2_4_length/25.4),"in)"));
for(i=[
[-halfZsX , -halfScaledY + half_beam_width + zYGap , -scaledZDown/6],
[-halfZsX ,-(halfScaledY-half_beam_width - zYGap) + zYSpan - 2*half_beam_width , -scaledZDown/6],
]) {
translate(i) translate([0,0,half_beam_width]) rotate([0,90,0]) misumi_2020( d30014r2_4_length );
}
d30014r2_3_length = zYSpan-2*beam_width;
d30014r2_3_partno = str("HFS5-2020-",d30014r2_3_length);
d30014r2_3_count = 2;
echo(str(" ",d30014r2_3_count," x ",d30014r2_3_partno," ",d30014r2_3_length,"mm (",(d30014r2_3_length/25.4),"in)"));
for(i=[
[-(halfZsX - half_beam_width) , -(halfScaledY - zYGap) + zYSpan - 2*half_beam_width , -scaledZDown/6],
[(halfZsOtherX - half_beam_width) , -(halfScaledY - zYGap) + zYSpan - 2*half_beam_width , -scaledZDown/6],
]) {
translate(i) translate([0,0,half_beam_width]) rotate([90,0,0]) misumi_2020( d30014r2_3_length );
}
// z table panel
echo(str("Z TABLE PANEL"));
echo(str(" 1 x C19010 ",zXSpan,"mm x ",zYSpan,"mm (",(zXSpan/25.4),"in x ",(zYSpan/25.4),"in)"));
// (not shown)
// z lead screws
zLeadScrewHeight=scaledZDown - 2*half_beam_width + (11/16)*25.4 + 3*half_beam_width + 5.7375;
echo(str("Z LEADSCREWS"));
B18009_0800_length = zLeadScrewHeight;
B18009_0800_partno = str("B18009-xxxx (0.25in,20tpi threaded rod)");
B18009_0800_count = 3;
echo(str(" ",B18009_0800_count," x ",B18009_0800_partno," ",B18009_0800_length,"mm (",(B18009_0800_length/25.4),"in)"));
for(i=[
[-halfZsX + zXSpan*(85/580) , -halfScaledY + half_beam_width ,0],
[-halfZsX + zXSpan*(435/580), -halfScaledY + half_beam_width ,0],
[-halfZsX + zXSpan*(435/580), (halfScaledY - half_beam_width) - (tube_space_Y+beam_width),0],
]) {
translate(i) translate([0,0,-scaledZDown+(2*half_beam_width - (11/16)*25.4)]) color([0.3,0.3,0.5]) cylinder(r=25.4/8,h=B18009_0800_length,center=false);
}
B18009_1000_length = zLeadScrewHeight+(2*25.4);
B18009_1000_partno = str("B18009-xxxx (0.25in,20tpi threaded rod)");
B18009_1000_count = 1;
echo(str(" ",B18009_1000_count," x ",B18009_1000_partno," ",B18009_1000_length,"mm (",(B18009_1000_length/25.4),"in)"));
for(i=[
[-halfZsX + zXSpan*(85/580) , (halfScaledY - half_beam_width) - (tube_space_Y+beam_width),0],
]) {
translate(i) translate([0,0,-scaledZDown+(2*half_beam_width - (11/16)*25.4)]) color([0.3,0.3,0.5]) cylinder(r=25.4/8,h=B18009_1000_length,center=false);
}
//z belt - belt display is more approximate than actual length calculation
beltthick=1.14;//mm
pd=0.48*25.4 + beltthick;
pext=PI*pd;
zby1=(((halfScaledY - half_beam_width) - (tube_space_Y+beam_width)) + (halfScaledY - half_beam_width)); //yspans
zby2=zby1;
zbx1=(zXSpan*(435/580) - zXSpan*(85/580)); // straight xspan
zbx2=sqrt(pow(30,2)+pow(pd,2)) + sqrt( pow( (zXSpan*(435/580) - zXSpan*(85/580)) - 30 , 2 ) + pow(pd,2)); // xspan with slack for tensioner
zbl = zby1 +
zby2 +
zbx1 +
zbx2 +
pext // extra around corners of pulleys
;
echo(str("Z CLOSED BELT"));
B28035_length = zbl;
B28035_partno = str("B28035 (loop timing belt)");
B28035_count = 1;
echo(str(" EconoBelt: ",B28035_count," x ",B28035_partno," : close to ",B28035_length,"mm (~",(round(10*B28035_length/25.4)/10),"in, rounded)"));
color([0.2,0.2,0.2])
translate([(zbx1+pd)/2 + (-halfZsX + zXSpan*(85/580)) - pd/2,- ((zby1+pd)/2 + (-(halfScaledY - half_beam_width)+ (tube_space_Y+beam_width)) - pd/2),-scaledZDown+5.5/16*25.4]) {
difference() {
difference() {
cube([zbx1+pd,zby1+pd,25.4/4],center=true);
translate([-(zbx1+pd)/2 + 30+pd,(zby1+pd)/2 - pd,-25.4/4.5])
rotate([0,0,90 - atan2(0.48*25.4,30)])
cube([zbx1+pd,zby1+pd,25.4/2]);
translate([-(zbx1+pd)/2 + 30+pd,(zby1+pd)/2 - pd,-25.4/4.5])
rotate([0,0,90 - atan2( (zXSpan*(435/580) - zXSpan*(85/580)) - 30 ,0.48*25.4)])
cube([zbx1+pd,zby1+pd,25.4/2]);
}
difference() {
cube([zbx1+pd-4,zby1+pd-4,25.4/2],center=true);
translate([-(zbx1+pd+4)/2 + 30+pd,(zby1+pd-4)/2 - pd,-25.4/4.5])
rotate([0,0,90 - atan2(0.48*25.4,30)])
cube([zbx1+pd,zby1+pd,25.4/2]);
translate([-(zbx1+pd+4)/2 + 30+pd,(zby1+pd-4)/2 - pd,-25.4/4.5])
rotate([0,0,90 - atan2((zXSpan*(435/580) - zXSpan*(85/580)) - 30,0.48*25.4)])
cube([zbx1+pd,zby1+pd,25.4/2]);
}
}
}
}
///////////////////////
// skins //
//////////////////////
module skins(xref=MakerSlideXLength,yref=MakerSlideYLength,zref=FrameHeight,skinThickness=skinThickness) {
S_L = -2 + beam_width + scaledX + beam_width + control_space_X + beam_width;
S_W = -2 + yref + beam_width + beam_width;
S_H = -2 + zref;
//echo(str("SKIN DIMS LxWxH: ",S_L," x ",S_W," x ",S_H)); // s/b 998 x 598 x 308 for reference design
color([0.25,0.30,0.45]) {
translate([1 + -halfScaledX-2*half_beam_width,-halfScaledY-2*half_beam_width,1 + -scaledZDown])
rotate([90,0,0])
linear_extrude(height=skinThickness)
skin_front(S_L,S_H);
translate([1 + -halfScaledX-2*half_beam_width + S_L,halfScaledY+2*half_beam_width,1 + -scaledZDown])
rotate([90,0,180])
linear_extrude(height=skinThickness)
skin_back(S_L,S_H);
translate([1 + -halfScaledX-2*half_beam_width + S_L-1,-halfScaledY-2*half_beam_width + 1,1 + -scaledZDown])
rotate([90,0,90])
linear_extrude(height=skinThickness)
skin_side(S_W,S_H);
translate([1 + -halfScaledX-2*half_beam_width -1 , halfScaledY+2*half_beam_width - 1,1 + -scaledZDown])
rotate([90,0,-90])
linear_extrude(height=skinThickness)
skin_side(S_W,S_H);
translate([1 + -halfScaledX-2*half_beam_width,1 + -halfScaledY-2*half_beam_width,-scaledZDown-skinThickness])
linear_extrude(height=skinThickness)
skin_bottom(S_L,S_W);
translate([ -halfScaledX-2*half_beam_width , halfScaledY - 99,zref-scaledZDown])
linear_extrude(height=skinThickness)
skin_top_back(S_L,S_W);
translate([1 + -halfScaledX-2*half_beam_width + S_L ,1 + -halfScaledY-2*half_beam_width,zref-scaledZDown])
rotate([0,0,90])
linear_extrude(height=skinThickness)
skin_top_right(S_W);
translate([1 + -halfScaledX-2*half_beam_width + 18,1 + -halfScaledY-2*half_beam_width,zref-scaledZDown])
rotate([0,0,90])
linear_extrude(height=skinThickness)
skin_top_left(S_W);
}
}
//////////////////////////////////
// skins for DXF - 2D layout //
//////////////////////////////////
module skins_flat(xref=MakerSlideXLength,yref=MakerSlideYLength,zref=FrameHeight) {
// Turn up the resolution on this one
$fa=2;
$fs=0.2;
echo("\nCGAL RENDER MIGHT TAKE A FEW MINUTES\n(resolution turned up to get smooth circles)\n");
//!linear_extrude(height=10) cable_slot();
S_L = -2 + beam_width + scaledX + beam_width + control_space_X + beam_width;
S_W = -2 + yref + beam_width + beam_width;
S_H = -2 + zref;
//echo(str("SKIN DIMS LxWxH: ",S_L," x ",S_W," x ",S_H)); // s/b 998 x 598 x 308 for reference design
margin=25.4;
color([0.25,0.30,0.45]) {
skin_bottom(S_L,S_W);
translate([0,S_W + margin + 0 * (S_H + margin)]) 2D_stack_layout(S_H + margin) {
skin_front(S_L,S_H);
skin_back(S_L,S_H);
skin_side(S_W,S_H);
skin_side(S_W,S_H);
skin_top_back(S_L,S_W);
skin_top_right(S_W);
skin_top_left(S_W);
}
}
}
//////////////////////////////////////////////////////////
// tube //
//////////////////////////////////////////////////////////
module tube() {
echo(str("tube"));
translate([-720,405,70])rotate([0,90,0])cylinder(r=28,h=1600);
}
module reservoir() {
echo(str("reservoir"));
color([0,0,10])translate([915,80,-110])rotate([0,0,90])cylinder(r=62,h=210);
}
module voeding() {
echo(str("voeding 173 * 97 * 280"));
translate([980,180,-110])rotate([0,0,90])cube([280,173,97]);
}
module luchtcompressor() {
echo(str("luchtcompressor 182*95*116"));
color([0.3,0.2,0.9])translate([920,-400,-100])rotate([0,0,90])cube([182,95,116]);
}
module waterpomp() {
echo(str("waterpomp 147*115*75"));
color([0,0,10])translate([850,-150,-100])rotate([90,0,90])cube([147,115,75]);
}
module radiator() {
echo(str("radiator 396*120*30 ==> 60 incl fans"));
color([0,0,10])translate([950,-380,-105])rotate([90,0,90])cube([396,120,60]);
}
module 2D_stack_layout(step) {for (i=[0:$children-1]) {translate([0,i*step]) child(i);}}

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

View file

@ -0,0 +1,83 @@
// MakerSlide Component
// http://www.makerslide.com
// c14005_rev_2
// Standard Wheel Carriage Plate
// Original by Barton Dring
// OpenSCAD model by Mike Sheldrake
standard_wheel_carriage_plate();
module standard_wheel_carriage_plate(thickness=3.175) {
color([175/255,178/255,183/255])
difference() {
// 90mm by 160mm plate
// 3.175mm thick by default,
// but you can pass a different thickness to this module
cube([90,160,3.175],center=false);
// 5mm diam. holes
for(i=[
[12.7,10],
[12.7,30],
[12.7,70],
[12.7,80],
[12.7,90],
[12.7,112.3],
[12.7,130],
[12.7,150],
[35,10],
[35,60],
[35,80],
[35,100],
[35,150],
[45,70],
[45,90],
[55,10],
[55,60],
[55,80],
[55,100],
[55,150],
[77.3,30],
[77.3,70],
[77.3,90],
[77.3,112.3],
[77.3,130],
//These are 5mm holes in the 7mm hole spots that we will do next.
//For some reason including them here too makes the OpenCSG display look right.
//Not needed for CGAL render though.
[12.7,47.7],
[45,47.7],
[77.3,10],
[77.3,47.7],
[77.3,80],
[77.3,150]
]) { translate([i[0],i[1],-0.2]) cylinder(h=thickness+1,r=5/2,center=false); }
// 7mm diam. holes
for(i=[
[12.7,47.7],
[45,47.7],
[77.3,10],
[77.3,47.7],
[77.3,80],
[77.3,150]
]) { translate([i[0],i[1],-0.2]) cylinder(h=thickness+1,r=7/2,center=false); }
// rounded corners on plate
for(i=[
[0,0,0],
[90,160,180],
[90,0,90],
[0,160,270]
]
) {
translate([i[0],i[1],0]) rotate(a=[0,0,i[2]]) translate([10,10,-0.1]) rotate(a=[0,0,180]) difference() {
cube([11,11,thickness+1],center=false);
translate([0,0,-0.1]) cylinder(h=thickness+2,r=10,center=false);
}
}
}
}

View file

@ -0,0 +1,5 @@
module makerslide(h=100) {
linear_extrude(file="makerslide_extrusion_profile.dxf", layer="makerslide",height=h, center=true, convexity=10);
}
makerslide(100);

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,2 @@
module misumi_2020(h=100) {color([0.7,0.7,0.7]) linear_extrude(file="misumi_2020_extrusion_profile.dxf", layer="8",height=h, center=false, convexity=10);}
misumi_2020();

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,2 @@
module misumi_2040(h=100) {color([0.7,0.7,0.7]) linear_extrude(file="misumi_2040_extrusion_profile.dxf", layer="0",height=h, center=false, convexity=10);}
misumi_2040();

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,740 @@
use <vwheel_single_bearing_b17001_rev_2.scad>;
use <makerslide.scad>;
use <carriage_plate_standard_c14005_rev_2.scad>;
use <misumi_2020.scad>;
use <misumi_2040.scad>;
use <skins.scad>;
PI=3.14159265358979323846;
// Specify the dimensions of the usable cutting envelope you need:
xtravel = 26.5 * 25.4; // The dims I need.
ytravel = 13.5 * 25.4; // Over-spec'd a bit.
ztravel = 2.5 * 25.4; // Millimeters.
// That's it. Configured. Hit F5.
// Check the console window for parts list with scaled dimensions.
// Check the display to see if everything really does line up.
// Set the folowing items to 1 or 0 to display or hide different
// sections of the assembly. Probaly the first thing you want to
// turn off is the skins, to get a better look at everything
// else inside.
xy_gantry = 1 ;
xbelt = 1 ;
ybelts = 1 ;
driveshafts = 1 ;
zsystem = 1 ;
frame = 1 ;
cover = 1 ; cover_is_open = 1 ;
skins = 1 ;
skins_flat = 0 ; // hi-res 2D layout, for DXF export
//(disables rendering of everything else)
// press F6 for this one, then "Design"
// menu --> "Export as DXF".
///////////
// INTRO //
///////////
// This is a parametric three axis motion system
// based on Barton Dring's Buildlog.net Laser 2.0 design
// and MakerSlide V rail system.
// (www.buildlog.net) (www.makerslide.com)
// I've tried to identify all the parts that need to scale
// to adjust the cutting envelope. This script calculates
// the new dimensions required just for the parts that need
// to change, and lists those results in the console window.
// Combine these results with the Laser 2.0 BOM at Buildlog.net
// to work up your parts orders for your own custom-sized machine.
// (To copy the text in the console, you might have to
// right click --> Select All --> Copy.)
// The scaled skin panels can be rendered flat and exported as
// 2D DXF files, suitable for generating cut files for a CNC
// router, or patterns to print and cut by hand.
// Is it all correct? Will this really give a workable set of
// scaled parts? Explore the model and consider it. I'm not
// making any claims - I can only attest to my intent. I'll
// be using it though, if I come up with money for a build soon.
// This work is Copyright 2011 by Michael Sheldrake
// and licensed under a Creative Commons Attribute-Share Alike 3.0 License
// http://creativecommons.org/licenses/by-sa/3.0/
// Thanks go to Barton Dring for releasing his designs under
// that same license.
////////////////////////////////
// SPECIFYING AXIS DIMENSIONS //
////////////////////////////////
// The Buildlog 2.0 Laser claims "just under" a 20"x12"x4"
// working envelope (508mm x 304.8mm x 101.6mm).
// If you specify those dimensions here (in millimeters), the parts
// generated should match the dimensions in bdring's Laser 2.0
// drawings.
//xtravel = 508.0; // everything in millimeters
//ytravel = 304.8; // These are the Buildlog.net
//ztravel = 101.6; // Laser 2.0 standard dimensions.
//// DON'T GO TOO BIG ///
// You want a 2'x2' system? 4'x4'? You can model that here.
// But don't count on that design to actually work.
// Maybe, though? Every extra inch makes it that much more
// difficult to align and maintain rigity of the system.
// Surely the Laser 2.0 design can add a half inch here or
// there and work about as well. But 12"? Yards?
// Probably not, but it's fun to look and dream:
//xtravel = 1500; // Way too big,
//ytravel = 1500; // probably.
//ztravel = 2500; // Or is it?
//// DON'T GO TOO SMALL ///
// ... because a laser tube and electronics won't fit in there.
// But if you're adapting the Laser 2.0 design to work as a
// plotter, or something else, here's a pretty small system:
//xtravel = 1; // We call this
//ytravel = 1; // "tugging the
//ztravel = 1; // envelope".
// OpenSCAD FUN //
// Animate the envelope - grow from 1x1x1 to standard Laser 2.0 size.
// Use OpenSCAD's Animate option in the View menu.
// (Normally animate just makes the x and y axes move.)
// (Make sure all other lines above that set
// xtravel, ytravel and ztravel are commented
// out before trying this animated version.)
//ztarg=101.6;
//xfact=508.0/ztarg;
//yfact=304.8/ztarg;
//xtravel = $t*ztarg * xfact;
//ytravel = $t*ztarg * yfact;
//ztravel = $t*ztarg;
/////////////////////////
// Constant Dimensions //
/////////////////////////
// Some frame dimensions don't change as we scale
// the cutting envelope. These are candidates for
// becoming parameters too, but I didn't do all the
// math with changing these in mind. So inspect
// results closely if you alter them.
beam_width = 20; // width of square aluminum extrusions
half_beam_width = beam_width/2; // handy
shaftmotorspan = 82; // stepper motor between two drive shafts
skinThickness = 3; // Alupanel, 3mm thick
control_space_X = 210; // width of where electroncs go
tube_space_Y = 80; // space for laser tube behind cutting area
top_space_Z = 140; // parts above z=0 don't scale
wheel_plate_thk = 0.125*25.4; // MakerSlide wheel plates / brackets, 1/8" Al
wheel_standoff = 0.25 *25.4; //
wheel_center_off= 3; // for single-bearing delrin vwheel
imperialFudge = 1.95; // Gantry assembly v wheel center to v wheel center comes
// out to 728.05mm on ref design. Frame bars that seem to
// match that length don't - they're 730mm.
// So this little extra gets us even frame dims that match
// reference, based on a metric span of MakerSlide, and then
// plates and vwheels that have some imperial dimensions mixed in.
///////////////////////////
/// THE SCALING MATH ///
///////////////////////////
// Here's the math to make the the Buildlog 2.0 reference dimensions adjustable,
// xyz reference frame parts - travel you get from that = base xyz vals to add your own desired travel dimensions to
// (x rail,y rail,frame height) - ( 12" , 20" , 4" )
// ( 703 , 560 , 310 ) - ( 508 , 304.8 , 101.6) = ( 195 , 255.2 , 208.4 )
// Note that we snap up to next whole mm:
MakerSlideXLength = ceil( 195.0 + xtravel ); // Note that we snap
MakerSlideYLength = ceil( 255.2 + ytravel ); // up to next whole
FrameHeight = ceil( 208.4 + ztravel ); // millimeter.
// similar for belts, except relative to roughly 1/2 belt length, since they loop
// original x,y = 60",40" (1524mm,1016mm); half: (762 , 508)
//(762 , 508) - ( 508 , 304.8 ) = ( 254 , 203.2)
BeltXLength = 2 * (254 + xtravel);
BeltYLength = 2 * (203.2 + ytravel);
// similar for Y drive shafts
// recently updated to 14" and 12"
// just split the difference of requested and reference ytravel between the shafts,
// but note that these shafts at McMaster mostly come in 2" increments (and 9 and 15, and not 22)
// original shaft sum - original xtravel
// 26" - 20" = 6"
shaftsum=ceil(6+(xtravel/25.4)); // inches here
ShaftOneLength=25.4 * floor(shaftsum/2 + 1); // longer shaft, back to mm
ShaftTwoLength=25.4 * ceil(shaftsum/2 - 1); // short shaft - there's more space
// in assy to make this one longer
///////////////////////////////////
// Derived and Scaled Dimensions //
///////////////////////////////////
to_vwheel_center= wheel_plate_thk + wheel_standoff + wheel_center_off;
scaledX = MakerSlideXLength + 2 * to_vwheel_center + imperialFudge;
halfScaledX = scaledX/2;
halfScaledXPlus = halfScaledX + half_beam_width;
scaledY = MakerSlideYLength;
halfScaledY = scaledY/2;
halfScaledYPlus = halfScaledY + half_beam_width;
shortHalfScaledY= halfScaledY - tube_space_Y - beam_width; // not really a half of anything
scaledZDown = FrameHeight - top_space_Z;
activeMakerSlideYLength = MakerSlideYLength - // this is just the portion that
tube_space_Y - // you would use if the beam didn't
beam_width; // reach back in to the tube space
// to the back of the machine
// and now ...
///////////////////////////////////
// RENDER THE SCALED SUBSECTIONS //
///////////////////////////////////
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
// ///
///
if (skins_flat==1) {skins_flat();}
else {
if (xy_gantry==1) xy_gantry();
if (xbelt==1) xbelt(BeltXLength);
if (ybelts==1) ybelts(BeltYLength);
if (driveshafts==1) driveshafts(ShaftOneLength,ShaftTwoLength);
if (zsystem==1) zsystem();
if (frame==1) frame();
if (cover==1) cover(open=(cover_is_open==1));
if (skins==1) skins();
}
///
///
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
///////////////////////////
// MakerSlide components //
///////////////////////////
makerslide_color=[0.6,0.6,0.7];
// These two modules are not used
// for the laser design, but might
// be useful for visualizing other
// non-laser concepts that use the
// standard MakerSlide wheel plates.
module wheel_plate_assy(flip=false) {
wheelelevation= (flip ? -1 : 1) * to_vwheel_center;
color([0.6,0.2,0.2]) rotate(a=180) translate([-55,-80,0])
import_stl("standard_wheel_carriage_plate.stl", convexity = 5);
translate([42.3, -70, wheelelevation]) vwheel();
translate([42.3, 70, wheelelevation]) vwheel();
translate([-22.3, 0, wheelelevation]) vwheel();
}
module tool_carriage_assy() {
wheelelevation= -(wheel_standoff + wheel_center_off);
translate([0.6,0,beam_width + -wheelelevation]) {
color([0.6,0.2,0.2]) translate([-80,45,0]) rotate([0,0,-90])
import_stl("standard_wheel_carriage_plate.stl",convexity=5);
translate([-32.663,0,wheelelevation]) rotate([180,0,0]) vwheel();
translate([32.3,-32.3,wheelelevation]) rotate([180,0,0]) vwheel();
translate([32.3, 32.3,wheelelevation]) rotate([180,0,0]) vwheel();
}
}
// These three modules bring in the laser-specific
// MakerSlide plates for the gantry assembly.
module left_bracket_assy() {
color([0.6,0.2,0.2]) import_stl("gantry_end_bracket_left_rev4_mm.stl", convexity = 10);
// Warning:
// The bracket plus the first wheel alone, cause OpenSCAD to crash on CGAL render.
// That region of the bracket is like a Bermuda Triangle for CGAL.
// There should be no need to CGAL-render this assembly, but if you do,
// comment out this first wheel.
translate([10 + 0.315 * 25.4 , -10 - 0.719 * 25.4 , to_vwheel_center]) vwheel();
translate([10 + 0.315 * 25.4 , 10 + 1.574 * 25.4 , to_vwheel_center]) vwheel();
translate([10 - 2.221 * 25.4 - 0.94 , 10 - 0.01 * 25.4 , to_vwheel_center]) vwheel();
}
module right_bracket_assy() {
color([0.6,0.2,0.2]) import_stl("gantry_end_bracket_right_rev_3_mm.stl", convexity = 5);
translate([10 + 0.315 * 25.4 , -10 - 0.719 * 25.4 , -to_vwheel_center]) rotate([180,0,0]) vwheel();
translate([10 + 0.315 * 25.4 , 10 + 1.574 * 25.4 , -to_vwheel_center]) rotate([180,0,0]) vwheel();
translate([10 - 2.221 * 25.4 - 0.94 , 10 + 0.236 * 25.4 , -to_vwheel_center]) rotate([180,0,0]) vwheel();
}
module laser_carriage_assy() {
wheelelevation= -(wheel_standoff + wheel_center_off);
translate([0.6,0,20 + -wheelelevation]) {
color([0.2,0.2,0.2]) rotate([0,0,-90]) import_stl("laser_carriage_plate_rev_4_mm.stl",convexity=5);
translate([ 32.163 , -34.925 , wheelelevation]) rotate([180,0,0]) vwheel();
translate([ 32.163 , 34.925 , wheelelevation]) rotate([180,0,0]) vwheel();
translate([-32.663 - 0.94 , 0 , wheelelevation]) rotate([180,0,0]) vwheel();
}
}
// Gantry assembly from wheel plates above and a piece of MakerSlide V rail extrusion.
module gantry(xref=400) {
echo(str("GANTRY"));
echo(str(" MakerSlide: 1 x ",MakerSlideXLength,"mm (",(MakerSlideXLength/25.4),"in)"));
translate([0,0,25])
rotate([0,0,-90])
rotate([-90,-90,0]) {
color(makerslide_color) makerslide(xref - 0.02); // minus 0.02 to avoid co-planar display glitches with end plates
translate([0,0, xref/2]) left_bracket_assy();
translate([0,0,-xref/2]) right_bracket_assy();
// you might use these standard plates instead, for a non-laser assembly
//translate([0,0, xref/2]) wheel_plate_assy();
//translate([0,0,-xref/2]) wheel_plate_assy(flip=true);
}
rotate([0,0,-90])
translate([0,sin(2*$t*360) * (xref/2 - 85),25]) { // for optional animation
//tool_carriage_assy(); // standard plate option
laser_carriage_assy();
}
}
// Gantry, with two pieces of MakerSlide to ride on.
// Note the belt model thrown in, so it can ride with the gantry when animated.
module xy_gantry() {
animlowy = -MakerSlideYLength/2 + 80;
animhalfspan = (MakerSlideYLength - (tube_space_Y+beam_width) - 160)/2;
translate([-imperialFudge/2,0,0]) { // to align the whole thing with the frame assembly
translate([0,(animlowy+animhalfspan)+sin(180+$t*360)*animhalfspan,0]) { // for animation
gantry(MakerSlideXLength);
}
echo(str(" MakerSlide: 2 x ",MakerSlideYLength,"mm (",(MakerSlideYLength/25.4),"in)"));
translate([-(MakerSlideXLength/2 + beam_width + to_vwheel_center),0,half_beam_width]) rotate([-90,0,0]) color(makerslide_color) makerslide(MakerSlideYLength);
translate([ (MakerSlideXLength/2 + beam_width + to_vwheel_center),0,half_beam_width]) rotate([-90,0,180]) color(makerslide_color) makerslide(MakerSlideYLength);
}
}
///////////////////////////
// Misumi components //
///////////////////////////
module frame(xref=MakerSlideXLength,yref=MakerSlideYLength,zref=FrameHeight) {
echo(str("FRAME"));
echo(str(" Misumi 2040:"));
d30027r3_9_length = scaledX + control_space_X + beam_width;
d30027r3_9_partno = str("HFS5-2040-",d30027r3_9_length);
d30027r3_9_count = 2;
echo(str(" ",d30027r3_9_count," x ",d30027r3_9_partno," ",d30027r3_9_length,"mm (",(d30027r3_9_length/25.4),"in)"));
for(i=[
[-halfScaledX , halfScaledYPlus , 0],
[-halfScaledX ,-halfScaledYPlus , 0],
]) {
translate(i) translate([0,0,half_beam_width]) rotate([0,90,0]) misumi_2040( d30027r3_9_length );
}
echo(str(" Misumi 2020:"));
d30027r3_4_length = zref;
d30027r3_4_partno = str("HFS5-2020-",d30027r3_4_length);
d30027r3_4_count = 4;
echo(str(" ",d30027r3_4_count," x ",d30027r3_4_partno," ",d30027r3_4_length,"mm (",(d30027r3_4_length/25.4),"in)"));
for(i=[
[-halfScaledXPlus , halfScaledYPlus ,-scaledZDown],
[-halfScaledXPlus ,-halfScaledYPlus ,-scaledZDown],
[ halfScaledXPlus + control_space_X + beam_width , halfScaledYPlus ,-scaledZDown],
[ halfScaledXPlus + control_space_X + beam_width ,-halfScaledYPlus ,-scaledZDown]
]) {
translate(i) misumi_2020(d30027r3_4_length);
}
d30027r3_8_length = scaledX + control_space_X + beam_width;
d30027r3_8_partno = str("HFS5-2020-",d30027r3_8_length);
d30027r3_8_count = 3;
echo(str(" ",d30027r3_8_count," x ",d30027r3_8_partno," ",d30027r3_8_length,"mm (",(d30027r3_8_length/25.4),"in)"));
for(i=[
[-halfScaledX ,-halfScaledYPlus ,-scaledZDown],
[-halfScaledX , halfScaledYPlus ,-scaledZDown],
[-halfScaledX , halfScaledYPlus , top_space_Z - beam_width],
]) {
translate(i) translate([0,0,half_beam_width]) rotate([0,90,0]) misumi_2020( d30027r3_8_length );
}
d30027r3_6_length = scaledX;
d30027r3_6_partno = str("HFS5-2020-",d30027r3_6_length);
d30027r3_6_count = 3;
echo(str(" ",d30027r3_6_count," x ",d30027r3_6_partno," ",d30027r3_6_length,"mm (",(d30027r3_6_length/25.4),"in)"));
for(i=[
[-halfScaledX ,-halfScaledYPlus , top_space_Z - 2*beam_width],
[-halfScaledX , halfScaledYPlus - (tube_space_Y+beam_width),-scaledZDown],
[-halfScaledX , halfScaledYPlus - (tube_space_Y+beam_width), top_space_Z - beam_width],
]) {
translate(i) translate([0,0,half_beam_width]) rotate([0,90,0]) misumi_2020( d30027r3_6_length );
}
d30027r3_notshown_length = scaledX - 5;
d30027r3_notshown_partno = str("HFS5-2020-",d30027r3_notshown_length);
d30027r3_notshown_count = 1;
echo(str(" ",d30027r3_notshown_count," x ",d30027r3_notshown_partno," ",d30027r3_notshown_length,"mm (",(d30027r3_notshown_length/25.4),"in)"));
for(i=[
[-halfScaledX ,halfScaledYPlus - (tube_space_Y+beam_width), half_beam_width],
]) {
translate(i) translate([0,0,half_beam_width]) rotate([0,90,0]) misumi_2020( d30027r3_notshown_length );
}
d30027r3_5_length = yref;
d30027r3_5_partno = str("HFS5-2020-",d30027r3_5_length);
d30027r3_5_count = 7; // drawing shows 6, coming revision has one more
echo(str(" ",d30027r3_5_count," x ",d30027r3_5_partno," ",d30027r3_5_length,"mm (",(d30027r3_5_length/25.4),"in)"));
for(i=[
[-halfScaledXPlus , halfScaledY ,-scaledZDown],
[-halfScaledXPlus , halfScaledY , top_space_Z-beam_width],
[ halfScaledXPlus , halfScaledY ,-scaledZDown],
[ halfScaledXPlus , halfScaledY , top_space_Z-beam_width],
[ halfScaledXPlus + control_space_X + beam_width , halfScaledY ,-scaledZDown],
[ halfScaledXPlus + control_space_X + beam_width , halfScaledY , half_beam_width],
[ halfScaledXPlus + control_space_X + beam_width , halfScaledY , top_space_Z-beam_width]
]) {
translate(i) translate([0,0,half_beam_width]) rotate([90,0,0]) misumi_2020(d30027r3_5_length);
}
d30027r3_3_length = control_space_X + beam_width;
d30027r3_3_partno = str("HFS5-2020-",d30027r3_3_length);;
d30027r3_3_count = 1;
echo(str(" ",d30027r3_3_count," x ",d30027r3_3_partno," ",d30027r3_3_length,"mm (",(d30027r3_3_length/25.4),"in)"));
translate([halfScaledX,-halfScaledYPlus, top_space_Z-half_beam_width]) rotate([0,90,0]) misumi_2020( d30027r3_3_length );
d30027r3_7_length = top_space_Z - beam_width - beam_width - half_beam_width;
d30027r3_7_partno = str("HFS5-2020-",d30027r3_7_length);
d30027r3_7_count = 1;
echo(str(" ",d30027r3_7_count," x ",d30027r3_7_partno," ",d30027r3_7_length,"mm (",(d30027r3_7_length/25.4),"in)"));
translate([halfScaledXPlus,-halfScaledYPlus,3*half_beam_width]) misumi_2020( d30027r3_7_length );
d30027r3_2_length = scaledZDown - half_beam_width;
d30027r3_2_partno = str("HFS5-2020-",d30027r3_2_length);
d30027r3_2_count = 1;
echo(str(" ",d30027r3_2_count," x ",d30027r3_2_partno," ",d30027r3_2_length,"mm (",(d30027r3_2_length/25.4),"in)"));
translate([half_beam_width,halfScaledYPlus - (tube_space_Y+beam_width),-scaledZDown + 2*half_beam_width]) misumi_2020( d30027r3_2_length );
}
/////////////////////
// cover, or lid //
/////////////////////
module cover(open=false) {
lidSideGap = 2.5; //mm
lidHingeGap = 0; //mm, maybe up to 1mm , based on Misumi hinge drawing
lidYPartLength=scaledY - tube_space_Y - 2*beam_width;
echo(str("COVER"));
d30013r3_8_length = scaledX - 2 * lidSideGap;
d30013r3_8_partno = str("HFS5-2020-",d30013r3_8_length);
d30013r3_8_count = 2;
echo(str(" ",d30013r3_8_count," x ",d30013r3_8_partno," ",d30013r3_8_length,"mm (",(d30013r3_8_length/25.4),"in)"));
d30013r3_7_length = lidYPartLength;
d30013r3_7_partno = str("HFS5-2020-",d30013r3_7_length);
d30013r3_7_count = 2;
echo(str(" ",d30013r3_7_count," x ",d30013r3_7_partno," ",d30013r3_7_length,"mm (",(d30013r3_7_length/25.4),"in)"));
// cover window panel
echo(str("COVER WINDOW PANEL"));
echo(str(" ",(2 * (halfScaledX - lidSideGap)),"mm x ",(lidYPartLength+2*beam_width),"mm (",((2 * (halfScaledX - lidSideGap))/25.4),"in x ",((lidYPartLength+2*beam_width)/25.4),"in)"));
ot=[0,-shortHalfScaledY,-top_space_Z-5];
or=[-92*(open?1:0),0,0];
translate(-1*ot) rotate(or) translate(ot) {
for(i=[
[-halfScaledX + lidSideGap , shortHalfScaledY - half_beam_width - lidHingeGap - beam_width - lidYPartLength, top_space_Z-beam_width],
[-halfScaledX + lidSideGap , shortHalfScaledY - half_beam_width - lidHingeGap, top_space_Z-beam_width],
]) {
translate(i) translate([0,0,half_beam_width]) rotate([0,90,0]) misumi_2020( d30013r3_8_length );
}
for(i=[
[-(halfScaledXPlus - 2*half_beam_width - lidSideGap) , shortHalfScaledY - beam_width - lidHingeGap , top_space_Z-beam_width],
[ (halfScaledXPlus - 2*half_beam_width - lidSideGap) , shortHalfScaledY - beam_width - lidHingeGap , top_space_Z-beam_width],
]) {
translate(i) translate([0,0,half_beam_width]) rotate([90,0,0]) misumi_2020( d30013r3_7_length );
}
color([0.7,0.7,1.0,0.5]) translate([-halfScaledX + lidSideGap,-halfScaledY - beam_width - lidHingeGap ,top_space_Z]) cube([(2 * (halfScaledX - lidSideGap)),(lidYPartLength+2*beam_width),skinThickness]);
}
}
///////////////////////////
// gantry timing belts //
///////////////////////////
module xbelt(beltlength=20) {
echo(str(" EconoBelt: 1 x ",beltlength,"mm (cut) (",ceil(beltlength/25.4),"in, rounded up)"));
animlowy = -MakerSlideYLength/2 + 80;
animhalfspan = (MakerSlideYLength - (tube_space_Y+beam_width) - 160)/2;
translate([-imperialFudge/2,(animlowy+animhalfspan)+sin(180+$t*360)*animhalfspan,0]) { // animation - should correspond to gantry motion
translate([-MakerSlideXLength/2 + 4,35,65]) rotate([90,0,0]) belt(beltlength);
}
}
module ybelts(beltlength=20) {
echo(str(" EconoBelt: 2 x ",beltlength,"mm (cut) (",ceil(beltlength/25.4),"in, rounded up)"));
translate([-MakerSlideXLength/2 + 5 ,(MakerSlideYLength)/2-55,-34]) rotate([90,0,-90]) belt(beltlength);
translate([ MakerSlideXLength/2 - 5 - imperialFudge,(MakerSlideYLength)/2-55,-34]) rotate([90,0,-90]) belt(beltlength);
}
module belt(ref) {
geardiam=25.4 * 0.489; //0.489" OD, but that might be for flange?
beltwidth=25.4/4;
beltthick=25.4/16;
halflength=ref/2;
gearcenter=(ref - (PI * geardiam)) / 2;
color([0.2,0.2,0.2])
difference() {
intersection() {
union() {
cylinder(r=geardiam/2,h=beltwidth*1.1,center=true);
translate([gearcenter,0,0]) cylinder(r=geardiam/2,h=beltwidth*1.1,center=true);
translate([0,-geardiam/2,-beltwidth*1.11/2]) cube([gearcenter,geardiam,beltwidth*1.11],center=false);
}
translate([(gearcenter + geardiam*2.2)/2 - geardiam,0,0]) cube([gearcenter + geardiam*2.2,geardiam*2.2,beltwidth],center=true);
}
union() {
translate([0,0,0]) cylinder(r=geardiam/2 - beltthick,h=beltwidth*1.2,center=true);
translate([gearcenter,0,0]) cylinder(r=geardiam/2-beltthick,h=beltwidth*1.2,center=true);
translate([0,-(geardiam-2*beltthick)/2,-beltwidth*1.12/2]) cube([gearcenter,geardiam-2*beltthick,beltwidth*1.21],center=false);
}
}
}
///////////////////////
// y drive shafts //
//////////////////////
module driveshafts(shaftlengthone=14*25.4,shaftlengthtwo=12*25.4) {
echo(str(" (shaft src): 1 x ",ShaftOneLength,"mm (",(ShaftOneLength/25.4),"in)"));
echo(str(" (shaft src): 1 x ",ShaftTwoLength,"mm (",(ShaftTwoLength/25.4),"in)"));
translate([-12.525,MakerSlideYLength/2 - (tube_space_Y+beam_width) + half_beam_width + 32.766,-34]) {
translate([-MakerSlideXLength/2,0,0]) driveshaft(shaftlengthone);
translate([-MakerSlideXLength/2+shaftlengthone+shaftmotorspan,0,0]) driveshaft(shaftlengthtwo);
}
}
module driveshaft(length=254) {
color([0.35,0.35,0.4]) rotate([0,90,0]) cylinder(r=25.4*0.125,h=length,center=false);
}
///////////////////////////////////////
// z table, leadscrews, drive belt //
///////////////////////////////////////
module zsystem() {
// z table frame - ref is 580 wide, with 370s butting
halfZsX = halfScaledX - 100;
halfZsOtherX = halfScaledX - 50; // from original specs, where 730 - (580 + 100) = right side spacing of z table = 50
zXSpan=halfZsOtherX + halfZsX;
zYGap=25;//from original specs, where[ (halfScaledY + (halfScaledYPlus - 100 - half_beam_width)) - (370+2*20) ] * 0.5 = gap
//[ (280 + (290 - 100 - 10)) - (370+2*20) ] * 0.5 = gap = (460 - 410) *0.5 = 25 = nice.
zYSpan=(halfScaledY + (halfScaledYPlus - (tube_space_Y+beam_width) - half_beam_width)) - 2*zYGap;
echo(str("Z TABLE"));
d30014r2_4_length = zXSpan;
d30014r2_4_partno = str("HFS5-2020-",d30014r2_4_length);
d30014r2_4_count = 2;
echo(str(" ",d30014r2_4_count," x ",d30014r2_4_partno," ",d30014r2_4_length,"mm (",(d30014r2_4_length/25.4),"in)"));
for(i=[
[-halfZsX , -halfScaledY + half_beam_width + zYGap , -scaledZDown/6],
[-halfZsX ,-(halfScaledY-half_beam_width - zYGap) + zYSpan - 2*half_beam_width , -scaledZDown/6],
]) {
translate(i) translate([0,0,half_beam_width]) rotate([0,90,0]) misumi_2020( d30014r2_4_length );
}
d30014r2_3_length = zYSpan-2*beam_width;
d30014r2_3_partno = str("HFS5-2020-",d30014r2_3_length);
d30014r2_3_count = 2;
echo(str(" ",d30014r2_3_count," x ",d30014r2_3_partno," ",d30014r2_3_length,"mm (",(d30014r2_3_length/25.4),"in)"));
for(i=[
[-(halfZsX - half_beam_width) , -(halfScaledY - zYGap) + zYSpan - 2*half_beam_width , -scaledZDown/6],
[(halfZsOtherX - half_beam_width) , -(halfScaledY - zYGap) + zYSpan - 2*half_beam_width , -scaledZDown/6],
]) {
translate(i) translate([0,0,half_beam_width]) rotate([90,0,0]) misumi_2020( d30014r2_3_length );
}
// z table panel
echo(str("Z TABLE PANEL"));
echo(str(" 1 x C19010 ",zXSpan,"mm x ",zYSpan,"mm (",(zXSpan/25.4),"in x ",(zYSpan/25.4),"in)"));
// (not shown)
// z lead screws
zLeadScrewHeight=scaledZDown - 2*half_beam_width + (11/16)*25.4 + 3*half_beam_width + 5.7375;
echo(str("Z LEADSCREWS"));
B18009_0800_length = zLeadScrewHeight;
B18009_0800_partno = str("B18009-xxxx (0.25in,20tpi threaded rod)");
B18009_0800_count = 3;
echo(str(" ",B18009_0800_count," x ",B18009_0800_partno," ",B18009_0800_length,"mm (",(B18009_0800_length/25.4),"in)"));
for(i=[
[-halfZsX + zXSpan*(85/580) , -halfScaledY + half_beam_width ,0],
[-halfZsX + zXSpan*(435/580), -halfScaledY + half_beam_width ,0],
[-halfZsX + zXSpan*(435/580), (halfScaledY - half_beam_width) - (tube_space_Y+beam_width),0],
]) {
translate(i) translate([0,0,-scaledZDown+(2*half_beam_width - (11/16)*25.4)]) color([0.3,0.3,0.5]) cylinder(r=25.4/8,h=B18009_0800_length,center=false);
}
B18009_1000_length = zLeadScrewHeight+(2*25.4);
B18009_1000_partno = str("B18009-xxxx (0.25in,20tpi threaded rod)");
B18009_1000_count = 1;
echo(str(" ",B18009_1000_count," x ",B18009_1000_partno," ",B18009_1000_length,"mm (",(B18009_1000_length/25.4),"in)"));
for(i=[
[-halfZsX + zXSpan*(85/580) , (halfScaledY - half_beam_width) - (tube_space_Y+beam_width),0],
]) {
translate(i) translate([0,0,-scaledZDown+(2*half_beam_width - (11/16)*25.4)]) color([0.3,0.3,0.5]) cylinder(r=25.4/8,h=B18009_1000_length,center=false);
}
//z belt - belt display is more approximate than actual length calculation
beltthick=1.14;//mm
pd=0.48*25.4 + beltthick;
pext=PI*pd;
zby1=(((halfScaledY - half_beam_width) - (tube_space_Y+beam_width)) + (halfScaledY - half_beam_width)); //yspans
zby2=zby1;
zbx1=(zXSpan*(435/580) - zXSpan*(85/580)); // straight xspan
zbx2=sqrt(pow(30,2)+pow(pd,2)) + sqrt( pow( (zXSpan*(435/580) - zXSpan*(85/580)) - 30 , 2 ) + pow(pd,2)); // xspan with slack for tensioner
zbl = zby1 +
zby2 +
zbx1 +
zbx2 +
pext // extra around corners of pulleys
;
echo(str("Z CLOSED BELT"));
B28035_length = zbl;
B28035_partno = str("B28035 (loop timing belt)");
B28035_count = 1;
echo(str(" EconoBelt: ",B28035_count," x ",B28035_partno," : close to ",B28035_length,"mm (~",(round(10*B28035_length/25.4)/10),"in, rounded)"));
color([0.2,0.2,0.2])
translate([(zbx1+pd)/2 + (-halfZsX + zXSpan*(85/580)) - pd/2,- ((zby1+pd)/2 + (-(halfScaledY - half_beam_width)+ (tube_space_Y+beam_width)) - pd/2),-scaledZDown+5.5/16*25.4]) {
difference() {
difference() {
cube([zbx1+pd,zby1+pd,25.4/4],center=true);
translate([-(zbx1+pd)/2 + 30+pd,(zby1+pd)/2 - pd,-25.4/4.5])
rotate([0,0,90 - atan2(0.48*25.4,30)])
cube([zbx1+pd,zby1+pd,25.4/2]);
translate([-(zbx1+pd)/2 + 30+pd,(zby1+pd)/2 - pd,-25.4/4.5])
rotate([0,0,90 - atan2( (zXSpan*(435/580) - zXSpan*(85/580)) - 30 ,0.48*25.4)])
cube([zbx1+pd,zby1+pd,25.4/2]);
}
difference() {
cube([zbx1+pd-4,zby1+pd-4,25.4/2],center=true);
translate([-(zbx1+pd+4)/2 + 30+pd,(zby1+pd-4)/2 - pd,-25.4/4.5])
rotate([0,0,90 - atan2(0.48*25.4,30)])
cube([zbx1+pd,zby1+pd,25.4/2]);
translate([-(zbx1+pd+4)/2 + 30+pd,(zby1+pd-4)/2 - pd,-25.4/4.5])
rotate([0,0,90 - atan2((zXSpan*(435/580) - zXSpan*(85/580)) - 30,0.48*25.4)])
cube([zbx1+pd,zby1+pd,25.4/2]);
}
}
}
}
///////////////////////
// skins //
//////////////////////
module skins(xref=MakerSlideXLength,yref=MakerSlideYLength,zref=FrameHeight,skinThickness=skinThickness) {
S_L = -2 + beam_width + scaledX + beam_width + control_space_X + beam_width;
S_W = -2 + yref + beam_width + beam_width;
S_H = -2 + zref;
//echo(str("SKIN DIMS LxWxH: ",S_L," x ",S_W," x ",S_H)); // s/b 998 x 598 x 308 for reference design
color([0.25,0.30,0.45]) {
translate([1 + -halfScaledX-2*half_beam_width,-halfScaledY-2*half_beam_width,1 + -scaledZDown])
rotate([90,0,0])
linear_extrude(height=skinThickness)
skin_front(S_L,S_H);
translate([1 + -halfScaledX-2*half_beam_width + S_L,halfScaledY+2*half_beam_width,1 + -scaledZDown])
rotate([90,0,180])
linear_extrude(height=skinThickness)
skin_back(S_L,S_H);
translate([1 + -halfScaledX-2*half_beam_width + S_L-1,-halfScaledY-2*half_beam_width + 1,1 + -scaledZDown])
rotate([90,0,90])
linear_extrude(height=skinThickness)
skin_side(S_W,S_H);
translate([1 + -halfScaledX-2*half_beam_width -1 , halfScaledY+2*half_beam_width - 1,1 + -scaledZDown])
rotate([90,0,-90])
linear_extrude(height=skinThickness)
skin_side(S_W,S_H);
translate([1 + -halfScaledX-2*half_beam_width,1 + -halfScaledY-2*half_beam_width,-scaledZDown-skinThickness])
linear_extrude(height=skinThickness)
skin_bottom(S_L,S_W);
translate([ -halfScaledX-2*half_beam_width , halfScaledY - 99,zref-scaledZDown])
linear_extrude(height=skinThickness)
skin_top_back(S_L,S_W);
translate([1 + -halfScaledX-2*half_beam_width + S_L ,1 + -halfScaledY-2*half_beam_width,zref-scaledZDown])
rotate([0,0,90])
linear_extrude(height=skinThickness)
skin_top_right(S_W);
translate([1 + -halfScaledX-2*half_beam_width + 18,1 + -halfScaledY-2*half_beam_width,zref-scaledZDown])
rotate([0,0,90])
linear_extrude(height=skinThickness)
skin_top_left(S_W);
}
}
//////////////////////////////////
// skins for DXF - 2D layout //
//////////////////////////////////
module skins_flat(xref=MakerSlideXLength,yref=MakerSlideYLength,zref=FrameHeight) {
// Turn up the resolution on this one
$fa=2;
$fs=0.2;
echo("\nCGAL RENDER MIGHT TAKE A FEW MINUTES\n(resolution turned up to get smooth circles)\n");
//!linear_extrude(height=10) cable_slot();
S_L = -2 + beam_width + scaledX + beam_width + control_space_X + beam_width;
S_W = -2 + yref + beam_width + beam_width;
S_H = -2 + zref;
//echo(str("SKIN DIMS LxWxH: ",S_L," x ",S_W," x ",S_H)); // s/b 998 x 598 x 308 for reference design
margin=25.4;
color([0.25,0.30,0.45]) {
skin_bottom(S_L,S_W);
translate([0,S_W + margin + 0 * (S_H + margin)]) 2D_stack_layout(S_H + margin) {
skin_front(S_L,S_H);
skin_back(S_L,S_H);
skin_side(S_W,S_H);
skin_side(S_W,S_H);
skin_top_back(S_L,S_W);
skin_top_right(S_W);
skin_top_left(S_W);
}
}
}
module 2D_stack_layout(step) {for (i=[0:$children-1]) {translate([0,i*step]) child(i);}}

View file

@ -0,0 +1,992 @@
0
SECTION
2
HEADER
9
$ACADVER
1
AC1015
0
ENDSEC
0
SECTION
2
BLOCKS
0
ENDSEC
0
SECTION
2
ENTITIES
0
LWPOLYLINE
8
0
90
78
70
1
10
-12.500000
20
-2.000000
10
-12.500000
20
0.000000
10
-12.000000
20
0.000000
10
-12.000000
20
0.010000
10
-11.453000
20
0.030000
10
-10.735000
20
0.163000
10
-10.044000
20
0.398000
10
-9.395000
20
0.732000
10
-8.802000
20
1.157000
10
-8.276000
20
1.663000
10
-7.830000
20
2.241000
10
-7.473000
20
2.878000
10
-7.212000
20
3.560000
10
-7.053000
20
4.272000
10
-7.000000
20
5.000000
10
-7.000000
20
21.876000
10
-7.053000
20
22.604000
10
-7.212000
20
23.316000
10
-7.473000
20
23.998000
10
-7.744000
20
24.482000
10
-8.249000
20
25.237000
10
-8.800000
20
26.355000
10
-9.200000
20
27.535000
10
-9.444000
20
28.757000
10
-9.525000
20
30.000000
10
-9.444000
20
31.243000
10
-9.200000
20
32.465000
10
-8.800000
20
33.645000
10
-8.249000
20
34.763000
10
-7.557000
20
35.798000
10
-6.735000
20
36.735000
10
-5.798000
20
37.557000
10
-4.763000
20
38.249000
10
-3.645000
20
38.800000
10
-2.465000
20
39.200000
10
-1.243000
20
39.444000
10
0.000000
20
39.525000
10
1.243000
20
39.444000
10
2.465000
20
39.200000
10
3.645000
20
38.800000
10
4.763000
20
38.249000
10
5.798000
20
37.557000
10
6.735000
20
36.735000
10
7.557000
20
35.798000
10
8.249000
20
34.763000
10
8.800000
20
33.645000
10
9.200000
20
32.465000
10
9.444000
20
31.243000
10
9.525000
20
30.000000
10
9.444000
20
28.757000
10
9.200000
20
27.535000
10
8.800000
20
26.355000
10
8.249000
20
25.237000
10
7.843000
20
24.629000
10
7.640000
20
24.323000
10
7.330000
20
23.662000
10
7.120000
20
22.963000
10
7.013000
20
22.241000
10
7.013000
20
21.876000
10
7.000000
20
21.876000
10
7.000000
20
5.000000
10
7.013000
20
5.000000
10
7.013000
20
4.635000
10
7.120000
20
3.913000
10
7.330000
20
3.214000
10
7.640000
20
2.553000
10
8.043000
20
1.944000
10
8.530000
20
1.400000
10
9.091000
20
0.934000
10
9.714000
20
0.553000
10
10.386000
20
0.268000
10
11.092000
20
0.083000
10
11.817000
20
0.003000
10
12.000000
20
0.010000
10
12.000000
20
0.000000
10
12.500000
20
0.000000
10
12.500000
20
-2.000000
10
-12.500000
20
-2.000000
0
LWPOLYLINE
8
0
90
78
70
1
10
17.500000
20
-2.000000
10
17.500000
20
0.000000
10
18.000000
20
0.000000
10
18.000000
20
0.010000
10
18.547000
20
0.030000
10
19.265000
20
0.163000
10
19.956000
20
0.398000
10
20.605000
20
0.732000
10
21.198000
20
1.157000
10
21.724000
20
1.663000
10
22.170000
20
2.241000
10
22.527000
20
2.878000
10
22.788000
20
3.560000
10
22.947000
20
4.272000
10
23.000000
20
5.000000
10
23.000000
20
21.876000
10
22.947000
20
22.604000
10
22.788000
20
23.316000
10
22.527000
20
23.998000
10
22.256000
20
24.482000
10
21.751000
20
25.237000
10
21.200000
20
26.355000
10
20.800000
20
27.535000
10
20.556000
20
28.757000
10
20.475000
20
30.000000
10
20.556000
20
31.243000
10
20.800000
20
32.465000
10
21.200000
20
33.645000
10
21.751000
20
34.763000
10
22.443000
20
35.798000
10
23.265000
20
36.735000
10
24.202000
20
37.557000
10
25.237000
20
38.249000
10
26.355000
20
38.800000
10
27.535000
20
39.200000
10
28.757000
20
39.444000
10
30.000000
20
39.525000
10
31.243000
20
39.444000
10
32.465000
20
39.200000
10
33.645000
20
38.800000
10
34.763000
20
38.249000
10
35.798000
20
37.557000
10
36.735000
20
36.735000
10
37.557000
20
35.798000
10
38.249000
20
34.763000
10
38.800000
20
33.645000
10
39.200000
20
32.465000
10
39.444000
20
31.243000
10
39.525000
20
30.000000
10
39.444000
20
28.757000
10
39.200000
20
27.535000
10
38.800000
20
26.355000
10
38.249000
20
25.237000
10
37.843000
20
24.629000
10
37.640000
20
24.323000
10
37.330000
20
23.662000
10
37.120000
20
22.963000
10
37.013000
20
22.241000
10
37.013000
20
21.876000
10
37.000000
20
21.876000
10
37.000000
20
5.000000
10
37.013000
20
5.000000
10
37.013000
20
4.635000
10
37.120000
20
3.913000
10
37.330000
20
3.214000
10
37.640000
20
2.553000
10
38.043000
20
1.944000
10
38.530000
20
1.400000
10
39.091000
20
0.934000
10
39.714000
20
0.553000
10
40.386000
20
0.268000
10
41.092000
20
0.083000
10
41.817000
20
0.003000
10
42.000000
20
0.010000
10
42.000000
20
0.000000
10
42.500000
20
0.000000
10
42.500000
20
-2.000000
10
17.500000
20
-2.000000
0
LWPOLYLINE
8
0
90
78
70
1
10
47.500000
20
-2.000000
10
47.500000
20
0.000000
10
48.000000
20
0.000000
10
48.000000
20
0.010000
10
48.547000
20
0.030000
10
49.265000
20
0.163000
10
49.956000
20
0.398000
10
50.605000
20
0.732000
10
51.198000
20
1.157000
10
51.724000
20
1.663000
10
52.170000
20
2.241000
10
52.527000
20
2.878000
10
52.788000
20
3.560000
10
52.947000
20
4.272000
10
53.000000
20
5.000000
10
53.000000
20
21.876000
10
52.947000
20
22.604000
10
52.788000
20
23.316000
10
52.527000
20
23.998000
10
52.256000
20
24.482000
10
51.751000
20
25.237000
10
51.200000
20
26.355000
10
50.800000
20
27.535000
10
50.556000
20
28.757000
10
50.475000
20
30.000000
10
50.556000
20
31.243000
10
50.800000
20
32.465000
10
51.200000
20
33.645000
10
51.751000
20
34.763000
10
52.443000
20
35.798000
10
53.265000
20
36.735000
10
54.202000
20
37.557000
10
55.237000
20
38.249000
10
56.355000
20
38.800000
10
57.535000
20
39.200000
10
58.757000
20
39.444000
10
60.000000
20
39.525000
10
61.243000
20
39.444000
10
62.465000
20
39.200000
10
63.645000
20
38.800000
10
64.763000
20
38.249000
10
65.798000
20
37.557000
10
66.735000
20
36.735000
10
67.557000
20
35.798000
10
68.249000
20
34.763000
10
68.800000
20
33.645000
10
69.200000
20
32.465000
10
69.444000
20
31.243000
10
69.525000
20
30.000000
10
69.444000
20
28.757000
10
69.200000
20
27.535000
10
68.800000
20
26.355000
10
68.249000
20
25.237000
10
67.843000
20
24.629000
10
67.640000
20
24.323000
10
67.330000
20
23.662000
10
67.120000
20
22.963000
10
67.013000
20
22.241000
10
67.013000
20
21.876000
10
67.000000
20
21.876000
10
67.000000
20
5.000000
10
67.013000
20
5.000000
10
67.013000
20
4.635000
10
67.120000
20
3.913000
10
67.330000
20
3.214000
10
67.640000
20
2.553000
10
68.043000
20
1.944000
10
68.530000
20
1.400000
10
69.091000
20
0.934000
10
69.714000
20
0.553000
10
70.386000
20
0.268000
10
71.092000
20
0.083000
10
71.817000
20
0.003000
10
72.000000
20
0.010000
10
72.000000
20
0.000000
10
72.500000
20
0.000000
10
72.500000
20
-2.000000
10
47.500000
20
-2.000000
0
ENDSEC
0
SECTION
2
OBJECTS
0
DICTIONARY
0
ENDSEC
0
EOF

View file

@ -0,0 +1,334 @@
//
// Use this to prerender a set of tube slots for the back panel, so you can load them as dxf.
// Rendering these slots in combination with other geometry just kills opencsg,
// though CGAL didn't have a problem with them.
// Save the CGAL-rendered slot set as "prerendered_tube_slots.dxf", since that's what the
// code in skin_back() below expects.
// Just do this once any time you need to update just these slots, then comment out again.
prerender_cable_notches_space=30;
!for (i=[0:2]) {translate([i*prerender_cable_notches_space,0,0]) cable_slot();}
//skin_front();
//skin_back();
//skin_side();
//skin_top_back();
//skin_top_right();
//skin_top_left();
//skin_bottom();
module skin_front(S_L=998,S_H=308) { // based on c51004_1.dxf
S_SL=S_L-248-18; //figure size of span under lid cutout, so we can set up vent slots there
vent_strip_offset=[18+32,S_H - 20 - 86]; // lower left corner of vent area
vent_width = 4; // each vent slot
vent_height = 60; //
vent_space = 30; // space between slot centers
vent_span = S_SL-(32+40);// whole span to be filled with multiple slots
interface_pocket_width=170;
interface_pocket_height=65;
interface_center=[S_L-129,S_H-63];
interface_mount_holes=[
[interface_center[0]-50,interface_center[1]+interface_pocket_height/2+5],
[interface_center[0]+50,interface_center[1]+interface_pocket_height/2+5],
[interface_center[0]+50,interface_center[1]-interface_pocket_height/2-5],
[interface_center[0]-50,interface_center[1]-interface_pocket_height/2-5],
];
h_dist = (S_L-99-99)/5;
panel_mount_holes=[
[99 , 9], // first hole bottom
[99+h_dist , 9],
[99+(h_dist*2) , 9],
[99+(h_dist*3) , 9],
[99+(h_dist*4) , 9],
[S_L-99 , 9], //last hole bottom
[S_L-9 , S_H/2], // side
[S_L-50 , S_H-9], // first top
[S_L-198 , S_H-9], // top next to klep
[99 , S_H - 20 - 9],
[99+(h_dist) , S_H - 20 - 9],
[99+(h_dist*2) , S_H - 20 - 9],
[99+(h_dist*3) , S_H - 20 - 9],
[99+(h_dist*4) , S_H - 20 - 9],
// [18 + S_SL - S_SL*(200/732) , S_H - 20 - 9],
// [18 + S_SL*(200/732) , S_H - 20 - 9],
[9 , S_H-9],
[9 , S_H/2]
];
// now, set up a panel area, and then difference out all the drill holes, slots and pockets
difference() {
// front panel area
difference(){square([S_L,S_H]);translate([18,S_H-20]) square([S_SL,20]);}
// drill
drill(5,panel_mount_holes);
// drill(5,interface_mount_holes);
// route pockets
//pocket([interface_center]) roundedSquare(interface_pocket_width,interface_pocket_height,10,center=true);
pocket([vent_strip_offset]) roundedSlotSet( vent_span , vent_space , vent_width , vent_height);
}
}
module skin_back(S_L=998,S_H=308) { // based on c51004_2.dxf
S_SL=S_L-248-18; // this time we'll use this to place the air vent hole
pmsw=5.04;
h_dist = (S_L-99-99)/5;
panel_mount_slots=[
[99 , 5], // first hole bottom
[99+h_dist , 5],
[99+(h_dist*2) , 5],
[99+(h_dist*3) , 5],
[99+(h_dist*4) , 5],
[99+(h_dist*5) , 5],
// [120-pmsw/2 , 5 , 0],
// [S_L/2,5,0],
// [S_L - (120+pmsw/2) , 5 , 0],
[99 , S_H-5,180 ], // first hole bottom
[99+h_dist , S_H-5 , 180],
[99+(h_dist*2) , S_H-5 , 180],
[99+(h_dist*3) , S_H-5 , 180],
[99+(h_dist*4) , S_H-5 , 180],
[99+(h_dist*5) , S_H-5 , 180],
[S_L-5 ,S_H/2 , 180], //side
// [S_L - (120+pmsw/2) , S_H-5 , 180],
// [S_L/2,S_H-5,180],
// [120-pmsw/2 , S_H-5 , 180],
[5,S_H/2,-90], // side
];
cable_notches_offset=260;
cable_notches_space=30;
airvent_center=[S_L - (18+S_SL/2),90,0];
airvent_radius=2*25.4;
back_interface_hole_width=187;
back_interface_hole_height=115;
back_interface_hole_center=[121.5,83.5,0];
difference() {
// back panel area
square([S_L,S_H]);
//translate([(cable_notches_offset),0,0]) {import_dxf(file="prerendered_tube_slots.dxf", layer="0");}
//pocket([airvent_center]) circle(airvent_radius);
//pocket([airvent_center]) rotate(30) roundedSlotCircleSet(360,60,5.2,12,airvent_radius+8.7);
//pocket([back_interface_hole_center]) roundedSquare(back_interface_hole_width,back_interface_hole_height,12.5,center=true);
pocket(panel_mount_slots) translate([-5.04/2,0,0]) roundedSlot(5.04,8);
//drill
// drill(5,[[back_interface_hole_center[0]+6.5,back_interface_hole_center[1]+back_interface_hole_height/2+5]]);
}
}
module skin_side(S_W=598,S_H=308) {
h_dist = (S_W-200)/3;
panel_mount_slots=[
[100 , 5 , 0],
[100+h_dist , 5 , 0],
[100+(h_dist*2), 5 , 0],
// [100+(h_dist*3), 5 , 0],
[S_W - 100 , 5 , 0],
[S_W - 5 , S_H/2 , 90], //side
[S_W - 100 , S_H - 5 , 180],
[100 , S_H - 5 , 180],
[100+h_dist , S_H -5 , 180],
[100+(h_dist*2), S_H - 5 , 180],
// [100+(h_dist*3), S_H -5 , 180],
[5 , S_H/2 ,-90],
];
difference() {
square([S_W,S_H]);
pocket(panel_mount_slots) translate([-5.01/2,0,0]) roundedSlot(5.01,8);
}
}
module skin_top_back(S_L=998) {
S_SL=S_L-248-18; //
hinge_slot_pair_center_x_from_edge=round(10*S_SL*(144.5/730))/10;//or so
// hinge_slots=[
// [(19+hinge_slot_pair_center_x_from_edge) - 25/2 , 0 , 0],
// [(19+hinge_slot_pair_center_x_from_edge) + 25/2 , 0 , 0],
// [(19+S_SL) - hinge_slot_pair_center_x_from_edge - 25/2 , 0 , 0],
// [(19+S_SL) - hinge_slot_pair_center_x_from_edge + 25/2 , 0 , 0],
// ];
h_dist=(S_L-99)/5;
panel_mount_holes=[
[99 , 118 - 9 ],
[(99+h_dist) , 118 - 9 ],
[(99+(h_dist*2)) , 118 - 9 ],
[(99+(h_dist*3)) , 118 - 9 ],
[(99+(h_dist*4)) , 118 - 9 ],
[(S_L-99) , 118 - 9 ],
[99 , 9 ],
[(99+h_dist) , 9 ],
[(99+(h_dist*2)) , 9 ],
[(99+(h_dist*3)) , 9 ],
[(99+(h_dist*4)) , 9 ],
[(S_L-99) , 9 ],
];
difference() {
square([19+S_SL,118]);
drill(5,panel_mount_holes);
//pocket(hinge_slots) translate([-6/2,-4,0]) roundedSlot(6,12+4);
}
}
module skin_top_right(S_W=598) {
panel_mount_holes=[
[100 , 248 - 9 ],
[100 , 9 ],
[S_W/2 , 9 ],
[S_W-100 , 9 ],
[S_W/2 , 248 - 9 ],
[S_W-100 , 248 - 9 ],
];
difference() {
square([S_W,248]);
drill(5,panel_mount_holes);
}
}
module skin_top_left(S_W=598) {
L=S_W-(598-479);
panel_mount_holes=[
[9 , 9 ],
[L/2, , 9 ],
[L - 9 , 9 ],
];
difference() {
square([L,18]);
drill(5,panel_mount_holes);
}
}
module skin_bottom(S_L=998,S_W=598) {
L=S_W-(598-479);
S_SL=S_L-248-18;
S_SL_reference=998-248-18;
cab_guide_ystart =L*(180/479);
cab_guide_ystart2=L*(318/479);
foot_holes=[
[ 9, 9 ],
[S_L - 9, 9 ],
[S_L - 9, S_W - 9 ],
[ 9, S_W - 9 ],
];
cable_guide_holes=[
[S_L - 286 , cab_guide_ystart ],
[S_L - 286 , cab_guide_ystart - 8 ],
[S_L - 286 , cab_guide_ystart2 ],
[S_L - 286 , cab_guide_ystart2 - 8 ],
];
h_dist=(S_L-(99*2))/5;
h_dist2=(S_W-(99*2))/3;
panel_mount_slots=[
[99,5,0],
[99 ,5,0], // first hole bottom
[99+h_dist ,5,0],
[99+(h_dist*2) ,5,0],
[99+(h_dist*3) ,5,0],
[99+(h_dist*4) ,5,0],
[S_L-99 ,5,0], //last hole bottom
// [S_L/2,5,0],
// [S_L-120,5,0],
// [S_L-5,80,90],
// [S_L-5,S_W/2,90],
// [S_L-5,S_W-80,90],
[S_L-5,S_W-99,90],
[S_L-5,S_W-(99+h_dist2),90],
[S_L-5,S_W-99-(h_dist2*2),90],
[S_L-5,99,90],
// [S_L-120,S_W-5,180],
// [S_L/2,S_W-5,180],
// [120,S_W-5,180],
[99,5,180],
[99 ,S_W-5,180], // first hole bottom
[99+h_dist ,S_W-5,180],
[99+(h_dist*2) ,S_W-5,180],
[99+(h_dist*3) ,S_W-5,180],
[99+(h_dist*4) ,S_W-5,180],
[S_L-99 ,S_W-5,180], //last hole bottom
[5,S_W-99,-90],
[5,S_W-(99+h_dist2),-90],
[5,S_W-99-(h_dist2*2),-90],
[5,99,-90],
// [S_L-235,S_W/2,90],
// [18 + S_SL*((400-18)/S_SL_reference),S_W-105,180], // hopefully
];
difference() {
square([S_L,S_W]);
// drill(7,foot_holes);
// drill(3.1749492,cable_guide_holes);
pocket(panel_mount_slots) translate([-5.1/2,0,0]) roundedSlot(5.1,8);
}
}
module drill(d,dl) {for(i=dl) {
//echo(str("drill ",(d)," ",i));
translate(i) circle(d/2);}
}
module pocket(o=[[0,0,0]]) {
for ( i = [ 0 : $children-1 ] ) {
//echo(str("pocket",(($children>1)?str(" ",(j+1)," of ",$children," "):str(" ")), "at ",o));
for (j=o) {
translate([j[0],j[1]]) rotate (j[2]) child(i);
}
}
}
module cable_slot() { // nice, but for some reason really hard on OpenCSG (no problem in CGAL render)
// so use it to pre-render sets of these slots, then save as DXF, and import
// those for integration with models
blendnudge=0.06;
union() {
//translate([0,blendnudge])
difference() {
translate([-25/2,-2,0]) square([25,blendnudge+2+30-5.3666898]);
translate([ 7,0,0]) roundedSquare(16,blendnudge+16.8161462+10,5,$fn=43);
translate([-16-7,0,0]) roundedSquare(16,blendnudge+16.8161462+10,5,$fn=43);
}
translate([0,30]) circle(9.525,$fn=48);
}
}
module roundedSlot(w=4,h=30) {
$fn=20;
union() {
translate([w/2,w/2]) circle(r=w/2);
translate([0,w/2]) square([w,h-w]);
translate([w/2,h-w/2]) circle(r=w/2);
}
}
module roundedSlotSet(span,slot_spacing_base=30,slotwidth,slotheight) {
number_of_slots = span/slot_spacing_base;
rem = number_of_slots - floor(number_of_slots);
slot_spacing=slot_spacing_base + slot_spacing_base * (rem/number_of_slots);
for(i=[0:floor(number_of_slots)]) {translate([i*slot_spacing,0,0]) roundedSlot(slotwidth,slotheight);}
}
module roundedSlotCircleSet(span,slot_spacing_base=30,slotwidth,slotheight,slotoffset) {
number_of_slots = span/slot_spacing_base;
rem = number_of_slots - floor(number_of_slots);
slot_spacing=slot_spacing_base + slot_spacing_base * (rem/number_of_slots);
for(i=[0:floor(number_of_slots)]) {rotate([0,0,i*slot_spacing]) translate([0,slotoffset,0]) roundedSlot(slotwidth,slotheight);}
}
module roundedSquare(w,h,r,center=false) {
coffx=(center)?-w/2:0;
coffy=(center)?-h/2:0;
union() {
translate([coffx + 0 ,coffy + r]) square([w,h-2*r]);
translate([coffx + r ,coffy + 0]) square([w-2*r,h]);
translate([coffx + r ,coffy + r]) circle(r);
translate([coffx + r ,coffy + h-r]) circle(r);
translate([coffx + w-r,coffy + h-r]) circle(r);
translate([coffx + w-r,coffy + r]) circle(r);
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,50 @@
// MakerSlide Component
// http://www.makerslide.com
// b17001_rev_2
// Single Bearing Delrin V Wheel
// Original by Barton Dring
// OpenSCAD model by Mike Sheldrake
vwheel(false);
module vwheelbearing() { //id=5mm,od=16mm,width=5mm
color([0.5,0.5,0.5])
difference() {
cylinder(r=8,h=5,$fn=24);
translate([0,0,-0.05]) cylinder(r=2.5,h=5.1,$fn=12);
}
}
module vwheel(withbearing=true) { //MakerSlide.com delrin v wheel
id1=15.9743;
id2=14.8;
od1=23.5;
od2=18.75;
color([0.2,0.2,0.2])
rotate_extrude(convexity = 10,$fn=40)
translate([id1/2, 0, 0])
rotate([0,0,-90])
polygon(points = [
[3 - 0.3/sqrt(2),0],
[-2,0],
[-2,-(id1-id2)/2],
[-3,-(id1-id2)/2],
[-3,(od1-id1)/2 - 0.2/sqrt(2)],
[-3 + 0.2/sqrt(2),(od1-id1)/2],
[-3 + 0.75,(od1-id1)/2],
[-0.55/2, (od1-id1)/2 - (3 - (0.75+(0.55/2)))],
[-0.55/2,(od2-id1)/2],
[0.55/2,(od2-id1)/2],
[0.55/2, (od1-id1)/2 - (3 - (0.75+(0.55/2)))],
[3 - 0.75,(od1-id1)/2],
[3 - 0.2/sqrt(2),(od1-id1)/2],
[3,(od1-id1)/2 - 0.2/sqrt(2)],
[3,0.3/sqrt(2)]
],
paths = [
[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
], convexity = 10);
if (withbearing) {translate([0,0,-3]) vwheelbearing();}
}

File diff suppressed because it is too large Load diff

1698
frame/amperemetertest.dxf Normal file

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