├── heated_bed ├── README ├── instrucoes producao.txt ├── .kicad_pcb.pro ├── heatbed.cmp ├── heatbed.pro ├── heatbed-cache.lib ├── heatbed.sch ├── shapes3D │ └── _usr_share_kicad_modules_packages3d_smd_chip_cms.wrl └── heatbed.net ├── img ├── MM2.png ├── MM2_header.jpg ├── lasercutter_panel1.png ├── lasercutter_panel2.png └── lasercutter_panel3.png ├── doc ├── hobbed_bolt.png ├── ptfe_liner.png ├── BillOfMaterials.ods ├── wiring_details.ods ├── Jhn_nozzle_holder_v4.jpg └── Jhn_md_brass_heater_nozzle.jpg ├── .gitignore ├── acrilico_5mm.scad ├── metric.scad ├── gears-params.scad ├── bolts.h ├── jhead.h ├── jheads.h ├── functions.scad ├── lm8uu_bearing.h ├── ZLink.h ├── PowerSupply.h ├── spacer.h ├── heated_bed.h ├── endstop.h ├── NEMA.h ├── coupling.h ├── lasercutter_6mm_MDF_CalibrationRules.scad ├── lasercutter_6mm_MDF_CalibrationZBars.scad ├── washers.h ├── hardware └── heatbed │ ├── heatbed.cmp │ ├── heatbed.pro │ ├── heatbed-cache.lib │ ├── _autosave-heatbed.kicad_pcb │ ├── heatbed.net │ ├── heatbed.bak │ └── heatbed.sch ├── lasercutter_5mm_acrylic.scad ├── BillOfMaterials.sh ├── CalibrationRules.scad ├── lm8uu_bearing.scad ├── nuts.h ├── serial_number_panel.scad ├── configuration.scad ├── bolts.scad ├── utils.scad ├── 608zz_bearing.scad ├── coupling.scad ├── BillOfMaterials.h ├── sandwich_test_panel.scad ├── nozzle.scad ├── Metamaquina2.h ├── README.md ├── mm2logo.scad ├── washers.scad ├── bar-clamp.scad ├── small_extruder_gear.scad ├── lasercutter_6mm_MDF_SpoolHolder.scad ├── large_extruder_gear.scad ├── ZLink.scad ├── PTFE_liner.scad ├── rounded_square.scad ├── gears.scad ├── jheads.scad ├── spacer.scad ├── jhead.scad ├── heated_bed.scad ├── nuts.scad ├── NEMA.scad ├── belt-clamp.scad ├── technical_drawing.scad ├── render.h ├── tslot.scad ├── domed_cap_nuts.scad ├── detailed_608zz_bearing.scad ├── hobbed_bolt.scad ├── svg └── M_circle.svg ├── CalibrationRules-conf.scad ├── RAMBo.scad ├── cable_clips.scad ├── lasercutter_6mm_MDF.scad ├── MM_logo_small.svg ├── FilamentSpoolHolder.scad └── utils └── upload_bom.py /heated_bed/README: -------------------------------------------------------------------------------- 1 | This is a heated bed design developed in KiCAD. 2 | 3 | -------------------------------------------------------------------------------- /img/MM2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Metamaquina/Metamaquina2/HEAD/img/MM2.png -------------------------------------------------------------------------------- /doc/hobbed_bolt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Metamaquina/Metamaquina2/HEAD/doc/hobbed_bolt.png -------------------------------------------------------------------------------- /doc/ptfe_liner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Metamaquina/Metamaquina2/HEAD/doc/ptfe_liner.png -------------------------------------------------------------------------------- /img/MM2_header.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Metamaquina/Metamaquina2/HEAD/img/MM2_header.jpg -------------------------------------------------------------------------------- /doc/BillOfMaterials.ods: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Metamaquina/Metamaquina2/HEAD/doc/BillOfMaterials.ods -------------------------------------------------------------------------------- /doc/wiring_details.ods: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Metamaquina/Metamaquina2/HEAD/doc/wiring_details.ods -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | #Kicad temp files 2 | /heated_bed/*.bak 3 | *kicad_pcb-bak 4 | $*.sch 5 | /heated_bed/gerbers/* 6 | -------------------------------------------------------------------------------- /img/lasercutter_panel1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Metamaquina/Metamaquina2/HEAD/img/lasercutter_panel1.png -------------------------------------------------------------------------------- /img/lasercutter_panel2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Metamaquina/Metamaquina2/HEAD/img/lasercutter_panel2.png -------------------------------------------------------------------------------- /img/lasercutter_panel3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Metamaquina/Metamaquina2/HEAD/img/lasercutter_panel3.png -------------------------------------------------------------------------------- /doc/Jhn_nozzle_holder_v4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Metamaquina/Metamaquina2/HEAD/doc/Jhn_nozzle_holder_v4.jpg -------------------------------------------------------------------------------- /doc/Jhn_md_brass_heater_nozzle.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Metamaquina/Metamaquina2/HEAD/doc/Jhn_md_brass_heater_nozzle.jpg -------------------------------------------------------------------------------- /acrilico_5mm.scad: -------------------------------------------------------------------------------- 1 | use ; 2 | use ; 3 | 4 | translate([30,20]){ 5 | translate([40,0]) 6 | idler_spacer_face(); 7 | 8 | translate([0,45]) 9 | zmin_endstop_spacer_face1(); 10 | 11 | translate([0,10]) 12 | zmin_endstop_spacer_face2(); 13 | 14 | translate([5,45]) 15 | zmax_endstop_spacer_face1(); 16 | 17 | translate([5,10]) 18 | zmax_endstop_spacer_face2(); 19 | } 20 | -------------------------------------------------------------------------------- /heated_bed/instrucoes producao.txt: -------------------------------------------------------------------------------- 1 | O funcionamento correto desta placa depende da resistência das suas trilhas. Portanto: 2 | 3 | * A placa DEVE ter densidade de cobre de 1oz. 4 | * A placa NÃO deve passar por eletrodeposição ANTES da máscara de solda. 5 | 6 | Outras informações: 7 | * Os pads devem ser metalizados por HAL. 8 | * A camada da frente não tem conexão elétrica com nenhuma trilha. Sua função é distribuir calor, portanto a placa deve ser 2 camadas, como nos gerbers. 9 | * Não é necessário metalizar os furos, nem os do conector. 10 | -------------------------------------------------------------------------------- /metric.scad: -------------------------------------------------------------------------------- 1 | // PRUSA Mendel 2 | // Default metric sizes 3 | // GNU GPL v3 4 | // Josef Průša 5 | // josefprusa@me.com 6 | // prusadjs.cz 7 | // http://www.reprap.org/wiki/Prusa_Mendel 8 | // http://github.com/prusajr/PrusaMendel 9 | 10 | // DONT CHANGE THIS FILE! ALTER VALUES IN CONFIGURATION.SCAD INSTEAD 11 | 12 | // RODS 13 | 14 | threaded_rod_diameter = 8.7; 15 | threaded_rod_diameter_horizontal = 8.7; 16 | smooth_bar_diameter = 8; 17 | smooth_bar_diameter_horizontal = 8.5; 18 | 19 | // Nuts and bolts 20 | 21 | m8_diameter = 9; 22 | m8_nut_diameter = 14.1; 23 | 24 | m4_diameter = 4.5; 25 | m4_nut_diameter = 9; 26 | 27 | m3_diameter = 3.6; 28 | m3_nut_diameter = 5.3; 29 | m3_nut_diameter_horizontal = 6.1; 30 | 31 | // Bushing holder 32 | 33 | bushing_core_diameter = smooth_bar_diameter; 34 | bushing_material_thickness = 1; 35 | 36 | // Motors 37 | 38 | motor_shaft = 5.5; -------------------------------------------------------------------------------- /gears-params.scad: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Author: 4 | // * Felipe C. da S. Sanches 5 | // 6 | // This program is free software: you can redistribute it and/or modify 7 | // it under the terms of the GNU General Public License as published by 8 | // the Free Software Foundation, either version 3 of the License, or 9 | // (at your option) any later version. 10 | // 11 | // This program is distributed in the hope that it will be useful, 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | // GNU General Public License for more details. 15 | // 16 | // You should have received a copy of the GNU General Public License 17 | // along with this program. If not, see . 18 | 19 | gear_thickness = 10; 20 | 21 | -------------------------------------------------------------------------------- /bolts.h: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Author: 4 | // * Felipe C. da S. Sanches 5 | // 6 | // This program is free software: you can redistribute it and/or modify 7 | // it under the terms of the GNU General Public License as published by 8 | // the Free Software Foundation, either version 3 of the License, or 9 | // (at your option) any later version. 10 | // 11 | // This program is distributed in the hope that it will be useful, 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | // GNU General Public License for more details. 15 | // 16 | // You should have received a copy of the GNU General Public License 17 | // along with this program. If not, see . 18 | 19 | use ; 20 | 21 | m3_bolt_head_height = 3; //TODO: check this! 22 | -------------------------------------------------------------------------------- /jhead.h: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Author: 4 | // * Felipe C. da S. Sanches 5 | // 6 | // This program is free software: you can redistribute it and/or modify 7 | // it under the terms of the GNU General Public License as published by 8 | // the Free Software Foundation, either version 3 of the License, or 9 | // (at your option) any later version. 10 | // 11 | // This program is distributed in the hope that it will be useful, 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | // GNU General Public License for more details. 15 | // 16 | // You should have received a copy of the GNU General Public License 17 | // along with this program. If not, see . 18 | 19 | use ; 20 | 21 | jhead_length = 64.25; 22 | jhead_instalation_depth = 9.4; 23 | 24 | -------------------------------------------------------------------------------- /jheads.h: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Author: 4 | // * Felipe C. da S. Sanches 5 | // 6 | // This program is free software: you can redistribute it and/or modify 7 | // it under the terms of the GNU General Public License as published by 8 | // the Free Software Foundation, either version 3 of the License, or 9 | // (at your option) any later version. 10 | // 11 | // This program is distributed in the hope that it will be useful, 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | // GNU General Public License for more details. 15 | // 16 | // You should have received a copy of the GNU General Public License 17 | // along with this program. If not, see . 18 | 19 | use ; 20 | 21 | jhead_length = 64.25; 22 | jhead_instalation_depth = 9.4; 23 | 24 | -------------------------------------------------------------------------------- /heated_bed/.kicad_pcb.pro: -------------------------------------------------------------------------------- 1 | update=Wed 06 Mar 2013 12:11:19 AM BRT 2 | last_client=pcbnew 3 | [pcbnew] 4 | version=1 5 | LastNetListRead=heatbed.net 6 | UseCmpFile=0 7 | PadDrill=0.762 8 | PadSizeH=1.524 9 | PadSizeV=1.524 10 | PcbTextSizeV=1.5 11 | PcbTextSizeH=1.5 12 | PcbTextThickness=0.3 13 | ModuleTextSizeV=1.5 14 | ModuleTextSizeH=1.5 15 | ModuleTextSizeThickness=0.15 16 | SolderMaskClearance=0.2 17 | SolderMaskMinWidth=0 18 | DrawSegmentWidth=0.2 19 | BoardOutlineThickness=0.15 20 | ModuleOutlineThickness=0.15 21 | [pcbnew/libraries] 22 | LibDir= 23 | LibName1=/home/aylons/kicad/Placeholders/aylons 24 | LibName2=sockets 25 | LibName3=connect 26 | LibName4=discret 27 | LibName5=pin_array 28 | LibName6=divers 29 | LibName7=libcms 30 | LibName8=display 31 | LibName9=led 32 | LibName10=dip_sockets 33 | LibName11=pga_sockets 34 | LibName12=valves 35 | LibName13=MountingHole_RevA_04Jul2011 36 | LibName14=/home/aylons/kicad/Placeholders/placeholders 37 | LibName15=MM_logo 38 | -------------------------------------------------------------------------------- /functions.scad: -------------------------------------------------------------------------------- 1 | // PRUSA Mendel 2 | // Functions used in many files 3 | // GNU GPL v3 4 | // Josef Průša 5 | // josefprusa@me.com 6 | // prusadjs.cz 7 | // http://www.reprap.org/wiki/Prusa_Mendel 8 | // http://github.com/prusajr/PrusaMendel 9 | 10 | 11 | module nut(d,h,horizontal=true){ 12 | cornerdiameter = (d / 2) / cos (180 / 6); 13 | cylinder(h = h, r = cornerdiameter, $fn = 6); 14 | if(horizontal){ 15 | for(i = [1:6]){ 16 | rotate([0,0,60*i]) translate([-cornerdiameter-0.2,0,0]) rotate([0,0,-45]) cube(size = [2,2,h]); 17 | }} 18 | } 19 | 20 | // Based on nophead research 21 | module polyhole(d,h) { 22 | n = max(round(2 * d),3); 23 | rotate([0,0,180]) 24 | cylinder(h = h, r = (d / 2) / cos (180 / n), $fn = n); 25 | } 26 | 27 | 28 | 29 | 30 | module roundcorner(diameter){ 31 | difference(){ 32 | cube(size = [diameter,diameter,99], center = false); 33 | translate(v = [diameter, diameter, 0]) cylinder(h = 100, r=diameter, center=true); 34 | } 35 | } -------------------------------------------------------------------------------- /lm8uu_bearing.h: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Author: 4 | // * Felipe C. da S. Sanches 5 | // 6 | // This program is free software: you can redistribute it and/or modify 7 | // it under the terms of the GNU General Public License as published by 8 | // the Free Software Foundation, either version 3 of the License, or 9 | // (at your option) any later version. 10 | // 11 | // This program is distributed in the hope that it will be useful, 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | // GNU General Public License for more details. 15 | // 16 | // You should have received a copy of the GNU General Public License 17 | // along with this program. If not, see . 18 | 19 | use ; 20 | 21 | lm8uu_diameter = 15; 22 | lm8uu_internal_diameter = 8; 23 | lm8uu_length = 24; 24 | 25 | -------------------------------------------------------------------------------- /ZLink.h: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Author: 4 | // * Felipe C. da S. Sanches 5 | // 6 | // This program is free software: you can redistribute it and/or modify 7 | // it under the terms of the GNU General Public License as published by 8 | // the Free Software Foundation, either version 3 of the License, or 9 | // (at your option) any later version. 10 | // 11 | // This program is distributed in the hope that it will be useful, 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | // GNU General Public License for more details. 15 | // 16 | // You should have received a copy of the GNU General Public License 17 | // along with this program. If not, see . 18 | 19 | use ; 20 | include ; 21 | 22 | dx_z_threaded = 14; 23 | ZLink_rod_height = 11*sqrt(3)/2; 24 | Zlink_hole_height = (XPlatform_height-thickness)/3; 25 | 26 | -------------------------------------------------------------------------------- /PowerSupply.h: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Author: 4 | // * Felipe C. da S. Sanches 5 | // 6 | // This program is free software: you can redistribute it and/or modify 7 | // it under the terms of the GNU General Public License as published by 8 | // the Free Software Foundation, either version 3 of the License, or 9 | // (at your option) any later version. 10 | // 11 | // This program is distributed in the hope that it will be useful, 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | // GNU General Public License for more details. 15 | // 16 | // You should have received a copy of the GNU General Public License 17 | // along with this program. If not, see . 18 | 19 | use ; 20 | 21 | //This is based on measurements of 22 | // a HIQUA power supply 23 | PowerSupply_width=110; 24 | PowerSupply_height=198; 25 | PowerSupply_thickness=50; 26 | 27 | -------------------------------------------------------------------------------- /spacer.h: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Author: 4 | // * Felipe C. da S. Sanches 5 | // 6 | // This program is free software: you can redistribute it and/or modify 7 | // it under the terms of the GNU General Public License as published by 8 | // the Free Software Foundation, either version 3 of the License, or 9 | // (at your option) any later version. 10 | // 11 | // This program is distributed in the hope that it will be useful, 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | // GNU General Public License for more details. 15 | // 16 | // You should have received a copy of the GNU General Public License 17 | // along with this program. If not, see . 18 | 19 | use ; 20 | include ; 21 | 22 | m3_spacer_radius = m3_diameter*1.5; 23 | hexspacer_length = 33; //considering the height of the connectors and components 24 | nylonspacer_length = 6; 25 | -------------------------------------------------------------------------------- /heated_bed.h: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Author: 4 | // * Felipe C. da S. Sanches 5 | // 6 | // This program is free software: you can redistribute it and/or modify 7 | // it under the terms of the GNU General Public License as published by 8 | // the Free Software Foundation, either version 3 of the License, or 9 | // (at your option) any later version. 10 | // 11 | // This program is distributed in the hope that it will be useful, 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | // GNU General Public License for more details. 15 | // 16 | // You should have received a copy of the GNU General Public License 17 | // along with this program. If not, see . 18 | 19 | use ; 20 | 21 | heated_bed_pcb_thickness = 2; 22 | heated_bed_pcb_width = 227; 23 | heated_bed_pcb_height = 224; 24 | heated_bed_glass_thickness = 3; 25 | 26 | glass_w=heated_bed_pcb_width; 27 | glass_h=200; //TODO 28 | 29 | -------------------------------------------------------------------------------- /endstop.h: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Author: 4 | // * Felipe C. da S. Sanches 5 | // 6 | // This program is free software: you can redistribute it and/or modify 7 | // it under the terms of the GNU General Public License as published by 8 | // the Free Software Foundation, either version 3 of the License, or 9 | // (at your option) any later version. 10 | // 11 | // This program is distributed in the hope that it will be useful, 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | // GNU General Public License for more details. 15 | // 16 | // You should have received a copy of the GNU General Public License 17 | // along with this program. If not, see . 18 | 19 | use ; 20 | 21 | //Micro Switch KW11-3Z-5-3T - 18MM 22 | microswitch_holes_distance = 9.5; 23 | microswitch_width = 20; 24 | microswitch_height = 10.7; 25 | microswitch_thickness = 6.3; 26 | 27 | endstop_spacer_height = 30; 28 | 29 | -------------------------------------------------------------------------------- /NEMA.h: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Author: 4 | // * Felipe C. da S. Sanches 5 | // 6 | // This program is free software: you can redistribute it and/or modify 7 | // it under the terms of the GNU General Public License as published by 8 | // the Free Software Foundation, either version 3 of the License, or 9 | // (at your option) any later version. 10 | // 11 | // This program is distributed in the hope that it will be useful, 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | // GNU General Public License for more details. 15 | // 16 | // You should have received a copy of the GNU General Public License 17 | // along with this program. If not, see . 18 | 19 | use ; 20 | 21 | //motor dimensions based on Action Motors NEMA17 datasheet 22 | motor_shaft_length = 24; 23 | motor_shaft_diameter = 5; 24 | NEMA17_width=42; 25 | NEMA17_height=42; 26 | NEMA17_length=40; 27 | NEMA17_connector_width = 13.7; 28 | NEMA17_connector_height = 4.5; 29 | 30 | -------------------------------------------------------------------------------- /coupling.h: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Author: 4 | // * Felipe C. da S. Sanches 5 | // 6 | // This program is free software: you can redistribute it and/or modify 7 | // it under the terms of the GNU General Public License as published by 8 | // the Free Software Foundation, either version 3 of the License, or 9 | // (at your option) any later version. 10 | // 11 | // This program is distributed in the hope that it will be useful, 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | // GNU General Public License for more details. 15 | // 16 | // You should have received a copy of the GNU General Public License 17 | // along with this program. If not, see . 18 | 19 | use ; 20 | 21 | coupling_length = 25; 22 | coupling_diameter = 20.4; 23 | coupling_rod_depth = 20; 24 | coupling_shaft_depth = coupling_length - coupling_rod_depth; 25 | bolt_diameter = 2.32; 26 | bolt_size = 20; 27 | bolt_offsetx = 7; 28 | bolt1_offsetz = 3.1; 29 | bolt2_offsetz = 3.4; 30 | epsilon = 0.05; 31 | 32 | -------------------------------------------------------------------------------- /lasercutter_6mm_MDF_CalibrationRules.scad: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Author: 4 | // * Felipe C. da S. Sanches 5 | // 6 | // This program is free software: you can redistribute it and/or modify 7 | // it under the terms of the GNU General Public License as published by 8 | // the Free Software Foundation, either version 3 of the License, or 9 | // (at your option) any later version. 10 | // 11 | // This program is distributed in the hope that it will be useful, 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | // GNU General Public License for more details. 15 | // 16 | // You should have received a copy of the GNU General Public License 17 | // along with this program. If not, see . 18 | 19 | include ; 20 | include ; 21 | 22 | extruder_wiring_radius = 6; 23 | YEndstopHolder_distance = 66; 24 | 25 | //utils 26 | use 27 | 28 | 29 | FrontRule_face(); 30 | 31 | translate([0,-(55),0]) 32 | rotate([180,0,0]) 33 | RearRule_face(); 34 | -------------------------------------------------------------------------------- /lasercutter_6mm_MDF_CalibrationZBars.scad: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Author: 4 | // * Felipe C. da S. Sanches 5 | // 6 | // This program is free software: you can redistribute it and/or modify 7 | // it under the terms of the GNU General Public License as published by 8 | // the Free Software Foundation, either version 3 of the License, or 9 | // (at your option) any later version. 10 | // 11 | // This program is distributed in the hope that it will be useful, 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | // GNU General Public License for more details. 15 | // 16 | // You should have received a copy of the GNU General Public License 17 | // along with this program. If not, see . 18 | 19 | //utils 20 | use ; 21 | 22 | RodEndTop_face(); 23 | 24 | translate([30,28.5,0]) 25 | RodEndBottom_face(); 26 | 27 | translate([-70,-170,0]) 28 | rotate([0,180,-90]) 29 | MachineRightPanel_face(); 30 | 31 | translate([-60,10,0]) 32 | MachineTopPanel_face(); 33 | 34 | translate([-60,-55,0]) 35 | MachineBottomPanel_face(); 36 | -------------------------------------------------------------------------------- /washers.h: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Author: 4 | // * Felipe C. da S. Sanches 5 | // 6 | // This program is free software: you can redistribute it and/or modify 7 | // it under the terms of the GNU General Public License as published by 8 | // the Free Software Foundation, either version 3 of the License, or 9 | // (at your option) any later version. 10 | // 11 | // This program is distributed in the hope that it will be useful, 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | // GNU General Public License for more details. 15 | // 16 | // You should have received a copy of the GNU General Public License 17 | // along with this program. If not, see . 18 | 19 | use ; 20 | 21 | m3_washer_thickness = 0.5; 22 | m3_washer_d = 3.1; 23 | m3_washer_D = 6.75; 24 | 25 | m4_washer_thickness = 0.75; 26 | m4_washer_d = 4.3; 27 | m4_washer_D = 8.75; 28 | 29 | m8_washer_thickness = 1.5; 30 | m8_washer_d = 8.5; 31 | m8_washer_D = 18; 32 | 33 | m8_mudguard_washer_thickness = 2; 34 | m8_mudguard_washer_d = 8.5; 35 | m8_mudguard_washer_D = 32; 36 | -------------------------------------------------------------------------------- /hardware/heatbed/heatbed.cmp: -------------------------------------------------------------------------------- 1 | Cmp-Mod V01 Created by CvPcb (2012-nov-02)-testing date = Thu 21 Feb 2013 01:00:05 AM BRT 2 | 3 | BeginCmp 4 | TimeStamp = /512592B6; 5 | Reference = D1; 6 | ValeurCmp = GREEN_LED; 7 | IdModule = LED-0805; 8 | EndCmp 9 | 10 | BeginCmp 11 | TimeStamp = /5125922A; 12 | Reference = P1; 13 | ValeurCmp = CONN_POWER; 14 | IdModule = AK300-2; 15 | EndCmp 16 | 17 | BeginCmp 18 | TimeStamp = /512596BD; 19 | Reference = P2; 20 | ValeurCmp = CONN_2; 21 | IdModule = 2PIN_6mm; 22 | EndCmp 23 | 24 | BeginCmp 25 | TimeStamp = /5125956A; 26 | Reference = PCB_R1; 27 | ValeurCmp = 4R; 28 | IdModule = SM1206; 29 | EndCmp 30 | 31 | BeginCmp 32 | TimeStamp = /51259665; 33 | Reference = PCB_R2; 34 | ValeurCmp = 4R; 35 | IdModule = SM1206; 36 | EndCmp 37 | 38 | BeginCmp 39 | TimeStamp = /5125966B; 40 | Reference = PCB_R3; 41 | ValeurCmp = 4R; 42 | IdModule = SM1206; 43 | EndCmp 44 | 45 | BeginCmp 46 | TimeStamp = /51259671; 47 | Reference = PCB_R4; 48 | ValeurCmp = 4R; 49 | IdModule = SM1206; 50 | EndCmp 51 | 52 | BeginCmp 53 | TimeStamp = /512592C5; 54 | Reference = R1; 55 | ValeurCmp = 1k; 56 | IdModule = SM0805; 57 | EndCmp 58 | 59 | BeginCmp 60 | TimeStamp = /512596CC; 61 | Reference = TH1; 62 | ValeurCmp = 100k; 63 | IdModule = 0805,0603; 64 | EndCmp 65 | 66 | EndListe 67 | -------------------------------------------------------------------------------- /lasercutter_5mm_acrylic.scad: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Author: 4 | // * Felipe C. da S. Sanches 5 | // 6 | // This program is free software: you can redistribute it and/or modify 7 | // it under the terms of the GNU General Public License as published by 8 | // the Free Software Foundation, either version 3 of the License, or 9 | // (at your option) any later version. 10 | // 11 | // This program is distributed in the hope that it will be useful, 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | // GNU General Public License for more details. 15 | // 16 | // You should have received a copy of the GNU General Public License 17 | // along with this program. If not, see . 18 | 19 | include ; 20 | use ; 21 | 22 | translate([10,80]) 23 | idler_spacer_face(); 24 | 25 | translate([30,80]) 26 | idler_spacer_face(); 27 | 28 | translate([25,60]) 29 | zmin_endstop_spacer_face1(); 30 | 31 | translate([25,25]) 32 | zmin_endstop_spacer_face2(); 33 | 34 | translate([30,60]) 35 | zmax_endstop_spacer_face1(); 36 | 37 | translate([30,25]) 38 | zmax_endstop_spacer_face2(); 39 | 40 | -------------------------------------------------------------------------------- /BillOfMaterials.sh: -------------------------------------------------------------------------------- 1 | # This file automatically generates a Bill of Materials for 2 | # the Metamaquina 2 desktop 3d printer. 3 | # 4 | # (c) 2013 Metamáquina 5 | # 6 | # Author: 7 | # * Felipe C. da S. Sanches 8 | # 9 | # This program is free software: you can redistribute it and/or modify 10 | # it under the terms of the GNU General Public License as published by 11 | # the Free Software Foundation, either version 3 of the License, or 12 | # (at your option) any later version. 13 | # 14 | # This program is distributed in the hope that it will be useful, 15 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 16 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 | # GNU General Public License for more details. 18 | # 19 | # You should have received a copy of the GNU General Public License 20 | # along with this program. If not, see . 21 | 22 | echo "Bill of Materials - Metamaquina 2" 23 | openscad -o Metamaquina2.csg Metamaquina2.scad 2>&1 > /dev/null |grep BOM|cut -d: -f3|cut -d\" -f1|sort|uniq -c 24 | 25 | COUNT=$(openscad -o Metamaquina2.csg Metamaquina2.scad 2>&1 > /dev/null |grep BOM|cut -d: -f3|cut -d\" -f1|wc -l) 26 | 27 | echo "Metamaquina 2 is composed of" $COUNT "parts." 28 | -------------------------------------------------------------------------------- /CalibrationRules.scad: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Author: 4 | // * Felipe C. da S. Sanches 5 | // 6 | // This program is free software: you can redistribute it and/or modify 7 | // it under the terms of the GNU General Public License as published by 8 | // the Free Software Foundation, either version 3 of the License, or 9 | // (at your option) any later version. 10 | // 11 | // This program is distributed in the hope that it will be useful, 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | // GNU General Public License for more details. 15 | // 16 | // You should have received a copy of the GNU General Public License 17 | // along with this program. If not, see . 18 | 19 | include ; 20 | include ; 21 | 22 | extruder_wiring_radius = 6; 23 | YEndstopHolder_distance = 66; 24 | 25 | //utils 26 | use ; 27 | use ; 28 | use ; 29 | use ; 30 | use 31 | use 32 | 33 | FrontRule(); 34 | RearRule(); 35 | //RearAssembly(); 36 | //RearBars(); 37 | //FrontBars(); 38 | //LaserCutPanels(); 39 | //Metamaquina2(); 40 | -------------------------------------------------------------------------------- /lm8uu_bearing.scad: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Author: 4 | // * Felipe C. da S. Sanches 5 | // 6 | // This program is free software: you can redistribute it and/or modify 7 | // it under the terms of the GNU General Public License as published by 8 | // the Free Software Foundation, either version 3 of the License, or 9 | // (at your option) any later version. 10 | // 11 | // This program is distributed in the hope that it will be useful, 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | // GNU General Public License for more details. 15 | // 16 | // You should have received a copy of the GNU General Public License 17 | // along with this program. If not, see . 18 | 19 | include ; 20 | include ; 21 | include ; 22 | 23 | module LM8UU(bom=true){ 24 | if (bom) 25 | BillOfMaterials("LM8UU linear bearing", ref="LM8UU"); 26 | 27 | material("metal") 28 | translate([0,lm8uu_length/2]) 29 | rotate([90,0]) 30 | linear_extrude(height=lm8uu_length) 31 | difference(){ 32 | circle(r=lm8uu_diameter/2); 33 | circle(r=lm8uu_internal_diameter/2); 34 | } 35 | } 36 | 37 | LM8UU(); 38 | -------------------------------------------------------------------------------- /nuts.h: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Author: 4 | // * Felipe C. da S. Sanches 5 | // 6 | // This program is free software: you can redistribute it and/or modify 7 | // it under the terms of the GNU General Public License as published by 8 | // the Free Software Foundation, either version 3 of the License, or 9 | // (at your option) any later version. 10 | // 11 | // This program is distributed in the hope that it will be useful, 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | // GNU General Public License for more details. 15 | // 16 | // You should have received a copy of the GNU General Public License 17 | // along with this program. If not, see . 18 | 19 | use ; 20 | 21 | //TODO: verify this whole file! 22 | 23 | m25_nut_r = 2.5/2; 24 | m25_nut_R = 5.68/2; 25 | m25_nut_height = 1.81; 26 | 27 | m3_nut_r = 3/2; 28 | m3_nut_R = 6.235/2; 29 | m3_nut_height = 2.23; 30 | 31 | m4_nut_r = 4/2; 32 | m4_nut_R = 7.875/2; 33 | m4_nut_height = 3.15; 34 | 35 | m8_nut_r = 8/2; 36 | m8_nut_R = 14/2; 37 | m8_nut_height = 6.3; 38 | 39 | m8_capnut_r = 8/2; 40 | m8_capnut_R = 14.76/2; 41 | m8_capnut_H1 = 6.35; 42 | m8_capnut_height = 14.87; 43 | 44 | -------------------------------------------------------------------------------- /serial_number_panel.scad: -------------------------------------------------------------------------------- 1 | //A lasercutter plate for a batch_run with serial number strings 2 | 3 | include ; 4 | include ; 5 | 6 | module serial_number_plate(){ 7 | assign(revision_id = batch_run[0], 8 | batch_number = batch_run[1], 9 | first_id = batch_run[2], 10 | size_of_batch = batch_run[3]){ 11 | for (i=[0:size_of_batch-1]){ 12 | translate([7*(i%2), i*52]) 13 | face_with_serial_number(revision_id, batch_number, first_id+i); 14 | } 15 | } 16 | } 17 | 18 | module glyph(char, fontsize){ 19 | scale(fontsize/12){ 20 | import("font.dxf", layer=char); 21 | } 22 | } 23 | 24 | module draw_number(value, digits, spacing=0.7, fontsize=7){ 25 | string = str(value + pow(10,digits)); 26 | text_length = (len(string)+1) * spacing*fontsize; 27 | translate([- text_length/2, fontsize/3]){ 28 | for (i=[0:digits-1]){ 29 | translate([spacing*fontsize*i,0]) 30 | if (i+1; 17 | 18 | // CUSTOM CUSTOM CUSTOM CUSTOM CUSTOM CUSTOM CUSTOM CUSTOM CUSTOM 19 | 20 | thin_wall = 3; 21 | 22 | 23 | // Linear bearing version 24 | linear = false; 25 | // set false for LM-8UU, true for LM-E-8UU (ignore if linear is set to false) 26 | lme8uu = false; 27 | 28 | 29 | 30 | // CHANGE ONLY THE STUFF YOU KNOW 31 | // IT WILL REPLACE DEFAULT SETTING 32 | 33 | // RODS 34 | 35 | // threaded_rod_diameter = 0; 36 | // threaded_rod_diameter_horizontal = 0; 37 | // smooth_bar_díameter = 0; 38 | // smooth_bar_díameter_horizontal = 0; 39 | 40 | // Nuts and bolts 41 | 42 | // m8_diameter = 0; 43 | // m8_nut_diameter = 0; 44 | 45 | // m4_diameter = 0; 46 | // m4_nut_diameter = 0; 47 | 48 | // m3_diameter = 0; 49 | // m3_nut_diameter = 0; 50 | 51 | // Bushing holder 52 | 53 | // bushing_core_diameter = smooth_bar_díameter; 54 | // bushing_material_thickness = 0; 55 | 56 | 57 | ///counted stuff 58 | m3_nut_diameter_bigger = ((m3_nut_diameter / 2) / cos (180 / 6))*2; 59 | 60 | // functions 61 | include 62 | 63 | -------------------------------------------------------------------------------- /heated_bed/heatbed.cmp: -------------------------------------------------------------------------------- 1 | Cmp-Mod V01 Created by PcbNew date = Sat 23 Mar 2013 04:26:24 PM BRT 2 | 3 | BeginCmp 4 | TimeStamp = /512592B6; 5 | Reference = D1; 6 | ValeurCmp = GREEN_LED; 7 | IdModule = LED-0805_manual; 8 | EndCmp 9 | 10 | BeginCmp 11 | TimeStamp = /5133CB70; 12 | Reference = MH1; 13 | ValeurCmp = MOUNTING_HOLE; 14 | IdModule = MountingHole_3mm_RevA_Date21Jun2010; 15 | EndCmp 16 | 17 | BeginCmp 18 | TimeStamp = /5133CB7D; 19 | Reference = MH2; 20 | ValeurCmp = MOUNTING_HOLE; 21 | IdModule = MountingHole_3mm_RevA_Date21Jun2010; 22 | EndCmp 23 | 24 | BeginCmp 25 | TimeStamp = /5133CB89; 26 | Reference = MH3; 27 | ValeurCmp = MOUNTING_HOLE; 28 | IdModule = MountingHole_3mm_RevA_Date21Jun2010; 29 | EndCmp 30 | 31 | BeginCmp 32 | TimeStamp = /5133CB83; 33 | Reference = MH4; 34 | ValeurCmp = MOUNTING_HOLE; 35 | IdModule = MountingHole_3mm_RevA_Date21Jun2010; 36 | EndCmp 37 | 38 | BeginCmp 39 | TimeStamp = /5136AF98; 40 | Reference = N1; 41 | ValeurCmp = AYLONS; 42 | IdModule = Aylons; 43 | EndCmp 44 | 45 | BeginCmp 46 | TimeStamp = /5133D6B0; 47 | Reference = P1; 48 | ValeurCmp = CONN_4; 49 | IdModule = bornier4; 50 | EndCmp 51 | 52 | BeginCmp 53 | TimeStamp = /512592C5; 54 | Reference = R1; 55 | ValeurCmp = 1k; 56 | IdModule = SM0805-manual; 57 | EndCmp 58 | 59 | BeginCmp 60 | TimeStamp = /512596CC; 61 | Reference = TH1; 62 | ValeurCmp = 100k; 63 | IdModule = SM0805; 64 | EndCmp 65 | 66 | BeginCmp 67 | TimeStamp = /51340120; 68 | Reference = TH2; 69 | ValeurCmp = 100k; 70 | IdModule = SM0603; 71 | EndCmp 72 | 73 | EndListe 74 | -------------------------------------------------------------------------------- /hardware/heatbed/heatbed.pro: -------------------------------------------------------------------------------- 1 | update=Wed 20 Feb 2013 11:51:50 PM BRT 2 | version=1 3 | last_client=kicad 4 | [cvpcb] 5 | version=1 6 | NetIExt=net 7 | [cvpcb/libraries] 8 | EquName1=devcms 9 | [eeschema] 10 | version=1 11 | LibDir= 12 | NetFmtName= 13 | RptD_X=0 14 | RptD_Y=100 15 | RptLab=1 16 | LabSize=60 17 | [eeschema/libraries] 18 | LibName1=power 19 | LibName2=device 20 | LibName3=transistors 21 | LibName4=conn 22 | LibName5=linear 23 | LibName6=regul 24 | LibName7=74xx 25 | LibName8=cmos4000 26 | LibName9=adc-dac 27 | LibName10=memory 28 | LibName11=xilinx 29 | LibName12=special 30 | LibName13=microcontrollers 31 | LibName14=dsp 32 | LibName15=microchip 33 | LibName16=analog_switches 34 | LibName17=motorola 35 | LibName18=texas 36 | LibName19=intel 37 | LibName20=audio 38 | LibName21=interface 39 | LibName22=digital-audio 40 | LibName23=philips 41 | LibName24=display 42 | LibName25=cypress 43 | LibName26=siliconi 44 | LibName27=opto 45 | LibName28=atmel 46 | LibName29=contrib 47 | LibName30=valves 48 | [pcbnew] 49 | version=1 50 | LastNetListRead= 51 | PadDrlX=320 52 | PadDimH=550 53 | PadDimV=550 54 | BoardThickness=620 55 | TxtPcbV=600 56 | TxtPcbH=600 57 | TxtModV=500 58 | TxtModH=500 59 | TxtModW=100 60 | VEgarde=100 61 | DrawLar=120 62 | EdgeLar=80 63 | TxtLar=120 64 | MSegLar=120 65 | [pcbnew/libraries] 66 | LibDir= 67 | LibName1=sockets 68 | LibName2=connect 69 | LibName3=discret 70 | LibName4=pin_array 71 | LibName5=divers 72 | LibName6=libcms 73 | LibName7=display 74 | LibName8=led 75 | LibName9=dip_sockets 76 | LibName10=pga_sockets 77 | LibName11=valves 78 | [general] 79 | version=1 80 | -------------------------------------------------------------------------------- /heated_bed/heatbed.pro: -------------------------------------------------------------------------------- 1 | update=Mon 08 Apr 2013 08:47:45 PM BRT 2 | version=1 3 | last_client=kicad 4 | [cvpcb] 5 | version=1 6 | NetIExt=net 7 | [cvpcb/libraries] 8 | EquName1=devcms 9 | [pcbnew] 10 | version=1 11 | LastNetListRead=heatbed.net 12 | UseCmpFile=0 13 | PadDrill=0 14 | PadSizeH=1.70688 15 | PadSizeV=1.19888 16 | PcbTextSizeV=1 17 | PcbTextSizeH=1 18 | PcbTextThickness=0.3 19 | ModuleTextSizeV=1 20 | ModuleTextSizeH=1 21 | ModuleTextSizeThickness=0.15 22 | SolderMaskClearance=0 23 | SolderMaskMinWidth=0 24 | DrawSegmentWidth=0.5 25 | BoardOutlineThickness=0.15 26 | ModuleOutlineThickness=0.15 27 | [pcbnew/libraries] 28 | LibDir= 29 | LibName1=sockets 30 | LibName2=connect 31 | LibName3=discret 32 | LibName4=pin_array 33 | LibName5=divers 34 | LibName6=libcms 35 | LibName7=display 36 | LibName8=led 37 | LibName9=dip_sockets 38 | LibName10=pga_sockets 39 | LibName11=valves 40 | LibName12=MountingHole_RevA_04Jul2011 41 | LibName13=MM_logo 42 | [eeschema] 43 | version=1 44 | LibDir= 45 | NetFmtName= 46 | RptD_X=0 47 | RptD_Y=100 48 | RptLab=1 49 | LabSize=60 50 | [eeschema/libraries] 51 | LibName1=power 52 | LibName2=device 53 | LibName3=transistors 54 | LibName4=conn 55 | LibName5=linear 56 | LibName6=regul 57 | LibName7=74xx 58 | LibName8=cmos4000 59 | LibName9=adc-dac 60 | LibName10=memory 61 | LibName11=xilinx 62 | LibName12=special 63 | LibName13=microcontrollers 64 | LibName14=dsp 65 | LibName15=microchip 66 | LibName16=analog_switches 67 | LibName17=motorola 68 | LibName18=texas 69 | LibName19=intel 70 | LibName20=audio 71 | LibName21=interface 72 | LibName22=digital-audio 73 | LibName23=philips 74 | LibName24=display 75 | LibName25=cypress 76 | LibName26=siliconi 77 | LibName27=opto 78 | LibName28=atmel 79 | LibName29=contrib 80 | LibName30=valves 81 | [general] 82 | version=1 83 | -------------------------------------------------------------------------------- /bolts.scad: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Author: 4 | // * Felipe C. da S. Sanches 5 | // 6 | // This program is free software: you can redistribute it and/or modify 7 | // it under the terms of the GNU General Public License as published by 8 | // the Free Software Foundation, either version 3 of the License, or 9 | // (at your option) any later version. 10 | // 11 | // This program is distributed in the hope that it will be useful, 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | // GNU General Public License for more details. 15 | // 16 | // You should have received a copy of the GNU General Public License 17 | // along with this program. If not, see . 18 | 19 | include ; 20 | include ; 21 | include ; 22 | 23 | module M3x10(){ 24 | bolt(3,10); 25 | } 26 | 27 | module M3x12(){ 28 | bolt(3,12); 29 | } 30 | 31 | module M3x16(){ 32 | bolt(3,16); 33 | } 34 | 35 | module M3x20(){ 36 | bolt(3,20); 37 | } 38 | 39 | module M3x25(){ 40 | bolt(3,25); 41 | } 42 | 43 | module M3x30(){ 44 | bolt(3,30); 45 | } 46 | 47 | module M3x35(){ 48 | bolt(3,35); 49 | } 50 | 51 | module bolt_head(r, h){ 52 | difference(){ 53 | cylinder(r=r, h=h, $fn=60); 54 | translate([0,0,h/2]){ 55 | cylinder(r=0.6*r, h=h, $fn=6); 56 | } 57 | } 58 | } 59 | 60 | module bolt(dia, length){ 61 | //TODO: assuming hexagonal/cylindric cap bolt 62 | BillOfMaterials(str("M",dia,"x",length," bolt"), ref=str("H_M",dia,"x",length)); 63 | 64 | material("metal"){ 65 | bolt_head(r=dia, h=dia); 66 | 67 | translate([0,0,-length]) 68 | cylinder(r=dia/2, h=length, $fn=60); 69 | } 70 | } 71 | 72 | -------------------------------------------------------------------------------- /hardware/heatbed/heatbed-cache.lib: -------------------------------------------------------------------------------- 1 | EESchema-LIBRARY Version 2.3 Date: Thu 21 Feb 2013 12:44:48 AM BRT 2 | #encoding utf-8 3 | # 4 | # CONN_2 5 | # 6 | DEF CONN_2 P 0 40 Y N 1 F N 7 | F0 "P" -50 0 40 V V C CNN 8 | F1 "CONN_2" 50 0 40 V V C CNN 9 | F2 "~" 0 0 60 H V C CNN 10 | F3 "~" 0 0 60 H V C CNN 11 | DRAW 12 | S -100 150 100 -150 0 1 0 N 13 | X P1 1 -350 100 250 R 60 60 1 1 P I 14 | X PM 2 -350 -100 250 R 60 60 1 1 P I 15 | ENDDRAW 16 | ENDDEF 17 | # 18 | # LED 19 | # 20 | DEF LED D 0 40 Y N 1 F N 21 | F0 "D" 0 100 50 H V C CNN 22 | F1 "LED" 0 -100 50 H V C CNN 23 | F2 "~" 0 0 60 H V C CNN 24 | F3 "~" 0 0 60 H V C CNN 25 | $FPLIST 26 | LED-3MM 27 | LED-5MM 28 | LED-10MM 29 | LED-0603 30 | LED-0805 31 | LED-1206 32 | LEDV 33 | $ENDFPLIST 34 | DRAW 35 | P 2 0 1 0 50 50 50 -50 N 36 | P 3 0 1 0 -50 50 50 0 -50 -50 F 37 | P 3 0 1 0 65 -40 110 -80 105 -55 N 38 | P 3 0 1 0 80 -25 125 -65 120 -40 N 39 | X A 1 -200 0 150 R 40 40 1 1 P 40 | X K 2 200 0 150 L 40 40 1 1 P 41 | ENDDRAW 42 | ENDDEF 43 | # 44 | # R 45 | # 46 | DEF R R 0 0 N Y 1 F N 47 | F0 "R" 80 0 50 V V C CNN 48 | F1 "R" 0 0 50 V V C CNN 49 | F2 "~" 0 0 60 H V C CNN 50 | F3 "~" 0 0 60 H V C CNN 51 | $FPLIST 52 | R? 53 | SM0603 54 | SM0805 55 | R?-* 56 | SM1206 57 | $ENDFPLIST 58 | DRAW 59 | S -40 150 40 -150 0 1 12 N 60 | X ~ 1 0 250 100 D 60 60 1 1 P 61 | X ~ 2 0 -250 100 U 60 60 1 1 P 62 | ENDDRAW 63 | ENDDEF 64 | # 65 | # THERMISTOR 66 | # 67 | DEF THERMISTOR TH 0 0 N Y 1 F N 68 | F0 "TH" 100 50 50 V V C CNN 69 | F1 "THERMISTOR" -100 0 50 V V C CNN 70 | F2 "~" 0 0 60 H V C CNN 71 | F3 "~" 0 0 60 H V C CNN 72 | $FPLIST 73 | R? 74 | SM0603 75 | SM0805 76 | $ENDFPLIST 77 | DRAW 78 | T 900 75 -150 60 0 0 1 - Normal 0 C C 79 | S -40 150 40 -150 0 1 8 N 80 | P 5 0 1 0 -75 125 -75 75 75 -75 75 -125 75 -125 N 81 | X ~ 1 0 250 100 D 60 60 1 1 P 82 | X ~ 2 0 -250 100 U 60 60 1 1 P 83 | ENDDRAW 84 | ENDDEF 85 | # 86 | #End Library 87 | -------------------------------------------------------------------------------- /utils.scad: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Author: 4 | // * Felipe C. da S. Sanches 5 | // 6 | // This program is free software: you can redistribute it and/or modify 7 | // it under the terms of the GNU General Public License as published by 8 | // the Free Software Foundation, either version 3 of the License, or 9 | // (at your option) any later version. 10 | // 11 | // This program is distributed in the hope that it will be useful, 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | // GNU General Public License for more details. 15 | // 16 | // You should have received a copy of the GNU General Public License 17 | // along with this program. If not, see . 18 | 19 | use ; 20 | 21 | //TODO: move these declarations to a header file 22 | m25_diameter = 2.5; 23 | m3_diameter=3; 24 | 25 | module M3_hole(){ 26 | circle(r=m3_diameter/2, $fn=20); 27 | } 28 | 29 | module M25_hole(){ 30 | circle(r=m25_diameter/2, $fn=20); 31 | } 32 | 33 | module rounded_edge_cut(width=10, height=20, r=5, plain_left=false, plain_right=false){ 34 | translate([-width/2,-height]) 35 | rounded_square([width,height], corners=[r,r,0,0]); 36 | 37 | if (!plain_left) 38 | translate([-width/2-r,-r]){ 39 | difference(){ 40 | square([r,r]); 41 | circle(r=r); 42 | } 43 | } 44 | 45 | 46 | if (!plain_right) 47 | translate([width/2,-r]){ 48 | difference(){ 49 | square([r,r]); 50 | translate([r,0]) 51 | circle(r=r); 52 | } 53 | } 54 | 55 | } 56 | 57 | module trapezoid(h, l1, l2, r=0, xoffset=0){ 58 | hull(){ 59 | translate([xoffset, h]) circle(r=r); 60 | translate([xoffset+l1,h]) circle(r=r); 61 | circle(r=r); 62 | translate([l2,0]) circle(r=r); 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /608zz_bearing.scad: -------------------------------------------------------------------------------- 1 | // 608zz bearing 2 | // 3 | // (c) 2013 Metamáquina 4 | // 5 | // Author: 6 | // * Felipe C. da S. Sanches 7 | // 8 | // This program is free software: you can redistribute it and/or modify 9 | // it under the terms of the GNU General Public License as published by 10 | // the Free Software Foundation, either version 3 of the License, or 11 | // (at your option) any later version. 12 | // 13 | // This program is distributed in the hope that it will be useful, 14 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | // GNU General Public License for more details. 17 | // 18 | // You should have received a copy of the GNU General Public License 19 | // along with this program. If not, see . 20 | 21 | include ; 22 | include ; 23 | 24 | module 608zz_bearing(details=false){ 25 | BillOfMaterials("608zz bearing", ref="608ZZ"); 26 | 27 | if(details){ 28 | 608zz_bearing_detailed(); 29 | } else { 30 | 608zz_bearing_simple(); 31 | } 32 | } 33 | 34 | module 608zz_bearing_simple(){ 35 | material("metal"){ 36 | linear_extrude(height=7) 37 | difference(){ 38 | circle(r=22/2, $fn=40); 39 | circle(r=8/2, $fn=40); 40 | } 41 | } 42 | } 43 | 44 | module 608zz_bearing_detailed(){ 45 | material("metal"){ 46 | //inner disc 47 | linear_extrude(height=7) 48 | difference(){ 49 | circle(r=11/2, $fn=40); 50 | circle(r=8/2, $fn=40); 51 | } 52 | 53 | //middle disc 54 | translate([0,0,0.5]) 55 | linear_extrude(height=6) 56 | difference(){ 57 | circle(r=18/2, $fn=40); 58 | circle(r=12/2, $fn=40); 59 | } 60 | 61 | //outer disc 62 | linear_extrude(height=7) 63 | difference(){ 64 | circle(r=22/2, $fn=40); 65 | circle(r=19/2, $fn=40); 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /coupling.scad: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Authors: 4 | // * Felipe C. da S. Sanches 5 | // * Rafael H. de L. Moretti 6 | // 7 | // This program is free software: you can redistribute it and/or modify 8 | // it under the terms of the GNU General Public License as published by 9 | // the Free Software Foundation, either version 3 of the License, or 10 | // (at your option) any later version. 11 | // 12 | // This program is distributed in the hope that it will be useful, 13 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | // GNU General Public License for more details. 16 | // 17 | // You should have received a copy of the GNU General Public License 18 | // along with this program. If not, see . 19 | 20 | include ; 21 | include ; 22 | include ; 23 | 24 | module coupling(shaft_diameter=5, rod_diameter=8){ 25 | BillOfMaterials("Coupling for the Z axis", ref="JT2-20"); 26 | 27 | material("metal") 28 | difference(){ 29 | cylinder(r=coupling_diameter/2, h=coupling_length, $fn=60); 30 | 31 | translate([0,0,-epsilon]) 32 | cylinder(r=shaft_diameter/2, h=coupling_shaft_depth+2*epsilon, $fn=20); 33 | 34 | translate([0,0,coupling_length - coupling_rod_depth - epsilon]) 35 | cylinder(r=rod_diameter/2, h=coupling_rod_depth+2*epsilon, $fn=20); 36 | 37 | translate([-coupling_diameter/2 + 2,-1, -epsilon]) 38 | cube([coupling_diameter, 2, 10*coupling_length+2*epsilon]); 39 | 40 | // Bolt hole 1 41 | translate([bolt_offsetx,-bolt_size/2,bolt1_offsetz+bolt_diameter/2]) 42 | rotate(a=[0,90,90]) 43 | cylinder(r=bolt_diameter/2, h=bolt_size+2*epsilon, $fn=20); 44 | 45 | // Bolt hole 2 46 | translate([bolt_offsetx,-bolt_size/2,coupling_length-bolt2_offsetz-bolt_diameter/2]) 47 | rotate(a=[0,90,90]) 48 | cylinder(r=bolt_diameter/2, h=bolt_size+2*epsilon, $fn=20); 49 | 50 | } 51 | } 52 | 53 | coupling(); 54 | 55 | -------------------------------------------------------------------------------- /BillOfMaterials.h: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Authors: 4 | // * Felipe C. da S. Sanches 5 | // * Rodrigo Rodrigues da Silva 6 | // 7 | // This program is free software: you can redistribute it and/or modify 8 | // it under the terms of the GNU General Public License as published by 9 | // the Free Software Foundation, either version 3 of the License, or 10 | // (at your option) any later version. 11 | // 12 | // This program is distributed in the hope that it will be useful, 13 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | // GNU General Public License for more details. 16 | // 17 | // You should have received a copy of the GNU General Public License 18 | // along with this program. If not, see . 19 | 20 | module BillOfMaterials(partname="", quantity=1, category=false, ref=false){ 21 | if (len (str(partname)) || len(ref)){ 22 | for (q = [1:quantity]){ 23 | if (ref && category) 24 | echo (str("BOM: ", "[", ref, "] ", "{", category,"} ", partname)); 25 | else if (ref) 26 | echo (str("BOM: ", "[", ref, "] ", partname)); 27 | else if (category) 28 | echo(str("BOM: ", "{", category,"} ", partname)); 29 | else 30 | echo (str("BOM: ", partname)); 31 | } 32 | } 33 | } 34 | 35 | //TEST 36 | 37 | module test_BillOfMaterials(){ 38 | BillOfMaterials("TEST Simple part"); 39 | BillOfMaterials("TEST Part with quantity 3", 3); 40 | BillOfMaterials("TEST Part with ref and category", 1, "The Cool Parts' Category", "COOLPART"); 41 | BillOfMaterials("TEST Part with category only", 2, "The Cool Parts' Category"); 42 | BillOfMaterials("TEST Another part no category", ref = "REFFOO", quantity = 2); 43 | BillOfMaterials(ref="H_M4x70", quantity=12); 44 | 45 | //no output 46 | BillOfMaterials(quantity=3); 47 | BillOfMaterials(""); 48 | BillOfMaterials(category="foo"); 49 | BillOfMaterials(partname="", ref="", quantity=20); 50 | } 51 | 52 | //test_BillOfMaterials(); 53 | -------------------------------------------------------------------------------- /sandwich_test_panel.scad: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Author: 4 | // * Felipe C. da S. Sanches 5 | // 6 | // This program is free software: you can redistribute it and/or modify 7 | // it under the terms of the GNU General Public License as published by 8 | // the Free Software Foundation, either version 3 of the License, or 9 | // (at your option) any later version. 10 | // 11 | // This program is distributed in the hope that it will be useful, 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | // GNU General Public License for more details. 15 | // 16 | // You should have received a copy of the GNU General Public License 17 | // along with this program. If not, see . 18 | 19 | include ; 20 | 21 | module sandwich_test_panel(){ 22 | translate([320, 50]) 23 | XCarriage_sandwich_face(); 24 | 25 | translate([440, 50]) 26 | rotate(90) 27 | XCarriage_bottom_face(); 28 | 29 | translate([280, 230]) 30 | XEndMotor_plain_face(); 31 | 32 | translate([350, 230]) 33 | XEndIdler_plain_face(); 34 | 35 | translate([280, 280]) 36 | XEndMotor_belt_face(); 37 | 38 | translate([350, 280]) 39 | XEndIdler_belt_face(); 40 | 41 | translate([80, 210]) 42 | XEnd_front_face(); 43 | 44 | translate([180, 210]) 45 | mirror([1,0]) 46 | XEnd_front_face(); 47 | 48 | translate([80, 280]) 49 | XEndMotor_back_face(); 50 | 51 | translate([180, 280]) 52 | XEndIdler_back_face(); 53 | 54 | translate([220,140]) 55 | XPlatform_bottom_face(); 56 | 57 | translate([85,110]) 58 | set_of_M4_spacers(h=3, w=8); 59 | 60 | translate([200,115]) 61 | set_of_M3_spacers(w=6); 62 | 63 | translate([25,50]) 64 | for (i=[0:5]) 65 | translate([i*45,0]){ 66 | difference(){ 67 | generic_bearing_sandwich_face(H=XPlatform_height, sandwich_tightening = i*2/5); 68 | rotate(45) 69 | for (j=[0:i]) 70 | translate([-i/2+j,0]) square([0.3,3]); 71 | } 72 | } 73 | 74 | } 75 | 76 | sandwich_test_panel(); 77 | -------------------------------------------------------------------------------- /nozzle.scad: -------------------------------------------------------------------------------- 1 | //This file came from the RepRap.org wiki 2 | 3 | include ; 4 | include ; 5 | include ; 6 | 7 | module v4nozzle(){ 8 | BillOfMaterials("J-Head 0.35mm nozzle", ref="035_NZ"); 9 | 10 | { 11 | //TODO: Add these parts to the CAD model 12 | BillOfMaterials("extruder thermistor", ref="TV100000X"); 13 | BillOfMaterials("extruder heater resistance", ref="UB5C-5RF1"); 14 | } 15 | 16 | if (render_nozzle){ 17 | material("golden"){ 18 | scale(25.4) 19 | difference() { 20 | union() { 21 | // heater block 22 | cube(size = [0.500,0.500,0.325]); 23 | 24 | // threaded top end 25 | translate([0.15625,0.250,0.325]) 26 | cylinder (h = 0.350, r = 0.15625, center = false, $fn = 100); 27 | translate([0.15625,0.250,0.675]) 28 | cylinder (h = 0.150, r = 0.1275, center = false, $fn = 100); 29 | 30 | // bottom projection 31 | translate([0.15625,0.250,-0.050]) 32 | cylinder (h = 0.050,r = 0.15625, center = false, $fn = 100); 33 | 34 | // nozzle profile 35 | translate([0.15626,0.250,-0.120]) 36 | cylinder (h = 0.070, r1 = 0.025, r2 = 0.15625, center = false, $fn = 100); 37 | } 38 | 39 | // heater resistor hole 40 | translate([0.358,0.501,0.1625]) 41 | rotate ([90,0,0]) cylinder (h=0.502, r = 0.117, center = false, $fn = 100); 42 | 43 | // thermistor hole 44 | translate([-0.001,0.430,0.1625]) 45 | rotate ([90,0,90]) cylinder (h=0.170, r = 0.045, center = false, $fn = 100); 46 | 47 | 48 | 49 | // melt chamber 50 | translate([0.15625,0.250,-0.029]) 51 | cylinder (h = 0.855, r = 0.069, center = false, $fn = 100); 52 | 53 | // orifice 54 | translate([0.15625,0.250,-0.120]) 55 | cylinder (h = 0.100, r = 0.010, center = false, $fn = 100); 56 | 57 | // internal nozzle profile 58 | translate([0.15625,0.250,-0.100]) 59 | cylinder (h = 0.070, r1 = 0.010, r2 = 0.069,center = false, $fn = 100); 60 | } 61 | } 62 | } 63 | } 64 | 65 | v4nozzle(); 66 | -------------------------------------------------------------------------------- /Metamaquina2.h: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Author: 4 | // * Felipe C. da S. Sanches 5 | // 6 | // This program is free software: you can redistribute it and/or modify 7 | // it under the terms of the GNU General Public License as published by 8 | // the Free Software Foundation, either version 3 of the License, or 9 | // (at your option) any later version. 10 | // 11 | // This program is distributed in the hope that it will be useful, 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | // GNU General Public License for more details. 15 | // 16 | // You should have received a copy of the GNU General Public License 17 | // along with this program. If not, see . 18 | 19 | use ; 20 | include ; 21 | 22 | /*Thickness of acrylic or plywood sheets to use.*/ 23 | thickness = 6; //millimiters 24 | acrylic_thickness = 5; 25 | 26 | /*This value is added to the thickness value when drawing cuts for connecting perpendicular sheets together*/ 27 | slot_extra_thickness = 0.5; 28 | 29 | module TSlot_holes(width=50){ 30 | t_slot_holes(width=width, thickness=thickness+slot_extra_thickness); 31 | } 32 | 33 | module TSlot_joints(width=50){ 34 | t_slot_joints(width=width, thickness=thickness, joint_size=5); 35 | } 36 | 37 | /* Desired build volume: */ 38 | BuildVolume_X=200; 39 | BuildVolume_Y=200; 40 | BuildVolume_Z=150; 41 | 42 | epsilon=0.1; 43 | inch=25.4; 44 | m25_diameter = 2.5; 45 | m3_diameter = 3; 46 | m4_diameter = 4; 47 | m8_diameter = 8; 48 | 49 | //------------------------- 50 | //RepRap standards: 51 | 52 | X_rods_distance = 50; 53 | X_rods_diameter=8; 54 | z_rod_z_bar_distance = 30; 55 | Y_rods_distance = 140; 56 | 57 | //------------------------- 58 | extruder_mount_holes_distance = X_rods_distance + 14; 59 | 60 | XPlatform_height = 45; 61 | 62 | //[revision_id, batch_number, first_id, size_of_batch] 63 | //batch_run = ["revA", 0, 31, 6]; 64 | //batch_run = ["revB", 1, 37, 10]; 65 | //batch_run = ["revB", 2, 47, 10]; 66 | //batch_run = ["revC", 3, 57, 10]; 67 | //batch_run = ["revC", 4, 67, 10]; 68 | batch_run = false; 69 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | Metamaquina2 3 | ============ 4 | 5 | Metamaquina 2 - fully parametric 3D printer 6 | 7 | ![A photo of the Metamaquina 2 desktop 3d printer](img/MM2_header.jpg) 8 | 9 | Manufacturing Instructions 10 | ========================== 11 | 12 | This is a 3d printer project that is completely designed using the parametric CAD tools 13 | provided by OpenSCAD. In order to deal with this source code you'll need to install OpenSCAD, 14 | following the instructions at: www.openscad.org 15 | 16 | The main structure of the machine is built using lasercut MDF panels. The curves for lasercutting 17 | can be exported to DXF by rendering the lasercutter_6mm_MDF.scad file. Open it in OpenSCAD, press F6 (to compile) and then click Design->Export DXF. The resulting DXF file can be used to cut 6mm thick MDF sheets (or you can change the thickness in the source if you plan to work with some other materials but be sure to review the 3d model in this case since some parts of the design depend on 6mm thickness). 18 | 19 | There is also a panel for lasercutting 2mm acrylic to cover the electronics PCB and a panel for lasercutting 5mm acrylic for the ZMAX/ZMIN endstop holders and a couple of 5mm spacers for the LCExtruder. There can be generated from the lasercutter_2m_acrylic.scad and lasercutter_5m_acrylic.scad, respectively. 20 | 21 | ![Laser Cutter Panel #1](https://raw.github.com/Metamaquina/Metamaquina2/master/img/lasercutter_panel1.png) 22 | ![Laser Cutter Panel #2](https://raw.github.com/Metamaquina/Metamaquina2/master/img/lasercutter_panel2.png) 23 | ![Laser Cutter Panel #3](https://raw.github.com/Metamaquina/Metamaquina2/master/img/lasercutter_panel3.png) 24 | 25 | The complete 3D model of the machine is described by the Metamaquina2.scad file. Open is in 26 | OpenSCAD and press F5 to render it. 27 | 28 | ![An OpenSCAD rendering of the Metamaquina 2 desktop 3d printer](https://raw.github.com/Metamaquina/Metamaquina2/master/img/MM2.png) 29 | 30 | Hacking the code 31 | ================ 32 | Feel free to send us pull requests at https://github.com/Metamaquina/Metamaquina2 33 | if you make any change to this design that you consider worth sharing with us. 34 | 35 | happy hacking, 36 | 37 | Felipe Sanches 38 | 39 | R&D director at Metamaquina.com.br 40 | 41 | 42 | -------------------------------------------------------------------------------- /mm2logo.scad: -------------------------------------------------------------------------------- 1 | // The Metamáquina logo and name are trademarks of 2 | // Metamaquina Comercio de Kits Eletrônicos Ltda 3 | // and cannot not be used without express written authorization. 4 | // 5 | // (c) 2013 Metamáquina 6 | // 7 | // Author: 8 | // * Felipe C. da S. Sanches 9 | // 10 | // This program is free software: you can redistribute it and/or modify 11 | // it under the terms of the GNU General Public License as published by 12 | // the Free Software Foundation, either version 3 of the License, or 13 | // (at your option) any later version. 14 | // 15 | // This program is distributed in the hope that it will be useful, 16 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 17 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 | // GNU General Public License for more details. 19 | // 20 | // You should have received a copy of the GNU General Public License 21 | // along with this program. If not, see . 22 | 23 | module mm_logo(){ 24 | translate([-10,-6]) 25 | import("MM_logo_small.dxf"); 26 | } 27 | 28 | module MM2_logo(){ 29 | difference(){ 30 | import("metamaquina-2.dxf"); 31 | remove_original_letter_Q(); 32 | } 33 | new_letter_Q(37); //Tony, mude o valor dessa linha. A sua tipografia original corresponde ao valor 29. Quanto maior este valor, menos frágil fica o corte a laser na madeira. 34 | } 35 | 36 | line_thickness=3.1; 37 | r=line_thickness/2; 38 | length = 6; 39 | N=120; 40 | R=8.4; 41 | 42 | module new_letter_Q(angle=29){ 43 | start = angle; 44 | end = 360 - angle; 45 | 46 | translate([111.5,4.52]){ 47 | 48 | hull(){ 49 | for (j=[-1,1]) 50 | translate([0,j*length/2]) 51 | circle(r=r, $fn=50); 52 | } 53 | 54 | translate([0,8.4]) 55 | for (i=[0:N]) 56 | rotate(-90 + start + (i/N)*(end-start)) 57 | translate([R,0]) 58 | circle(r=r, $fn=50); 59 | } 60 | } 61 | 62 | module remove_original_letter_Q(){ 63 | translate([111.5,4.52+8.4]){ 64 | color("green"){ 65 | circle(r=11); 66 | hull(){ 67 | for (j=[-1,1]) 68 | translate([0,-8.4+j*length/2]) 69 | circle(r=3.3, $fn=50); 70 | } 71 | } 72 | } 73 | } 74 | 75 | MM2_logo(); 76 | -------------------------------------------------------------------------------- /washers.scad: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Authors: 4 | // * Felipe C. da S. Sanches 5 | // * Rafael H. de L. Moretti 6 | // 7 | // This program is free software: you can redistribute it and/or modify 8 | // it under the terms of the GNU General Public License as published by 9 | // the Free Software Foundation, either version 3 of the License, or 10 | // (at your option) any later version. 11 | // 12 | // This program is distributed in the hope that it will be useful, 13 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | // GNU General Public License for more details. 16 | // 17 | // You should have received a copy of the GNU General Public License 18 | // along with this program. If not, see . 19 | 20 | include ; 21 | include ; 22 | include ; 23 | 24 | module M3_washer(){ 25 | BillOfMaterials("M3 washer", ref="AL_M3"); 26 | washer(washer_thickness = m3_washer_thickness, 27 | external_diameter = m3_washer_D, 28 | internal_diameter = m3_washer_d); 29 | } 30 | 31 | module M4_washer(){ 32 | BillOfMaterials("M4 washer", ref="AL_M4"); 33 | washer(washer_thickness = m4_washer_thickness, 34 | external_diameter = m4_washer_D, 35 | internal_diameter = m4_washer_d); 36 | } 37 | 38 | module M8_washer(){ 39 | BillOfMaterials("M8 washer", ref="AL_M8"); 40 | washer(washer_thickness = m8_washer_thickness, 41 | external_diameter = m8_washer_D, 42 | internal_diameter = m8_washer_d); 43 | } 44 | 45 | module M8_mudguard_washer(){ 46 | BillOfMaterials("M8 mudguard washer", ref="AF_M8"); 47 | washer(washer_thickness = m8_mudguard_washer_thickness, 48 | external_diameter = m8_mudguard_washer_D, 49 | internal_diameter = m8_mudguard_washer_d); 50 | } 51 | 52 | module M8_lock_washer(){ 53 | BillOfMaterials("M8 lock washer", ref="AP_M8"); 54 | //TODO: render 55 | } 56 | 57 | module washer(washer_thickness, external_diameter, internal_diameter){ 58 | material("metal"){ 59 | linear_extrude(height=washer_thickness) 60 | difference(){ 61 | circle(r=external_diameter/2); 62 | circle(r=internal_diameter/2); 63 | } 64 | } 65 | } 66 | 67 | -------------------------------------------------------------------------------- /bar-clamp.scad: -------------------------------------------------------------------------------- 1 | // Bar clamp 2 | // Used for joining 8mm rods 3 | // 4 | // This code is derived from: 5 | // http://www.reprap.org/wiki/Prusa_Mendel 6 | // http://github.com/prusajr/PrusaMendel 7 | // 8 | // (c) 2012 Josef Průša 9 | // (c) 2013 Metamáquina 10 | // 11 | // Authors: 12 | // * Josef Průša 13 | // * Felipe C. da S. Sanches 14 | // * Rafael H. de L. Moretti 15 | // 16 | // This program is free software: you can redistribute it and/or modify 17 | // it under the terms of the GNU General Public License as published by 18 | // the Free Software Foundation, either version 3 of the License, or 19 | // (at your option) any later version. 20 | // 21 | // This program is distributed in the hope that it will be useful, 22 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 23 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 24 | // GNU General Public License for more details. 25 | // 26 | // You should have received a copy of the GNU General Public License 27 | // along with this program. If not, see . 28 | 29 | include 30 | include ; 31 | include 32 | 33 | module barclamp(){ 34 | BillOfMaterials(category="3D Printed", partname="Bar Clamp", ref="MM2_BC"); 35 | 36 | outer_diameter = threaded_rod_diameter/2 + 2.4; 37 | 38 | material("ABS"){ 39 | difference(){ 40 | union(){ 41 | translate([outer_diameter, outer_diameter, 0]) 42 | cylinder(h =outer_diameter*2, r = outer_diameter, $fn = 100); 43 | 44 | translate([outer_diameter, 0, 0]) 45 | cube([outer_diameter+1.5,outer_diameter*2,outer_diameter*2]); 46 | 47 | translate([18, 2*outer_diameter, outer_diameter]) 48 | rotate([90, 0, 0]) 49 | nut(outer_diameter*2, outer_diameter*2, false); 50 | } 51 | 52 | translate([18, outer_diameter, 9]) 53 | cube([18,05,20], center=true); 54 | 55 | translate([outer_diameter, outer_diameter, -1]) 56 | cylinder(h = 20, r = threaded_rod_diameter/2, $fn = 80); 57 | 58 | translate([17, 17, outer_diameter]) 59 | rotate([90, 00, 00]) 60 | cylinder(h = 20, r = threaded_rod_diameter/2, $fn = 80); 61 | } 62 | } 63 | } 64 | 65 | barclamp(); 66 | -------------------------------------------------------------------------------- /small_extruder_gear.scad: -------------------------------------------------------------------------------- 1 | // (c) 2011 Guy 'DeuxVis' P. 2 | // (c) 2013 Metamáquina 3 | // 4 | // Authors: 5 | // * Guy 'DeuxVis' P. 6 | // * Felipe C. da S. Sanches 7 | // * Rafael H. de L. Moretti 8 | // 9 | // This program is free software: you can redistribute it and/or modify 10 | // it under the terms of the GNU General Public License as published by 11 | // the Free Software Foundation, either version 3 of the License, or 12 | // (at your option) any later version. 13 | // 14 | // This program is distributed in the hope that it will be useful, 15 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 16 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 | // GNU General Public License for more details. 18 | // 19 | // You should have received a copy of the GNU General Public License 20 | // along with this program. If not, see . 21 | 22 | use ; 23 | include ; 24 | include ; 25 | 26 | module motor_gear(teeth=11, shaft_diameter=5){ 27 | BillOfMaterials(category="3D Printed", partname="Small Extruder Gear", ref="MM2_SEG"); 28 | 29 | {//TODO: Add this part to the CAD model 30 | BillOfMaterials("M3x8 grubscrew - TODO", ref="GS_M3x8"); 31 | } 32 | 33 | material("ABS") 34 | render() 35 | translate([0,0,5]) 36 | difference() { 37 | union() { 38 | //gear 39 | herringbone_gear( teeth=teeth, $fn=50 ); 40 | 41 | translate( [0, 0, 13] ) 42 | mirror( [0, 0, 1] ) 43 | difference() { 44 | //base 45 | rotate_extrude($fn=120) { 46 | square( [9, 8] ); 47 | square( [10, 7] ); 48 | translate( [9, 7] ) circle( 1, $fn=50 ); 49 | } 50 | 51 | //captive nut and grub holes 52 | translate( [0, 20, 4] ) rotate( [90, 0, 0] ) union() { 53 | //enterance 54 | translate( [0, -3, 14.5] ) cube( [5.4, 6, 2.4], center=true ); 55 | //nut 56 | translate( [0, 0, 13.3] ) rotate( [0, 0, 30] ) cylinder( r=3.12, h=2.4, $fn=6 ); 57 | //grub hole 58 | translate( [0, 0, 9] ) cylinder( r=1.5, h=10, $fn=20 ); 59 | } 60 | } 61 | } 62 | 63 | //shaft hole 64 | translate( [0, 0, -6] ) 65 | cylinder( r=shaft_diameter/2, h=20, $fn=20 ); 66 | } 67 | } 68 | 69 | motor_gear(); 70 | -------------------------------------------------------------------------------- /lasercutter_6mm_MDF_SpoolHolder.scad: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Author: 4 | // * Felipe C. da S. Sanches 5 | // * Sara Rodriguez 6 | // 7 | // This program is free software: you can redistribute it and/or modify 8 | // it under the terms of the GNU General Public License as published by 9 | // the Free Software Foundation, either version 3 of the License, or 10 | // (at your option) any later version. 11 | // 12 | // This program is distributed in the hope that it will be useful, 13 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | // GNU General Public License for more details. 16 | // 17 | // You should have received a copy of the GNU General Public License 18 | // along with this program. If not, see . 19 | 20 | //utils 21 | use ; 22 | use ; 23 | include ; 24 | include ; 25 | use ; 26 | use ; 27 | use 28 | 29 | 30 | //measures copy of FilamentSpoolHolder.scad 31 | thickness = 6; 32 | margin = 10; 33 | 34 | feet_height = 12; 35 | feet_width = 50; 36 | base_height = 80; 37 | 38 | adjust=12; 39 | 40 | total_width = 160+2*thickness+2*margin+adjust/2; 41 | 42 | top_cut_height = 20; 43 | top_cut_width = 9; 44 | 45 | radius = 15; 46 | rad=3/2; 47 | 48 | spool_holder_width = 160+2*margin+2*thickness; 49 | spool_holder_height = 40; 50 | 51 | tslot_length = 16; 52 | tslot_diameter = 3; 53 | 54 | hole_domed_cap_nut=12.75; 55 | 56 | bar_diameter=8; 57 | bar_length= spool_holder_width+hole_domed_cap_nut*2; 58 | 59 | total_height = 160/2+35/2-bar_diameter/2+top_cut_height+feet_height+top_cut_width/2; 60 | radius_feet=5; 61 | 62 | diameter=3; 63 | 64 | //measures 65 | 66 | distance=5; 67 | 68 | module lasercutter_panel(){ 69 | FilamentSpoolHolder_sidepanel_face(); 70 | 71 | translate([0,-total_height,0]) 72 | FilamentSpoolHolder_sidepanel_face(); 73 | 74 | rotate([0,0,90]) 75 | translate([0,(-base_height+total_width+spool_holder_height)/2+distance,0]) 76 | FilamentSpoolHolder_front_and_back_panels_face(); 77 | 78 | rotate([0,0,90]) 79 | translate([0,(-base_height/2-(+total_width+spool_holder_height)/2-distance),0]) 80 | FilamentSpoolHolder_front_and_back_panels_face(); 81 | } 82 | 83 | lasercutter_panel(); 84 | -------------------------------------------------------------------------------- /large_extruder_gear.scad: -------------------------------------------------------------------------------- 1 | // (c) 2011 Guy 'DeuxVis' P. 2 | // (c) 2013 Metamáquina 3 | // 4 | // Authors: 5 | // * Guy 'DeuxVis' P. 6 | // * Felipe C. da S. Sanches 7 | // * Rafael H. de L. Moretti 8 | // 9 | // This program is free software: you can redistribute it and/or modify 10 | // it under the terms of the GNU General Public License as published by 11 | // the Free Software Foundation, either version 3 of the License, or 12 | // (at your option) any later version. 13 | // 14 | // This program is distributed in the hope that it will be useful, 15 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 16 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 | // GNU General Public License for more details. 18 | // 19 | // You should have received a copy of the GNU General Public License 20 | // along with this program. If not, see . 21 | 22 | use ; 23 | include ; 24 | include ; 25 | include ; 26 | 27 | module extruder_gear(teeth=37, circles=12, shaft=8.6){ 28 | BillOfMaterials(category="3D Printed", partname="Large Extruder Gear", ref="MM2_LEG"); 29 | 30 | body_thickness = 4; 31 | hub_thickness = 8; 32 | 33 | material("ABS") 34 | difference(){ 35 | union() { 36 | //hub 37 | translate([0,0,-0.01]) 38 | cylinder( r1=15, r2=9, h=hub_thickness ); 39 | 40 | difference(){ 41 | //gear 42 | translate([0,0,gear_thickness/2]) 43 | herringbone_gear( gear_thickness=gear_thickness, teeth=teeth, shaft=shaft, $fn=40 ); 44 | 45 | //central cut to make the gear thin 46 | translate([0,0,body_thickness]) 47 | cylinder(r1=26, r2=29, h=gear_thickness - body_thickness + 0.01); 48 | } 49 | 50 | } 51 | 52 | for (i=[0:circles-1]) 53 | rotate(i*360/circles) 54 | translate([0,0,-0.1]) 55 | if (i%2==0){ 56 | sector_hole(); 57 | } 58 | else{ 59 | rotate(2) 60 | translate([12,0,-0.01]) 61 | scale(0.6) 62 | linear_extrude(height=20) import("MM_hole.dxf", layer="eme"); 63 | } 64 | 65 | //M8 hobbed bolt head fit washer 66 | translate( [0, 0, 2.5 -0.01] ) 67 | cylinder( r=12.9/sqrt(3), h=10, $fn=6 ); 68 | 69 | translate( [0, 0, -0.1] ) 70 | cylinder( r=shaft/2, h=10, $fn=20 ); 71 | } 72 | } 73 | 74 | extruder_gear(); 75 | -------------------------------------------------------------------------------- /ZLink.scad: -------------------------------------------------------------------------------- 1 | // z_threaded_bar_link (a.k.a. z-link) 2 | // 3 | // These are the plastic parts that link the XPlatform to the 4 | // Z-axis threaded bars. 5 | // 6 | // (c) 2013 Metamáquina 7 | // 8 | // Author: 9 | // * Felipe C. da S. Sanches 10 | // 11 | // This program is free software: you can redistribute it and/or modify 12 | // it under the terms of the GNU General Public License as published by 13 | // the Free Software Foundation, either version 3 of the License, or 14 | // (at your option) any later version. 15 | // 16 | // This program is distributed in the hope that it will be useful, 17 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 18 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 | // GNU General Public License for more details. 20 | // 21 | // You should have received a copy of the GNU General Public License 22 | // along with this program. If not, see . 23 | 24 | include ; 25 | include ; 26 | include ; 27 | include ; 28 | 29 | module ZLink(clearance = 0.2, hull_size=0){ 30 | BillOfMaterials(category="3D Printed", partname="ZLink", ref="MM2_ZL"); 31 | 32 | material("ABS"){ 33 | difference(){ 34 | union(){ 35 | linear_extrude(height=2.6){ 36 | difference(){ 37 | hull(){ 38 | for (i=[-1,1]) 39 | translate([i*dx_z_threaded, 0]) 40 | circle(r=6); 41 | } 42 | for (i=[-1,1]) 43 | translate([i*dx_z_threaded, 0]) 44 | circle(r=m3_diameter/2, $fn=20); 45 | } 46 | } 47 | for (i=[-1,1]) 48 | translate([i*dx_z_threaded, 0, 2.6]) cylinder(r=5, h=2, $fn=6); 49 | } 50 | 51 | for (i=[-1,1]) 52 | translate([i*dx_z_threaded, 0, 2]) cylinder(r=3, h=5, $fn=6); 53 | } 54 | 55 | translate([0,Zlink_hole_height, ZLink_rod_height]) 56 | rotate([90, 0, 0]){ 57 | linear_extrude(height=XPlatform_height - thickness) 58 | difference(){ 59 | circle($fn=6, r=11); 60 | circle($fn=6, r=8); 61 | } 62 | 63 | translate([0,0,7]){ 64 | linear_extrude(height=4) 65 | difference(){ 66 | circle($fn=6, r=10); 67 | hull(){ 68 | for (i=[-1,1]) 69 | translate([0,i*hull_size/2]) 70 | circle($fn=20, r=(8+clearance)/2); 71 | } 72 | } 73 | } 74 | } 75 | } 76 | } 77 | 78 | ZLink(); 79 | 80 | -------------------------------------------------------------------------------- /PTFE_liner.scad: -------------------------------------------------------------------------------- 1 | // PTFE liner for 3d printer hotend (JHead) 2 | // 2d/3d model 3 | // 4 | // (c) 2013 Metamáquina 5 | // 6 | // Author: 7 | // * Felipe C. da S. Sanches 8 | // 9 | // This program is free software: you can redistribute it and/or modify 10 | // it under the terms of the GNU General Public License as published by 11 | // the Free Software Foundation, either version 3 of the License, or 12 | // (at your option) any later version. 13 | // 14 | // This program is distributed in the hope that it will be useful, 15 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 16 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 | // GNU General Public License for more details. 18 | // 19 | // You should have received a copy of the GNU General Public License 20 | // along with this program. If not, see . 21 | 22 | use ; 23 | 24 | module PTFE_liner_2d_outline(dimensions=true){ 25 | epsilon = 0.01; 26 | 27 | d1 = 6.33; 28 | d2 = 3.25; 29 | d4 = 3.0; 30 | d5a = 4.5; 31 | d5b = 3.0; 32 | 33 | l2 = 47; 34 | l1 = l2 - (d1-d2)/(2*tan(118/2)); 35 | l3 = 47.5; 36 | l4 = l3 + 1; 37 | l5 = 2; 38 | 39 | angulo = 2*atan2((d2-d1)/2,l2-l1); 40 | echo(str("angulo = ",angulo," graus")); 41 | 42 | if (dimensions){ 43 | dimension(0, 8, l2, 8, line_thickness=0.05, fontsize=0.8); 44 | dimension(0, 10, l1, 10, line_thickness=0.05, fontsize=0.8); 45 | 46 | translate([l5,0]) 47 | dimension(-l5, 6, 0, 6, line_thickness=0.05, fontsize=0.8); 48 | 49 | translate([4,0]) 50 | rotate(90){ 51 | dimension(-d5a/2, 11, d5a/2, 11, line_thickness=0.05, fontsize=0.8); 52 | dimension(-d5b/2, 9, d5b/2, 9, line_thickness=0.05, fontsize=0.8); 53 | } 54 | 55 | translate([l1-1,0]) 56 | rotate(-90) 57 | dimension(-d1/2, 8, d1/2, 8, line_thickness=0.05, fontsize=0.8); 58 | } 59 | 60 | difference(){ 61 | //exterior outline 62 | hull(){ 63 | translate([0,-d1/2]) 64 | square([l1,d1]); 65 | 66 | translate([0,-d2/2]) 67 | square([l2,d2]); 68 | } 69 | 70 | //interior outline 71 | translate([0,-d4/2]) 72 | square([l3,d4]); 73 | 74 | //entrance interior bevel 75 | hull(){ 76 | translate([l5-epsilon,-d5b/2]) 77 | square([epsilon,d5b]); 78 | 79 | translate([-epsilon,-d5a/2]) 80 | square([epsilon,d5a]); 81 | } 82 | } 83 | } 84 | 85 | module PTFE_liner(){ 86 | color("red") 87 | rotate_extrude($fn=50) 88 | rotate(90) 89 | PTFE_liner_2d_outline(); 90 | } 91 | 92 | PTFE_liner_2d_outline(); 93 | //PTFE_liner(); 94 | 95 | -------------------------------------------------------------------------------- /hardware/heatbed/_autosave-heatbed.kicad_pcb: -------------------------------------------------------------------------------- 1 | (kicad_pcb (version 3) (host pcbnew "(2012-nov-02)-testing") 2 | 3 | (general 4 | (links 0) 5 | (no_connects 0) 6 | (area 0 0 0 0) 7 | (thickness 1.6) 8 | (drawings 0) 9 | (tracks 0) 10 | (zones 0) 11 | (modules 0) 12 | (nets 1) 13 | ) 14 | 15 | (page A3) 16 | (layers 17 | (15 F.Cu signal) 18 | (0 B.Cu signal) 19 | (16 B.Adhes user) 20 | (17 F.Adhes user) 21 | (18 B.Paste user) 22 | (19 F.Paste user) 23 | (20 B.SilkS user) 24 | (21 F.SilkS user) 25 | (22 B.Mask user) 26 | (23 F.Mask user) 27 | (24 Dwgs.User user) 28 | (25 Cmts.User user) 29 | (26 Eco1.User user) 30 | (27 Eco2.User user) 31 | (28 Edge.Cuts user) 32 | ) 33 | 34 | (setup 35 | (last_trace_width 0.254) 36 | (trace_clearance 0.254) 37 | (zone_clearance 0.508) 38 | (zone_45_only no) 39 | (trace_min 0.254) 40 | (segment_width 0.2) 41 | (edge_width 0.15) 42 | (via_size 0.889) 43 | (via_drill 0.635) 44 | (via_min_size 0.889) 45 | (via_min_drill 0.508) 46 | (uvia_size 0.508) 47 | (uvia_drill 0.127) 48 | (uvias_allowed no) 49 | (uvia_min_size 0.508) 50 | (uvia_min_drill 0.127) 51 | (pcb_text_width 0.3) 52 | (pcb_text_size 1 1) 53 | (mod_edge_width 0.15) 54 | (mod_text_size 1 1) 55 | (mod_text_width 0.15) 56 | (pad_size 1 1) 57 | (pad_drill 0.6) 58 | (pad_to_mask_clearance 0) 59 | (aux_axis_origin 0 0) 60 | (visible_elements FFFFFFBF) 61 | (pcbplotparams 62 | (layerselection 3178497) 63 | (usegerberextensions true) 64 | (excludeedgelayer true) 65 | (linewidth 152400) 66 | (plotframeref false) 67 | (viasonmask false) 68 | (mode 1) 69 | (useauxorigin false) 70 | (hpglpennumber 1) 71 | (hpglpenspeed 20) 72 | (hpglpendiameter 15) 73 | (hpglpenoverlay 2) 74 | (psnegative false) 75 | (psa4output false) 76 | (plotreference true) 77 | (plotvalue true) 78 | (plotothertext true) 79 | (plotinvisibletext false) 80 | (padsonsilk false) 81 | (subtractmaskfromsilk false) 82 | (outputformat 1) 83 | (mirror false) 84 | (drillshape 1) 85 | (scaleselection 1) 86 | (outputdirectory "")) 87 | ) 88 | 89 | (net 0 "") 90 | 91 | (net_class Default "This is the default net class." 92 | (clearance 0.254) 93 | (trace_width 0.254) 94 | (via_dia 0.889) 95 | (via_drill 0.635) 96 | (uvia_dia 0.508) 97 | (uvia_drill 0.127) 98 | (add_net "") 99 | ) 100 | 101 | ) 102 | -------------------------------------------------------------------------------- /rounded_square.scad: -------------------------------------------------------------------------------- 1 | // helper module for drawing rectangles with rounded borders 2 | // 3 | // (c) 2013 Metamáquina 4 | // 5 | // Author: 6 | // * Felipe C. da S. Sanches 7 | // 8 | // This program is free software: you can redistribute it and/or modify 9 | // it under the terms of the GNU General Public License as published by 10 | // the Free Software Foundation, either version 3 of the License, or 11 | // (at your option) any later version. 12 | // 13 | // This program is distributed in the hope that it will be useful, 14 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | // GNU General Public License for more details. 17 | // 18 | // You should have received a copy of the GNU General Public License 19 | // along with this program. If not, see . 20 | 21 | module rounded_square(dim, corners=[10,10,10,10], center=false){ 22 | w=dim[0]; 23 | h=dim[1]; 24 | 25 | if (center){ 26 | translate([-w/2, -h/2]) 27 | rounded_square_(dim, corners=corners); 28 | }else{ 29 | rounded_square_(dim, corners=corners); 30 | } 31 | } 32 | 33 | module rounded_square_(dim, corners, center=false){ 34 | w=dim[0]; 35 | h=dim[1]; 36 | render(){ 37 | difference(){ 38 | square([w,h]); 39 | 40 | if (corners[0]) 41 | square([corners[0], corners[0]]); 42 | 43 | if (corners[1]) 44 | translate([w-corners[1],0]) 45 | square([corners[1], corners[1]]); 46 | 47 | if (corners[2]) 48 | translate([0,h-corners[2]]) 49 | square([corners[2], corners[2]]); 50 | 51 | if (corners[3]) 52 | translate([w-corners[3], h-corners[3]]) 53 | square([corners[3], corners[3]]); 54 | } 55 | 56 | if (corners[0]) 57 | translate([corners[0], corners[0]]) 58 | intersection(){ 59 | circle(r=corners[0]); 60 | translate([-corners[0], -corners[0]]) 61 | square([corners[0], corners[0]]); 62 | } 63 | 64 | if (corners[1]) 65 | translate([w-corners[1], corners[1]]) 66 | intersection(){ 67 | circle(r=corners[1]); 68 | translate([0, -corners[1]]) 69 | square([corners[1], corners[1]]); 70 | } 71 | 72 | if (corners[2]) 73 | translate([corners[2], h-corners[2]]) 74 | intersection(){ 75 | circle(r=corners[2]); 76 | translate([-corners[2], 0]) 77 | square([corners[2], corners[2]]); 78 | } 79 | 80 | if (corners[3]) 81 | translate([w-corners[3], h-corners[3]]) 82 | intersection(){ 83 | circle(r=corners[3]); 84 | square([corners[3], corners[3]]); 85 | } 86 | } 87 | } 88 | 89 | -------------------------------------------------------------------------------- /gears.scad: -------------------------------------------------------------------------------- 1 | // These gears are derived from: 2 | // "An extruder gear set for the TechZone Huxley, 3 | // featuring Herringbone teeth." 4 | // 5 | // This use 2 modules from the MCAD library that you can 6 | // get from https://github.com/elmom/MCAD. 7 | // 8 | // Part - the motor gear mount hub with set screw hole - 9 | // derived from http://www.thingiverse.com/thing:3104 10 | // (thanks GilesBathgate) which is under GPL CC license. 11 | // 12 | // (c) 2011 Guy 'DeuxVis' P. 13 | // (c) 2013 Metamáquina 14 | // 15 | // Authors: 16 | // * Giles Bathgate 17 | // * Guy 'DeuxVis' P. 18 | // * Felipe C. da S. Sanches 19 | // * Rafael H. de L. Moretti 20 | // 21 | // This program is free software: you can redistribute it and/or modify 22 | // it under the terms of the GNU General Public License as published by 23 | // the Free Software Foundation, either version 3 of the License, or 24 | // (at your option) any later version. 25 | // 26 | // This program is distributed in the hope that it will be useful, 27 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 28 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 29 | // GNU General Public License for more details. 30 | // 31 | // You should have received a copy of the GNU General Public License 32 | // along with this program. If not, see . 33 | 34 | use 35 | 36 | /* Herringbone gear module, adapted from MCAD/involute_gears */ 37 | module herringbone_gear( teeth=12, shaft=5, gear_thickness=10 ) { 38 | twist=200; 39 | pressure_angle=30; 40 | 41 | gear( 42 | number_of_teeth=teeth, 43 | circular_pitch=320, 44 | pressure_angle=pressure_angle, 45 | clearance = 0.2, 46 | gear_thickness = gear_thickness/2, 47 | rim_thickness = gear_thickness/2, 48 | rim_width = 1, 49 | hub_thickness = gear_thickness/2, 50 | hub_diameter=1, 51 | bore_diameter=shaft, 52 | circles=0, 53 | twist=twist/teeth 54 | ); 55 | 56 | mirror( [0,0,1] ) 57 | gear( 58 | number_of_teeth=teeth, 59 | circular_pitch=320, 60 | pressure_angle=pressure_angle, 61 | clearance = 0.2, 62 | gear_thickness = gear_thickness/2, 63 | rim_thickness = gear_thickness/2, 64 | rim_width = 1, 65 | hub_thickness = gear_thickness/2, 66 | hub_diameter=1, 67 | bore_diameter=shaft, 68 | circles=0, 69 | twist=twist/teeth 70 | ); 71 | } 72 | 73 | module sector_hole(){ 74 | gear_thickness=4; 75 | render() 76 | rotate([0, 0, -4]) 77 | intersection(){ 78 | difference(){ 79 | cylinder(r=26,h=gear_thickness+2); 80 | cylinder(r=12,h=gear_thickness+2); 81 | } 82 | cube([100, 100, gear_thickness+2]); 83 | rotate([0, 0, 90-25]) cube([100, 100, gear_thickness+2]); 84 | } 85 | } 86 | 87 | -------------------------------------------------------------------------------- /heated_bed/heatbed-cache.lib: -------------------------------------------------------------------------------- 1 | EESchema-LIBRARY Version 2.3 Date: Mon 08 Apr 2013 08:47:42 PM BRT 2 | #encoding utf-8 3 | # 4 | # AYLONS 5 | # 6 | DEF AYLONS U 0 40 Y Y 1 F N 7 | F0 "U" -300 550 60 H V C CNN 8 | F1 "AYLONS" -300 400 60 H V C CNN 9 | F2 "~" -100 100 60 H V C CNN 10 | F3 "~" -100 100 60 H V C CNN 11 | DRAW 12 | P 2 0 1 0 -650 250 -550 250 N 13 | P 2 0 1 0 -650 350 -650 250 N 14 | P 2 0 1 0 -500 250 -500 750 N 15 | P 2 0 1 0 -500 400 -700 200 N 16 | P 2 0 1 0 -500 600 -700 800 N 17 | P 2 0 1 0 -150 500 -500 500 N 18 | P 2 0 1 0 -150 750 -150 250 N 19 | P 2 0 1 0 -100 650 0 650 N 20 | P 2 0 1 0 -100 750 -100 650 N 21 | P 2 0 1 0 50 200 -150 400 N 22 | P 2 0 1 0 50 800 -150 600 N 23 | ENDDRAW 24 | ENDDEF 25 | # 26 | # CONN_4 27 | # 28 | DEF CONN_4 P 0 40 Y N 1 F N 29 | F0 "P" -50 0 50 V V C CNN 30 | F1 "CONN_4" 50 0 50 V V C CNN 31 | F2 "~" 0 0 60 H V C CNN 32 | F3 "~" 0 0 60 H V C CNN 33 | DRAW 34 | S -100 200 100 -200 0 1 0 N 35 | X P1 1 -350 150 250 R 50 50 1 1 P I 36 | X P2 2 -350 50 250 R 50 50 1 1 P I 37 | X P3 3 -350 -50 250 R 50 50 1 1 P I 38 | X P4 4 -350 -150 250 R 50 50 1 1 P I 39 | ENDDRAW 40 | ENDDEF 41 | # 42 | # LED 43 | # 44 | DEF LED D 0 40 Y N 1 F N 45 | F0 "D" 0 100 50 H V C CNN 46 | F1 "LED" 0 -100 50 H V C CNN 47 | F2 "~" 0 0 60 H V C CNN 48 | F3 "~" 0 0 60 H V C CNN 49 | $FPLIST 50 | LED-3MM 51 | LED-5MM 52 | LED-10MM 53 | LED-0603 54 | LED-0805 55 | LED-1206 56 | LEDV 57 | $ENDFPLIST 58 | DRAW 59 | P 2 0 1 0 50 50 50 -50 N 60 | P 3 0 1 0 -50 50 50 0 -50 -50 F 61 | P 3 0 1 0 65 -40 110 -80 105 -55 N 62 | P 3 0 1 0 80 -25 125 -65 120 -40 N 63 | X A 1 -200 0 150 R 40 40 1 1 P 64 | X K 2 200 0 150 L 40 40 1 1 P 65 | ENDDRAW 66 | ENDDEF 67 | # 68 | # MOUNTING_HOLE 69 | # 70 | DEF MOUNTING_HOLE MH 0 40 Y Y 1 F N 71 | F0 "MH" 0 -300 60 H V C CNN 72 | F1 "MOUNTING_HOLE" 0 -200 60 H V C CNN 73 | F2 "~" 0 -750 60 H V C CNN 74 | F3 "~" 0 -750 60 H V C CNN 75 | DRAW 76 | C 0 0 141 0 1 0 N 77 | P 2 0 1 0 -100 -100 100 100 N 78 | P 2 0 1 0 -100 100 100 -100 N 79 | ENDDRAW 80 | ENDDEF 81 | # 82 | # R 83 | # 84 | DEF R R 0 0 N Y 1 F N 85 | F0 "R" 80 0 40 V V C CNN 86 | F1 "R" 7 1 40 V V C CNN 87 | F2 "~" -70 0 30 V V C CNN 88 | F3 "~" 0 0 30 H V C CNN 89 | $FPLIST 90 | R? 91 | SM0603 92 | SM0805 93 | R?-* 94 | SM1206 95 | $ENDFPLIST 96 | DRAW 97 | S -40 150 40 -150 0 1 12 N 98 | X ~ 1 0 250 100 D 60 60 1 1 P 99 | X ~ 2 0 -250 100 U 60 60 1 1 P 100 | ENDDRAW 101 | ENDDEF 102 | # 103 | # THERMISTOR 104 | # 105 | DEF THERMISTOR TH 0 0 N Y 1 F N 106 | F0 "TH" 100 50 50 V V C CNN 107 | F1 "THERMISTOR" -100 0 50 V V C CNN 108 | F2 "~" 0 0 60 H V C CNN 109 | F3 "~" 0 0 60 H V C CNN 110 | $FPLIST 111 | R? 112 | SM0603 113 | SM0805 114 | $ENDFPLIST 115 | DRAW 116 | T 900 75 -150 60 0 0 1 - Normal 0 C C 117 | S -40 150 40 -150 0 1 8 N 118 | P 5 0 1 0 -75 125 -75 75 75 -75 75 -125 75 -125 N 119 | X ~ 1 0 250 100 D 60 60 1 1 P 120 | X ~ 2 0 -250 100 U 60 60 1 1 P 121 | ENDDRAW 122 | ENDDEF 123 | # 124 | #End Library 125 | -------------------------------------------------------------------------------- /jheads.scad: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Author: 4 | // * Felipe C. da S. Sanches 5 | // 6 | // This program is free software: you can redistribute it and/or modify 7 | // it under the terms of the GNU General Public License as published by 8 | // the Free Software Foundation, either version 3 of the License, or 9 | // (at your option) any later version. 10 | // 11 | // This program is distributed in the hope that it will be useful, 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | // GNU General Public License for more details. 15 | // 16 | // You should have received a copy of the GNU General Public License 17 | // along with this program. If not, see . 18 | 19 | include ; 20 | include ; 21 | include ; 22 | include ; 23 | use ; 24 | 25 | module J_head_assembly(){ 26 | 27 | extruders_distance=9; 28 | 29 | J_head_body(); 30 | 31 | translate([-0.15625*25.4+extruders_distance/2,-0.250*25.4,-50]) 32 | //translate([1*extruders_distance,0,0]) 33 | v4nozzle(); 34 | 35 | 36 | 37 | rotate([0,0,180]) 38 | translate([-0.15625*25.4+extruders_distance/2,-0.250*25.4,-50]) 39 | //translate([0,0,0]) 40 | 41 | #v4nozzle(); 42 | 43 | 44 | // #v4nozzle(); 45 | } 46 | 47 | module J_head_body(){ 48 | BillOfMaterials("JHead machined body"); 49 | 50 | { 51 | //TODO: Add this part to the CAD model 52 | BillOfMaterials("PTFE liner"); 53 | } 54 | 55 | h1=50; 56 | r1=2*10.4/2; 57 | 58 | h2=1; 59 | r2=2*13/2; 60 | 61 | h3=13.6; 62 | r3=2*16/2; 63 | 64 | h4=1; 65 | r4=2*16/2; 66 | 67 | h5=1; 68 | r5=2*16/2; 69 | 70 | h6=1; 71 | r6=2*16/2; 72 | 73 | h7=1; 74 | r7=2*16/2; 75 | 76 | h8=10.4; 77 | r8=2*16/2; 78 | 79 | h9=4.64; 80 | r9=2*(5/8)*inch/2; 81 | 82 | 83 | material("peek"){ 84 | difference(){ 85 | union(){ 86 | translate([0,0,-50+4.76+4.64]){ 87 | cylinder(h=h1,r=r1); 88 | 89 | cylinder(h=h2,r=r2); 90 | 91 | translate([0,0,1]) 92 | cylinder(h=h3,r=r3); 93 | 94 | translate([0,0,1+13.6+2.5]) 95 | cylinder(h=h4,r=r4); 96 | 97 | translate([0,0,1+13.6+2.5+1+2.5]) 98 | cylinder(h=h5,r=r5); 99 | 100 | translate([0,0,1+13.6+2.5+1+2.5+1+2.5]) 101 | cylinder(h=h6,r=r6); 102 | 103 | translate([0,0,1+13.6+2.5+1+2.5+1+2.5+1+2.5]) 104 | cylinder(h=h7,r=r7); 105 | 106 | translate([0,0,1+13.6+2.5+1+2.5+1+2.5+1+2.5+1+2.5]) 107 | cylinder(h=h8,r=r8); 108 | 109 | translate([0,0,50-4.64]) 110 | cylinder(h=h9,r=r9); 111 | } 112 | } 113 | 114 | union() 115 | translate([13+10/2,0,-50+4.76+4.64-10/2+6]) 116 | cube(size=[10,100,10], center=true ); 117 | 118 | translate([-13-10/2,0,-50+4.76+4.64-10/2+6]) 119 | cube(size=[10,100,10], center=true ); 120 | } 121 | } 122 | } 123 | 124 | J_head_assembly(); 125 | -------------------------------------------------------------------------------- /spacer.scad: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Author: 4 | // * Felipe C. da S. Sanches 5 | // 6 | // This program is free software: you can redistribute it and/or modify 7 | // it under the terms of the GNU General Public License as published by 8 | // the Free Software Foundation, either version 3 of the License, or 9 | // (at your option) any later version. 10 | // 11 | // This program is distributed in the hope that it will be useful, 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | // GNU General Public License for more details. 15 | // 16 | // You should have received a copy of the GNU General Public License 17 | // along with this program. If not, see . 18 | 19 | include ; 20 | include ; 21 | include ; 22 | 23 | m3_diameter = 3; 24 | 25 | spacers_clearance = 0.1; // extra room for the spacers hole diameter 26 | 27 | module double_M3_lasercut_spacer(){ 28 | M3_spacer(); 29 | 30 | translate([0,0,thickness]) 31 | M3_spacer(); 32 | } 33 | 34 | module M3_spacer(){ 35 | BillOfMaterials(category = "Lasercut wood", "M3 Lasercut spacer"); 36 | 37 | material("lasercut") 38 | linear_extrude(height=thickness) 39 | M3_spacer_face(); 40 | } 41 | 42 | module M3_spacer_face(){ 43 | difference(){ 44 | circle(r=m3_spacer_radius, $fn=30); 45 | circle(r=(m3_diameter + spacers_clearance)/2, $fn=30); 46 | } 47 | } 48 | 49 | module set_of_M3_spacers(w=4, h=4){ 50 | for (x=[1:w]){ 51 | for (y=[1:h]){ 52 | translate([x*3.2*m3_diameter, y*3.2*m3_diameter]) 53 | M3_spacer_face(); 54 | } 55 | } 56 | } 57 | 58 | module M4_spacer(){ 59 | BillOfMaterials(category = "Lasercut wood", "M4 Lasercut spacer"); 60 | 61 | material("lasercut") 62 | linear_extrude(height=thickness) 63 | M4_spacer_face(); 64 | } 65 | 66 | module M4_spacer_face(){ 67 | difference(){ 68 | circle(r=m4_diameter*1.5, $fn=30); 69 | circle(r=(m4_diameter + spacers_clearance)/2, $fn=30); 70 | } 71 | } 72 | 73 | module set_of_M4_spacers(w=4, h=4){ 74 | for (x=[1:w]){ 75 | for (y=[1:h]){ 76 | translate([x*3.2*m4_diameter, y*3.2*m4_diameter]) 77 | M4_spacer_face(); 78 | } 79 | } 80 | } 81 | 82 | module hexspacer_38mm(){ 83 | BillOfMaterials(str("Female-female 38mm Hexspacer (CBTS135A)"), ref="CBTS135A"); 84 | 85 | generic_hexspacer(length=38); 86 | } 87 | 88 | module hexspacer_32mm(){ 89 | BillOfMaterials(str("Female-female 32mm Hexspacer (CBTS130A)"), ref="CBTS130A"); 90 | 91 | generic_hexspacer(length=32); 92 | } 93 | 94 | module generic_hexspacer(D=8, d=m3_diameter, h=hexspacer_length){ 95 | material("metal") 96 | linear_extrude(height=h) 97 | difference(){ 98 | circle(r=D/2, $fn=6); 99 | circle(r=d/2, $fn=20); 100 | } 101 | } 102 | 103 | module generic_nylonspacer(D=8, d=m4_diameter, h=nylonspacer_length){ 104 | material("nylon") 105 | linear_extrude(height=h) 106 | difference(){ 107 | circle(r=D/2, $fn=20); 108 | circle(r=d/2, $fn=20); 109 | } 110 | } 111 | 112 | -------------------------------------------------------------------------------- /jhead.scad: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Author: 4 | // * Felipe C. da S. Sanches 5 | // 6 | // This program is free software: you can redistribute it and/or modify 7 | // it under the terms of the GNU General Public License as published by 8 | // the Free Software Foundation, either version 3 of the License, or 9 | // (at your option) any later version. 10 | // 11 | // This program is distributed in the hope that it will be useful, 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | // GNU General Public License for more details. 15 | // 16 | // You should have received a copy of the GNU General Public License 17 | // along with this program. If not, see . 18 | 19 | include ; 20 | include ; 21 | include ; 22 | include ; 23 | use ; 24 | 25 | module J_head_assembly(){ 26 | 27 | extruders_distance=9; 28 | 29 | J_head_body(); 30 | 31 | translate([-0.15625*25.4,-0.250*25.4,-50]) 32 | //translate([1*extruders_distance,0,0]) 33 | v4nozzle(); 34 | 35 | 36 | // #v4nozzle(); 37 | } 38 | 39 | module J_head_body(){ 40 | BillOfMaterials("JHead machined body", ref="MM2_PEEK"); 41 | 42 | { 43 | //TODO: Add this part to the CAD model 44 | BillOfMaterials("PTFE liner", ref="MM2_PTFE_liner"); 45 | } 46 | 47 | h1=50; 48 | r1=10.4/2; 49 | 50 | h2=1; 51 | r2=13/2; 52 | 53 | h3=13.6; 54 | r3=16/2; 55 | 56 | h4=1; 57 | r4=16/2; 58 | 59 | h5=1; 60 | r5=16/2; 61 | 62 | h6=1; 63 | r6=16/2; 64 | 65 | h7=1; 66 | r7=16/2; 67 | 68 | h8=10.4; 69 | r8=16/2; 70 | 71 | h9=4.64; 72 | r9=(5/8)*inch/2; 73 | 74 | 75 | material("peek"){ 76 | difference(){ 77 | union(){ 78 | translate([0,0,-50+4.76+4.64]){ 79 | cylinder(h=h1,r=r1); 80 | 81 | cylinder(h=h2,r=r2); 82 | 83 | translate([0,0,1]) 84 | cylinder(h=h3,r=r3); 85 | 86 | translate([0,0,1+13.6+2.5]) 87 | cylinder(h=h4,r=r4); 88 | 89 | translate([0,0,1+13.6+2.5+1+2.5]) 90 | cylinder(h=h5,r=r5); 91 | 92 | translate([0,0,1+13.6+2.5+1+2.5+1+2.5]) 93 | cylinder(h=h6,r=r6); 94 | 95 | translate([0,0,1+13.6+2.5+1+2.5+1+2.5+1+2.5]) 96 | cylinder(h=h7,r=r7); 97 | 98 | translate([0,0,1+13.6+2.5+1+2.5+1+2.5+1+2.5+1+2.5]) 99 | cylinder(h=h8,r=r8); 100 | 101 | translate([0,0,50-4.64]) 102 | cylinder(h=h9,r=r9); 103 | } 104 | } 105 | 106 | union() 107 | <<<<<<< .merge_file_K4LOfE 108 | translate([13+10/2,0,-50+4.76+4.64-10/2+6]) 109 | cube(size=[10,100,10], center=true ); 110 | 111 | translate([-13-10/2,0,-50+4.76+4.64-10/2+6]) 112 | cube(size=[10,100,10], center=true ); 113 | ======= 114 | translate([13/2+10/2,0,-50+4.76+4.64-10/2+6]) 115 | cube(size=[10,10,10], center=true ); 116 | 117 | translate([-13/2-10/2,0,-50+4.76+4.64-10/2+6]) 118 | cube(size=[10,10,10], center=true ); 119 | >>>>>>> .merge_file_sSWurE 120 | } 121 | } 122 | } 123 | 124 | J_head_assembly(); 125 | -------------------------------------------------------------------------------- /heated_bed.scad: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Author: 4 | // * Felipe C. da S. Sanches 5 | // 6 | // This program is free software: you can redistribute it and/or modify 7 | // it under the terms of the GNU General Public License as published by 8 | // the Free Software Foundation, either version 3 of the License, or 9 | // (at your option) any later version. 10 | // 11 | // This program is distributed in the hope that it will be useful, 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | // GNU General Public License for more details. 15 | // 16 | // You should have received a copy of the GNU General Public License 17 | // along with this program. If not, see . 18 | 19 | include ; 20 | include ; 21 | include ; 22 | include ; 23 | use ; 24 | 25 | module heated_bed_pcb(width = heated_bed_pcb_width, height = heated_bed_pcb_height){ 26 | BillOfMaterials("Metamaquina heated bed v14, assembled", ref="HB_MM2_14"); 27 | 28 | material("pcb") 29 | linear_extrude(height=heated_bed_pcb_thickness) 30 | heated_bed_pcb_curves(width=width, height=height); 31 | } 32 | 33 | module heated_bed_pcb_curves(width = heated_bed_pcb_width, height = heated_bed_pcb_height, connector_holes=true){ 34 | r = 4; 35 | border = 5; 36 | 37 | connector_area = [26.5, 8.5]; 38 | 39 | translate([-connector_area[0]/2, height/2]) 40 | difference(){ 41 | rounded_square(connector_area, corners=[0,0,4,4]); 42 | 43 | if (connector_holes){ 44 | for (i=[-1.5,-0.5,0.5,1.5]){ 45 | translate([connector_area[0]/2 + i*5,5]) 46 | circle(r=1, $fn=30); 47 | } 48 | } 49 | } 50 | 51 | difference(){ 52 | rounded_square([width, height], corners=[r,r,r,r], $fn=50, center=true); 53 | 54 | for (j=[-1,1]){ 55 | for (i=[-1,1]){ 56 | translate([i*(width/2 - border), j*(height/2 - border)]) 57 | circle(r=3/2, $fn=50); 58 | } 59 | } 60 | } 61 | } 62 | 63 | module heated_bed_silk(width = heated_bed_pcb_width, height = heated_bed_pcb_height){ 64 | line_thickness = 1; 65 | material("silk"){ 66 | translate([0,0,heated_bed_pcb_thickness+0.1]) 67 | difference(){ 68 | square([200,200], center=true); 69 | square([200-2*line_thickness,200-2*line_thickness], center=true); 70 | } 71 | } 72 | } 73 | 74 | module heated_bed_glass(){ 75 | BillOfMaterials(str(heated_bed_glass_thickness, "mm glass for the build platform (",glass_w,"mm x ",glass_h,"mm)"), ref=str("MM2_SIV_",glass_w,"x",glass_h)); 76 | 77 | material("glass") 78 | translate([-glass_w/2, -glass_h/2, heated_bed_pcb_thickness]) 79 | cube([glass_w, glass_h, heated_bed_glass_thickness]); 80 | } 81 | 82 | module heated_bed(){ 83 | { //TODO: Add these parts to the CAD model 84 | BillOfMaterials("Compression Spring CM351 (D=4.5mm, lenght=15.3mm)", 4, ref="CM351"); 85 | BillOfMaterials("M3x30 bolt", 4, ref="H_M3x30"); 86 | BillOfMaterials("M3 washer", 4*3, ref="AL_M3"); 87 | BillOfMaterials("Borboleta M3", 4, ref="P_M3_bo"); 88 | } 89 | 90 | heated_bed_pcb(); 91 | heated_bed_silk(); 92 | heated_bed_glass(); 93 | } 94 | 95 | heated_bed(); 96 | -------------------------------------------------------------------------------- /nuts.scad: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Authors: 4 | // * Felipe C. da S. Sanches 5 | // * Rafael H. de L. Moretti 6 | // 7 | // This program is free software: you can redistribute it and/or modify 8 | // it under the terms of the GNU General Public License as published by 9 | // the Free Software Foundation, either version 3 of the License, or 10 | // (at your option) any later version. 11 | // 12 | // This program is distributed in the hope that it will be useful, 13 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | // GNU General Public License for more details. 16 | // 17 | // You should have received a copy of the GNU General Public License 18 | // along with this program. If not, see . 19 | 20 | include ; 21 | include ; 22 | include ; 23 | 24 | module M25_nut(){ 25 | BillOfMaterials("M2.5 nut", ref="P_M2.5"); 26 | nut(m25_nut_r, R = m25_nut_R, H = m25_nut_height); 27 | } 28 | 29 | module M3_nut(){ 30 | BillOfMaterials("M3 nut", ref="P_M3"); 31 | nut(r = m3_nut_r, R = m3_nut_R, H = m3_nut_height); 32 | } 33 | 34 | module M3_locknut(){ 35 | BillOfMaterials("M3 lock-nut", ref="P_M3_ny"); 36 | locknut(r = 2.25, R = 6.235, H1 = 2.23, H = 3.95); 37 | } 38 | 39 | module M4_nut(){ 40 | BillOfMaterials("M4 nut", ref="P_M4"); 41 | nut(r = m4_nut_r, R = m4_nut_R, H = m4_nut_height); 42 | } 43 | 44 | module M8_nut(){ 45 | BillOfMaterials("M8 nut", ref="P_M8"); 46 | nut(r = m8_nut_r, R = m8_nut_R, H = m8_nut_height); 47 | } 48 | 49 | //TODO: verify this 50 | module new_M8_nut(){ 51 | BillOfMaterials("M8 nut", ref="P_M8"); 52 | nut(r = 6.75, R = 14.76, H = 6.35); 53 | } 54 | 55 | //TODO: verify this 56 | module M8_locknut(){ 57 | BillOfMaterials("M8 lock-nut", ref="P_M8_ny"); 58 | locknut(r = m8_nut_r, R = m8_nut_R, H1 = 6.4, H = 7.94); 59 | } 60 | 61 | module M8_cap_nut(){ 62 | BillOfMaterials("M8 cap-nut", ref="P_M8_ca"); 63 | cap_nut(r = m8_capnut_r, R = m8_capnut_R, H1 = m8_capnut_H1, H = m8_capnut_height); 64 | } 65 | 66 | function hypotenuse(a, b) = sqrt(a*a + b*b); 67 | epsilon = 0.05; 68 | 69 | // Commented lines are not working for all sizes 70 | module nut(r, R, H){ 71 | material("metal") 72 | difference(){ 73 | //hexagon 74 | intersection(){ 75 | cylinder(r=R*2/sqrt(3), h=H, $fn=6); 76 | //sphere(r=hypotenuse(R, H), $fn=60); 77 | //translate([0,0,H]) 78 | //sphere(r=hypotenuse(R, H), $fn=60); 79 | } 80 | 81 | //hole 82 | translate([0,0,-epsilon]) 83 | cylinder(r=r, h=H+2*epsilon); 84 | } 85 | } 86 | 87 | // H: total height 88 | module locknut(r, R, H1, H){ 89 | difference() { 90 | union(){ 91 | nut(r, R, H1); 92 | 93 | intersection(){ 94 | translate([0,0,H1]) cylinder(r=R, h=H-H1, $fn=60); 95 | translate([0,0,H1]) sphere(r=R, $fn=60); 96 | } 97 | } 98 | translate([0,0,-epsilon]) cylinder(r=0.9*R, h=H+2*epsilon, $fn=60); 99 | } 100 | } 101 | 102 | // H: total height 103 | module cap_nut(r, R, H1, H) { 104 | union(){ 105 | nut(r, R, H1); 106 | intersection(){ 107 | translate([0,0,H1]) cylinder(r=R, h=H-H1, $fn=60); 108 | translate([0,0,(H-H1)/2]) sphere(r=R, $fn=60); 109 | } 110 | } 111 | } 112 | 113 | M8_locknut(); 114 | translate([0,30,0]) M8_cap_nut(); 115 | translate([0,70,0]) M8_nut(); 116 | -------------------------------------------------------------------------------- /NEMA.scad: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Author: 4 | // * Felipe C. da S. Sanches 5 | // 6 | // This program is free software: you can redistribute it and/or modify 7 | // it under the terms of the GNU General Public License as published by 8 | // the Free Software Foundation, either version 3 of the License, or 9 | // (at your option) any later version. 10 | // 11 | // This program is distributed in the hope that it will be useful, 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | // GNU General Public License for more details. 15 | // 16 | // You should have received a copy of the GNU General Public License 17 | // along with this program. If not, see . 18 | 19 | include ; 20 | include ; 21 | include ; 22 | include ; 23 | include ; 24 | use ; 25 | include ; 26 | 27 | module NEMA17(){ 28 | BillOfMaterials("NEMA17 stepper motor", ref="SM1.8A1740CHSE"); 29 | 30 | material("rubber"){ 31 | translate([-NEMA17_width/2, -NEMA17_height/2, -0.1]) 32 | intersection(){ 33 | cube([NEMA17_width, NEMA17_height, NEMA17_length]); 34 | translate ([NEMA17_width/2, NEMA17_height/2]) cylinder(r=0.87*NEMA17_width*sqrt(2)/2, h=100); 35 | } 36 | } 37 | 38 | material("metal"){ 39 | translate([0, 0, -motor_shaft_length]) 40 | cylinder(r=motor_shaft_diameter/2, h=motor_shaft_length); 41 | 42 | translate([0,0,-3]) 43 | cylinder(r1=6, r2=8, h=2); 44 | 45 | translate([0,0,-0.2]){ 46 | difference(){ 47 | linear_extrude(height=NEMA17_length/5) 48 | rounded_square([NEMA17_width+2, NEMA17_height+2], center=true, corners= [5,5,5,5]); 49 | 50 | translate([0,0,-0.2]) 51 | linear_extrude(height=1) 52 | NEMA17_holes(central_hole=false); 53 | } 54 | 55 | //connector detail 56 | translate([-15.6/2,NEMA17_width/2 + 1, NEMA17_length - 4]) 57 | cube([15.6, 4.6, 4]); 58 | } 59 | 60 | translate([0,0,NEMA17_length - NEMA17_length/5]) 61 | linear_extrude(height=NEMA17_length/5) 62 | rounded_square([NEMA17_width+2, NEMA17_height+2], center=true, corners=[5,5,5,5]); 63 | } 64 | 65 | translate([0,0, NEMA17_length - 12.5]) 66 | connector(); 67 | } 68 | 69 | module connector(){ 70 | //This is very hacky and someone should clean it up 71 | 72 | translate([-15/2,NEMA17_width/2 + 1, 4]){ 73 | material("nylon") 74 | difference(){ 75 | cube([15, 6, 4]); 76 | translate([1,1,0.5]) cube([13, 6, 3]); 77 | translate([3.5,4,-1]) cube([8, 10, 3]); 78 | } 79 | 80 | material("metal") 81 | for (i=[0:3]){ 82 | translate([4+i*2.3,6, 2]) 83 | rotate([90,0]) 84 | cylinder(r=0.5, h=5); 85 | } 86 | } 87 | } 88 | 89 | module NEMA17_holes(l=15.5, r=12, central_hole=true){ 90 | if (central_hole) 91 | circle(r=r); 92 | 93 | for (i=[-l,l]){ 94 | for (j=[-l,l]){ 95 | translate([i, j]) 96 | circle(r=m3_diameter/2, $fn=20); 97 | } 98 | } 99 | } 100 | 101 | module NEMA17_subassembly(l=15.5, r=12, th=thickness){ 102 | NEMA17(); 103 | 104 | for (i=[-l,l]){ 105 | for (j=[-l,l]){ 106 | translate([i, j, -th - m3_washer_thickness]){ 107 | M3_washer(); 108 | 109 | rotate([180,0]) 110 | M3x10(); 111 | } 112 | } 113 | } 114 | } 115 | 116 | NEMA17_subassembly(); 117 | -------------------------------------------------------------------------------- /belt-clamp.scad: -------------------------------------------------------------------------------- 1 | // Reimplementation of Josef Průša's belt clamp 2 | // Adapted for eighter laser cutting or 3d printing. 3 | // 4 | // (c) 2013 Metamáquina 5 | // 6 | // Author: 7 | // * Felipe C. da S. Sanches 8 | // 9 | // This program is free software: you can redistribute it and/or modify 10 | // it under the terms of the GNU General Public License as published by 11 | // the Free Software Foundation, either version 3 of the License, or 12 | // (at your option) any later version. 13 | // 14 | // This program is distributed in the hope that it will be useful, 15 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 16 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 | // GNU General Public License for more details. 18 | // 19 | // You should have received a copy of the GNU General Public License 20 | // along with this program. If not, see . 21 | 22 | include ; 23 | include ; 24 | include ; 25 | include ; 26 | include ; 27 | 28 | module belt_clamp_holder(){ 29 | r = 5; 30 | s = 28 - 2*r; 31 | hull(){ 32 | for (p=[[s,0], [s,s], [0,0]]){ 33 | translate(p) 34 | circle(r=r, $fn=20); 35 | } 36 | } 37 | } 38 | 39 | //2d shape (good for the lasercutter) 40 | module beltclamp_curves(width, r, for_x_carriage=false, for_y_platform=false){ 41 | d = width/2-r; 42 | 43 | difference(){ 44 | hull(){ 45 | for (x=[-d,d]){ 46 | translate([x, 0]) 47 | circle(r=5, $fn=20); 48 | } 49 | 50 | if(for_x_carriage){ 51 | for (x=[-d,0.7*d]){ 52 | translate([x, 4]) 53 | circle(r=5, $fn=20); 54 | } 55 | } 56 | 57 | if (for_y_platform){ 58 | for (x=[-d,d]){ 59 | translate([x, 0]) 60 | circle(r=8, $fn=20); 61 | } 62 | } 63 | 64 | } 65 | 66 | //These are holes for M3 bolts, but we want 67 | // some clearance so they'll have 3.3mm diameter. 68 | for (x=[-d,d]){ 69 | translate([x, 0]) 70 | circle(r=3.3/2, $fn=20); 71 | } 72 | } 73 | } 74 | 75 | // This seems to be designed for T5. 76 | //TODO: Adapt this for 2mm GT2? (add a belt_pitch parameter?) 77 | module teeth_for_belt(belt_width=6){ 78 | for (y=[-2:2]) 79 | translate([0,y*2.5]) 80 | square([belt_width+2, 1.8], center = true); 81 | } 82 | 83 | module beltclamp(width=28, height=6, r=5, teeth_depth=0.5){ 84 | BillOfMaterials(category="3D printed", partname="Belt Clamp"); 85 | 86 | material("ABS"){ 87 | render() 88 | difference(){ 89 | linear_extrude(height=height) 90 | beltclamp_curves(width, r); 91 | 92 | translate([0, 0, height-teeth_depth]){ 93 | linear_extrude(height = teeth_depth+1) 94 | teeth_for_belt(); 95 | } 96 | } 97 | } 98 | } 99 | 100 | module x_carriage_beltclamp(width=28, height=6, r=5){ 101 | BillOfMaterials(category="Lasercut wood", partname="X Carriage Belt Clamp"); 102 | 103 | material("lasercut") 104 | linear_extrude(height=height) 105 | beltclamp_curves(width, r, for_x_carriage=true); 106 | 107 | for (i=[-1,1]) 108 | rotate([180,0]) 109 | translate([i*9,0]){ 110 | M3_washer(); 111 | translate([0,0,m3_washer_thickness]){ 112 | M3x20(); 113 | } 114 | } 115 | } 116 | 117 | module y_platform_beltclamp(width=28, height=6, r=5){ 118 | BillOfMaterials(category="Lasercut wood", partname="Y Platform Belt Clamp"); 119 | 120 | material("lasercut") 121 | linear_extrude(height=height) 122 | beltclamp_curves(width, r, for_y_platform=true); 123 | } 124 | 125 | beltclamp(); //for 3d printing 126 | 127 | translate ([0,20]) 128 | x_carriage_beltclamp(); //lasercut model 129 | 130 | translate ([0,40]) 131 | y_platform_beltclamp(); //lasercut model 132 | -------------------------------------------------------------------------------- /technical_drawing.scad: -------------------------------------------------------------------------------- 1 | // Helper modules for parametric technical drawing 2 | // 3 | // (c) 2013 Metamáquina 4 | // 5 | // Author: 6 | // * Felipe C. da S. Sanches 7 | // 8 | // This program is free software: you can redistribute it and/or modify 9 | // it under the terms of the GNU General Public License as published by 10 | // the Free Software Foundation, either version 3 of the License, or 11 | // (at your option) any later version. 12 | // 13 | // This program is distributed in the hope that it will be useful, 14 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | // GNU General Public License for more details. 17 | // 18 | // You should have received a copy of the GNU General Public License 19 | // along with this program. If not, see . 20 | 21 | module roundline(x1,y1,x2,y2, color="black", thickness=0.3){ 22 | color(color){ 23 | hull(){ 24 | translate([x1,y1]) 25 | circle(r=thickness/2, $fn=20); 26 | 27 | translate([x2,y2]) 28 | circle(r=thickness/2, $fn=20); 29 | } 30 | } 31 | } 32 | 33 | module line(x1,y1,x2,y2, color="black", thickness=1){ 34 | angle = atan2(y2-y1, x2-x1); 35 | length = sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1)); 36 | 37 | color(color){ 38 | translate([x1,y1]){ 39 | rotate([0,0,angle]) 40 | translate([0,-thickness/2]) 41 | square([length,thickness]); 42 | } 43 | } 44 | } 45 | 46 | 47 | module Square(x1,y1,x2,y2){ 48 | roundline(x1,y1,x2,y1); 49 | roundline(x2,y1,x2,y2); 50 | roundline(x2,y2,x1,y2); 51 | roundline(x1,y2,x1,y1); 52 | } 53 | 54 | module RegularPolygon(N,r, even_odd=false){ 55 | if (even_odd){ 56 | for (i=[1:N/2]) 57 | roundline(r*cos(2*i*360/N), r*sin(2*i*360/N), 58 | r*cos((2*i+1)*360/N), r*sin((2*i+1)*360/N)); 59 | } else { 60 | for (i=[1:N]) 61 | roundline(r*cos(i*360/N), r*sin(i*360/N), 62 | r*cos((i+1)*360/N), r*sin((i+1)*360/N)); 63 | } 64 | } 65 | 66 | module Hexagon(r){ 67 | RegularPolygon(6,r); 68 | } 69 | 70 | module Circle(r, even_odd=false){ 71 | RegularPolygon(60,r, even_odd=even_odd); 72 | } 73 | 74 | module glyph(char, fontsize){ 75 | scale(fontsize/12){ 76 | import("font.dxf", layer=char); 77 | } 78 | } 79 | 80 | module dimension_label(x, y, string, spacing=0.7, fontsize=2){ 81 | //draw dimension text at coordinate x,y 82 | 83 | text_length = (len(string)+1) * spacing*fontsize; 84 | translate([x - text_length/2,y + fontsize/3]){ 85 | for (i=[0:len(string)-1]){ 86 | translate([spacing*fontsize*i,0]) glyph(string[i], fontsize); 87 | } 88 | 89 | translate([len(string)*spacing*fontsize, 0]) glyph("mm", fontsize); 90 | } 91 | } 92 | 93 | module arrow(x,y,angle, thickness=0.1){ 94 | length = 10*thickness; 95 | width = 4*thickness; 96 | 97 | translate([x,y]) 98 | rotate([0,0,angle]) 99 | hull(){ 100 | circle(r=thickness, $fn=20); 101 | 102 | translate([length, width/2]) 103 | circle(r=thickness, $fn=20); 104 | 105 | translate([length, -width/2]) 106 | circle(r=thickness, $fn=20); 107 | } 108 | } 109 | 110 | module dimension(x1,y1, x2,y2, color="blue", line_thickness=1, fontsize=2){ 111 | length = round(1000*sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)))/1000.0; 112 | angle = atan2(y2-y1, x2-x1); 113 | 114 | color(color){ 115 | arrow(x1,y1, 0, thickness=line_thickness); 116 | roundline(x1,y1+1, x1,y1-6, thickness=line_thickness); 117 | 118 | arrow(x2,y2, -180, thickness=line_thickness); 119 | roundline(x2,y2+1, x2,y2-6, thickness=line_thickness); 120 | 121 | roundline(x1,y1, x2,y2, thickness=line_thickness); 122 | dimension_label((x1+x2)/2, (y1+y2)/2, str(length), fontsize=fontsize); 123 | } 124 | } 125 | 126 | -------------------------------------------------------------------------------- /render.h: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Author: 4 | // * Felipe C. da S. Sanches 5 | // 6 | // This program is free software: you can redistribute it and/or modify 7 | // it under the terms of the GNU General Public License as published by 8 | // the Free Software Foundation, either version 3 of the License, or 9 | // (at your option) any later version. 10 | // 11 | // This program is distributed in the hope that it will be useful, 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | // GNU General Public License for more details. 15 | // 16 | // You should have received a copy of the GNU General Public License 17 | // along with this program. If not, see . 18 | 19 | // $fa is the minimum angle for a fragment. Even a huge circle does not have more fragments than 360 divided by this number. The default value is 12 (i.e. 30 fragments for a full circle). The minimum allowed value is 0.01. 20 | $fa = 0.01; 21 | 22 | // $fs is the minimum size of a fragment. Because of this variable very small circles have a smaller number of fragments than specified using $fa. The default value is 2. The minimum allowed value is 0.01. 23 | $fs = 0.5; 24 | 25 | dark_green = [0,0.2,0]; 26 | rubber_color = [0.1, 0.1, 0.1]; 27 | nozzle_color = "gold"; 28 | pcb_color = [1.0, 0.0, 0.0]; 29 | glass_color = [0.6, 0.6, 1, 0.4]; 30 | threaded_metal_color = [0.6, 0.6, 0.6]; 31 | metal_color = [0.7, 0.7, 0.7]; 32 | powersupply_color = metal_color; 33 | PLA_color = [0.95, 0.35, 0.35]; 34 | ABS_color = [0.35, 0.35, 0.35]; 35 | sheet_color = [227/230, 190/230, 151/230]; 36 | peek_color = "beige"; 37 | dark_grey = [0.3, 0.3, 0.3]; 38 | green_plastic_color = [0.7,0.8,0,7]; 39 | black_plastic_color = [0.3,0.3,0.3]; 40 | nylon_color = [1, 1, 0.8]; 41 | acrylic_color = [1, 0.6, 0.6, 0.4]; 42 | 43 | render_materials = [ 44 | "lasercut", 45 | "pcb", 46 | "glass", 47 | "ABS", 48 | "PLA", 49 | "metal", 50 | "threaded metal", 51 | "rubber", 52 | "peek", 53 | "nylon", 54 | "acrylic", 55 | "silk", 56 | "golden"]; 57 | 58 | module material(id){ 59 | for (m=render_materials){ 60 | if (id==m){ 61 | if (id=="lasercut") 62 | for (i=[0:$children-1]) 63 | color(sheet_color) child(i); 64 | 65 | if (id=="pcb") 66 | for (i=[0:$children-1]) 67 | color(pcb_color) child(i); 68 | 69 | if (id=="glass") 70 | for (i=[0:$children-1]) 71 | color(glass_color) child(i); 72 | 73 | if (id=="ABS") 74 | for (i=[0:$children-1]) 75 | color(ABS_color) child(i); 76 | 77 | if (id=="PLA") 78 | for (i=[0:$children-1]) 79 | color(PLA_color) child(i); 80 | 81 | if (id=="metal") 82 | for (i=[0:$children-1]) 83 | color(metal_color) child(i); 84 | 85 | if (id=="threaded metal") 86 | for (i=[0:$children-1]) 87 | color(threaded_metal_color) child(i); 88 | 89 | if (id=="rubber") 90 | for (i=[0:$children-1]) 91 | color(rubber_color) child(i); 92 | 93 | if (id=="peek") 94 | for (i=[0:$children-1]) 95 | color(peek_color) child(i); 96 | 97 | if (id=="nylon") 98 | for (i=[0:$children-1]) 99 | color(nylon_color) child(i); 100 | 101 | if (id=="acrylic") 102 | for (i=[0:$children-1]) 103 | color(acrylic_color) child(i); 104 | 105 | if (id=="silk") 106 | for (i=[0:$children-1]) 107 | color("white") child(i); 108 | 109 | if (id=="golden") 110 | for (i=[0:$children-1]) 111 | color("gold") child(i); 112 | } 113 | } 114 | } 115 | 116 | //subassembly rendering switches: 117 | render_nozzle=true; 118 | render_powersupply=true; 119 | render_calibration_guide = false; 120 | render_build_volume=false; 121 | render_xplatform=true; 122 | render_bolts = false; //work-in-progress 123 | render_extruder = true; 124 | 125 | -------------------------------------------------------------------------------- /tslot.scad: -------------------------------------------------------------------------------- 1 | // t-slot helper modules 2 | // 3 | // (c) 2013 Metamáquina 4 | // 5 | // Author: 6 | // * Felipe C. da S. Sanches 7 | // 8 | // This program is free software: you can redistribute it and/or modify 9 | // it under the terms of the GNU General Public License as published by 10 | // the Free Software Foundation, either version 3 of the License, or 11 | // (at your option) any later version. 12 | // 13 | // This program is distributed in the hope that it will be useful, 14 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | // GNU General Public License for more details. 17 | // 18 | // You should have received a copy of the GNU General Public License 19 | // along with this program. If not, see . 20 | 21 | include ; 22 | include ; 23 | include ; 24 | include ; 25 | include ; 26 | 27 | module t_slot_holes(width, thickness, joint_size=5){ 28 | translate([0, width/2]) 29 | circle(r=m3_diameter/2, $fn=20); 30 | 31 | translate([0, width/4]) 32 | square([thickness, joint_size], center=true); 33 | 34 | translate([0, 3*width/4]) 35 | square([thickness, joint_size], center=true); 36 | } 37 | 38 | module t_slot_cuts(width, diameter, length){ 39 | translate([0, width/2]) 40 | rotate([0, 0, 90]) 41 | t_slot_shape(diameter, length); 42 | } 43 | 44 | module t_slot_shape(diameter, length){ 45 | { 46 | //TODO: Add these nuts, washers and bolts to the CAD model 47 | BillOfMaterials(str("M",diameter,"x",length," bolt"), ref=str("H_M",diameter,"x",length)); 48 | BillOfMaterials(str("M",diameter," nut"), ref=str("P_M",diameter)); 49 | BillOfMaterials(str("M",diameter," washer"), ref=str("AL_M",diameter)); 50 | } 51 | 52 | translate([-diameter/2, 0]) 53 | square([diameter, length]); 54 | 55 | translate([-diameter, length-(3/2)*diameter]) 56 | square([2*diameter, diameter]); 57 | } 58 | 59 | module t_slot_joints(width, thickness, joint_size=5){ 60 | translate([0, width/4]) 61 | square([thickness, joint_size], center=true); 62 | 63 | translate([0, 3*width/4]) 64 | square([thickness, joint_size], center=true); 65 | } 66 | 67 | module t_slot_bolt_washer_nut(diameter, length){ 68 | washer_height = 0.5; 69 | //bolt head 70 | translate([0, 0, washer_height]) 71 | difference(){ 72 | cylinder(r=diameter, h=0.75 * diameter, $fn=20); 73 | translate([0,0,0.25*diameter]) 74 | cylinder(r=diameter*0.7, h=diameter, $fn=6); 75 | } 76 | 77 | //washer 78 | cylinder(r=diameter*1.4, h=washer_height, $fn=20); 79 | 80 | //bolt body 81 | translate([0, 0, -length + washer_height]) 82 | cylinder(r=diameter/2, h=length, $fn=20); 83 | 84 | //nut 85 | translate([0, 0, -length+diameter]) 86 | cylinder(r=diameter, h=diameter/2, $fn=6); 87 | } 88 | 89 | module tslot_shapes_from_list(list, length=16){ 90 | for (tslot=list){ 91 | assign(x=tslot[0], 92 | y=tslot[1], 93 | angle=tslot[2]) 94 | translate([x,y]) 95 | rotate(angle) 96 | t_slot_shape(3,length); 97 | } 98 | } 99 | 100 | module tslot_holes_from_list(list){ 101 | for (tslot=list){ 102 | assign(x=tslot[0], 103 | y=tslot[1], 104 | width=tslot[2], 105 | angle=tslot[3]) 106 | if(width>0) 107 | translate([x, y]) 108 | rotate(angle) 109 | TSlot_holes(width=width); 110 | } 111 | } 112 | 113 | //how is this different from t_slot_bolt_washer_nut() ? 114 | module tslot_parts_from_list(list, length=16){ 115 | for (tslot=list){ 116 | assign(x=tslot[0], 117 | y=tslot[1], 118 | width=tslot[2], 119 | angle=tslot[3]) 120 | translate([x, y]) 121 | rotate(angle) 122 | translate([0, width/2]){ 123 | translate([0, 0, thickness]){ 124 | M3_washer(); 125 | 126 | translate([0,0,m3_washer_thickness]) 127 | bolt(3,length); 128 | } 129 | 130 | translate([0,0,8-length]) 131 | M3_nut(); 132 | } 133 | } 134 | } 135 | -------------------------------------------------------------------------------- /domed_cap_nuts.scad: -------------------------------------------------------------------------------- 1 | // Domed Cap Nuts 2 | // 3 | // Based on data from: 4 | // http://www.pankajinternational.com/DomedCapNutsDIN1587.htm 5 | // 6 | // (c) 2013 Metamáquina 7 | // 8 | // Author: 9 | // * Felipe C. da S. Sanches 10 | // 11 | // This program is free software: you can redistribute it and/or modify 12 | // it under the terms of the GNU General Public License as published by 13 | // the Free Software Foundation, either version 3 of the License, or 14 | // (at your option) any later version. 15 | // 16 | // This program is distributed in the hope that it will be useful, 17 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 18 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 | // GNU General Public License for more details. 20 | // 21 | // You should have received a copy of the GNU General Public License 22 | // along with this program. If not, see . 23 | 24 | include ; 25 | include ; 26 | 27 | module M6_domed_cap_nut(){ 28 | BillOfMaterials("M6 domed cap nut (DIN_1587)", ref="P_M6_ca"); 29 | DIN_1587(6, 9.5, 4.75, 12, 8.29, 5.15, 10.00, 11.05); 30 | } 31 | 32 | module M8_domed_cap_nut(){ 33 | BillOfMaterials("M8 domed cap nut (DIN_1587)", ref="P_M8_ca"); 34 | DIN_1587(8, 12.5, 6.25, 15, 11.35, 6.68, 13.00, 14.38); 35 | } 36 | 37 | module M10_domed_cap_nut(){ 38 | BillOfMaterials("M10 domed cap nut (DIN_1587)", ref="P_M10_ca"); 39 | DIN_1587(10, 16, 8, 18, 13.35, 8.18, 17.00, 18.90); 40 | } 41 | 42 | module M12_domed_cap_nut(){ 43 | BillOfMaterials("M12 domed cap nut (DIN_1587)", ref="P_M12_ca"); 44 | DIN_1587(12, 18, 9, 22, 16.35, 9.68, 19.00, 21.10); 45 | } 46 | 47 | module M14_domed_cap_nut(){ 48 | BillOfMaterials("M14 domed cap nut (DIN_1587)", ref="P_M14_ca"); 49 | DIN_1587(14, 21, 10.5, 25, 18.35, 11.22, 22.00, 24.49); 50 | } 51 | 52 | module M16_domed_cap_nut(){ 53 | BillOfMaterials("M16 domed cap nut (DIN_1587)", ref="P_M16_ca"); 54 | DIN_1587(16, 23, 11.5, 28, 21.42, 13.22, 24.00, 26.75); 55 | } 56 | 57 | module M18_domed_cap_nut(){ 58 | BillOfMaterials("M18 domed cap nut (DIN_1587)", ref="P_M18_ca"); 59 | DIN_1587(18, 26, 13, 32, 25.42, 15.22, 27.00, 30.14); 60 | } 61 | 62 | module M20_domed_cap_nut(){ 63 | BillOfMaterials("M20 domed cap nut (DIN_1587)", ref="P_M20_ca"); 64 | DIN_1587(20, 28, 14, 34, 26.42, 16.22, 30.00, 33.53); 65 | } 66 | 67 | module M22_domed_cap_nut(){ 68 | BillOfMaterials("M22 domed cap nut (DIN_1587)", ref="P_M22_ca"); 69 | DIN_1587(22, 31, 15.5, 39, 29.42, 17.22, 32.00, 35.72); 70 | } 71 | 72 | module M24_domed_cap_nut(){ 73 | BillOfMaterials("M24 domed cap nut (DIN_1587)", ref="P_M24_ca"); 74 | DIN_1587(24, 34, 17, 42, 35.00, 18.22, 36.00, 39.98); 75 | } 76 | 77 | function hipotenusa(a, b) = sqrt(a*a + b*b); 78 | 79 | //E/2 = x * sqrt(3)/2 80 | //x=E/sqrt(3); 81 | 82 | module DIN_1587(D, C, R, B, A, H, E, F){ 83 | material("metal") 84 | render(){ 85 | difference(){ 86 | union(){ 87 | //dome 88 | translate([0, 0, B-R]) 89 | sphere(r=R, $fn=60); 90 | cylinder(r=R, h=B-R, $fn=60); 91 | 92 | //hexagon 93 | intersection(){ 94 | cylinder(r=E/sqrt(3), h=H, $fn=6); 95 | sphere(r=hipotenusa(E/2, H), $fn=60); 96 | translate([0,0,H]) 97 | sphere(r=hipotenusa(E/2, H), $fn=60); 98 | } 99 | } 100 | 101 | //hole 102 | translate([0,0,-1]) 103 | cylinder(r=D/2, h=A+1, $fn=20); 104 | } 105 | } 106 | } 107 | 108 | M6_domed_cap_nut(); 109 | 110 | translate([15, 0, 0]) 111 | M8_domed_cap_nut(); 112 | 113 | translate([34, 0, 0]) 114 | M10_domed_cap_nut(); 115 | 116 | translate([57, 0, 0]) 117 | M12_domed_cap_nut(); 118 | 119 | translate([83, 0, 0]) 120 | M14_domed_cap_nut(); 121 | 122 | translate([112, 0, 0]) 123 | M16_domed_cap_nut(); 124 | 125 | translate([144, 0, 0]) 126 | M18_domed_cap_nut(); 127 | 128 | translate([182, 0, 0]) 129 | M20_domed_cap_nut(); 130 | 131 | translate([224, 0, 0]) 132 | M22_domed_cap_nut(); 133 | 134 | translate([270, 0, 0]) 135 | M24_domed_cap_nut(); 136 | 137 | -------------------------------------------------------------------------------- /hardware/heatbed/heatbed.net: -------------------------------------------------------------------------------- 1 | (export (version D) 2 | (design 3 | (source /home/aylons/Insync/aylons@gmail.com/MetaMaquina/code/Metamaquina2/hardware/heatbed/heatbed.sch) 4 | (date "Thu 21 Feb 2013 12:49:05 AM BRT") 5 | (tool "eeschema (2012-nov-02)-testing")) 6 | (components 7 | (comp (ref P1) 8 | (value CONN_POWER) 9 | (libsource (lib conn) (part CONN_2)) 10 | (sheetpath (names /) (tstamps /)) 11 | (tstamp 5125922A)) 12 | (comp (ref D1) 13 | (value GREEN_LED) 14 | (libsource (lib device) (part LED)) 15 | (sheetpath (names /) (tstamps /)) 16 | (tstamp 512592B6)) 17 | (comp (ref R1) 18 | (value 1k) 19 | (libsource (lib device) (part R)) 20 | (sheetpath (names /) (tstamps /)) 21 | (tstamp 512592C5)) 22 | (comp (ref PCB_R1) 23 | (value 4R) 24 | (libsource (lib device) (part R)) 25 | (sheetpath (names /) (tstamps /)) 26 | (tstamp 5125956A)) 27 | (comp (ref PCB_R2) 28 | (value 4R) 29 | (libsource (lib device) (part R)) 30 | (sheetpath (names /) (tstamps /)) 31 | (tstamp 51259665)) 32 | (comp (ref PCB_R3) 33 | (value 4R) 34 | (libsource (lib device) (part R)) 35 | (sheetpath (names /) (tstamps /)) 36 | (tstamp 5125966B)) 37 | (comp (ref PCB_R4) 38 | (value 4R) 39 | (libsource (lib device) (part R)) 40 | (sheetpath (names /) (tstamps /)) 41 | (tstamp 51259671)) 42 | (comp (ref P2) 43 | (value CONN_2) 44 | (libsource (lib conn) (part CONN_2)) 45 | (sheetpath (names /) (tstamps /)) 46 | (tstamp 512596BD)) 47 | (comp (ref TH1) 48 | (value 100k) 49 | (footprint 0805,0603) 50 | (libsource (lib device) (part THERMISTOR)) 51 | (sheetpath (names /) (tstamps /)) 52 | (tstamp 512596CC))) 53 | (libparts 54 | (libpart (lib device) (part LED) 55 | (footprints 56 | (fp LED-3MM) 57 | (fp LED-5MM) 58 | (fp LED-10MM) 59 | (fp LED-0603) 60 | (fp LED-0805) 61 | (fp LED-1206) 62 | (fp LEDV)) 63 | (fields 64 | (field (name Reference) D) 65 | (field (name Value) LED)) 66 | (pins 67 | (pin (num 1) (name A) (type passive)) 68 | (pin (num 2) (name K) (type passive)))) 69 | (libpart (lib device) (part R) 70 | (description Resistance) 71 | (footprints 72 | (fp R?) 73 | (fp SM0603) 74 | (fp SM0805) 75 | (fp R?-*) 76 | (fp SM1206)) 77 | (fields 78 | (field (name Reference) R) 79 | (field (name Value) R)) 80 | (pins 81 | (pin (num 1) (name ~) (type passive)) 82 | (pin (num 2) (name ~) (type passive)))) 83 | (libpart (lib device) (part THERMISTOR) 84 | (description Resistance) 85 | (footprints 86 | (fp R?) 87 | (fp SM0603) 88 | (fp SM0805)) 89 | (fields 90 | (field (name Reference) TH) 91 | (field (name Value) THERMISTOR)) 92 | (pins 93 | (pin (num 1) (name ~) (type passive)) 94 | (pin (num 2) (name ~) (type passive)))) 95 | (libpart (lib conn) (part CONN_2) 96 | (description "Symbole general de connecteur") 97 | (fields 98 | (field (name Reference) P) 99 | (field (name Value) CONN_2)) 100 | (pins 101 | (pin (num 1) (name P1) (type passive)) 102 | (pin (num 2) (name PM) (type passive))))) 103 | (libraries 104 | (library (logical device) 105 | (uri /usr/share/kicad/library/device.lib)) 106 | (library (logical conn) 107 | (uri /usr/share/kicad/library/conn.lib))) 108 | (nets 109 | (net (code 1) (name "") 110 | (node (ref PCB_R1) (pin 1)) 111 | (node (ref D1) (pin 2)) 112 | (node (ref P1) (pin 2)) 113 | (node (ref PCB_R2) (pin 1)) 114 | (node (ref PCB_R3) (pin 1)) 115 | (node (ref PCB_R4) (pin 1))) 116 | (net (code 2) (name "") 117 | (node (ref P2) (pin 2)) 118 | (node (ref TH1) (pin 1))) 119 | (net (code 3) (name "") 120 | (node (ref TH1) (pin 2)) 121 | (node (ref P2) (pin 1))) 122 | (net (code 4) (name "") 123 | (node (ref D1) (pin 1)) 124 | (node (ref R1) (pin 1))) 125 | (net (code 5) (name "") 126 | (node (ref PCB_R2) (pin 2)) 127 | (node (ref P1) (pin 1)) 128 | (node (ref PCB_R1) (pin 2)) 129 | (node (ref PCB_R3) (pin 2)) 130 | (node (ref R1) (pin 2)) 131 | (node (ref PCB_R4) (pin 2))))) -------------------------------------------------------------------------------- /hardware/heatbed/heatbed.bak: -------------------------------------------------------------------------------- 1 | EESchema Schematic File Version 2 date Thu 21 Feb 2013 12:38:33 AM BRT 2 | LIBS:power 3 | LIBS:device 4 | LIBS:transistors 5 | LIBS:conn 6 | LIBS:linear 7 | LIBS:regul 8 | LIBS:74xx 9 | LIBS:cmos4000 10 | LIBS:adc-dac 11 | LIBS:memory 12 | LIBS:xilinx 13 | LIBS:special 14 | LIBS:microcontrollers 15 | LIBS:dsp 16 | LIBS:microchip 17 | LIBS:analog_switches 18 | LIBS:motorola 19 | LIBS:texas 20 | LIBS:intel 21 | LIBS:audio 22 | LIBS:interface 23 | LIBS:digital-audio 24 | LIBS:philips 25 | LIBS:display 26 | LIBS:cypress 27 | LIBS:siliconi 28 | LIBS:opto 29 | LIBS:atmel 30 | LIBS:contrib 31 | LIBS:valves 32 | EELAYER 27 0 33 | EELAYER END 34 | $Descr A4 11693 8268 35 | encoding utf-8 36 | Sheet 1 1 37 | Title "" 38 | Date "21 feb 2013" 39 | Rev "" 40 | Comp "" 41 | Comment1 "" 42 | Comment2 "" 43 | Comment3 "" 44 | Comment4 "" 45 | $EndDescr 46 | $Comp 47 | L CONN_2 P1 48 | U 1 1 5125922A 49 | P 2750 5200 50 | F 0 "P1" V 2700 5200 40 0000 C CNN 51 | F 1 "CONN_POWER" V 2800 5200 40 0000 C CNN 52 | F 2 "" H 2750 5200 60 0000 C CNN 53 | F 3 "" H 2750 5200 60 0000 C CNN 54 | 1 2750 5200 55 | -1 0 0 1 56 | $EndComp 57 | $Comp 58 | L LED D1 59 | U 1 1 512592B6 60 | P 3850 5000 61 | F 0 "D1" H 3850 5100 50 0000 C CNN 62 | F 1 "GREEN_LED" H 3850 4900 50 0000 C CNN 63 | F 2 "" H 3850 5000 60 0000 C CNN 64 | F 3 "" H 3850 5000 60 0000 C CNN 65 | 1 3850 5000 66 | 0 -1 -1 0 67 | $EndComp 68 | $Comp 69 | L R R1 70 | U 1 1 512592C5 71 | P 3850 5450 72 | F 0 "R1" V 3930 5450 50 0000 C CNN 73 | F 1 "1k" V 3850 5450 50 0000 C CNN 74 | F 2 "" H 3850 5450 60 0000 C CNN 75 | F 3 "" H 3850 5450 60 0000 C CNN 76 | 1 3850 5450 77 | 1 0 0 -1 78 | $EndComp 79 | Wire Wire Line 80 | 3100 5300 3100 5700 81 | Wire Wire Line 82 | 3100 5700 5150 5700 83 | Wire Wire Line 84 | 3100 5100 3100 4800 85 | Wire Wire Line 86 | 3100 4800 5150 4800 87 | $Comp 88 | L R PCB_R? 89 | U 1 1 5125956A 90 | P 4250 5250 91 | F 0 "PCB_R?" V 4330 5250 50 0000 C CNN 92 | F 1 "4R" V 4250 5250 50 0000 C CNN 93 | F 2 "" H 4250 5250 60 0000 C CNN 94 | F 3 "" H 4250 5250 60 0000 C CNN 95 | 1 4250 5250 96 | 1 0 0 -1 97 | $EndComp 98 | Wire Wire Line 99 | 5150 4800 5150 5000 100 | Connection ~ 3850 4800 101 | Wire Wire Line 102 | 5150 5700 5150 5500 103 | Connection ~ 3850 5700 104 | Wire Wire Line 105 | 4850 5000 4850 4800 106 | Connection ~ 4850 4800 107 | Wire Wire Line 108 | 4850 5500 4850 5700 109 | Connection ~ 4850 5700 110 | Wire Wire Line 111 | 4550 5500 4550 5700 112 | Connection ~ 4550 5700 113 | Wire Wire Line 114 | 4250 5500 4250 5700 115 | Connection ~ 4250 5700 116 | Wire Wire Line 117 | 4250 5000 4250 4800 118 | Connection ~ 4250 4800 119 | Wire Wire Line 120 | 4550 5000 4550 4800 121 | Connection ~ 4550 4800 122 | $Comp 123 | L R PCB_R? 124 | U 1 1 51259665 125 | P 4550 5250 126 | F 0 "PCB_R?" V 4630 5250 50 0000 C CNN 127 | F 1 "4R" V 4550 5250 50 0000 C CNN 128 | F 2 "" H 4550 5250 60 0000 C CNN 129 | F 3 "" H 4550 5250 60 0000 C CNN 130 | 1 4550 5250 131 | 1 0 0 -1 132 | $EndComp 133 | $Comp 134 | L R PCB_R? 135 | U 1 1 5125966B 136 | P 4850 5250 137 | F 0 "PCB_R?" V 4930 5250 50 0000 C CNN 138 | F 1 "4R" V 4850 5250 50 0000 C CNN 139 | F 2 "" H 4850 5250 60 0000 C CNN 140 | F 3 "" H 4850 5250 60 0000 C CNN 141 | 1 4850 5250 142 | 1 0 0 -1 143 | $EndComp 144 | $Comp 145 | L R PCB_R? 146 | U 1 1 51259671 147 | P 5150 5250 148 | F 0 "PCB_R?" V 5230 5250 50 0000 C CNN 149 | F 1 "4R" V 5150 5250 50 0000 C CNN 150 | F 2 "" H 5150 5250 60 0000 C CNN 151 | F 3 "" H 5150 5250 60 0000 C CNN 152 | 1 5150 5250 153 | 1 0 0 -1 154 | $EndComp 155 | Connection ~ 4250 5000 156 | Connection ~ 4250 5500 157 | Connection ~ 4550 5500 158 | Connection ~ 4550 5000 159 | Connection ~ 4850 5000 160 | Connection ~ 4850 5500 161 | Connection ~ 5150 5500 162 | Connection ~ 5150 5000 163 | $Comp 164 | L CONN_2 P? 165 | U 1 1 512596BD 166 | P 2700 4300 167 | F 0 "P?" V 2650 4300 40 0000 C CNN 168 | F 1 "CONN_2" V 2750 4300 40 0000 C CNN 169 | F 2 "" H 2700 4300 60 0000 C CNN 170 | F 3 "" H 2700 4300 60 0000 C CNN 171 | 1 2700 4300 172 | -1 0 0 1 173 | $EndComp 174 | $Comp 175 | L THERMISTOR TH? 176 | U 1 1 512596CC 177 | P 3600 4200 178 | F 0 "TH?" V 3700 4250 50 0000 C CNN 179 | F 1 "100k" V 3500 4200 50 0000 C CNN 180 | F 2 "0805,0603" H 3600 4200 60 0000 C CNN 181 | F 3 "" H 3600 4200 60 0000 C CNN 182 | 1 3600 4200 183 | 0 -1 -1 0 184 | $EndComp 185 | Wire Wire Line 186 | 3050 4200 3350 4200 187 | Wire Wire Line 188 | 3850 4200 4050 4200 189 | Wire Wire Line 190 | 4050 4200 4050 4400 191 | Wire Wire Line 192 | 4050 4400 3050 4400 193 | $EndSCHEMATC 194 | -------------------------------------------------------------------------------- /hardware/heatbed/heatbed.sch: -------------------------------------------------------------------------------- 1 | EESchema Schematic File Version 2 date Thu 21 Feb 2013 12:44:48 AM BRT 2 | LIBS:power 3 | LIBS:device 4 | LIBS:transistors 5 | LIBS:conn 6 | LIBS:linear 7 | LIBS:regul 8 | LIBS:74xx 9 | LIBS:cmos4000 10 | LIBS:adc-dac 11 | LIBS:memory 12 | LIBS:xilinx 13 | LIBS:special 14 | LIBS:microcontrollers 15 | LIBS:dsp 16 | LIBS:microchip 17 | LIBS:analog_switches 18 | LIBS:motorola 19 | LIBS:texas 20 | LIBS:intel 21 | LIBS:audio 22 | LIBS:interface 23 | LIBS:digital-audio 24 | LIBS:philips 25 | LIBS:display 26 | LIBS:cypress 27 | LIBS:siliconi 28 | LIBS:opto 29 | LIBS:atmel 30 | LIBS:contrib 31 | LIBS:valves 32 | EELAYER 27 0 33 | EELAYER END 34 | $Descr A4 11693 8268 35 | encoding utf-8 36 | Sheet 1 1 37 | Title "" 38 | Date "21 feb 2013" 39 | Rev "" 40 | Comp "" 41 | Comment1 "" 42 | Comment2 "" 43 | Comment3 "" 44 | Comment4 "" 45 | $EndDescr 46 | $Comp 47 | L CONN_2 P1 48 | U 1 1 5125922A 49 | P 2750 5200 50 | F 0 "P1" V 2700 5200 40 0000 C CNN 51 | F 1 "CONN_POWER" V 2800 5200 40 0000 C CNN 52 | F 2 "" H 2750 5200 60 0000 C CNN 53 | F 3 "" H 2750 5200 60 0000 C CNN 54 | 1 2750 5200 55 | -1 0 0 1 56 | $EndComp 57 | $Comp 58 | L LED D1 59 | U 1 1 512592B6 60 | P 3850 5000 61 | F 0 "D1" H 3850 5100 50 0000 C CNN 62 | F 1 "GREEN_LED" H 3850 4900 50 0000 C CNN 63 | F 2 "" H 3850 5000 60 0000 C CNN 64 | F 3 "" H 3850 5000 60 0000 C CNN 65 | 1 3850 5000 66 | 0 -1 -1 0 67 | $EndComp 68 | $Comp 69 | L R R1 70 | U 1 1 512592C5 71 | P 3850 5450 72 | F 0 "R1" V 3930 5450 50 0000 C CNN 73 | F 1 "1k" V 3850 5450 50 0000 C CNN 74 | F 2 "" H 3850 5450 60 0000 C CNN 75 | F 3 "" H 3850 5450 60 0000 C CNN 76 | 1 3850 5450 77 | 1 0 0 -1 78 | $EndComp 79 | Wire Wire Line 80 | 3100 5300 3100 5700 81 | Wire Wire Line 82 | 3100 5700 5150 5700 83 | Wire Wire Line 84 | 3100 5100 3100 4800 85 | Wire Wire Line 86 | 3100 4800 5150 4800 87 | $Comp 88 | L R PCB_R1 89 | U 1 1 5125956A 90 | P 4250 5250 91 | F 0 "PCB_R1" V 4330 5250 50 0000 C CNN 92 | F 1 "4R" V 4250 5250 50 0000 C CNN 93 | F 2 "" H 4250 5250 60 0000 C CNN 94 | F 3 "" H 4250 5250 60 0000 C CNN 95 | 1 4250 5250 96 | 1 0 0 -1 97 | $EndComp 98 | Wire Wire Line 99 | 5150 4800 5150 5000 100 | Connection ~ 3850 4800 101 | Wire Wire Line 102 | 5150 5700 5150 5500 103 | Connection ~ 3850 5700 104 | Wire Wire Line 105 | 4850 5000 4850 4800 106 | Connection ~ 4850 4800 107 | Wire Wire Line 108 | 4850 5500 4850 5700 109 | Connection ~ 4850 5700 110 | Wire Wire Line 111 | 4550 5500 4550 5700 112 | Connection ~ 4550 5700 113 | Wire Wire Line 114 | 4250 5500 4250 5700 115 | Connection ~ 4250 5700 116 | Wire Wire Line 117 | 4250 5000 4250 4800 118 | Connection ~ 4250 4800 119 | Wire Wire Line 120 | 4550 5000 4550 4800 121 | Connection ~ 4550 4800 122 | $Comp 123 | L R PCB_R2 124 | U 1 1 51259665 125 | P 4550 5250 126 | F 0 "PCB_R2" V 4630 5250 50 0000 C CNN 127 | F 1 "4R" V 4550 5250 50 0000 C CNN 128 | F 2 "" H 4550 5250 60 0000 C CNN 129 | F 3 "" H 4550 5250 60 0000 C CNN 130 | 1 4550 5250 131 | 1 0 0 -1 132 | $EndComp 133 | $Comp 134 | L R PCB_R3 135 | U 1 1 5125966B 136 | P 4850 5250 137 | F 0 "PCB_R3" V 4930 5250 50 0000 C CNN 138 | F 1 "4R" V 4850 5250 50 0000 C CNN 139 | F 2 "" H 4850 5250 60 0000 C CNN 140 | F 3 "" H 4850 5250 60 0000 C CNN 141 | 1 4850 5250 142 | 1 0 0 -1 143 | $EndComp 144 | $Comp 145 | L R PCB_R4 146 | U 1 1 51259671 147 | P 5150 5250 148 | F 0 "PCB_R4" V 5230 5250 50 0000 C CNN 149 | F 1 "4R" V 5150 5250 50 0000 C CNN 150 | F 2 "" H 5150 5250 60 0000 C CNN 151 | F 3 "" H 5150 5250 60 0000 C CNN 152 | 1 5150 5250 153 | 1 0 0 -1 154 | $EndComp 155 | Connection ~ 4250 5000 156 | Connection ~ 4250 5500 157 | Connection ~ 4550 5500 158 | Connection ~ 4550 5000 159 | Connection ~ 4850 5000 160 | Connection ~ 4850 5500 161 | Connection ~ 5150 5500 162 | Connection ~ 5150 5000 163 | $Comp 164 | L CONN_2 P2 165 | U 1 1 512596BD 166 | P 2700 4300 167 | F 0 "P2" V 2650 4300 40 0000 C CNN 168 | F 1 "CONN_2" V 2750 4300 40 0000 C CNN 169 | F 2 "" H 2700 4300 60 0000 C CNN 170 | F 3 "" H 2700 4300 60 0000 C CNN 171 | 1 2700 4300 172 | -1 0 0 1 173 | $EndComp 174 | $Comp 175 | L THERMISTOR TH1 176 | U 1 1 512596CC 177 | P 3600 4200 178 | F 0 "TH1" V 3700 4250 50 0000 C CNN 179 | F 1 "100k" V 3500 4200 50 0000 C CNN 180 | F 2 "0805,0603" H 3600 4200 60 0000 C CNN 181 | F 3 "" H 3600 4200 60 0000 C CNN 182 | 1 3600 4200 183 | 0 -1 -1 0 184 | $EndComp 185 | Wire Wire Line 186 | 3050 4200 3350 4200 187 | Wire Wire Line 188 | 3850 4200 4050 4200 189 | Wire Wire Line 190 | 4050 4200 4050 4400 191 | Wire Wire Line 192 | 4050 4400 3050 4400 193 | $EndSCHEMATC 194 | -------------------------------------------------------------------------------- /detailed_608zz_bearing.scad: -------------------------------------------------------------------------------- 1 | // An extremely detailed version of a 608zz bearing. 2 | // This is not used in the 3d printer model. 3 | // It is just a personal exercise on openscad 3d modeling. 4 | // 5 | // (c) 2013 Metamáquina 6 | // 7 | // Author: 8 | // * Felipe C. da S. Sanches 9 | // 10 | // This program is free software: you can redistribute it and/or modify 11 | // it under the terms of the GNU General Public License as published by 12 | // the Free Software Foundation, either version 3 of the License, or 13 | // (at your option) any later version. 14 | // 15 | // This program is distributed in the hope that it will be useful, 16 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 17 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 | // GNU General Public License for more details. 19 | // 20 | // You should have received a copy of the GNU General Public License 21 | // along with this program. If not, see . 22 | 23 | use ; 24 | include ; 25 | 26 | //include ; 27 | $fa=0.01; 28 | $fs=0.3; 29 | 30 | 608zz_inner_diameter = 8; 31 | 608zz_ball_diameter = 3.95; 32 | 608zz_num_balls = 7; 33 | 608zz_edge_fillet = 0.6; 34 | 608zz_small_fillet = 0.2; 35 | 608zz_race_thickness = 1.92; 36 | 608zz_race_radius = 608zz_inner_diameter/2 + 7/2; 37 | 608zz_cage_clearance = 0.0395; 38 | 608zz_cage_thickness = 0.3; 39 | 608zz_cage_internal_radius = 608zz_race_radius - 1.3; 40 | 41 | module detailed_608zz_bearing_2d(){ 42 | f = 608zz_edge_fillet; 43 | sf = 608zz_small_fillet; 44 | 45 | translate([608zz_race_radius,0]){ 46 | difference(){ 47 | union(){ 48 | translate([7/2-608zz_race_thickness,-7/2]) 49 | rounded_square([608zz_race_thickness, 7], corners=[sf,f,sf,f]); 50 | 51 | translate([-7/2,-7/2]) 52 | rounded_square([608zz_race_thickness, 7], corners=[f,sf,f,sf]); 53 | } 54 | 55 | square([3,8], center=true); 56 | 57 | circle(r=2); 58 | 59 | for (i=[0,1]) 60 | mirror([0,i]) 61 | bearing_internal_cut(); 62 | } 63 | } 64 | } 65 | 66 | module bearing_internal_cut(){ 67 | translate([3/2, -7/2]){ 68 | square([0.47, 0.6+0.6+0.2]); 69 | 70 | translate([0.47, 0.6]) 71 | square([0.3, 0.6]); 72 | } 73 | } 74 | 75 | module detailed_608zz_bearing_body(){ 76 | material("metal") 77 | rotate_extrude() detailed_608zz_bearing_2d(); 78 | } 79 | 80 | time = 1/2 + (1/2) * cos(360*$t); 81 | module detailed_608zz_bearing() { 82 | rotate([90,0]){ 83 | detailed_608zz_bearing_body(); 84 | 85 | translate([0,0,10*time]) 86 | detailed_608zz_ball_cage1(); 87 | 88 | translate([0,0,15*time]) 89 | detailed_608zz_balls(); 90 | 91 | translate([0,0,20*time]) 92 | detailed_608zz_ball_cage2(); 93 | } 94 | } 95 | 96 | module detailed_608zz_balls(){ 97 | material("metal") 98 | for (i=[1:608zz_num_balls]) 99 | rotate(i*360/608zz_num_balls) 100 | translate([608zz_race_radius, 0]) 101 | sphere(r=608zz_ball_diameter/2); 102 | } 103 | 104 | module detailed_608zz_ball_cage1(){ 105 | mirror([0,0,1]) 106 | detailed_608zz_ball_cage(); 107 | } 108 | 109 | module detailed_608zz_ball_cage2(){ 110 | detailed_608zz_ball_cage(); 111 | } 112 | 113 | module detailed_608zz_ball_cage(){ 114 | translate([0,0,608zz_cage_clearance]) 115 | material("metal") 116 | render(){ 117 | 118 | linear_extrude(height=608zz_cage_thickness) 119 | difference(){ 120 | circle(r=608zz_race_radius); 121 | circle(r=608zz_cage_internal_radius); 122 | 123 | for (i=[1:608zz_num_balls]){ 124 | rotate(i*360/608zz_num_balls){ 125 | translate([608zz_race_radius, 0]) 126 | circle(r=608zz_ball_diameter/2 + 608zz_cage_clearance); 127 | } 128 | } 129 | } 130 | 131 | intersection(){ 132 | difference(){ 133 | sphere(r=608zz_race_radius); 134 | 135 | sphere(r=608zz_cage_internal_radius); 136 | 137 | translate([0,0,-(608zz_ball_diameter/2 + 608zz_cage_clearance + 608zz_cage_thickness)]) 138 | cylinder(r=608zz_race_radius+1, h=608zz_ball_diameter/2 + 608zz_cage_clearance + 608zz_cage_thickness); 139 | } 140 | 141 | for (i=[1:608zz_num_balls]){ 142 | rotate(i*360/608zz_num_balls){ 143 | translate([608zz_race_radius, 0]) 144 | difference(){ 145 | sphere(r=608zz_ball_diameter/2 + 608zz_cage_clearance + 608zz_cage_thickness); 146 | sphere(r=608zz_ball_diameter/2 + 608zz_cage_clearance); 147 | } 148 | } 149 | } 150 | } 151 | 152 | } 153 | } 154 | 155 | detailed_608zz_bearing(); 156 | 157 | -------------------------------------------------------------------------------- /hobbed_bolt.scad: -------------------------------------------------------------------------------- 1 | // Hobbed Bolt dimensions for a lasercut version of the GregsWade Extruder 2 | // 3 | // (c) 2013 Metamáquina 4 | // 5 | // Author: 6 | // * Felipe C. da S. Sanches 7 | // 8 | // This program is free software: you can redistribute it and/or modify 9 | // it under the terms of the GNU General Public License as published by 10 | // the Free Software Foundation, either version 3 of the License, or 11 | // (at your option) any later version. 12 | // 13 | // This program is distributed in the hope that it will be useful, 14 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | // GNU General Public License for more details. 17 | // 18 | // You should have received a copy of the GNU General Public License 19 | // along with this program. If not, see . 20 | 21 | use ; 22 | 23 | MDF_thickness = 6; 24 | bearing_thickness = 7; //based on 608zz_bearing.scad 25 | M8_washer_thickness = 1.5; //based on washers.scad 26 | wade_large_thickness = 2.5; //based on wade_big.stl (using projection(cut=true)) 27 | M8_nut_thickness = 6; //based on nuts.scad 28 | 29 | bolt_diameter = 7.7; //The hobbed bolt diameter must not be any greater than 7.7 30 | // otherwise it wont fit in the 608zz bearing. 31 | 32 | //hobbing_position = 22; //3d printed wade block 33 | hobbing_position = MDF_thickness*3/2 + bearing_thickness + 2*M8_washer_thickness + wade_large_thickness; 34 | 35 | /* ideally these would be the lengths of the bolt: 36 | screw_length = 2 * M8_washer_thickness + M8_nut_thickness; 37 | bolt_length = hobbing_position + MDF_thickness*3/2 + bearing_thickness + screw_length; 38 | hobbing_width = 16; 39 | */ 40 | 41 | // but these are the measures of the bolt we got from our supplier 42 | screw_length = 24; 43 | bolt_length = 50; 44 | hobbing_width = 7.5; 45 | hobbing_depth = 1; 46 | 47 | echo(str("hobbing position: ", hobbing_position)); 48 | echo(str("bolt_length: ", bolt_length)); 49 | echo(str("screw_length: ", screw_length)); 50 | lt = 0.1; 51 | 52 | module bolt_hex_head_frontal_view(D){ 53 | //ISO standard for NON-STRUCTURAL hexagonal bolt head dimensions: 54 | e = 1.8 * D; 55 | s = 1.6 * D; 56 | 57 | translate([-15,0]){ 58 | dimension(-s/2, 14, s/2, 14, line_thickness=lt); 59 | rotate([0,0,90]) 60 | dimension(-e/2, 12, e/2, 12, line_thickness=lt); 61 | 62 | rotate([0,0,30]) 63 | Hexagon(e/2); 64 | 65 | Circle(D/2, even_odd=true); 66 | dimension(-D/2, 10, D/2, 10, line_thickness=lt); 67 | 68 | Circle(e/2*sqrt(3)/2); 69 | } 70 | } 71 | 72 | module head(D){ 73 | //ISO standard for NON-STRUCTURAL hexagonal bolt head dimensions: 74 | e = 1.8 * D; 75 | h = 0.7 * D; 76 | //TODO: these rules are based on the info found at 77 | //http://www.metrication.com/engineering/fastener.html 78 | // We should double check it. 79 | 80 | Square(-h, -e/2, 0, e/2); 81 | Square(-h, -e/4, 0, e/4); 82 | 83 | dimension(-h,16,0,16, line_thickness=lt); 84 | } 85 | 86 | module body(diameter, length){ 87 | Square(0, -diameter/2, hobbing_position - hobbing_width/2, diameter/2); 88 | Square(hobbing_position + hobbing_width/2, -diameter/2, length, diameter/2); 89 | dimension(0,-10, length,-10, line_thickness=lt); 90 | } 91 | 92 | module hobbing(position, diameter, length){ 93 | N=6; 94 | dimension(0,11, position-length/2,11, line_thickness=lt); 95 | dimension(position-length/2, 12, position+length/2, 12, color="red", line_thickness=lt); 96 | 97 | translate([position,0]){ 98 | for (i=[0:N]) 99 | Square(-length/2, -(i/N)*diameter/2, length/2, (i/N)*diameter/2); 100 | } 101 | } 102 | 103 | module screw(diameter, length){ 104 | N=10; 105 | spacing=3; 106 | dimension(bolt_length-length,11, bolt_length,11, line_thickness=lt); 107 | 108 | Square(bolt_length-length, -diameter/2, bolt_length, diameter/2); 109 | 110 | color("black") 111 | translate([bolt_length-length, -diameter/2]) 112 | intersection(){ 113 | square([length, diameter]); 114 | for(i=[0:N]){ 115 | line(i*spacing-diameter, -1, i*spacing, diameter+1); 116 | } 117 | } 118 | } 119 | 120 | module wade_large(){ 121 | color("brown") 122 | projection(cut=true){ 123 | rotate([0,-90]) 124 | rotate([0,0,10]) 125 | import("MM_wade-big.stl"); 126 | } 127 | } 128 | 129 | module wade_large_3d(){ 130 | rotate([0,-90]) 131 | rotate([0,0,10]) 132 | import("MM_wade-big.stl"); 133 | } 134 | 135 | use ; 136 | module wade_block_3d(){ 137 | jhead_mount=256; 138 | wade(hotend_mount=jhead_mount, layer_thickness=0.25); 139 | } 140 | 141 | module wade_block_2d(){ 142 | projection(cut=true) 143 | wade_block_3d(); 144 | } 145 | 146 | wade_height = 6; 147 | translate([wade_height,0]){ 148 | wade_large(); 149 | // %wade_large_3d(); 150 | } 151 | 152 | //%wade_block_3d(); 153 | module hobbed_bolt(){ 154 | bolt_hex_head_frontal_view(bolt_diameter); 155 | 156 | head(bolt_diameter); 157 | body(diameter=bolt_diameter, length=bolt_length); 158 | hobbing(position=hobbing_position, diameter=bolt_diameter-2*hobbing_depth, length=hobbing_width); 159 | screw(diameter=bolt_diameter, length=screw_length); 160 | } 161 | 162 | hobbed_bolt(); 163 | 164 | -------------------------------------------------------------------------------- /heated_bed/heatbed.sch: -------------------------------------------------------------------------------- 1 | EESchema Schematic File Version 2 date Mon 08 Apr 2013 08:47:42 PM BRT 2 | LIBS:power 3 | LIBS:device 4 | LIBS:transistors 5 | LIBS:conn 6 | LIBS:linear 7 | LIBS:regul 8 | LIBS:74xx 9 | LIBS:cmos4000 10 | LIBS:adc-dac 11 | LIBS:memory 12 | LIBS:xilinx 13 | LIBS:special 14 | LIBS:microcontrollers 15 | LIBS:dsp 16 | LIBS:microchip 17 | LIBS:analog_switches 18 | LIBS:motorola 19 | LIBS:texas 20 | LIBS:intel 21 | LIBS:audio 22 | LIBS:interface 23 | LIBS:digital-audio 24 | LIBS:philips 25 | LIBS:display 26 | LIBS:cypress 27 | LIBS:siliconi 28 | LIBS:opto 29 | LIBS:atmel 30 | LIBS:contrib 31 | LIBS:valves 32 | LIBS:heatbed-cache 33 | EELAYER 27 0 34 | EELAYER END 35 | $Descr A4 11693 8268 36 | encoding utf-8 37 | Sheet 1 1 38 | Title "Heat Bed for Metamáquina 2" 39 | Date "6 mar 2013" 40 | Rev "0.9" 41 | Comp "Gustavo Barbosa Monteiro Bruno for Metamáquina" 42 | Comment1 "Licensed under GNU GPLv3 (or later)" 43 | Comment2 "" 44 | Comment3 "" 45 | Comment4 "" 46 | $EndDescr 47 | $Comp 48 | L LED D1 49 | U 1 1 512592B6 50 | P 3850 5000 51 | F 0 "D1" H 3850 5100 50 0000 C CNN 52 | F 1 "GREEN_LED" H 3850 4900 50 0000 C CNN 53 | F 2 "LED-0805" H 3850 5000 60 0000 C CNN 54 | F 3 "" H 3850 5000 60 0000 C CNN 55 | 1 3850 5000 56 | 0 -1 -1 0 57 | $EndComp 58 | $Comp 59 | L THERMISTOR TH1 60 | U 1 1 512596CC 61 | P 3250 5150 62 | F 0 "TH1" V 3350 5200 50 0000 C CNN 63 | F 1 "100k" V 3150 5150 50 0000 C CNN 64 | F 2 "SM0805" H 3250 5150 60 0000 C CNN 65 | F 3 "" H 3250 5150 60 0000 C CNN 66 | 1 3250 5150 67 | 0 -1 -1 0 68 | $EndComp 69 | $Comp 70 | L MOUNTING_HOLE MH1 71 | U 1 1 5133CB70 72 | P 5750 4550 73 | F 0 "MH1" H 5750 4250 60 0000 C CNN 74 | F 1 "MOUNTING_HOLE" H 5750 4350 60 0000 C CNN 75 | F 2 "MountingHole_3mm_RevA_Date21Jun2010" H 5750 3800 60 0000 C CNN 76 | F 3 "~" H 5750 3800 60 0000 C CNN 77 | 1 5750 4550 78 | 1 0 0 -1 79 | $EndComp 80 | $Comp 81 | L MOUNTING_HOLE MH2 82 | U 1 1 5133CB7D 83 | P 6550 4550 84 | F 0 "MH2" H 6550 4250 60 0000 C CNN 85 | F 1 "MOUNTING_HOLE" H 6550 4350 60 0000 C CNN 86 | F 2 "MountingHole_3mm_RevA_Date21Jun2010" H 6550 3800 60 0000 C CNN 87 | F 3 "~" H 6550 3800 60 0000 C CNN 88 | 1 6550 4550 89 | 1 0 0 -1 90 | $EndComp 91 | $Comp 92 | L MOUNTING_HOLE MH4 93 | U 1 1 5133CB83 94 | P 6550 5050 95 | F 0 "MH4" H 6550 4750 60 0000 C CNN 96 | F 1 "MOUNTING_HOLE" H 6550 4850 60 0000 C CNN 97 | F 2 "MountingHole_3mm_RevA_Date21Jun2010" H 6550 4300 60 0000 C CNN 98 | F 3 "~" H 6550 4300 60 0000 C CNN 99 | 1 6550 5050 100 | 1 0 0 -1 101 | $EndComp 102 | $Comp 103 | L MOUNTING_HOLE MH3 104 | U 1 1 5133CB89 105 | P 5750 5050 106 | F 0 "MH3" H 5750 4750 60 0000 C CNN 107 | F 1 "MOUNTING_HOLE" H 5750 4850 60 0000 C CNN 108 | F 2 "MountingHole_3mm_RevA_Date21Jun2010" H 5750 4300 60 0000 C CNN 109 | F 3 "~" H 5750 4300 60 0000 C CNN 110 | 1 5750 5050 111 | 1 0 0 -1 112 | $EndComp 113 | $Comp 114 | L CONN_4 P1 115 | U 1 1 5133D6B0 116 | P 2450 5200 117 | F 0 "P1" V 2400 5200 50 0000 C CNN 118 | F 1 "CONN_4" V 2500 5200 50 0000 C CNN 119 | F 2 "bornier4" H 2450 5200 60 0000 C CNN 120 | F 3 "" H 2450 5200 60 0000 C CNN 121 | 1 2450 5200 122 | -1 0 0 1 123 | $EndComp 124 | Text Label 4200 5650 1 60 ~ 12 125 | Heater 1 126 | $Comp 127 | L THERMISTOR TH2 128 | U 1 1 51340120 129 | P 3250 4900 130 | F 0 "TH2" V 3350 4950 50 0000 C CNN 131 | F 1 "100k" V 3150 4900 50 0000 C CNN 132 | F 2 "SM0603" H 3250 4900 60 0000 C CNN 133 | F 3 "" H 3250 4900 60 0000 C CNN 134 | 1 3250 4900 135 | 0 -1 -1 0 136 | $EndComp 137 | Wire Wire Line 138 | 5150 6300 2800 6300 139 | Wire Wire Line 140 | 2800 4800 5150 4800 141 | Connection ~ 3850 4800 142 | Wire Wire Line 143 | 5150 4800 5150 6300 144 | Connection ~ 3850 6300 145 | Connection ~ 4850 4800 146 | Wire Wire Line 147 | 4850 4800 4850 6300 148 | Wire Wire Line 149 | 4550 4800 4550 6300 150 | Wire Wire Line 151 | 4250 4800 4250 6300 152 | Connection ~ 4250 4800 153 | Connection ~ 4550 4800 154 | Connection ~ 4250 5300 155 | Connection ~ 4550 5300 156 | Connection ~ 4850 5300 157 | Connection ~ 5150 5300 158 | Connection ~ 5150 4800 159 | Wire Wire Line 160 | 2800 4800 2800 5050 161 | Wire Wire Line 162 | 2800 6300 2800 5350 163 | Wire Wire Line 164 | 2800 5150 3000 5150 165 | Wire Wire Line 166 | 3500 5150 3600 5150 167 | Wire Wire Line 168 | 3600 5150 3600 5250 169 | Wire Wire Line 170 | 3600 5250 2800 5250 171 | Connection ~ 2800 5050 172 | Connection ~ 2800 5150 173 | Connection ~ 2800 5250 174 | Connection ~ 2800 5350 175 | Wire Wire Line 176 | 3850 5800 3850 5200 177 | Connection ~ 4250 6300 178 | Connection ~ 4550 6300 179 | Connection ~ 4850 6300 180 | Connection ~ 5150 6300 181 | Connection ~ 4250 5800 182 | Connection ~ 4550 5800 183 | Connection ~ 4850 5800 184 | Connection ~ 5150 5800 185 | Wire Wire Line 186 | 3000 5150 3000 4900 187 | Wire Wire Line 188 | 3500 4900 3500 5150 189 | Connection ~ 3500 5150 190 | Connection ~ 3500 4900 191 | Connection ~ 3000 4900 192 | Connection ~ 3000 5150 193 | $Comp 194 | L R R1 195 | U 1 1 512592C5 196 | P 3850 6050 197 | F 0 "R1" V 3930 6050 50 0000 C CNN 198 | F 1 "1k" V 3850 6050 50 0000 C CNN 199 | F 2 "SM0805" H 3850 6050 60 0000 C CNN 200 | F 3 "" H 3850 6050 60 0000 C CNN 201 | 1 3850 6050 202 | 1 0 0 1 203 | $EndComp 204 | $Comp 205 | L AYLONS N1 206 | U 1 1 5136AF98 207 | P 11000 7000 208 | F 0 "N1" H 10700 7550 60 0000 C CNN 209 | F 1 "AYLONS" H 10700 7400 60 0000 C CNN 210 | F 2 "~" H 10900 7100 60 0000 C CNN 211 | F 3 "~" H 10900 7100 60 0000 C CNN 212 | 1 11000 7000 213 | 1 0 0 -1 214 | $EndComp 215 | $EndSCHEMATC 216 | -------------------------------------------------------------------------------- /heated_bed/shapes3D/_usr_share_kicad_modules_packages3d_smd_chip_cms.wrl: -------------------------------------------------------------------------------- 1 | #VRML V2.0 utf8 2 | #Exported from Wings 3D 0.98.36 3 | DEF cube1 Transform { 4 | children [ 5 | Shape { 6 | appearance Appearance { 7 | material DEF GRAY Material { 8 | diffuseColor 0.493333 0.493333 0.493333 9 | emissiveColor 0.00000e+0 0.00000e+0 0.00000e+0 10 | specularColor 1.00000 1.00000 1.00000 11 | ambientIntensity 1.00000 12 | transparency 0.00000e+0 13 | shininess 1.00000 14 | } 15 | } 16 | geometry IndexedFaceSet { 17 | normalPerVertex TRUE 18 | coord Coordinate { point [ 19 | 3.84064 -2.09508 2.40553e-2, 20 | 3.84065 2.22492 2.40553e-2, 21 | -3.83485 -2.09507 2.40447e-2, 22 | -3.83485 2.22493 2.40447e-2, 23 | 3.84064 -2.09508 1.74406, 24 | 3.84065 2.22492 1.74406, 25 | -3.83485 -2.09507 1.74404, 26 | -3.83485 2.22493 1.74404, 27 | 3.57240 -1.79268 2.02405, 28 | 3.57241 1.92252 2.02405, 29 | -3.56661 1.92253 2.02405, 30 | -3.56661 -1.79267 2.02405 ] } 31 | coordIndex [ 32 | 0, 1, 5, 4, -1, 33 | 0, 2, 3, 1, -1, 34 | 0, 4, 6, 2, -1, 35 | 1, 3, 7, 5, -1, 36 | 2, 6, 7, 3, -1, 37 | 4, 5, 9, 8, -1, 38 | 4, 8, 11, 6, -1, 39 | 5, 7, 10, 9, -1, 40 | 6, 11, 10, 7, -1, 41 | 8, 9, 10, 11, -1 ] 42 | normal Normal { vector [ 43 | 0.577350 -0.577351 -0.577350, 44 | 0.577352 0.577350 -0.577349, 45 | -0.577350 -0.577350 -0.577351, 46 | -0.577349 0.577351 -0.577351, 47 | 0.615893 -0.600624 0.509831, 48 | 0.615894 0.600622 0.509831, 49 | -0.615896 -0.600622 0.509829, 50 | -0.615894 0.600624 0.509829, 51 | 0.275574 -0.259281 0.925652, 52 | 0.275575 0.259280 0.925652, 53 | -0.275577 0.259281 0.925652, 54 | -0.275578 -0.259280 0.925652 ] } 55 | normalIndex [ 56 | 0, 1, 5, 4, -1, 57 | 0, 2, 3, 1, -1, 58 | 0, 4, 6, 2, -1, 59 | 1, 3, 7, 5, -1, 60 | 2, 6, 7, 3, -1, 61 | 4, 5, 9, 8, -1, 62 | 4, 8, 11, 6, -1, 63 | 5, 7, 10, 9, -1, 64 | 6, 11, 10, 7, -1, 65 | 8, 9, 10, 11, -1 ] 66 | } 67 | }, 68 | Shape { 69 | appearance Appearance { 70 | material DEF metal Material { 71 | diffuseColor 1.00000 1.00000 0.786667 72 | emissiveColor 0.00000e+0 0.00000e+0 0.00000e+0 73 | specularColor 1.00000 1.00000 1.00000 74 | ambientIntensity 0.922222 75 | transparency 0.00000e+0 76 | shininess 1.00000 77 | } 78 | } 79 | geometry IndexedFaceSet { 80 | normalPerVertex TRUE 81 | coord Coordinate { point [ 82 | -3.83868 -1.87907 2.40447e-2, 83 | -3.83869 -1.87907 1.72404, 84 | -3.83868 2.00893 1.72404, 85 | -3.83868 2.00893 2.40447e-2, 86 | -4.33493 -1.87907 2.40440e-2, 87 | -4.33492 2.00893 2.40440e-2, 88 | -4.04715 -1.87907 1.72404, 89 | -4.33493 -1.87907 1.42364, 90 | -4.04714 2.00893 1.72404, 91 | -4.33492 2.00893 1.42364, 92 | 4.33306 -1.87908 2.40560e-2, 93 | 4.33306 2.00892 2.40560e-2, 94 | 3.83298 -1.87908 2.40553e-2, 95 | 3.83298 -1.87908 1.72406, 96 | 3.83298 2.00892 1.72406, 97 | 3.83299 2.00892 2.40553e-2, 98 | 4.33306 -1.87908 1.42326, 99 | 4.04489 -1.87908 1.72406, 100 | 4.33306 2.00892 1.42326, 101 | 4.04489 2.00892 1.72406 ] } 102 | coordIndex [ 103 | 0, 1, 6, 7, 4, -1, 104 | 0, 3, 2, 1, -1, 105 | 0, 4, 5, 3, -1, 106 | 1, 2, 8, 6, -1, 107 | 2, 3, 5, 9, 8, -1, 108 | 4, 7, 9, 5, -1, 109 | 6, 8, 9, 7, -1, 110 | 10, 11, 18, 16, -1, 111 | 10, 12, 15, 11, -1, 112 | 10, 16, 17, 13, 12, -1, 113 | 11, 15, 14, 19, 18, -1, 114 | 12, 13, 14, 15, -1, 115 | 13, 17, 19, 14, -1, 116 | 16, 18, 19, 17, -1 ] 117 | normal Normal { vector [ 118 | 0.577350 -0.577351 -0.577350, 119 | 0.577349 -0.577351 0.577351, 120 | 0.577350 0.577350 0.577351, 121 | 0.577352 0.577350 -0.577349, 122 | -0.577350 -0.577350 -0.577351, 123 | -0.577349 0.577351 -0.577351, 124 | -0.344898 -0.477624 0.808035, 125 | -0.816890 -0.474353 0.328147, 126 | -0.344897 0.477625 0.808035, 127 | -0.816888 0.474355 0.328147, 128 | 0.577350 -0.577351 -0.577350, 129 | 0.577352 0.577350 -0.577349, 130 | -0.577350 -0.577350 -0.577351, 131 | -0.577352 -0.577350 0.577349, 132 | -0.577350 0.577351 0.577350, 133 | -0.577349 0.577351 -0.577351, 134 | 0.816888 -0.474355 0.328150, 135 | 0.344895 -0.477625 0.808036, 136 | 0.816889 0.474353 0.328149, 137 | 0.344896 0.477624 0.808036 ] } 138 | normalIndex [ 139 | 0, 1, 6, 7, 4, -1, 140 | 0, 3, 2, 1, -1, 141 | 0, 4, 5, 3, -1, 142 | 1, 2, 8, 6, -1, 143 | 2, 3, 5, 9, 8, -1, 144 | 4, 7, 9, 5, -1, 145 | 6, 8, 9, 7, -1, 146 | 10, 11, 18, 16, -1, 147 | 10, 12, 15, 11, -1, 148 | 10, 16, 17, 13, 12, -1, 149 | 11, 15, 14, 19, 18, -1, 150 | 12, 13, 14, 15, -1, 151 | 13, 17, 19, 14, -1, 152 | 16, 18, 19, 17, -1 ] 153 | } 154 | } 155 | ] 156 | } 157 | 158 | -------------------------------------------------------------------------------- /heated_bed/heatbed.net: -------------------------------------------------------------------------------- 1 | (export (version D) 2 | (design 3 | (source /home/aylons/Insync/aylons@gmail.com/MetaMaquina/code/Metamaquina2/heated_bed/heatbed.sch) 4 | (date "Wed 06 Mar 2013 12:03:25 AM BRT") 5 | (tool "eeschema (2013-feb-21)-testing")) 6 | (components 7 | (comp (ref D1) 8 | (value GREEN_LED) 9 | (footprint LED-0805) 10 | (libsource (lib device) (part LED)) 11 | (sheetpath (names /) (tstamps /)) 12 | (tstamp 512592B6)) 13 | (comp (ref TH1) 14 | (value 100k) 15 | (footprint SM0805) 16 | (libsource (lib device) (part THERMISTOR)) 17 | (sheetpath (names /) (tstamps /)) 18 | (tstamp 512596CC)) 19 | (comp (ref MH1) 20 | (value MOUNTING_HOLE) 21 | (footprint MountingHole_3mm_RevA_Date21Jun2010) 22 | (libsource (lib aylons_mechanical) (part MOUNTING_HOLE)) 23 | (sheetpath (names /) (tstamps /)) 24 | (tstamp 5133CB70)) 25 | (comp (ref MH2) 26 | (value MOUNTING_HOLE) 27 | (footprint MountingHole_3mm_RevA_Date21Jun2010) 28 | (libsource (lib aylons_mechanical) (part MOUNTING_HOLE)) 29 | (sheetpath (names /) (tstamps /)) 30 | (tstamp 5133CB7D)) 31 | (comp (ref MH4) 32 | (value MOUNTING_HOLE) 33 | (footprint MountingHole_3mm_RevA_Date21Jun2010) 34 | (libsource (lib aylons_mechanical) (part MOUNTING_HOLE)) 35 | (sheetpath (names /) (tstamps /)) 36 | (tstamp 5133CB83)) 37 | (comp (ref MH3) 38 | (value MOUNTING_HOLE) 39 | (footprint MountingHole_3mm_RevA_Date21Jun2010) 40 | (libsource (lib aylons_mechanical) (part MOUNTING_HOLE)) 41 | (sheetpath (names /) (tstamps /)) 42 | (tstamp 5133CB89)) 43 | (comp (ref P1) 44 | (value CONN_4) 45 | (footprint bornier4) 46 | (libsource (lib conn) (part CONN_4)) 47 | (sheetpath (names /) (tstamps /)) 48 | (tstamp 5133D6B0)) 49 | (comp (ref TH2) 50 | (value 100k) 51 | (footprint SM0603) 52 | (libsource (lib device) (part THERMISTOR)) 53 | (sheetpath (names /) (tstamps /)) 54 | (tstamp 51340120)) 55 | (comp (ref R1) 56 | (value 1k) 57 | (footprint SM0805) 58 | (libsource (lib device) (part R)) 59 | (sheetpath (names /) (tstamps /)) 60 | (tstamp 512592C5)) 61 | (comp (ref N1) 62 | (value AYLONS) 63 | (libsource (lib aylons_mechanical) (part AYLONS)) 64 | (sheetpath (names /) (tstamps /)) 65 | (tstamp 5136AF98))) 66 | (libparts 67 | (libpart (lib device) (part LED) 68 | (footprints 69 | (fp LED-3MM) 70 | (fp LED-5MM) 71 | (fp LED-10MM) 72 | (fp LED-0603) 73 | (fp LED-0805) 74 | (fp LED-1206) 75 | (fp LEDV)) 76 | (fields 77 | (field (name Reference) D) 78 | (field (name Value) LED) 79 | (field (name Footprint) ~) 80 | (field (name Datasheet) ~)) 81 | (pins 82 | (pin (num 1) (name A) (type passive)) 83 | (pin (num 2) (name K) (type passive)))) 84 | (libpart (lib device) (part R) 85 | (description Resistance) 86 | (footprints 87 | (fp R?) 88 | (fp SM0603) 89 | (fp SM0805) 90 | (fp R?-*) 91 | (fp SM1206)) 92 | (fields 93 | (field (name Reference) R) 94 | (field (name Value) R) 95 | (field (name Footprint) ~) 96 | (field (name Datasheet) ~)) 97 | (pins 98 | (pin (num 1) (name ~) (type passive)) 99 | (pin (num 2) (name ~) (type passive)))) 100 | (libpart (lib device) (part THERMISTOR) 101 | (description Resistance) 102 | (footprints 103 | (fp R?) 104 | (fp SM0603) 105 | (fp SM0805)) 106 | (fields 107 | (field (name Reference) TH) 108 | (field (name Value) THERMISTOR) 109 | (field (name Footprint) ~) 110 | (field (name Datasheet) ~)) 111 | (pins 112 | (pin (num 1) (name ~) (type passive)) 113 | (pin (num 2) (name ~) (type passive)))) 114 | (libpart (lib conn) (part CONN_4) 115 | (description "Symbole general de connecteur") 116 | (fields 117 | (field (name Reference) P) 118 | (field (name Value) CONN_4)) 119 | (pins 120 | (pin (num 1) (name P1) (type passive)) 121 | (pin (num 2) (name P2) (type passive)) 122 | (pin (num 3) (name P3) (type passive)) 123 | (pin (num 4) (name P4) (type passive)))) 124 | (libpart (lib aylons_mechanical) (part AYLONS) 125 | (fields 126 | (field (name Reference) U) 127 | (field (name Value) AYLONS) 128 | (field (name Footprint) ~) 129 | (field (name Datasheet) ~))) 130 | (libpart (lib aylons_mechanical) (part MOUNTING_HOLE) 131 | (fields 132 | (field (name Reference) MH) 133 | (field (name Value) MOUNTING_HOLE) 134 | (field (name Footprint) ~) 135 | (field (name Datasheet) ~)))) 136 | (libraries 137 | (library (logical device) 138 | (uri /usr/share/kicad/library/device.lib)) 139 | (library (logical conn) 140 | (uri /usr/share/kicad/library/conn.lib)) 141 | (library (logical aylons_mechanical) 142 | (uri /home/aylons/kicad/Mechanical/aylons_mechanical.lib))) 143 | (nets 144 | (net (code 1) (name "") 145 | (node (ref TH2) (pin 1)) 146 | (node (ref P1) (pin 3)) 147 | (node (ref TH1) (pin 1))) 148 | (net (code 2) (name "") 149 | (node (ref TH2) (pin 2)) 150 | (node (ref P1) (pin 2)) 151 | (node (ref TH1) (pin 2))) 152 | (net (code 3) (name "") 153 | (node (ref R1) (pin 2)) 154 | (node (ref D1) (pin 1))) 155 | (net (code 5) (name "") 156 | (node (ref P1) (pin 4)) 157 | (node (ref P1) (pin 1)) 158 | (node (ref D1) (pin 2)) 159 | (node (ref R1) (pin 1))))) -------------------------------------------------------------------------------- /svg/M_circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 18 | 20 | 42 | 44 | 45 | 47 | image/svg+xml 48 | 50 | 51 | 52 | 53 | 54 | 59 | 63 | 68 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /CalibrationRules-conf.scad: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Author: 4 | // * Felipe C. da S. Sanches 5 | // 6 | // This program is free software: you can redistribute it and/or modify 7 | // it under the terms of the GNU General Public License as published by 8 | // the Free Software Foundation, either version 3 of the License, or 9 | // (at your option) any later version. 10 | // 11 | // This program is distributed in the hope that it will be useful, 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | // GNU General Public License for more details. 15 | // 16 | // You should have received a copy of the GNU General Public License 17 | // along with this program. If not, see . 18 | 19 | include ; 20 | include ; 21 | 22 | extruder_wiring_radius = 6; 23 | YEndstopHolder_distance = 66; 24 | 25 | //utils 26 | use ; 27 | use ; 28 | use ; 29 | use ; 30 | include 31 | 32 | //dimensions 33 | tolerancia=0; 34 | 35 | module calibracao(){ 36 | import("calibracao.dxf"); 37 | } 38 | 39 | module FrontRule_face(){ 40 | difference(){ 41 | union(){ 42 | translate([0,0]) 43 | square([283, 50], center=true); 44 | translate([0,25+25/2]) 45 | rounded_square([283+30, 25], corners=[10,10,10,10], center=true); 46 | } 47 | union(){ 48 | translate([-44,15+16]) 49 | scale(0.5) calibracao(); 50 | 51 | for (i=[-1,1]){ 52 | 53 | //barras transversais 54 | translate([i*Y_rods_distance/2,-11+tolerancia,0]) 55 | rounded_square([m8_diameter,50], corners=[0,0,m8_diameter/2,m8_diameter/2], center=true); 56 | 57 | //arruelas encostadas nas laterais 58 | translate([i*(SidePanels_distance-2*thickness-m8_washer_thickness)/2,m8_washer_D/2-50/2+tolerancia,0]) 59 | square([m8_washer_thickness,50], center=true); 60 | 61 | //porcas encostadas nas laterais 62 | translate([i*(SidePanels_distance-2*thickness-2*m8_washer_thickness-m8_nut_height)/2,m8_nut_R-50/2+1.1+tolerancia,0]) 63 | square([m8_nut_height,50], center=true); 64 | 65 | //arruelas encostadas nas laterais do rolamento 66 | translate([i*(bearing_thickness+2*mudguard_washer_thickness+2*washer_thickness+1.25)/2,m8_washer_D/2-50/2+tolerancia,0]) 67 | square([1.25,50], center=true); 68 | 69 | //porcas encostadas nas laterais do rolamento 70 | translate([i*(bearing_thickness+2*mudguard_washer_thickness+2*washer_thickness+2*1.25+m8_nut_height)/2,m8_nut_R-50/2+1.1+tolerancia,0]) 71 | square([m8_nut_height,50], center=true); 72 | } 73 | 74 | //rolamento 75 | translate([0,-8+tolerancia,0]) 76 | square([bearing_thickness+2*mudguard_washer_thickness+2*washer_thickness,50], center=true); 77 | } 78 | } 79 | } 80 | 81 | module FrontRule_sheet(){ 82 | material("lasercut") 83 | linear_extrude(height=thickness) 84 | FrontRule_face(); 85 | } 86 | 87 | module FrontRule(){ 88 | translate([0,5,0]) 89 | translate([0, -RightPanel_basewidth/2 + bar_cut_length+thickness/2, base_bars_Zdistance + base_bars_height]) 90 | rotate([90,0,0]) 91 | FrontRule_sheet(); 92 | } 93 | 94 | module RearRule_face(){ 95 | difference(){ 96 | union(){ 97 | translate([0,0]) 98 | square([283, 50], center=true); 99 | translate([0,25+25/2]) 100 | square([283, 25], center=true); 101 | } 102 | union(){ 103 | rotate([180,0,0]) 104 | rotate([180,180,0]) 105 | translate([-44,15+16]) 106 | scale(0.5) calibracao(); 107 | 108 | for (i=[-1,1]){ 109 | 110 | //barras transversais 111 | translate([i*Y_rods_distance/2,-11+tolerancia,0]) 112 | rounded_square([m8_diameter,50], corners=[0,0,m8_diameter/2,m8_diameter/2], center=true); 113 | 114 | //arruelas encostadas nas laterais 115 | translate([i*(SidePanels_distance-2*thickness-m8_washer_thickness)/2,m8_washer_D/2-50/2+tolerancia,0]) 116 | square([m8_washer_thickness,50], center=true); 117 | 118 | //porcas encostadas nas laterais 119 | translate([i*(SidePanels_distance-2*thickness-2*m8_washer_thickness-m8_nut_height)/2,m8_nut_R-50/2+1.1+tolerancia,0]) 120 | square([m8_nut_height,50], center=true); 121 | } 122 | 123 | //porca da direita encostada no rolamento 124 | translate([(bearing_thickness+2*mudguard_washer_thickness+2*washer_thickness+m8_nut_height)/2,m8_nut_R-50/2+1.1+tolerancia,0]) 125 | square([m8_nut_height,50], center=true); 126 | 127 | //porca da esquerda encostada no rolamento 128 | translate([-(bearing_thickness+2*mudguard_washer_thickness+2*washer_thickness+thickness+2*thickness+2*m8_washer_thickness)/2,m8_nut_R-50/2+1.1+tolerancia,0]) 129 | square([m8_nut_height,50], center=true); 130 | 131 | //arruela encostada no rolamento 132 | translate([-(bearing_thickness+2*mudguard_washer_thickness+2*washer_thickness+2*thickness+m8_washer_thickness)/2,m8_washer_D/2-50/2+tolerancia,0]) 133 | square([m8_washer_thickness,50], center=true); 134 | 135 | //rolamento 136 | translate([0,-9+tolerancia,0]) 137 | square([bearing_thickness+2*mudguard_washer_thickness+2*washer_thickness,50], center=true); 138 | 139 | //madeira motor 140 | translate([-(bearing_thickness+2*mudguard_washer_thickness+2*washer_thickness+thickness)/2,-14.5+tolerancia,0]) 141 | square([thickness,50], center=true); 142 | } 143 | } 144 | } 145 | 146 | module RearRule_sheet(){ 147 | material("lasercut") 148 | linear_extrude(height=thickness) 149 | RearRule_face(); 150 | } 151 | 152 | module RearRule(){ 153 | translate([0,430,0]) 154 | translate([0, -RightPanel_basewidth/2 + bar_cut_length+thickness/2, base_bars_Zdistance + base_bars_height]) 155 | rotate([90,0,0]) 156 | RearRule_sheet(); 157 | } 158 | 159 | 160 | FrontRule(); 161 | RearRule(); 162 | -------------------------------------------------------------------------------- /RAMBo.scad: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Authors: 4 | // * Felipe C. da S. Sanches 5 | // * Rafael H. de L. Moretti 6 | // 7 | // This program is free software: you can redistribute it and/or modify 8 | // it under the terms of the GNU General Public License as published by 9 | // the Free Software Foundation, either version 3 of the License, or 10 | // (at your option) any later version. 11 | // 12 | // This program is distributed in the hope that it will be useful, 13 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | // GNU General Public License for more details. 16 | // 17 | // You should have received a copy of the GNU General Public License 18 | // along with this program. If not, see . 19 | 20 | include ; 21 | include ; 22 | use ; 23 | include ; 24 | include ; 25 | 26 | RAMBo_pcb_thickness = 2; 27 | M3_bolt_head = 3; 28 | RAMBo_cover_thickness = 3; 29 | RAMBo_thickness = nylonspacer_length + RAMBo_pcb_thickness + hexspacer_length + RAMBo_cover_thickness + M3_bolt_head; 30 | RAMBo_border = 3.7; 31 | RAMBo_width = 103; 32 | RAMBo_height = 104; 33 | epsilon = 0.05; 34 | 35 | module PSU_connector(){ 36 | BillOfMaterials("Power supply connector for RAMBo board", ref="39530-0006"); 37 | 38 | //Power supply connector 39 | 40 | //Connector dimensions 41 | conn_thickness = 9.8; 42 | conn_width = 30.5; 43 | conn_height = 15.1; 44 | epsilon = 0.05; 45 | 46 | //Bolt slots 47 | bolt_diameter = 3.5; 48 | bolts_offset = -2.3; 49 | 50 | material("rubber") 51 | difference() { 52 | cube([conn_thickness, conn_width, conn_height]); 53 | 54 | for (i = [1 : 6]) { 55 | translate([conn_thickness/2,bolts_offset + 5*i,-epsilon]) { 56 | cylinder(conn_height+2*epsilon,r=bolt_diameter/2); 57 | } 58 | } 59 | } 60 | } 61 | 62 | module RAMBo_cover_curves(border=0){ 63 | difference(){ 64 | translate([-border,-border]) 65 | rounded_square([RAMBo_width+2*border, RAMBo_height+2*border], corners=[3,3,3,3]); 66 | RAMBo_holes(); 67 | } 68 | //TODO: Add logo / labels ? 69 | } 70 | 71 | module RAMBo_cover(){ 72 | BillOfMaterials("Lasercut acrylic RAMBo cover", ref="MM2_RAMBO_COVER"); 73 | 74 | material("acrylic") 75 | linear_extrude(height=RAMBo_cover_thickness) 76 | RAMBo_cover_curves(); 77 | } 78 | 79 | module RAMBo(){ 80 | BillOfMaterials("RAMBo board", ref="RMB_1.1b"); 81 | 82 | { //TODO: add these parts to the CAD model 83 | BillOfMaterials("M3x25 bolt",4, ref="H_M3x25"); //to mount the RAMBo board in the side panel 84 | BillOfMaterials("M3x10 bolt",4, ref="H_M3x10"); //To attach the cover 85 | } 86 | 87 | for (x=[RAMBo_border, RAMBo_width-RAMBo_border]){ 88 | for (y=[RAMBo_border, RAMBo_height-RAMBo_border]){ 89 | translate([x,y]){ 90 | double_M3_lasercut_spacer(); 91 | 92 | translate([0,0,2*thickness+RAMBo_pcb_thickness]){ 93 | hexspacer_32mm(); 94 | translate([0,0,hexspacer_length+RAMBo_cover_thickness]){ 95 | //bolt head 96 | material("metal") 97 | cylinder(r=3, h=M3_bolt_head); 98 | } 99 | } 100 | } 101 | } 102 | } 103 | 104 | translate([0,0,2*thickness]){ 105 | RAMBo_pcb(); 106 | 107 | translate([0,0,RAMBo_pcb_thickness]){ 108 | translate([100,60]) 109 | PSU_connector(); 110 | 111 | translate([0,0,hexspacer_length]) 112 | RAMBo_cover(); 113 | } 114 | } 115 | } 116 | 117 | module RAMBo_volume(){ 118 | //This is the space that is required for the RAMBo Electronics. 119 | //We must make sure there's enough space so that the electronics doesn't 120 | //take up part of the printer's max build volume. 121 | %cube([RAMBo_width, RAMBo_height, RAMBo_thickness]); 122 | } 123 | 124 | module RAMBo_wiring_holes(){ 125 | //This is a big hole for passing all wires from one side of 126 | // the panel to the other side: 127 | translate([RAMBo_width/2, RAMBo_height/2]) 128 | rotate(90) 129 | hull() 130 | for (i=[-1,1]) 131 | translate([i*15,0]) 132 | circle(r=10); 133 | 134 | 135 | //These are ziptie holes for making sure the individual wires 136 | // are kept in place, near their connection point in the RAMBo PCB: 137 | 138 | //X & Y motor cables 139 | translate([20,10]) 140 | rotate(90) 141 | zip_tie_holes(); 142 | 143 | //Z left and right motor cables 144 | translate([50,10]) 145 | rotate(90) 146 | zip_tie_holes(); 147 | 148 | //Extruder motor cable 149 | translate([80,10]) 150 | rotate(90) 151 | zip_tie_holes(); 152 | 153 | //Thermistor cables 154 | translate([95,52]) 155 | zip_tie_holes(d=10); 156 | 157 | //Power Supply cables 158 | translate([95,80]) 159 | zip_tie_holes(d=20); 160 | 161 | { //Endstop cables 162 | //TODO: Choose one before manufacturing: 163 | 164 | // Option 1: This is closer to the connector but may leave the cables exposed in the back of the machine 165 | # translate([10,50]) 166 | zip_tie_holes(); 167 | 168 | // Option 2: This is a bit far, but the cables would be less exposed in the upper portion of the pcb mount area 169 | # translate([80,95]) 170 | rotate(90) 171 | zip_tie_holes(); 172 | } 173 | 174 | //Extruder heater cable 175 | translate([20,95]) 176 | rotate(90) 177 | zip_tie_holes(); 178 | 179 | //HeatedBed heater cable 180 | translate([50,95]) 181 | rotate(90) 182 | zip_tie_holes(); 183 | } 184 | 185 | module RAMBo_holes(){ 186 | translate([RAMBo_border, RAMBo_border]) 187 | circle(r=m4_diameter/2); 188 | 189 | translate([RAMBo_border, RAMBo_height-RAMBo_border]) 190 | circle(r=m4_diameter/2); 191 | 192 | translate([RAMBo_width-RAMBo_border, RAMBo_border]) 193 | circle(r=m4_diameter/2); 194 | 195 | translate([RAMBo_width-RAMBo_border, RAMBo_height-RAMBo_border]) 196 | circle(r=m4_diameter/2); 197 | } 198 | 199 | module RAMBo_pcb(){ 200 | material("pcb"){ 201 | linear_extrude(height=RAMBo_pcb_thickness){ 202 | difference(){ 203 | square([RAMBo_width, RAMBo_height]); 204 | RAMBo_holes(); 205 | } 206 | } 207 | } 208 | } 209 | 210 | //RAMBo(); 211 | 212 | -------------------------------------------------------------------------------- /cable_clips.scad: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Author: 4 | // * Felipe C. da S. Sanches 5 | // 6 | // This program is free software: you can redistribute it and/or modify 7 | // it under the terms of the GNU General Public License as published by 8 | // the Free Software Foundation, either version 3 of the License, or 9 | // (at your option) any later version. 10 | // 11 | // This program is distributed in the hope that it will be useful, 12 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | // GNU General Public License for more details. 15 | // 16 | // You should have received a copy of the GNU General Public License 17 | // along with this program. If not, see . 18 | 19 | include ; 20 | include ; 21 | 22 | module ring(r, R, start=0, end=360){ 23 | N=200; 24 | for (i=[0:N]) 25 | rotate(start + i*(end-start)/N) 26 | translate([R,0]) 27 | circle(r=r, $fn=20); 28 | } 29 | 30 | module clip_2d(height, diameter, clip_thickness){ 31 | r = clip_thickness/2; 32 | R = diameter/2+r; 33 | stick_length = 5; 34 | 35 | translate([0,height-R-r]) 36 | { 37 | ring(r=r, R=R, start=-30, end=240); 38 | 39 | //stick 40 | hull(){ 41 | rotate(-30) 42 | translate([R,0]){ 43 | circle(r=r, $fn=20); 44 | 45 | rotate(60) 46 | translate([stick_length,0]) 47 | circle(r=r, $fn=20); 48 | } 49 | } 50 | 51 | //tip 52 | rotate(-30) 53 | translate([R,0]) 54 | rotate(60) 55 | translate([stick_length,0]) 56 | circle(r=r*1.2, $fn=20); 57 | 58 | //details 59 | for (angle = [30, 180-30]){ 60 | rotate(angle) 61 | translate([R+r,0]) 62 | circle(r=r*1.2, $fn=20); 63 | } 64 | } 65 | } 66 | 67 | module base_2d(length, clip_thickness){ 68 | hull(){ 69 | for (i=[-1,1]) 70 | translate([i*length/2, clip_thickness/2]) 71 | circle(r=clip_thickness/2, $fn=20); 72 | } 73 | 74 | for (i=[-1,1]) 75 | translate([i*length/2, 1.2*clip_thickness/2]) 76 | circle(r=1.2*clip_thickness/2, $fn=20); 77 | } 78 | 79 | module base_3d(width, length, clip_thickness){ 80 | translate([0,width/2]) 81 | rotate([90,0]) 82 | linear_extrude(height=width) 83 | base_2d(length=length, clip_thickness=clip_thickness); 84 | } 85 | 86 | module clip_3d(width, height, diameter, clip_thickness){ 87 | translate([0,width/2]) 88 | rotate([90,0]) 89 | linear_extrude(height=width) 90 | clip_2d(height=height, diameter=diameter, clip_thickness=clip_thickness); 91 | } 92 | 93 | module cable_clip_model(D, H, L, W, W2, clip_thickness){ 94 | base_3d(width=W, length=L, clip_thickness=clip_thickness); 95 | clip_3d(width=W2, height=H, diameter=D, clip_thickness=clip_thickness); 96 | } 97 | 98 | module hellerman_cable_clip_with_sticker(D, H, L, W, W2, sticker_thickness=1, clip_thickness){ 99 | material("rubber") 100 | translate([-L/2, -W/2]) 101 | cube([L, W, sticker_thickness]); 102 | 103 | material("nylon") 104 | translate([0,0,sticker_thickness]) 105 | cable_clip_model(D=D, H=H, L=L, W=W, W2=W2, clip_thickness=clip_thickness); 106 | } 107 | 108 | module arrow(length, line_thickness=0.5, angle=30){ 109 | lt = line_thickness; 110 | square([length,lt]); 111 | for (i=[-1:1]) 112 | rotate(i*angle) 113 | square([length/4, lt]); 114 | } 115 | 116 | module clip_mount(L,W, line_thickness=0.5){ 117 | lt = line_thickness; 118 | difference(){ 119 | translate([-L/2, -W/2]) 120 | square([L, W]); 121 | 122 | translate([-L/2 + lt, -W/2 + lt]) 123 | square([L - 2*lt, W - 2*lt]); 124 | } 125 | 126 | translate([0.4*L, 0]) 127 | rotate(180) 128 | arrow(length=0.4*L, line_thickness=lt); 129 | } 130 | 131 | module cable_clip_mount(type){ 132 | if (type == "RA3") RA3_cable_clip_mount(); 133 | if (type == "RA6") RA6_cable_clip_mount(); 134 | if (type == "RA9") RA9_cable_clip_mount(); 135 | if (type == "RA13") RA13_cable_clip_mount(); 136 | if (type == "RA18") RA18_cable_clip_mount(); 137 | } 138 | 139 | module cable_clip(type){ 140 | if (type == "RA3") RA3_cable_clip(); 141 | if (type == "RA6") RA6_cable_clip(); 142 | if (type == "RA9") RA9_cable_clip(); 143 | if (type == "RA13") RA13_cable_clip(); 144 | if (type == "RA18") RA18_cable_clip(); 145 | } 146 | 147 | //http://www.farnell.com/datasheets/1504045.pdf 148 | module RA3_cable_clip_mount() clip_mount(L=13, W=13); 149 | module RA3_cable_clip(){ 150 | BillOfMaterials("Cable-clip Hellerman RA3", ref="RA3"); 151 | hellerman_cable_clip_with_sticker(D=3, H=5, L=13, W=13, W2=5, clip_thickness=1); 152 | } 153 | 154 | module RA6_cable_clip_mount(){ 155 | clip_mount(L=20.7, W=11.6); 156 | 157 | translate([-9,5]) 158 | rotate(-90) 159 | scale(0.6) 160 | import("RA6.dxf"); 161 | } 162 | 163 | module RA6_cable_clip(){ 164 | BillOfMaterials("Cable-clip Hellerman RA6", ref="RA6"); 165 | hellerman_cable_clip_with_sticker(D=6, L=20.7, H=9, W=11.6, W2=5, clip_thickness=1.5); 166 | } 167 | 168 | module RA9_cable_clip_mount() clip_mount(L=19, W=11.25); 169 | module RA9_cable_clip(){ 170 | BillOfMaterials("Cable-clip Hellerman RA9", ref="RA9"); 171 | hellerman_cable_clip_with_sticker(D=9, H=12.5, L=19, W=11.25, W2=6.75, clip_thickness=1.5 /*todo*/); 172 | } 173 | 174 | module RA13_cable_clip_mount() clip_mount(L=23.3, W=24); 175 | module RA13_cable_clip(){ 176 | BillOfMaterials("Cable-clip Hellerman RA13", ref="RA13"); 177 | hellerman_cable_clip_with_sticker(D=13, H=16.5, L=23.3, W=24, W2=9.5, clip_thickness=1.8 /*todo*/); 178 | } 179 | 180 | module RA18_cable_clip_mount() clip_mount(L=28.5, W=28.5); 181 | module RA18_cable_clip(){ 182 | BillOfMaterials("Cable-clip Hellerman RA18", ref="RA18"); 183 | hellerman_cable_clip_with_sticker(D=18, L=28.5, H=23, W=28.5, W2=10, clip_thickness=1.8); 184 | } 185 | 186 | translate([0,0]) RA3_cable_clip(); 187 | translate([20,0]) RA6_cable_clip(); 188 | translate([43,0]) RA9_cable_clip(); 189 | translate([70,0]) RA13_cable_clip(); 190 | translate([103,0]) RA18_cable_clip(); 191 | 192 | -------------------------------------------------------------------------------- /lasercutter_6mm_MDF.scad: -------------------------------------------------------------------------------- 1 | // Large Lasercutter Panel containing all parts for manufacturing the Metamaquina 2 desktop 3d printer 2 | // 3 | // (c) 2013 Metamáquina 4 | // 5 | // Author: 6 | // * Felipe C. da S. Sanches 7 | // 8 | // This program is free software: you can redistribute it and/or modify 9 | // it under the terms of the GNU General Public License as published by 10 | // the Free Software Foundation, either version 3 of the License, or 11 | // (at your option) any later version. 12 | // 13 | // This program is distributed in the hope that it will be useful, 14 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | // GNU General Public License for more details. 17 | // 18 | // You should have received a copy of the GNU General Public License 19 | // along with this program. If not, see . 20 | 21 | include ; 22 | use ; 23 | use ; 24 | use ; 25 | include ; 26 | use ; 27 | 28 | module lasercutter_panel(){ 29 | % plate_border(w=2500, h=1300, border=2); 30 | 31 | translate([10,0]){ 32 | translate([0,10]) 33 | MachineRightPanel_face(); 34 | 35 | translate([902,10]) 36 | mirror([1,0]) //this is mirrored to place the etchings in the right side of the sheet 37 | render() MachineLeftPanel_face(); 38 | 39 | translate([1215,88]) 40 | set_of_M3_spacers(h=6, w=11); 41 | 42 | translate([207,195]){ 43 | XEndIdler_back_face(); 44 | 45 | translate([40,70]) 46 | XEndMotor_back_face(); 47 | } 48 | 49 | translate([236,153]) 50 | XEndMotor_plain_face(); 51 | 52 | translate([444,341]) 53 | XEndMotor_belt_face(); 54 | 55 | translate([276,143]) 56 | rotate(180) 57 | XEndIdler_belt_face(); 58 | 59 | translate([730,314]) 60 | rotate(180) 61 | XEndIdler_plain_face(); 62 | } 63 | 64 | # for (i=[0:1]) 65 | translate([1280+i*18,238]) 66 | rotate(90) 67 | beltclamp_curves(width=28, r=5, for_y_platform=true); 68 | 69 | translate([908,0]){ 70 | translate([405,170]) 71 | for (i=[0:1]) 72 | translate([i*18,0]) 73 | rotate(90) 74 | beltclamp_curves(width=28, r=5, for_y_platform=true); 75 | 76 | translate([372,170]){ 77 | rotate(90) 78 | beltclamp_curves(width=28, r=5, for_x_carriage=true); 79 | 80 | translate([12,0]) 81 | rotate(90) 82 | mirror([0,1]) 83 | beltclamp_curves(width=28, r=5, for_x_carriage=true); 84 | } 85 | 86 | translate([338,230]) 87 | mirror([0,1]) 88 | rotate([0,0,-90]) 89 | MachineTopPanel_face(); 90 | 91 | translate([393,340]) 92 | rotate([0,0,90]) 93 | MachineArcPanel_face(); 94 | 95 | translate([185,230]) 96 | rotate(90) 97 | mirror([1,0]) //mirroring to make laser etching in the correct side of the panel 98 | MachineBottomPanel_face(); 99 | 100 | translate([80,230]){ 101 | rotate([0,0,90]) 102 | XPlatform_bottom_face(); 103 | 104 | translate([30,-40]) 105 | rotate([0,0,90]){ 106 | XEnd_front_face();//Motor 107 | 108 | translate([90,0]) 109 | mirror([1,0]) XEnd_front_face();//Idler <-- this is mirrored so that the laser burnt side ends up turned to the same side (eighter exterior or interior) for both XEnds 110 | } 111 | } 112 | 113 | translate([10,330]) 114 | rotate(180) 115 | mirror([0,1]) 116 | YMotorHolder_face(); 117 | 118 | translate([352,310]) 119 | rotate(-90) 120 | render() 121 | mirror([1,0]) //we want the burnt side up because it's cool! 122 | XCarriage_bottom_face(); 123 | 124 | translate([335,170]){ 125 | for (i=[0:1]){ 126 | translate([i*20,0]) RodEndBottom_face(); 127 | } 128 | } 129 | 130 | translate([415,205]){ 131 | rotate(90) 132 | for (i=[0:1]){ 133 | translate([i*30,0]) 134 | rotate(45) 135 | top_wiring_hole_aux(r=6); 136 | } 137 | } 138 | 139 | translate([275,15]){ 140 | rotate(90) for (i=[-1,1]){ 141 | translate([0,i*15]) RodEndTop_face(); 142 | translate([60,i*15]) SecondaryRodEndTop_face(); 143 | } 144 | } 145 | } 146 | 147 | translate([350,70]){ 148 | translate([70, 147]) 149 | rotate(90) 150 | render() YPlatform_face(); 151 | 152 | translate([370,85]) 153 | rotate(90) xend_bearing_sandwich_face(); 154 | 155 | translate([228,292]) 156 | rotate(90) 157 | xend_bearing_sandwich_face(); 158 | 159 | translate([350,160]) 160 | rotate(90) 161 | XCarriage_sandwich_face(); 162 | 163 | translate([-150,80]) 164 | rotate(90) 165 | YPlatform_left_sandwich_face(); 166 | 167 | translate([8,283]) 168 | rotate(90) 169 | YPlatform_right_sandwich_face(); 170 | 171 | translate([320,210]){ 172 | YEndstopHolder_face(); 173 | 174 | translate([0,28]) 175 | YEndstopHolder_face(); 176 | } 177 | 178 | translate([480,-135]){ 179 | translate([365,210]) 180 | ymin_endstop_spacer_face(); 181 | 182 | translate([335,210]) 183 | ymin_endstop_spacer_face(); 184 | 185 | translate([365,245]) 186 | ymax_endstop_spacer_face(); 187 | 188 | translate([335,245]) 189 | ymax_endstop_spacer_face(); 190 | } 191 | } 192 | 193 | translate([650,100]){ 194 | rotate(90) 195 | render() LCExtruder_panel(); 196 | } 197 | 198 | # translate([20,380]) 199 | PowerSupplyBox_side_face(); 200 | # translate([210,380]) 201 | PowerSupplyBox_front_face(); 202 | # translate([130,380]) 203 | rotate(90) 204 | mirror([0,1]) //we want to keep the burnt side visible because it looks good! 205 | PowerSupplyBox_back_face(); 206 | 207 | if (batch_run==false){ 208 | #translate([265,385]) 209 | PowerSupplyBox_bottom_face(); 210 | } 211 | } 212 | 213 | 214 | module LCExtruder_panel(){ 215 | translate([50,5]) 216 | slice1_face(); 217 | 218 | translate([109,20]) 219 | slice2_face(); 220 | 221 | translate([170,100]) 222 | rotate(180) 223 | slice3_face(); 224 | 225 | translate([175,5]) 226 | slice4_face(); 227 | 228 | translate([90,115]) 229 | rotate(180) 230 | slice5_face(); 231 | 232 | translate([10,100]) 233 | rotate(180) 234 | idler_side_face(); 235 | 236 | translate([148,37]) 237 | idler_side_face(); 238 | 239 | translate([22,20]) 240 | idler_back_face(); 241 | 242 | translate([55,74]) 243 | handle_face(); 244 | } 245 | 246 | lasercutter_panel(); 247 | 248 | -------------------------------------------------------------------------------- /MM_logo_small.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 18 | 20 | 45 | 47 | 48 | 50 | image/svg+xml 51 | 53 | 54 | 55 | 56 | 57 | 62 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /FilamentSpoolHolder.scad: -------------------------------------------------------------------------------- 1 | // (c) 2013 Metamáquina 2 | // 3 | // Author: 4 | // * Felipe C. da S. Sanches 5 | // * Sara Rodriguez 6 | // 7 | // This program is free software: you can redistribute it and/or modify 8 | // it under the terms of the GNU General Public License as published by 9 | // the Free Software Foundation, either version 3 of the License, or 10 | // (at your option) any later version. 11 | // 12 | // This program is distributed in the hope that it will be useful, 13 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | // GNU General Public License for more details. 16 | // 17 | // You should have received a copy of the GNU General Public License 18 | // along with this program. If not, see . 19 | 20 | //utils 21 | use ; 22 | use ; 23 | include ; 24 | include ; 25 | use ; 26 | use ; 27 | 28 | //measures 29 | thickness = 6; 30 | margin = 10; 31 | 32 | feet_height = 12; 33 | feet_width = 50; 34 | base_height = 80; 35 | 36 | adjust=12; 37 | 38 | total_width = 160+2*thickness+2*margin+adjust/2; 39 | 40 | top_cut_height = 20; 41 | top_cut_width = 9; 42 | 43 | radius = 15; 44 | rad=3/2; 45 | 46 | spool_holder_width = 160+2*margin+2*thickness; 47 | spool_holder_height = 40; 48 | 49 | tslot_length = 16; 50 | tslot_diameter = 3; 51 | 52 | hole_domed_cap_nut=12.75; 53 | 54 | bar_diameter=8; 55 | bar_length= spool_holder_width+hole_domed_cap_nut*2; 56 | 57 | total_height = 160/2+35/2-bar_diameter/2+top_cut_height+feet_height+top_cut_width/2; 58 | radius_feet=5; 59 | 60 | diameter=3; 61 | 62 | //TSLOTS 63 | sidepanel_TSLOTS = [ 64 | //parameters => [x, y, width, angle] 65 | [(total_width/2-thickness),15, 50, 0], 66 | [-(total_width/2-thickness),15, 50, 0], 67 | ]; 68 | 69 | front_and_back_panels_TSLOT_SHAPES = [ 70 | //parameters => [x, y, angle] 71 | [tslot_diameter,tslot_length,0], 72 | ]; 73 | 74 | //side panel 75 | module FilamentSpoolHolder_sidepanel_face(){ 76 | 77 | difference(){ 78 | union(){ 79 | hull() 80 | for (i=[-1,1]){ 81 | translate([i*40,total_height-radius]) 82 | circle(r=radius); 83 | 84 | translate([i*(total_width/2-radius),base_height]) 85 | circle(r=radius); 86 | 87 | translate([i*total_width/2,feet_height]) 88 | circle(r=0.1); 89 | } 90 | 91 | for (i=[-1,1]){ 92 | translate([i*(total_width-feet_width)/2,(feet_height+radius_feet)/2]) 93 | rounded_square([feet_width,feet_height+radius_feet], corners=[radius_feet, radius_feet, radius_feet, radius_feet], center=true); 94 | } 95 | } 96 | 97 | union(){ 98 | translate([0,(total_height-top_cut_height/2)]) 99 | square([top_cut_width,top_cut_height],center = true); 100 | 101 | translate([0,(total_height-top_cut_height)]) 102 | circle(r=top_cut_width/2); 103 | 104 | //logo 105 | translate([-3,(base_height*0.75)]) 106 | scale(5) mm_logo(); 107 | 108 | //tslots 109 | for (i=[-1,1]){ 110 | translate([i*(total_width/2-thickness),15]) 111 | TSlot_holes(); 112 | } 113 | } 114 | } 115 | } 116 | 117 | //front and back panels 118 | module FilamentSpoolHolder_front_and_back_panels_face(){ 119 | difference(){ 120 | union(){ 121 | translate([0,(base_height)/2]) 122 | square([spool_holder_width-2*thickness,spool_holder_height],center = true); 123 | 124 | //tslots joints 125 | for (i=[-1,1]){ 126 | translate([i*(spool_holder_width/2-thickness/2),15]) 127 | TSlot_joints(50); 128 | } 129 | } 130 | 131 | for (i=[-1,1]){ 132 | translate([i*(spool_holder_width/2+tslot_length), (base_height/2-i*tslot_diameter)]) 133 | rotate([0,0,i*90]) 134 | tslot_shapes_from_list(front_and_back_panels_TSLOT_SHAPES); 135 | } 136 | } 137 | } 138 | 139 | //bar 140 | module FilamentSpoolHolder_bar_face(){ 141 | circle(r=bar_diameter/2,center=true); 142 | } 143 | 144 | //spool 145 | module FilamentSpoolHolder_spool_face(){ 146 | difference(){ 147 | circle(r=160/2,center=true); 148 | 149 | circle(r=35/2,center=true); 150 | } 151 | } 152 | 153 | module FilamentSpoolHolder_sidepanel_sheet(){ 154 | BillOfMaterials(category="Lasercut wood", partname="Filament Spool Holder Side Panel"); 155 | material("lasercut") 156 | linear_extrude(height=thickness) 157 | FilamentSpoolHolder_sidepanel_face(); 158 | tslot_parts_from_list(sidepanel_TSLOTS); 159 | } 160 | 161 | module FilamentSpoolHolder_front_and_back_panels_sheet(){ 162 | BillOfMaterials(category="Lasercut wood", partname="Filament Spool Holder Side Panel"); 163 | material("lasercut") 164 | linear_extrude(height=thickness) 165 | FilamentSpoolHolder_front_and_back_panels_face(); 166 | } 167 | 168 | module FilamentSpoolHolder_bar_sheet(){ 169 | BillOfMaterials(str("M8x","mm Threaded Rod"), 2); 170 | material("threaded metal") 171 | linear_extrude(height=bar_length) 172 | FilamentSpoolHolder_bar_face(); 173 | } 174 | 175 | module FilamentSpoolHolder_sidepanels(){ 176 | rotate([0,0,90]){ 177 | translate([0, -spool_holder_width/2+thickness]) 178 | rotate([90,0,0]) 179 | FilamentSpoolHolder_sidepanel_sheet(); 180 | 181 | translate([0, spool_holder_width/2-thickness]) 182 | rotate([90,0,180]) 183 | FilamentSpoolHolder_sidepanel_sheet(); 184 | } 185 | } 186 | 187 | module FilamentSpoolHolder_front_and_back_panels(){ 188 | translate([0, -1*(total_width/2-thickness/2-adjust/2)]) 189 | rotate([90,0,0]) 190 | FilamentSpoolHolder_front_and_back_panels_sheet(); 191 | 192 | translate([0, 1*(total_width/2-thickness/2-adjust/2)]) 193 | rotate([90,0,180]) 194 | FilamentSpoolHolder_front_and_back_panels_sheet(); 195 | } 196 | 197 | module FilamentSpoolHolder_bar_subassembly(){ 198 | translate([-(bar_length)/2,0,(total_height-top_cut_height-(top_cut_width-bar_diameter)/2)]) 199 | rotate([0,90,0]) 200 | FilamentSpoolHolder_bar_sheet(); 201 | 202 | union(){ 203 | translate([1*((bar_length-2*hole_domed_cap_nut)/2),0,(total_height-top_cut_height-(top_cut_width-bar_diameter)/2)]) 204 | rotate([0,90,0]) 205 | M8_domed_cap_nut(); 206 | 207 | translate([-1*((bar_length-2*hole_domed_cap_nut)/2),0,(total_height-top_cut_height-(top_cut_width-bar_diameter)/2)]) 208 | rotate([0,270,0]) 209 | M8_domed_cap_nut(); 210 | } 211 | } 212 | 213 | module FilamentSpoolHolder(){ 214 | FilamentSpoolHolder_sidepanels(); 215 | FilamentSpoolHolder_front_and_back_panels(); 216 | FilamentSpoolHolder_bar_subassembly(); 217 | } 218 | 219 | module FilamentSpool(){ 220 | BillOfMaterials(partname="Filament Spool"); 221 | translate([-160/2,0,total_height - top_cut_height - 35/2 + bar_diameter/2 - (top_cut_width-bar_diameter)/2]) 222 | rotate([0,90,0]) 223 | material("ABS") 224 | linear_extrude(height=160) 225 | difference(){ 226 | circle(r=160/2); 227 | circle(r=35/2); 228 | } 229 | } 230 | 231 | FilamentSpoolHolder(); 232 | FilamentSpool(); 233 | -------------------------------------------------------------------------------- /utils/upload_bom.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | # -*- coding: utf-8 -*- 3 | 4 | """ 5 | // (c) 2013 Metamáquina 6 | // 7 | // Author: 8 | // * Rodrigo Rodrigues da Silva 9 | // 10 | // This program is free software: you can redistribute it and/or modify 11 | // it under the terms of the GNU General Public License as published by 12 | // the Free Software Foundation, either version 3 of the License, or 13 | // (at your option) any later version. 14 | // 15 | // This program is distributed in the hope that it will be useful, 16 | // but WITHOUT ANY WARRANTY; without even the implied warranty of 17 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 | // GNU General Public License for more details. 19 | // 20 | // You should have received a copy of the GNU General Public License 21 | // along with this program. If not, see . 22 | """ 23 | 24 | import sys 25 | import xmlrpclib 26 | import re 27 | import argparse 28 | 29 | 30 | def search_product_by_code(code): 31 | args = [('default_code', '=', code)] 32 | ids = sock.execute(dbname, uid, pwd, 'product.product', 'search', args) 33 | #print ids 34 | #print len(ids) 35 | if len(ids) == 0: 36 | #print "Product reference not found!" 37 | raise Exception('[ERROR] Product reference [%(default_code)s] not found!' % item) 38 | else: 39 | fields = ['id', 'default_code', 'name_template'] 40 | results = sock.execute(dbname, uid, pwd, 'product.product', 'read', ids, fields) 41 | #print results 42 | if len(results) > 1: 43 | #print 'Duplicated entry. Reference: %s' % item['default_code'] 44 | raise Exception('[ERROR] Product reference [%(default_code)s] not unique!' % item) 45 | else: 46 | return (results[0]['id'], results[0]['name_template']) 47 | 48 | def create_master_bom(product_id, name): 49 | args = [('name', '=', name)] 50 | ids = sock.execute(dbname, uid, pwd, 'mrp.bom', 'search', args) 51 | if not len(ids) == 0: 52 | raise Exception('[ERROR] BOM with name %s already exists.' % name) 53 | 54 | master_bom = {} 55 | master_bom['product_id'] = product_id 56 | master_bom['name'] = name 57 | master_bom['product_uom'] = 1 58 | return sock.execute(dbname, uid, pwd, 'mrp.bom', 'create', master_bom) 59 | 60 | def create_bom_line(item): 61 | item['product_uom'] = 1 62 | return sock.execute(dbname, uid, pwd, 'mrp.bom', 'create', item) 63 | 64 | 65 | # TODO: put defaults in .rc file 66 | D_USERNAME = 'admin' 67 | D_DBNAME = 'mm_test' 68 | D_PWD = 'test' 69 | D_URL = "erp.metamaquina.com.br" 70 | 71 | ## Parse CLI arguments ## 72 | parser = argparse.ArgumentParser(description='Process BOM from standard input and load items to OpenERP.') 73 | 74 | parser.add_argument('-d', metavar='DATABASE', default=D_DBNAME, dest='dbname', 75 | help='Database name') 76 | parser.add_argument('-u', metavar='USERNAME', default=D_USERNAME, dest='username', 77 | help='Database user') 78 | parser.add_argument('-p', metavar='PASSWORD', default=D_PWD, dest='pwd', 79 | help='Database password') 80 | parser.add_argument('-s', metavar='URL', default=D_URL, dest='server_url', 81 | help='Server URL') 82 | 83 | group = parser.add_mutually_exclusive_group() 84 | group.add_argument('--quiet', action='store_true', default=False, 85 | help='Don\'t show warnings') 86 | group.add_argument('--verbose', action='store_true', default=False, 87 | help='Show debugging info') 88 | 89 | parser.add_argument('--pedantic', action='store_true', default=False, 90 | help='Halt on all errors') 91 | parser.add_argument('--dry-run', action='store_true', default=False, 92 | help='Just parse and check BOM, don\'t load to ERP') 93 | # positional 94 | parser.add_argument('bom_name', metavar='BOM_NAME', type=str, 95 | help='BOM name (no whitespaces)') 96 | parser.add_argument('master_product_code', metavar='PRODUCT_CODE', type=str, 97 | help='Master product code (no whitespaces)') 98 | parser.add_argument('infile', metavar='INFILE', nargs='?', type=argparse.FileType('r'), default=sys.stdin, 99 | help='Input file (MM OpenSCAD BOM format)') 100 | 101 | args = parser.parse_args(sys.argv[1:len(sys.argv)]) 102 | #print args 103 | 104 | username = args.username 105 | dbname = args.dbname 106 | pwd = args.pwd 107 | master_product_code = args.master_product_code 108 | bom_name = args.bom_name 109 | verbose = args.verbose 110 | pedantic = args.pedantic 111 | quiet = args.quiet 112 | server_url = args.server_url 113 | dry_run = args.dry_run 114 | infile = args.infile 115 | 116 | if quiet: verbose = False 117 | 118 | ### BEGIN SCRIPT ### 119 | 120 | # Get the object socket 121 | sock_common = xmlrpclib.ServerProxy ('https://%s/xmlrpc/common' % server_url) 122 | uid = sock_common.login(dbname, username, pwd) 123 | if not uid: 124 | print 'Unable to connect to database %s at %s' % (dbname, server_url) 125 | exit (-1) 126 | sock = xmlrpclib.ServerProxy('https://%s/xmlrpc/object' % server_url) 127 | 128 | pattern = re.compile('\s*(\d+)\s*\[([^\]]*)\]\s*(.*)') 129 | # group 0: quantity 130 | # group 1: [part ref] 131 | # group 2: part name 132 | 133 | parser_skipped = 0 134 | erp_skipped = 0 135 | bom_items = [] 136 | 137 | # TODO: ignore lines that don't start with a number 138 | for line in infile: 139 | # match pattern 140 | ma = pattern.match(line) 141 | if not ma : 142 | if not quiet: 143 | sys.stdout.write('[WARN] Invalid line: %s' % line) 144 | parser_skipped+=1 145 | else: 146 | item = {} 147 | item['product_qty'] = int(ma.group(1)) 148 | item['default_code'] = ma.group(2) 149 | try: 150 | (item['product_id'], item['name_template']) = search_product_by_code(item['default_code']) 151 | except Exception, e: 152 | print e #TODO: write to stdout 153 | erp_skipped += 1 154 | continue 155 | bom_items.append(item) 156 | if verbose: 157 | print '[DEBUG] Item added %s' % item 158 | 159 | if pedantic and (erp_skipped): 160 | print "[FATAL] I found that %d items are either duplicated or don't exist. Fix your OpenERP database to match the BOM and try again. Run without --pedantic if you know what you're doing." % erp_skipped 161 | exit (-1) 162 | 163 | if verbose: 164 | print '' 165 | print '===CHECKLIST===' 166 | print 'BOM_NAME: %s PRODUCT_CODE: %s\n' % (bom_name, master_product_code) 167 | for item in bom_items: 168 | print '%(product_qty)5d \t [%(default_code)s] %(name_template)s' % item 169 | print "" 170 | 171 | #if interactive: 172 | #if not raw_input("%s (y/N) " % "Upload this BOM?").lower() == 'y': 173 | # sys.exit(-1) 174 | 175 | if not dry_run: 176 | # create BOM 177 | (master_product_id, foo) = search_product_by_code(master_product_code) 178 | try: 179 | master_bom_id = create_master_bom(master_product_id, bom_name) 180 | except Exception, e: 181 | print e #TODO: write to stdout 182 | exit (-1) 183 | if not quiet: print 'BOM %s created' % bom_name 184 | # create BOM lines 185 | for bom_line in bom_items: 186 | bom_line['bom_id'] = master_bom_id 187 | bom_line_id = create_bom_line(bom_line) 188 | 189 | if not quiet: 190 | print "Total invalid input lines: %s" % (parser_skipped-2) #-2 header & footer 191 | print "Total items not found or duplicated on ERP: %s" % erp_skipped 192 | print "BOM lines created: %s" % len(bom_items) 193 | if dry_run: 194 | print "Option --dry-run was provided, therefore no items have been created on database %s" % dbname 195 | --------------------------------------------------------------------------------