├── .gitignore ├── Cycloid.ipynb ├── README.md ├── axi.fcstd ├── bearingadapter-10mm.fcstd ├── cantilever-3d.fcstd ├── cnchead.fcstd ├── corexy3.fcstd ├── cycloid.fcstd ├── cycloid.py ├── delta.fcstd ├── doc ├── axi-concept.png ├── braindump.md ├── corexy3-concept.png ├── doverail-slim-model.png ├── doverail-slim-square.jpg ├── doverail-slim-test.jpg ├── doverail-wide-model.png ├── flex-joint-concept.png ├── handy-a4-concept.png ├── ibeam-first.jpg ├── lgm-2018 │ ├── README.md │ └── workshop.md ├── ninja-deltahead-1.jpg ├── tapepen-v1.jpg ├── tapexy-first.jpg ├── tapexy-model.png ├── tapexy-second.jpg └── wallframed-3dp-concept.png ├── doverail-slim-slider-adjustable.fcstd ├── doverail-slim.fcstd ├── doverail-wide.fcstd ├── gantry-adjuster.fcstd ├── handy-a4.fcstd ├── ibeam-20.fcstd ├── ibeam-slider.fcstd ├── ibeam2t-motor.fcstd ├── ibeam2t.fcstd ├── idlerwheel-30deg.fcstd ├── iibeam-30.fcstd ├── limitswitch-holder.fcstd ├── m8alt.fcstd ├── nema17-standoff.fcstd ├── nema17.fcstd ├── penheadhack.fcstd ├── penspring.fcstd ├── platexy.fcstd ├── pulley-ninjaflex.fcstd ├── pulley.fcstd ├── pulleysmall.fcstd ├── tape-slide.fcstd ├── tape608ov.fcstd ├── tapecore-3d.fcstd ├── tapecorexy2.fcstd ├── tapecrane.fcstd ├── tapepen.fcstd ├── tapexy-bearing-assembly-x2.fcstd ├── tapexy-bearing-assembly.fcstd ├── tapexy-frame.fcstd ├── tapexy-gantry.fcstd ├── tapexy-head.fcstd ├── tapexy-kapton608.fcstd ├── tapexy-kapton608v.fcstd ├── tapexy.fcstd ├── tapez-bed.fcstd ├── tapez-frame.fcstd ├── tapez.fcstd ├── tolerancetest.fcstd ├── vrail-inner.fcstd ├── vrail.fcstd ├── wallframed-zadjuster.fcstd ├── wallframed.fcstd ├── wallframed2.fcstd └── zservo_post.py /.gitignore: -------------------------------------------------------------------------------- 1 | *.fcstd1 2 | export/* 3 | -------------------------------------------------------------------------------- /Cycloid.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "http://mathworld.wolfram.com/Cycloid.html\n", 8 | "\n", 9 | "\n", 10 | "$x=acos^(-1)(1-y/a)-sqrt(2ay-y^2)$ \n", 11 | "\n", 12 | "\n", 13 | "$ \\arccos(1-y/a)-2sqrt(2y/a-(y/a)^2) $" 14 | ] 15 | }, 16 | { 17 | "cell_type": "code", 18 | "execution_count": 73, 19 | "metadata": { 20 | "collapsed": true 21 | }, 22 | "outputs": [], 23 | "source": [ 24 | "%load_ext autoreload\n", 25 | "%autoreload 2\n", 26 | "%matplotlib inline\n", 27 | "\n", 28 | "import math\n", 29 | "import sys\n", 30 | "\n", 31 | "# Supress warnings from matplotlib\n", 32 | "import warnings\n", 33 | "warnings.filterwarnings('ignore')\n", 34 | "\n", 35 | "import matplotlib.pyplot as plt\n", 36 | "import numpy\n", 37 | "import pandas" 38 | ] 39 | }, 40 | { 41 | "cell_type": "code", 42 | "execution_count": 77, 43 | "metadata": {}, 44 | "outputs": [ 45 | { 46 | "data": { 47 | "text/plain": [ 48 | "" 49 | ] 50 | }, 51 | "execution_count": 77, 52 | "metadata": {}, 53 | "output_type": "execute_result" 54 | }, 55 | { 56 | "data": { 57 | "image/png": "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\n", 58 | "text/plain": [ 59 | "" 60 | ] 61 | }, 62 | "metadata": {}, 63 | "output_type": "display_data" 64 | } 65 | ], 66 | "source": [ 67 | "sys.path.insert(0, '/home/jon/projects/tapecore')\n", 68 | "import cycloid\n", 69 | "c = cycloid.cycloid(2)\n", 70 | "df = pandas.DataFrame(c)\n", 71 | "df.plot(x='x', y='y', figsize=(periods*3.01*2, 2))" 72 | ] 73 | }, 74 | { 75 | "cell_type": "code", 76 | "execution_count": 75, 77 | "metadata": {}, 78 | "outputs": [ 79 | { 80 | "data": { 81 | "text/plain": [ 82 | "" 83 | ] 84 | }, 85 | "execution_count": 75, 86 | "metadata": {}, 87 | "output_type": "execute_result" 88 | }, 89 | { 90 | "data": { 91 | "image/png": "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\nQmCC\n", 92 | "text/plain": [ 93 | "" 94 | ] 95 | }, 96 | "metadata": {}, 97 | "output_type": "display_data" 98 | } 99 | ], 100 | "source": [ 101 | "def cycloid_x(y, a=1.0):\n", 102 | " return a * math.acos(1 - (y/a)) - math.sqrt(2*a*y - y**2)\n", 103 | "\n", 104 | "def cycloid_period(a, steps): \n", 105 | " # first half\n", 106 | " yleft = list(i/(steps/2) for i in range(0, steps))\n", 107 | " xleft = list(cycloid_x(yleft[i], a) for i in range(0, steps))\n", 108 | "\n", 109 | " xmax = max(xleft)\n", 110 | " ymax = max(yleft)\n", 111 | "\n", 112 | " # second half\n", 113 | " yright = list(ymax - i/(steps/2) for i in range(0, steps))\n", 114 | " xright = list((xmax*2) - cycloid_x(yright[i], a) for i in range(0, steps))\n", 115 | "\n", 116 | " Y = yleft + yright\n", 117 | " x = xleft + xright\n", 118 | "\n", 119 | " # reflect across Y\n", 120 | " Y = list(ymax - y for y in Y)\n", 121 | "\n", 122 | " return { 'x': x, 'y': Y, 'xmax': xmax, 'ymax': ymax }\n", 123 | "\n", 124 | "def shifted(points, shift):\n", 125 | " return list(p + shift for p in points)\n", 126 | " \n", 127 | "def cycloid(periods, a=1.0, steps=1000):\n", 128 | " points = { 'x': [], 'y': [] }\n", 129 | " period = cycloid_period(a, steps)\n", 130 | " for i in range(periods):\n", 131 | " x = shifted(period['x'], period['xmax']*2*i)\n", 132 | " points['x'] += x\n", 133 | " points['y'] += period['y']\n", 134 | "\n", 135 | " return points\n", 136 | "\n", 137 | "periods = 3\n", 138 | "c = cycloid(periods, a=1.0, steps=1000)\n", 139 | "df = pandas.DataFrame(c)\n", 140 | "df.plot(x='x', y='y', figsize=(periods*3.01*2, 2))" 141 | ] 142 | }, 143 | { 144 | "cell_type": "code", 145 | "execution_count": null, 146 | "metadata": { 147 | "collapsed": true 148 | }, 149 | "outputs": [], 150 | "source": [] 151 | } 152 | ], 153 | "metadata": { 154 | "kernelspec": { 155 | "display_name": "Python 3", 156 | "language": "python", 157 | "name": "python3" 158 | }, 159 | "language_info": { 160 | "codemirror_mode": { 161 | "name": "ipython", 162 | "version": 3 163 | }, 164 | "file_extension": ".py", 165 | "mimetype": "text/x-python", 166 | "name": "python", 167 | "nbconvert_exporter": "python", 168 | "pygments_lexer": "ipython3", 169 | "version": "3.6.2" 170 | } 171 | }, 172 | "nbformat": 4, 173 | "nbformat_minor": 2 174 | } 175 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # TapeCore 2 | 3 | Construction techniques for digital fabrication machines and linear axes that aim 4 | to be extremely easy-to-replicate. Key ingredient is using tape surface for plain-bearings 5 | on parts made with commonly available 3d-printers and/or laser-cutters. 6 | 7 | # Handy 8 | 9 | Open-bottom frame, meant to be positioned over workpiece/table. 10 | 11 | ## Handy A4 12 | 13 | Small version, with A4 workarea (22 x 30 cm). 14 | 15 | ![TapeCore Handy A4](./doc/handy-a4-concept.png) 16 | 17 | [FreeCAD project](./handy-a4.fcstd) 18 | 19 | [Bill-of-materials](https://docs.google.com/spreadsheets/d/1o2K1h2c_w2d49ZTSx7vD1f-7HGYju6wTmgCQS48S1lg/edit?usp=sharing) 20 | 21 | ### Status 22 | May 2018: **Needs revision** 23 | 24 | Version 1 with split rails has a lot of backlash in the Y axis, 25 | primarily due to the gantry twisting. This is planned fixed in a future version. 26 | 27 | ### Handy A4 penplotter 28 | 29 | Firmware: [GRBL with servo](https://github.com/jonnor/grbl/tree/handy-a4-plotter). 30 | 31 | CAM/MachineControl: Recommend [LaserWeb4](https://github.com/LaserWeb/LaserWeb4). Set gcode options, Tool On: `M3 S40` and Tool Off to `M3 S0`. 32 | Can also use Inkscape gcodetools + [custom postprocessor](./zservo_post.py) + Universal Gcode Sender 33 | 34 | ### TODO 35 | 36 | v1.0 = penplotter 37 | 38 | * Fix Y axis backlash. Use rail on each side? 39 | * Improve diagonal stiffness. Wedge connecting rail with side? 40 | * Add endstops 41 | * Improve wire guides for motors 42 | * Fix parametrics to respect material size+clearance 43 | * Make pen pressure more even. Use a spring/rubberband in downward direction 44 | * Publish files with part layout ready for lasercutting and 3d-printing 45 | * Document assembly steps 46 | 47 | v1.1 48 | 49 | * Gantry: Avoid needing glue to assemble 50 | * Gantry: Move adjustment of slider pressure to bottom. Wider sliders on top 51 | * Gantry: Move all wire attachment to front. Requires idlers/wires to be placed vertically 52 | * Add wire guides to all idlers. Can be disassembled without loosing wires 53 | * Add carrying holes to sides 54 | * Add holes for attaching to table/wall 55 | 56 | v2.0 = laserengraver 57 | 58 | * Test running plotter vertically 59 | * Test with laserhead, primarily engraving 60 | * Add laser guard around diode (Rishalaser style) 61 | * Add laser reducing light on sides+top, using window tinting film. 62 | * Microswitch safety turns off laser if lifted from table 63 | 64 | v3.0 = reprap? 65 | 66 | * Test maximum cut depth in wood/plastic and 2.5w 67 | * Test splitting gantry into 2/3 pieces 68 | 69 | ## Learnings 70 | 71 | 72 | ### Silicone good lubricant with Kapton 73 | Pure silicone spray, like also used as mold release, is the best. 74 | Works well with Kapton, gives good glide and seems to stay around for a while. 75 | Mechanical lubricant spray based on silicone also works (tested manufacturer: WD40). 76 | However is a bit too fluid, smells badly, and seems to dissolve glue of the Kapton tape. 77 | 78 | ### Mixing directions important with 3d-printed sliders 79 | 80 | If parts are printed with sliding geometry in same direction they have same periodic pattern. 81 | This becomes slightly 'interlocking' when sliding against eachother. 82 | If one part is printed 90 degrees this locking effect does not happen. 83 | Ex: If A is printed with sliding in X direction, print B with sliding in Z direction. 84 | 85 | 86 | ``` 87 | BAD 88 | A: | | | 89 | B: | | | 90 | 91 | Good: 92 | A: | | | 93 | B: _ _ _ 94 | ``` 95 | 96 | ### Ideas 97 | 98 | * 3d-print the 'dragchain' that guides wires etc out to toolhead. 99 | Set of interlinking tubular pieces, possibly print-in-place. 100 | Possibly held together by fishing line. 101 | 102 | 103 | ## Handy A2 104 | 105 | Medium-sized machine, A2 workarea (60x42cm) 106 | 107 | * Scaled up version of Handy A4 design 108 | * Aim for 60x120 footprint or smaller. Can still fit on a typical table 109 | * Splits gantry, sidewalls and rails into 2/3 pieces. 110 | 111 | # Axi 112 | 113 | Cantilevered CoreXY, inspired by Axidraw V3. 114 | A4 workarea, for use with pen or laserhead. 115 | 116 | ![TapeCore Axi concept drawing](./doc/axi-concept.png) 117 | 118 | [FreeCAD sources](./axi.fcstd) 119 | 120 | ## Status 121 | Just a concept sketch, not actively developed. 122 | 123 | 124 | # Doverail Slim 125 | 126 | First 3d-printed linear axis. Geometry inspired by dovetail slides found in lathes and mills, 127 | and the narrow rail format inspired by Hiwin MDG type linear actuators. 128 | 129 | [VIDEO: First tests](https://www.youtube.com/watch?v=5IGngfO671M) 130 | 131 | ![Doverail Slim testing](./doc/doverail-slim-test.jpg) 132 | 133 | ![Doverail Slim model](./doc/doverail-slim-model.png) 134 | 135 | Flexing fingers on the slider gives some extra tolerance for variation along rail. 136 | M3 screwholes for attaching to the support of the rail. 137 | Multiple pieces can easily be joined together to build longer axes. 138 | 139 | ## Limitations 140 | 141 | Side-loading capacity is limited due to springyness of slider fingers. 142 | Rotational force will easily twist the slider. 143 | The short slider length and narrow rail contributes, but also primarily due to flex of slider fingers. 144 | 145 | So for a sliding Y bed (Prusa i3) would need dual rails. 146 | 147 | Not suitable for cantilevered designs (Y axis on a PrintrBot Simple or Z-axis on Ultimaker). 148 | It may be possible to compensate a little bit by using multiple widely-spaced sliders, as one would with a LMU6/8/10 based design. 149 | 150 | ## Learnings 151 | 152 | ### Tape adheres poorly to printed PLA 153 | Poor adhesion of tape to printed PLA is a challenge. 154 | Office-tape, Kapton and PET all stick pretty bad to the rough surfaces. 155 | Especially for internal curvature. Applying tape to the rail is tricky due to its length, and while mounted together. 156 | Having a precisely cut tape piece ahead of time would help, as would a mounting jig which still allows easy access to underside. 157 | 158 | Edges to be taped should be: flat, tolerate slight misaligment and excess, ideally allow wrapping tape to adhere to itself. 159 | 160 | ### Vegetable oil gives higher static friction 161 | 162 | When adding a couple of drops of olive oil to the PLA rail with PETP taped slider, the slider became much more 'sticky'. 163 | Possible that sliding friction went down, but for plain bearing usually static friction is the biggest problem. 164 | Wiping it off with a wet cloth fixed the problem. 165 | Not known if a less viscous oil and/or hydrophobic/mineral oil would not have this problem. 166 | 167 | ### Sliding non-coated printed parts works 168 | 169 | Since taping the rail is a bit tedious, we're primarily testing without any surface treatment on rail. 170 | Against a PETP taped slider, friction is OK and there is no noticable wear after hundreds of repetitions. 171 | Long-term wear is still unknown. 172 | 173 | Not tested, but it looks like PLA against PLA may actually perform OK for very simple tasks with low load, low precision requirements. 174 | 175 | This should be even better with a filament like PolyPropylene or Nylon, 176 | which have a lower coefficient of friction and has self-lubricating properties. 177 | 178 | ## TODO 179 | 180 | * Test the design on a Delta 3d-printer, or a CoreXY pen-plotter 181 | * Make the FreeCAD properly parametric, with variables for length/height/width and tolerance 182 | * Change to 4x mounting holes on the slider, ideally compatible with MGN9 183 | * Make an adjustable slider design that works 184 | 185 | Contributions welcome! 186 | 187 | # Doverail Wide 188 | 189 | A redesign of the Doverail Slim to have a much wider rail (40-100 mm), 190 | and using a slider which is fixed on one side and screw-ajustable tensioner on other side. 191 | 192 | ![Model of wide Doverail](./doc/doverail-wide-model.png) 193 | 194 | This should significantly improve side-loading ability, and make suitable for more kinematic systems. 195 | Examples would be an XYZ gantry-based system (as on many CNC-mills), and sliding-bed Y (like Prusa i3) using a single rail. 196 | Even for a CoreXY laser or 3d-printer, the ability to have the X/Y rails vertical (like SmartRap Core) 197 | simplifies how axes and end-effectors are attached. 198 | 199 | Disadvantage is the higher material use and printing time. 200 | 201 | ## TODO 202 | 203 | * Finish first model, print and test an axis 204 | * Test with Kapton tape on slider, nothing on rail. 205 | * Test with UHWM PE tape. 206 | * Test on a vertical-rail X gantry, with end-effector 207 | * Test on a sliding-Y bed 208 | 209 | ## Ideas 210 | 211 | * Create sanding jigs, by adhering sandpaper to inner/outer shape, then slide one across the other. 212 | * Use a steel rod as the idler instead of (608) bearing. For instance the head of a hex bolt? 213 | 214 | ## Tribology of common materials 215 | 216 | Needed is some proper test procedure and data for coefficient-of-friction tests for commonly available materials and their combinations. 217 | 218 | Examples: 219 | 220 | * Candle wax. Polyurethane coating, epoxy coating. 221 | * Lubricants: vegetable oil, sewing-machine-oil, mineral oil, silicone oil. 222 | * Surface treatment: Sanding, heating, buffing 223 | 224 | 225 | # TapeXY 226 | 227 | Experiment in super low-cost XY stage, for uses in digital fabrication techniques 228 | which have minimal weight and forces on head (laser engraving, 3d-printing). 229 | Inspired by the [RishaLaser](http://rishalaser.org) project. 230 | 231 | [Youtube VIDEO](https://www.youtube.com/watch?v=Eynk2ZyVWqM) 232 | 233 | ![TapeXY fully functioning prototype](./doc/tapexy-second.jpg) 234 | 235 | Key features: 236 | 237 | * Using low-friction tape as basis for gliding surfaces, 238 | inspired by [a design](http://www.thingiverse.com/thing:3554) by Peter Jansen 239 | * Using braided Nylon/Polyamid wire ("Spectra line") instead of timing belts. 240 | Like on Tantillus and some Delta printers. 241 | * Reproduction with primarily lasercutter (or CNC mill), in wood/acrylics. 242 | * [CoreXY](http://corexy.com) kinematics 243 | 244 | ### Status 245 | Not actively developed. Use [Handy](./README.md#Handy) instead 246 | 247 | ### Parts 248 | 249 | Fabricated 250 | 251 | * Frame [FreeCAD](./tapexy-frame.fcstd) 252 | * Gantry [FreeCAD](./tapexy-gantry.fcstd) 253 | * Head [FreeCAD](./tapexy-head.fcstd) 254 | * Pulleys. NinjaFlex/SemiFlex for friction. [FreeCAD](./pulley-ninjaflex.fcstd) 255 | * Idlers. 2x [sideguides](http://www.thingiverse.com/thing:31216) for 608 bearing 256 | 257 | Assembly: [FreeCAD](./tapexy.fcstd) 258 | 259 | Main vitamins 260 | 261 | * MDF/Plywood/Acrylic 3-6 mm. 262 | * 2x NEMA17 stepper motors. 263 | * 1x Motion driver board. RAMPS or similar 264 | * Cables for motors and endstops 265 | * Low-friction tape, width at least 20mm. Recommened: 266 | [UHMWPE 1in 3mil](https://www.amazon.com/JVCC-UHMW-PE-3-UHMW-Polyethylene-Film/dp/B00WUU61A) | 267 | Alternative: Kapton tape, as used for Reprap 3d-printers. 268 | * Strong line. Recommended: Braided fishing line (Spectra or similar). 269 | Alternative: Nylon, Polyester or linen. 270 | * 2x Endstops. 271 | 272 | Misc vitamins 273 | 274 | * 8x 608 bearings, for idlers. 275 | * 8x M8x40 bolts, for idlers. 276 | * 8x M3x10 bolts, for stepper. 277 | * 4x M4x25 bolts, for head/gantry. 278 | 279 | Effector 280 | 281 | * 1x Laser diode module including driver. 282 | 283 | 284 | ## Done 285 | 286 | * First working prototype of XY stage, driven by RAMPS/Cura 287 | * [Laser diode driver](../currentsource). Linear constant-current source based on op-amp+MOSFET, for 5volt supply. 288 | * Fully operational prototype, driven by RAMPS w/Marlin 289 | 290 | ### Limitations 291 | 292 | * Non-standard lasermodule and attachment 293 | * Gantry stiffness is too low 294 | * Small working area, approx 15x10cm 295 | 296 | Missing 297 | 298 | * Holes in backwall for motor cables 299 | * Mounting holes for endstops 300 | * A belt/line attachment and tensioning system. Just use strip-ties?? 301 | * Holes for attaching RAMPS/controlboard 302 | * Cables management for cables going to head/effector 303 | 304 | ## I-beam 305 | 306 | ![First I-beam prototype](./doc/ibeam-first.jpg) 307 | 308 | Designed to be a basic construction module, from which relatively large multi-axis machines can be made. 309 | 310 | [v1 on Thingiverse](http://www.thingiverse.com/thing:1850612). 311 | [v1 demo video](https://www.youtube.com/watch?v=oqJivOp4JyQ) 312 | 313 | Features 314 | 315 | * Rigid I-beam structure, with double-layer core for rotational stiffness 316 | * Trapped nuts allows attaching from all sides 317 | * Use as linear guide for slider by wrapping low-friction tape 318 | 319 | Source files for FreeCAD 320 | 321 | * [Beam](./ibeam2t.fcstd) 322 | * [Slider](./ibeam2t-slider.fcstd) 323 | * [Motor connection](./ibeam2t-motor.fcstd) 324 | 325 | Vitamins needed: 326 | 327 | * Low-friction tape. UHMW PE or Teflon ideal. Kapton also works OK 328 | * NEMA17 stepper motor, incl M3 screws 329 | * Braided line (fishing line or similar) 330 | * 4 pieces M4x20+ 331 | * 4 pieces M4x15+ 332 | 333 | ### TODO 334 | 335 | Beam 336 | 337 | * Improve trapped nut pattern in sides. Top-left and bottom-right (diagonal) should face one side 338 | * Remove redundant (blind) holes in top/bottom layer 339 | * Make tabs wider, reduce number by approx half 340 | * Split up cut parts into multiple, with top/bottom/sides being a staggered/lapped 341 | * Maybe reduce height/width a little bit. 30x40 mm? 342 | 343 | Tests 344 | 345 | * Test making axis in multiple parts, with total length 1.5-2x than machine working area. 346 | * Test in 3-4 mm plywood. Faster to make and possibly self-replicatable. Is it rigid enough? 347 | * Design & test a CoreXY using the I-beam as basic building block 348 | 349 | Other designs for lasercut beams (untested) 350 | 351 | * I-beam. [FreeCAD source](./ibeam-20.fcstd) 352 | * II-beam. [FreeCAD source](./ibeam-30.fcstd) 353 | 354 | Tools for calculating stiffness of beams 355 | 356 | * http://www.had2know.com/technology/I-beam-calculator-moments-engineering.html 357 | * http://www.engineersedge.com/section_properties_menu.shtml 358 | * http://www.amesweb.info/SectionalPropertiesTabs/SectionalPropertiesIbeam.aspx 359 | * https://en.m.wikipedia.org/wiki/Deflection_(engineering) 360 | * https://en.m.wikipedia.org/wiki/List_of_second_moments_of_area 361 | 362 | ## CNC Z-axis 363 | 364 | [Servo-driven Z-axis with ER11 shank driven by brushless motor](./cnchead.fcstd) 365 | 366 | TODO 367 | 368 | * Add rack&pinion 369 | * Finish servo attachment 370 | * Add holes for tightening screws for pen holding 371 | * Test with pen 372 | * Add pulleys 373 | * Test with CNC spindle 374 | 375 | Servo options. Should at least have 5 kg-cm 376 | 377 | * [JX Servo PS-4806HB](https://www.banggood.com/JX-Servo-PS-4806HB-6KG-High-Torque-Standard-48_5g-Servo-for-RC-Models-p-1013373.html), 6kg-cm 378 | * [TowerPro MG996R](https://www.banggood.com/TowerPro-MG996R-Metal-Gear-Digital-High-Torque-Servo-55g-p-982287.html), 10 kg-cm 379 | 380 | 381 | ## Pen Z-axis 382 | 383 | ![Servo driven Z axis for a pen holder](./doc/tapepen-v1.jpg) 384 | 385 | 3d-printed files [on Thingiverse](http://www.thingiverse.com/thing:1850720). 386 | [FreeCAD source project](./tapepen.fcstd). 387 | 388 | Using a printed V-rail geometry, covered with low-friction tape. 389 | Has adjustment for the tension, was very practical to dial in the correct amount. 390 | 391 | Fits pens 8-15 mm in diameter. 392 | Lifts straight up, perpendicular to surface. Roughly 10 mm travel. 393 | Unlike many others servo-driven pen axes which rotate when lifting pen. 394 | 395 | Used in the penplotter which was the award given to the winners of Oslo Innovation Award 2016. 396 | Successfully printed the diploma live on stage. 397 | 398 | Vitamins needed: 399 | 400 | * Microservo. SG92R or other with same size head, https://www.adafruit.com/product/169 401 | * Low-friction tape. UHMW PE or Teflon ideal. Kapton can be used as replacement 402 | * 2x M3x30 + M3 hex nuts for attaching pen to slider 403 | * 2x M3x30 for adjusting tension on the slider 404 | 405 | TODO/improvements 406 | 407 | * Use a slightly bigger/stronger servomotor 408 | * Use as basis for a lens-moving Z axis for lasers. 409 | Probably use 3 v-rails instead of 2, keep tensioning principle. 410 | 411 | Existing designs by others 412 | 413 | * Servo+fishingline, spring in one direction. http://www.thingiverse.com/thing:749118 414 | * Servo with 2-bar linkage, lasercut. http://www.thingiverse.com/thing:4185 415 | * Servo with PTFE bushing, spring in down direction. http://www.thingiverse.com/thing:13407 416 | * Servo with rotating slot linkage, lasercut+3dprint. http://fab.cba.mit.edu/classes/863.14/people/nathan_melenbrink/Week_15.html 417 | * Servo with steel bars and POM bushing parts. CNCed https://www.tindie.com/products/ijinstruments/servo-actuated-pen-slide/ 418 | * XY pan+tilt mover, with Z motion. http://www.thingiverse.com/thing:31463 419 | 420 | ## Wallmounted 3d-printer 421 | 422 | Concept based on TapeXY mechanics, adding a wire-driven cantilevered Z-axis. 423 | 424 | ![Wall-mounted 3d-printer](./doc/wallframed-3dp-concept.png) 425 | [FreeCAD project](./wallframed2.fcstd) 426 | 427 | Designed for mounting on a wall, to keep precious desktop space untouched. 428 | Inspired by machines such as the SmartRap Core. 429 | 430 | ## Reproducability 431 | 432 | ### Power needed to reproduce itself. 433 | 434 | Mr.Beam II says that with 5W they can cut 4 mm plywood in two passes (no focus adjustment). 435 | It seems to be a blue diode laser with no air assist. This probably sets 5W as the a lower limit. 436 | 437 | * Adding air-assist might improve cutting efficiency a bit. 438 | * Adjusting the focus into the material for each pass might help 439 | * Using PWM to overdrive the laser periodically may also help 440 | 441 | If one could cut 4 mm acrylic instead, or 5-6 mm plywood, that would make it simpler to make a more rigid machine. 442 | This _might_ be doable with 8-10 watts IR diode. If more is needed, may need to assemble 15-20 watt using multiple diodes. 443 | 444 | [8W diode laser cutting 4mm plywood single pass](https://www.youtube.com/watch?v=gWxxxrpdF10) 445 | [5.5W laser cutting 4mm plywood single pass](https://www.youtube.com/watch?v=fT6_FLB4vyM) 446 | [3.5W laser cutting 3mm acrylic single pass](https://www.youtube.com/watch?v=rqom-Ns8LqA) 447 | [3.5W laser cutting 3mm plywood 5 passes 12mm/s](https://www.youtube.com/watch?v=iQ14XSbGCJk) 448 | [5.5W laser cutting 3mm plywood 2 passes](https://www.youtube.com/watch?v=j0H8-iMtKs4) 449 | 450 | ### Construction tricks 451 | 452 | To make more reproducible 453 | 454 | * Use I/H beam or similar structures to achieve stiffness 455 | * Use 2x 2-3mm material instead of 1x 4-6mm, sandwiched using interlocking geometry. 456 | 457 | General best practices 458 | 459 | * Use same bearings and screws types everywhere 460 | 461 | Self-reproducability. 462 | 463 | * Need to create structure bigger than own working area. 464 | Let I/II-beams consist of multiple sections, with staggered joints? 465 | Do testing of a long beam (50 cm+). Flatness, stiffness, maximum load. 466 | Keep compatible with alu profiles? T-slot/Makerbeam/Openbeam 467 | 468 | ## Laser diodes 469 | 470 | * Bangood [1.6W](http://www.banggood.com/Wholesale-Laser-Equipment-c-3491.html), 471 | [3.5W](https://www.banggood.com/450nm-3500mW-3_5W-Blue-Laser-Module-With-TTL-Modulation-for-DIY-Laser-Cutter-Engraver-p-1103261.html), 472 | [5.5W](http://www.banggood.com/445nm-5_5W-5500mW-Blue-Laser-Module-With-Heatsink-For-DIY-Laser-Cutter-Engraver-p-999283.html) 473 | [7W](https://www.banggood.com/EleksMaker-LA03-7000-445nm-7000mW-Blue-Laser-Module-With-Heatsink-For-DIY-Laser-Engraver-Machine-p-1127310.html), 474 | [15W](https://www.banggood.com/445-450nm-15W-Blue-Laser-Module-Mark-On-Metal-for-DIY-Laser-Engraver-Machine-p-1137779.html) 475 | 476 | * Osram PL TB450B [DigiKey](http://www.digikey.com/product-detail/en/osram-opto-semiconductors-inc/PL%20TB450B/PL%20TB450B-ND/5719266) 477 | * [DTR's Laser Shop](https://sites.google.com/site/dtrlpf/home/diodes) 478 | * [Laserdirect@Ebay](http://www.ebay.com/sch/laserdirect/m.html?_nkw&_armrs=1&_ipg&_from&rt=nc&_mPrRngCbx=1) 479 | 480 | Fibre guided 481 | 482 | * [Ebay: 8 watt NIR 980nm](http://www.ebay.com/itm/980nm-8W-Fiber-Coupled-Laser-Semiconductor-Fiber-Coupled-laser-8000mW-IR-Laser-/141524214275?hash=item20f3802203:g:jsMAAOSwMpZUolDB) 483 | * Ebay: [3W](http://www.ebay.com/itm/Laser-Diode-3-1-Watt-923nm-Fiber-Coupled-100um-JDSU-6380-L2-3-1W-NEW-63-00123-/111598682682?hash=item19fbccc23a:g:mhMAAOSwPhdU3sXA) 484 | and [5W](http://www.ebay.com/itm/Laser-Diode-5-Watt-915nm-Fiber-Coupled-100um-JDSU-6390-L3-5W-NEW-63-00192-/111598671030?hash=item19fbcc94b6:g:0M8AAOSwqu9U3r8Y) 485 | 486 | Should be possible to [combine](https://www.rp-photonics.com/beam_combining.html) multiple such fibre laser diodes with one focusing lens (maybe with colliminator). 487 | To achieve powers of N times the individual laser source. Though with simple combinators, the brightness will not increase so much, due to widening of beam size. 488 | Also the heatsink no longer needs to be on the head, reducing weight of moving parts. 489 | 490 | ## CO2 lasers 491 | 492 | For cheap lasercutters, CO2 lasers are used. 493 | 494 | There are several aspects which are challenging. 495 | 496 | * Laser tube itself 497 | * Cooling the gas 498 | * The optics 499 | * Power supply 500 | 501 | Principle 502 | 503 | Using gas mixture of helium, nitrogen, and carbon dioxide gas. 504 | A common standard mixture is 4.5 percent CO2, 13.5 percent N2, and 82 percent He. Penn suggests using a mixture of 14:14:72 in narrow-bore CO2 laser. 505 | 506 | Aactive cooling to keep the temperature of the discharge tube below around 30 degrees C or so. 507 | 508 | Flowing-gas lasers 509 | 510 | "the flowing-gas CO2 laser requires a vacuum pump to achieve the low pressures (10-30 torr or so)" 511 | 512 | * [35 Watt Flowing Gas CO2 Laser Tube Kit](http://repairfaq.cis.upenn.edu/sam/rconway/35wtkit.pdf), assembly instructions. 513 | * [Flowing gas CO2 laser conversion from sealed gas](https://www.photonlexicon.com/forums/showthread.php/17719-Flowing-gas-CO2-laser-conversion-from-sealed-gas) 514 | * [First Homemade CO2 Laser Built From Scratch](http://jarrodkinsey.org/co2laser/co2laser.html) 515 | 516 | References 517 | 518 | * [Understanding CO2 laser](http://www.laserk.com/newsletters/whiteCO.html) 519 | * [RP Photonics Encyclopedia: CO2 lasers](https://www.rp-photonics.com/co2_lasers.html), describes different types. Sealed tube versus 520 | * [Homebrew CO2 Laser Design and Construction Notes](http://www.timefracture.org/laserdocs/laser_design_notes.html) 521 | * [RepairFAQ: Home-Built Carbon Dioxide (CO2) Laser](http://www.repairfaq.org/sam/lasercc2.htm). Looots of information 522 | * [RepairFAQ: Carbon Dioxide Lasers](http://www.repairfaq.org/sam/laserco2.htm). Loots of information 523 | 524 | ## Related projects... 525 | 526 | Of mine 527 | 528 | * [Clothing](../clothing), various techniques rely on laser 529 | * [Rishalaser](../rishalaser), build of existing open-source low-powered laserengraver 530 | 531 | Existing low-cost laser diode engravers 532 | 533 | * [smartDIYs](http://www.thingiverse.com/thing:1026345) open source kit. Lasercut acrylic, steelrods+timingbelts, motor on gantry. 534 | * [Mr. Beam](https://www.mr-beam.org/) open source kit. Kickstarter 2014. 3d-printed + wood-frame. [Octoprint-based](https://github.com/mrbeam/OctoPrint) software 535 | * [Emblaser](https://darklylabs.com/emblaser-overview) [2](https://sites.google.com/site/3dprinterlist/lasercutters/darklylabs-a3-diode-laser) 536 | * [Fabool Laser Mini](http://www.smartdiys.cc/fabool-laser-mini/) claims to be openn source. Also has a CO2 laser available. 537 | 538 | Other inspirational machines 539 | 540 | * [MPlus One](http://www.thingiverse.com/thing:1104249). 541 | Cantilevered, moving bed like PrinterBot Simple and Smartrap, with lasered/milled structure. 542 | Maybe has potential in combination with tape principle, possibly making even cheaper than a CoreXY? 543 | * Axidraw V3 544 | * Cloth of the Bot 545 | 546 | Possible addons 547 | 548 | * [Lasercut vacuum table](http://hackaday.com/2016/03/19/diy-vacuum-table-makes-lasering-even-easier) 549 | * [Air assist for diode laser](http://www.thingiverse.com/thing:1688209), 3d-printed using a radial fan 550 | * [Air assist for compressor](http://www.thingiverse.com/thing:72691). 551 | Seems a small oil-free compressor (airbrush etc) is good enough. Recommened ratings are 30-50 PSI at 1-2.5 CFM. 552 | 553 | ## TapeZ 554 | 555 | Moving-bed Z-axis stage for laserengraver/3d-printer to go with TapeXY. 556 | Also uses Kapton tape and braided Nylon wire. 557 | 558 | Existing wire/belt Z-axis: 559 | 560 | * [SmartRapCore alternative Z](http://www.thingiverse.com/thing:896556) 561 | * [Sli3dr](http://richrap.blogspot.co.uk/2014/07/3d-printers-big-printers-small-printers.html) 562 | * [Igentis](https://www.youmagine.com/designs/ingentis-a-tantillus-variant) 563 | * [Printxel](http://printxel.blogspot.ca/2012/12/printxel-community.html) 564 | * http://forums.reprap.org/read.php?177,310249 565 | * http://forums.reprap.org/read.php?160,170024 566 | * http://forums.reprap.org/read.php?177,192178 567 | * http://forums.reprap.org/read.php?14,319321 568 | * http://forums.reprap.org/read.php?279,188149 569 | 570 | A challenge is that Z-resolution/precision might be a bit low without gearing. 571 | The hold-torque of a NEMA17 stepper might also not be enough to keep bed up. 572 | Reduction gearing of between 1/4 and 1/9 is desirable. 573 | 574 | ## TapeCrane 575 | 576 | My dad wants to build a cheap, large-scale 3d-printer (workspace with sides of 50-100cm) 577 | which could be stowed away when not in used. For this he had two ideas for the kinematics. 578 | One being a robot arm with two joints (elbow and wrist), working in the XY plane. Like SCARA. 579 | The arm up/down or the bed would move to form Z axis. 580 | The effector is cantilevered, making it tricky to keep rigid, and there are multiple 581 | solutions for the inverse kinematics and singularity points. 582 | 583 | The other idea was more like a crane, a [cylindrical robot](https://www.google.no/search?q=cylindrical+robot&tbm=isch). 584 | It has the advantages of much simpler inverse kinematics (because no articulated joints), 585 | and that the structure can be made more rigid in various ways: 586 | Using tensioned wires (like a guy-wire), by supporting the far end, and/or using a (moving) counterbalance. 587 | 588 | The most common configuration, has a rotating base. Alternatively, one can rotate just the (elevated) arm. 589 | Either the whole arm can move back & forth to move end-effector, or the effector can travel along a static arm. 590 | 591 | Unlike a cartesian or delta robot, several cylindrial robots could work into the same workarea. 592 | They could potentially collaborate on a single (large) part, either for speed or multi-filament. 593 | Or indepentently making different parts, or multiple instances of the same part. 594 | 595 | Example of multi-arm collaborations 596 | 597 | * Flexible + rigid printing 598 | * 3d-printing binder + laying out fiber threads 599 | * Rough 3d-printing + precision lasering/milling 600 | * Conductive + non-conductive 3d-printing 601 | 602 | Challenges: 603 | 604 | * Having enough resolution in rotating joint. Probably will need gearing, challenge then becomes low/zero backlash in gear 605 | * Mimizing angular momentum of rotating joint, for maximum speed / minimum force. Keeping weight down, and it close to center of axis 606 | * Cylindrical sectioned build area, does not fit typical objects well. Can partition the circle into 3/4/6/8 rectangular build areas 607 | * Decreasing precision at long-reach. Can also be seen as feature, better precision on small objects 608 | 609 | TODO: 610 | 611 | * Sketch a rough concept 612 | * Test an arm beam, with tensioned wires on top+bottom for ridigity 613 | * Implementing the IK for cylindrical in firmware 614 | 615 | # Experiments 616 | 617 | ## PlateXY 618 | Experiment in extremely simple plotter/laserengraver. 619 | 620 | Features 621 | 622 | * Head is wire-suspended between fixed rails (no gantry), 623 | * Glideblocks tensioned by the drive wires 624 | * Custom rails fixed to standard plate 625 | 626 | ### Status 627 | **Aborted**. In favor of [Handy](./README.md#Handy) 628 | 629 | The gantry-free design was found not good enough for penplotting use. 630 | The lack of locking between the two sliders meant they would move independently, causing a twist in the head. 631 | At A4 size it might have been barely acceptable, but not better than simpler kinematics like [Axi](./README.md#Axi). 632 | 633 | However this kinematics can be useful when precision is not needed, and it is desirable to hide the mechanics of the machine. 634 | For instance with the rails mounted to floor/ceiling, and using transparent fishing line, one can make pieces move around in XZ 'invisibly'. 635 | 636 | ## Kapton 608 bearing 637 | 638 | .. Wednesday 14 Oct 2015, Oslo .. 639 | 640 | Attempted to create a 608-sized bearing/bushing. 3d-printed, using Kapton tape added afterwards. 641 | Using a V-profile to make the bearing support some axial load. 642 | Initially 120 deg, but had to increase to 135-degrees to make it possible to insert inner part into outer ring. 643 | Tolerances when 3d-printed (on a Ultimaker Original) seemed generally OK. 644 | 645 | However, major issues were found when trying to assemble. 646 | The Kapton tape was not particularly sticky to the print, 647 | and would not easily fold around the V-profiles, especially the outer ring (with inward V profile). 648 | When pressing the inner part of the bearing in, would easily 649 | move the carefully aligned tape... Avoiding folds/creases was quite tricky. 650 | 651 | I was able to succesfully assemble one bearing, with tape only on the inner part. 652 | This rotated quite nicely, with not too much play. 653 | Considering the application of belt pulley, where some excentricity is quite OK. 654 | Indicates that if one can figure out a practical assembly, the idea has some merit. 655 | 656 | It could be that in larger scale, and with a more adhesive tape and, or with simpler geometry, 657 | that the idea would have some merit. But with v-style 608 the process was too fiddly to be practical. 658 | 659 | For TapeXY it could be possible to design an alternative idler/pulley solution. 660 | For instance one could integrate the belt bottom/top guides, and use top/bottom of 661 | rotating part for supporting the (tiny) axial load. 662 | 663 | It is however desirable to be compatible with a standard solution, 664 | or at least also allow a standard solution - since a hacked thing will (probably?) 665 | never be as good as a proper bearing. 666 | 667 | TODO 668 | 669 | * Test cutting low-friction tape to revolved V-shape using laser. 670 | If necessary, try to use additional glue. A jig for pressing the tape against when adhering could also help? 671 | * Try an inverted design: inward V on inner part, outward V on outer ring. 672 | This should be easier to adhere tape to, as the ring has shape towards the top/bottom, not hidden inside. 673 | * Test using UHMW PE / PTFE tape. 674 | * Design an integrated bearing+belt idler for CoreXY usage, compatible with 608-based 675 | 676 | ## References 677 | 678 | Work by others 679 | 680 | * [3d-printed bushing](http://www.thingiverse.com/thing:1196801), replaces speciality linear bearings 681 | * [3d-printed beam surface](http://www.thingiverse.com/thing:9080/#comments) 682 | 683 | General machine building 684 | 685 | * [Methods for minimizing gear backlash](http://machinedesign.com/motion-control/methods-minimize-gear-backlash), 686 | spring-loaded distance, spring-loaded split gears, backloading/dual-gear-train 687 | * [3d=printed anti-backlash gear](http://www.thingiverse.com/thing:98393), dual layer with printed integrated springs. 688 | 689 | 690 | -------------------------------------------------------------------------------- /axi.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/axi.fcstd -------------------------------------------------------------------------------- /bearingadapter-10mm.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/bearingadapter-10mm.fcstd -------------------------------------------------------------------------------- /cantilever-3d.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/cantilever-3d.fcstd -------------------------------------------------------------------------------- /cnchead.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/cnchead.fcstd -------------------------------------------------------------------------------- /corexy3.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/corexy3.fcstd -------------------------------------------------------------------------------- /cycloid.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/cycloid.fcstd -------------------------------------------------------------------------------- /cycloid.py: -------------------------------------------------------------------------------- 1 | import math 2 | 3 | """ 4 | Usage in FreeCAD 5 | 6 | import sys 7 | sys.path.insert(0, '/home/jon/projects/tapecore') # where to find cycloid.py script 8 | import cycloid 9 | C = cycloid.cycloid(3, steps=100) 10 | P = list(FreeCAD.Vector(x, y, 0.0) for x, y in zip(C['x'], C['y'])) 11 | Draft.makeWire(P,closed=False,face=True,support=None) 12 | """ 13 | 14 | ### TODO 15 | # Create shape for one tooth only 16 | # Repeat over by period/n_teeth 17 | # Close the shape 18 | # Fillet teeth tip 19 | 20 | def cycloid_x(y, a=1.0): 21 | return a * math.acos(1.0 - (y/a)) - math.sqrt(2.0*a*y - y**2) 22 | 23 | def cycloid_period(a, steps): 24 | # first half 25 | yleft = list(i/(steps/2.0) for i in range(0, steps)) 26 | xleft = list(cycloid_x(yleft[i], a) for i in range(0, steps)) 27 | 28 | xmax = max(xleft) 29 | ymax = max(yleft) 30 | 31 | # second half 32 | yright = list(ymax - i/(steps/2.0) for i in range(0, steps)) 33 | xright = list((xmax*2.0) - cycloid_x(yright[i], a) for i in range(0, steps)) 34 | 35 | Y = yleft + yright 36 | x = xleft + xright 37 | 38 | # reflect across Y 39 | #Y = list(ymax - y for y in Y) 40 | 41 | return { 'x': x, 'y': Y, 'xmax': xmax, 'ymax': ymax } 42 | 43 | def shifted(points, shift): 44 | return list(p + shift for p in points) 45 | 46 | def cycloid(periods, a=1.0, steps=1000): 47 | points = { 'x': [], 'y': [] } 48 | period = cycloid_period(a, steps) 49 | for i in range(periods): 50 | x = shifted(period['x'], period['xmax']*2*i) 51 | points['x'] += x 52 | points['y'] += period['y'] 53 | 54 | return points 55 | -------------------------------------------------------------------------------- /delta.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/delta.fcstd -------------------------------------------------------------------------------- /doc/axi-concept.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/doc/axi-concept.png -------------------------------------------------------------------------------- /doc/braindump.md: -------------------------------------------------------------------------------- 1 | 2 | # Endstops and autoleveling probe 3 | 4 | Endstops are cheap, but a specialized part. It would be great if we could reproduce them. 5 | Using a conductive filament (like ProtoPasta Conductive), one could create traces which 6 | can be connected together. In PLA one could design a spring which would separate the traces. 7 | 8 | TODO: 9 | 10 | * Do research of existing work on reprappable endstops/switches 11 | * Do reserch on suitable spring designs 12 | * Design and print a prototype 13 | * Test repeatability 14 | 15 | 16 | On a 3d-printer could use mechanical switches/endstops as an autoleveling probe. 17 | The problem however is that the switch cannot be lower than the nozzle when running 18 | - it will interfere with printing. 19 | 20 | * Have an endstop on two sides of the nozzle, some millimeters higher than nozzle 21 | * Each corner of the build plate, has an elevated area (a bit). 22 | * When running autoleveling, head moves such that the switch is above each of the areas before moving down. 23 | * The hit-targets in the corners can also be the clamps for the glass-plate 24 | * Note: requires careful calibration of build size area 25 | * If repping endstops is cheap enough, can be achieved easily using min+max stops. 26 | * Another advantage is that one can use a printed piece with correct offset 27 | to autolevel also ontop of objects (like a CNC mill) 28 | 29 | # Coating 30 | 31 | Using coats of an epoxy-like binder as an alternative to tape. 32 | Can both provide structural stength, binding individual parts and getting a slick/hard sliding surface 33 | 34 | * [How to measure friction](http://www.tribology-abc.com/abc/friction.htm) 35 | * [Understanding Polyurethane Friction](https://www.slideshare.net/SunrayInc/understanding-polyurethane-coefficient-of-friction). 36 | Harder -> lower friction. 37 | Wet Polyurethane COF `<0.3` against stainless steel, and `<0.7` when dry. 38 | Wood against dry Polyurethane `<0.2` for 75D hardness. 39 | * [Testing coating hardness using pencil method](http://www.woodweb.com/knowledge_base/Testing_Your_Coatings_Hardness.html) 40 | * Durometer. [1](https://www.amazon.com/MegaBrand-Durometer-Digital-Hardness-Tester/dp/B011JCG1KK) 41 | 42 | 43 | # Reprappable laser 44 | 45 | Using Rishalaser/TapeXY as a base. 46 | Focusing first on ultra-low cost for use with textiles & paper, 47 | with long-term goal of having high enough power to cut itself and similar structures. 48 | 49 | ## Milestone 1: Simplified mechanics (DONE) 50 | 51 | * CoreXY architecture. 52 | * Using string (Nylon) instead of belts 53 | * Tape (Kapton/Scotch) slide-bearings 54 | * See [TapeXY](../README.md#TapeXY) 55 | 56 | ## Milestone 2: Raster firmware (in progress) 57 | 58 | * Couple open source alternatives available 59 | 60 | ## Milestone 3: 61 | 62 | * CNC-millable PCB with discrete H-bridges & microcontroller 63 | * Firmware runs directly on this microcontroller 64 | 65 | ## Milestone 4: Fabbable motors 66 | 67 | * Either brusless with gearing and closed-loop, or a direct-drive stepper 68 | * 3d-printed or lasercut bobbins and structure 69 | * Etched 70 | 71 | ## Milestone 5: Custom CO2 laser tubes 72 | 73 | * See [Kreatures work](http://hackaday.com/2015/09/13/building-a-3d-printed-laser-tube/) 74 | * If one can get them up to 20+ watt, should be able to reproduce 75 | -------------------------------------------------------------------------------- /doc/corexy3-concept.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/doc/corexy3-concept.png -------------------------------------------------------------------------------- /doc/doverail-slim-model.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/doc/doverail-slim-model.png -------------------------------------------------------------------------------- /doc/doverail-slim-square.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/doc/doverail-slim-square.jpg -------------------------------------------------------------------------------- /doc/doverail-slim-test.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/doc/doverail-slim-test.jpg -------------------------------------------------------------------------------- /doc/doverail-wide-model.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/doc/doverail-wide-model.png -------------------------------------------------------------------------------- /doc/flex-joint-concept.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/doc/flex-joint-concept.png -------------------------------------------------------------------------------- /doc/handy-a4-concept.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/doc/handy-a4-concept.png -------------------------------------------------------------------------------- /doc/ibeam-first.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/doc/ibeam-first.jpg -------------------------------------------------------------------------------- /doc/lgm-2018/README.md: -------------------------------------------------------------------------------- 1 | 2 | # LGM2018 workshop 3 | 4 | * Where: Seville, Spain 5 | * When: April 26-28 6 | * Status: Proposed 7 | 8 | http://libregraphicsmeeting.org/2018/ 9 | 10 | ## Title 11 | Plotting openly 12 | 13 | ## Proposal 14 | Before the ubiquity of inkjet printers and mobile devices, the pen-plotter was a common way to physically realize and share a digital drawing. Today the plotter remains one of the simplest example of a computer-controlled fabrication device, perfect for learning the basics of digital fabrication. 15 | 16 | Join us to learn how these machines work, how to control it using open software and make them output your drawings! 17 | 18 | We will provide some plotters based on the TapeCore open hardware project. The machines are designed to be easily replicated in a local makerspace/fablab, so that you can build your own. 19 | 20 | Participants should bring their laptops. 21 | 22 | ## Presenter bio 23 | Jon is an engineer who loves working on projects which combine software, electronics and mechanics. 24 | Since 2016 he is active in the maker community in Oslo, researching how make digital fabrication 25 | accessible by designing open-hardware machines that require a minimum amount of specialized parts and skills. 26 | 27 | Jon has previously participated in the libre graphics community as a MyPaint and GEGL/GIMP developer. 28 | At day he runs an Internet-of-Things consultancy named Flowhub. 29 | 30 | 31 | ## TODO 32 | 33 | Machine 34 | 35 | * See ./README.md 36 | 37 | Workshop 38 | 39 | * Decide format/structure 40 | * What software should participants use/learn? 41 | 42 | Maybe 43 | 44 | * Test laser-engraver head 45 | * Test dragknife head 46 | 47 | ## Goal 48 | Finish first version of simple plotter/engraver. 49 | Documentation enough to replicate locally. 50 | Inspire others to replicate it in their local lab. 51 | -------------------------------------------------------------------------------- /doc/lgm-2018/workshop.md: -------------------------------------------------------------------------------- 1 | 2 | ## Tapecore @ LGM2017 - Plotting along openly 3 | 4 | https://github.com/jonnor/tapecore 5 | 6 | ## Goals 7 | - Understand the TapeCore project. 8 | Motivation, construction principles, current state 9 | - Understand basics of digital fabrication. 10 | 11 | ## Non-goals 12 | - Learn to build machine 13 | 14 | ## Format 15 | 16 | 1. Demo 17 | 2. Talk, some background 18 | 3. Hands-on usage 19 | 20 | ## About me 21 | 22 | Contract 23 | 24 | Twitter: @jononor 25 | Github: jonnor 26 | Web: https:/jonnor.com 27 | 28 | Background 29 | 30 | BEng. Electronics 31 | Software Engineer: Embedded, Open Source 32 | (ex) Bike mechanic 33 | 34 | Libre Graphics 2009-2014. MyPaint,OpenRaster, 35 | Maker community. 2014-< . Bitraf & Fellesverkstedet 36 | 37 | Dayjob 38 | 39 | Independent consultant. Internet of Things. Rapid prototyping. SW/E.eng/M.Eng 40 | MSc. Data Science. Machine learning 41 | 42 | ## TapeCore 43 | 44 | - LOW cost 45 | - LOW tech 46 | - OK performance. Sub-millimeter precision 47 | 48 | Fabricatable in makerspace/fablab 49 | 50 | - Few speciality tools 51 | Lasercut + 3d-printed. 52 | - Few speciality parts. 53 | Instead: Digital fabricated and generic consumables. 54 | Tape (Kapton/UHWMPE), Wire/fishing line. 55 | 56 | ### Handy A4 57 | 58 | Designed in FreeCAD 59 | 60 | [Bill of Materials]( 61 | https://docs.google.com/spreadsheets/d/1o2K1h2c_w2d49ZTSx7vD1f-7HGYju6wTmgCQS48S1lg) 62 | 63 | Why penplotters 64 | 65 | GRBL controller 66 | https://github.com/gnea/grbl 67 | 68 | 69 | 70 | ## Review 71 | 72 | Good 73 | 74 | - Portable 75 | - Open bottom frame 76 | 77 | Needs work 78 | 79 | - Backlash in Y axis. Replace split rail with individual rails 80 | - Glue needed for gantry slider. 81 | - Diagonal stiffness too low 82 | - Too many screws 83 | 84 | 85 | ## Fabricatable machines 86 | 87 | https://github.com/fellesverkstedet/fabricatable-machines 88 | 89 | - Medium to high-end machines 90 | - CNCed Aluminum/POM 91 | - Chamfer rail 92 | - Humprey: Full-size CNC 93 | - FAB2.0 - build a Fablab in a Fablab 94 | 95 | 96 | ## Digital fabrication 97 | 98 | ### Concept 99 | 100 | Digital 3d-model + digitally controlled fabrication machine 101 | => automated production of 102 | software-defined physical objects 103 | 104 | In practice: 105 | 106 | - Manual labor needed. 107 | Postprocessing, machine tending 108 | - Craft involved. 109 | Design-for-manufacturing, technology choice, choosing machine parameters 110 | 111 | ### Where is this taking us? 112 | 113 | - Less human labor needed 114 | Cheaper products. Fewer jobs 115 | - Less manual skills needed 116 | Beginners can get good results also. 117 | - Mass-production 118 | Automated, easy to scale up 119 | - Mass-customization 120 | Each part can be unique 121 | 122 | ### Democratization 123 | 124 | Ensure the benefits are widely distributed instead of going to a selected few. 125 | 126 | * Shared public access. 127 | Maker/hackerspaces, Fablabs 128 | * Open online manufacturing services. 129 | Ponoko,3d-hubs,Shapeways,iMaterialize 130 | * Open source hardware. 131 | Reprap project, Prusa i3 132 | * Open source software. 133 | Grbl, Marlin 134 | * Consumer market. 135 | Low prices, OK volume. 136 | Makers as early adopters 137 | 138 | ### Process 139 | 140 | Generally 141 | 142 | CAD -> CAM -> MC 143 | 144 | CAD: Computer-Aided Design 145 | CAM: Computer-aided Manufacturing 146 | MC: Machine Control 147 | 148 | 149 | Example Plotting: 150 | 151 | Inkscape -> Inkscape gcodetools -> OctoPrint 152 | 153 | Example LaserCutting: 154 | 155 | FreeCAD -> AutoLaser -> Control panel on Redsail 156 | 157 | Example generative code 158 | 159 | Python script generates 160 | 161 | Why these divisions? 162 | 163 | - Legacy: In instrustry often separate personell for each role 164 | - CAD: Best software depends on what to design. 165 | - CAM/MC: Depends on technology 166 | 167 | ### Languages 168 | 169 | 170 | https://www.shapeoko.com/wiki/index.php/G-Code 171 | http://reprap.org/wiki/G-code 172 | 173 | Alternative for penplotters: HPGL 174 | 175 | ``` 176 | PU100,100 177 | PD200,200 178 | ``` 179 | Often in 1/64th inch etc 180 | 181 | 182 | ## Machine 183 | 184 | Open loop. Dead reckoning 185 | 186 | -------------------------------------------------------------------------------- /doc/ninja-deltahead-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/doc/ninja-deltahead-1.jpg -------------------------------------------------------------------------------- /doc/tapepen-v1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/doc/tapepen-v1.jpg -------------------------------------------------------------------------------- /doc/tapexy-first.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/doc/tapexy-first.jpg -------------------------------------------------------------------------------- /doc/tapexy-model.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/doc/tapexy-model.png -------------------------------------------------------------------------------- /doc/tapexy-second.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/doc/tapexy-second.jpg -------------------------------------------------------------------------------- /doc/wallframed-3dp-concept.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/doc/wallframed-3dp-concept.png -------------------------------------------------------------------------------- /doverail-slim-slider-adjustable.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/doverail-slim-slider-adjustable.fcstd -------------------------------------------------------------------------------- /doverail-slim.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/doverail-slim.fcstd -------------------------------------------------------------------------------- /doverail-wide.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/doverail-wide.fcstd -------------------------------------------------------------------------------- /gantry-adjuster.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/gantry-adjuster.fcstd -------------------------------------------------------------------------------- /handy-a4.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/handy-a4.fcstd -------------------------------------------------------------------------------- /ibeam-20.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/ibeam-20.fcstd -------------------------------------------------------------------------------- /ibeam-slider.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/ibeam-slider.fcstd -------------------------------------------------------------------------------- /ibeam2t-motor.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/ibeam2t-motor.fcstd -------------------------------------------------------------------------------- /ibeam2t.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/ibeam2t.fcstd -------------------------------------------------------------------------------- /idlerwheel-30deg.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/idlerwheel-30deg.fcstd -------------------------------------------------------------------------------- /iibeam-30.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/iibeam-30.fcstd -------------------------------------------------------------------------------- /limitswitch-holder.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/limitswitch-holder.fcstd -------------------------------------------------------------------------------- /m8alt.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/m8alt.fcstd -------------------------------------------------------------------------------- /nema17-standoff.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/nema17-standoff.fcstd -------------------------------------------------------------------------------- /nema17.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/nema17.fcstd -------------------------------------------------------------------------------- /penheadhack.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/penheadhack.fcstd -------------------------------------------------------------------------------- /penspring.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/penspring.fcstd -------------------------------------------------------------------------------- /platexy.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/platexy.fcstd -------------------------------------------------------------------------------- /pulley-ninjaflex.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/pulley-ninjaflex.fcstd -------------------------------------------------------------------------------- /pulley.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/pulley.fcstd -------------------------------------------------------------------------------- /pulleysmall.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/pulleysmall.fcstd -------------------------------------------------------------------------------- /tape-slide.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/tape-slide.fcstd -------------------------------------------------------------------------------- /tape608ov.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/tape608ov.fcstd -------------------------------------------------------------------------------- /tapecore-3d.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/tapecore-3d.fcstd -------------------------------------------------------------------------------- /tapecorexy2.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/tapecorexy2.fcstd -------------------------------------------------------------------------------- /tapecrane.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/tapecrane.fcstd -------------------------------------------------------------------------------- /tapepen.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/tapepen.fcstd -------------------------------------------------------------------------------- /tapexy-bearing-assembly-x2.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/tapexy-bearing-assembly-x2.fcstd -------------------------------------------------------------------------------- /tapexy-bearing-assembly.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/tapexy-bearing-assembly.fcstd -------------------------------------------------------------------------------- /tapexy-frame.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/tapexy-frame.fcstd -------------------------------------------------------------------------------- /tapexy-gantry.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/tapexy-gantry.fcstd -------------------------------------------------------------------------------- /tapexy-head.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/tapexy-head.fcstd -------------------------------------------------------------------------------- /tapexy-kapton608.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/tapexy-kapton608.fcstd -------------------------------------------------------------------------------- /tapexy-kapton608v.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/tapexy-kapton608v.fcstd -------------------------------------------------------------------------------- /tapexy.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/tapexy.fcstd -------------------------------------------------------------------------------- /tapez-bed.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/tapez-bed.fcstd -------------------------------------------------------------------------------- /tapez-frame.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/tapez-frame.fcstd -------------------------------------------------------------------------------- /tapez.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/tapez.fcstd -------------------------------------------------------------------------------- /tolerancetest.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/tolerancetest.fcstd -------------------------------------------------------------------------------- /vrail-inner.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/vrail-inner.fcstd -------------------------------------------------------------------------------- /vrail.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/vrail.fcstd -------------------------------------------------------------------------------- /wallframed-zadjuster.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/wallframed-zadjuster.fcstd -------------------------------------------------------------------------------- /wallframed.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/wallframed.fcstd -------------------------------------------------------------------------------- /wallframed2.fcstd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jonnor/tapecore/de92d86c628391ba17a284c0b89bd5ee6e55fd38/wallframed2.fcstd -------------------------------------------------------------------------------- /zservo_post.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import os 3 | import re 4 | 5 | def parse_command(line): 6 | line = re.compile(r"\(.*").sub('', line) 7 | 8 | pieces = line.split(' ') 9 | parsed = {} 10 | for p in pieces: 11 | if not p: 12 | continue 13 | 14 | kind,data = p[0],p[1:] 15 | data = re.compile(r"\(.*").sub('', data) 16 | if not data: 17 | continue 18 | 19 | if kind in ('G', 'M'): 20 | parsed[kind] = int(data) 21 | else: 22 | parsed[kind] = float(data) 23 | 24 | return parsed 25 | 26 | known_parameters = ['G', 'M', 'P', 'S', 'X', 'Y', 'Z', 'I', 'J', 'F'] 27 | def serialize_command(command): 28 | pieces = [] 29 | for parameter in known_parameters: 30 | val = command.get(parameter) 31 | if val is not None: 32 | if isinstance(val, float): 33 | pieces.append("{}{:.3f}".format(parameter, val)) 34 | else: 35 | pieces.append("{}{}".format(parameter, val)) 36 | 37 | unknown_parameters = set(command.keys()) - set(known_parameters) 38 | for parameter in unknown_parameters: 39 | val = command.get(parameter) 40 | if val is not None: 41 | if isinstance(val, float): 42 | pieces.append("{}{:.3f}".format(parameter, val)) 43 | else: 44 | pieces.append("{}{}".format(parameter, val)) 45 | 46 | return ' '.join(pieces) 47 | 48 | 49 | def postprocess(gcode): 50 | last_z = None 51 | epsilon = 0.0001 52 | 53 | out = [] 54 | for line in gcode.split('\n'): 55 | c = parse_command(line) 56 | 57 | Z = c.get('Z') 58 | if Z is not None: 59 | change_z = last_z is None or abs(c['Z']-last_z) > epsilon 60 | if change_z: 61 | servo = 'M3 S0' if Z > 0.0 else 'M3 S48' 62 | out.append(servo) 63 | out.append('G4 P0.1') 64 | last_z = c['Z'] 65 | 66 | del c['Z'] 67 | 68 | if set(c.keys()) != set(['G']): 69 | out.append(serialize_command(c)) 70 | 71 | return '\n'.join(out) 72 | 73 | inp = """ 74 | G00 Z0.300000 75 | G00 X154.889190 Y56.379210 76 | 77 | G01 Z-0.125000 F100.0(Penetrate) 78 | G03 X152.742534 Y56.025041 Z-0.125000 I0.000000 J-6.682640 F400.000000 79 | G03 X154.889190 Y56.379210 Z-0.125000 I-2.160392 J-6.368966 80 | G01 X154.889190 Y56.379210 Z-0.125000 81 | G00 Z0.300000 82 | """ 83 | 84 | out = """ 85 | G00 X154.889190 Y56.379210 86 | 87 | G01 F100.0 88 | G03 X152.742534 Y56.025041 I0.000000 J-6.682640 F400.000000 89 | G03 X154.889190 Y56.379210 I-2.160392 J-6.368966 90 | G01 X154.889190 Y56.379210 91 | G00 Z0.300000 92 | """ 93 | 94 | def test_first(): 95 | o = postprocess(inp) 96 | print('o', o) 97 | assert o == out 98 | 99 | def main(): 100 | path = sys.argv[1] 101 | with open(path, 'r') as f: 102 | gcode = f.read() 103 | out = postprocess(gcode) 104 | sys.stdout.write(out) 105 | 106 | if __name__ == '__main__': 107 | main() 108 | 109 | --------------------------------------------------------------------------------