Showing posts with label Reprap. Show all posts
Showing posts with label Reprap. Show all posts

Monday, May 26, 2014

Adventures in 3d printing Or "I Finally Built a RepRap!"

I've wanted a 3d printer for quite some time. A few years ago I stared building one that, to say the least, was poorly engineered and under constructed. It never actually worked at all. Some of the designs could have worked, especially in a large CNC machine, but were just not a good fit for a small 3d printer. I've been eyeing the RepRap i3 models for a while now, last week I bought a kit (less electronics).

RepRap i3 with cooling fans and filament spool.
Note spool is on backwards to allow for the sloped ceiling in my lab.


Assembly was quite straightforward, there is a partial guide, though it skips (or I missed) some key steps.

A few tips:

  • Final alignment of the XZ (vertical) frame should be done after assembly. Just line it up so the extruder will reach the front and back of the Y frame and is square.
  • I printed thumbnuts to fine tune the bed leveling, it makes it really easy to get it spot on. I used these "Easy Heated Bed Leveling Thumbnuts"
  • The Z axis endstop was a pain, part of it was I used the wrong mount, but I printed this "Adjustable Z-Axis Endstop Arm" to make it easier

Fire in the Hole!

Everything I (and probably everyone else) build has some "teething" issues. I had (and am still having) a few. After I got it set up fairly good I started a print and it seemed to be working nicely, then the Sanguinololou literally caught fire (there were flames). The bug list for the Sanguinololou says the traces for the heated bed are too small, so I had reinforced them with wires before this point, it was the wires that caught fire. Turns out the mosFET shorted and the bed just stayed on continuously drawing ~16A. I salvaged the board and put a new mosFET (all I had on hand was a 12A logic level one) put it back together, set it to pwm at 50% and it lasted about 30 seconds before shorting too (I was watching this time). I swapped it again, added a reverse diode and ran it through an automotive relay (so the mosFET turns the relay on and off). That works really good.

Electronics, complete with rats nest

Now that the fires were out It was time to try some real prints. The filament won't stick to the bed. No matter what I do it won't stick. I tried cleaning really well, nope. gluestick helped, allowed me to print the upgrades I mentioned, but was hit or miss. I researched, tweaked settings, spent the better part of a day on it. Finally my brother was over and (looking on his tablet) said "they say here that Reprapper brand glossy black PLA won't stick to glass, use blue tape". Yep, I had Reprapper brand glossy black PLA filament, and yes, it sticks really well to blue tape.

A Sheep! Here's the first print that I took a picture of.

A few remain

Now I can print, I've still got a few issues left, mostly "dialing in" problems.

  • Overhangs and bridging don't work quite right. I've been lowering the extrusion temperature and it really helps. I started at 200C and am down to 180C for the first layer and 175C after that. A box fan after ~5 layers helps even more.
  • I printed some large parts and they warped, pulling the blue tape off the glass. The cooling fan bracket printed really nice with the 182C/177C and bed at 35C settings. this might be licked, but can't say yet. 
  • The first layer of big parts will bunch up a bit during infill, leaving stuff sticking up that can catch the extruder. If it gets 3 layers or so it will bury the problem and will complete fine. I might still be a touch close on my z-axis start point or it might be something else.

Future plans

  • Upgrade to optical endstop for Z-axis. It should be considerably more repeatable than a mechanical endstop, so I think it would be a big improvement. The X and Y axis are not nearly as critical, so I don't see any need to change those endstops.
  • Upgrade the electronics so I don't need a computer hooked to it and add cooling fan support. I've got several options: MosFET board and sd adapter, MosFET board and android tablet, Panelolou (includes Mosfets on the interface board and SD on the panel). I'm leaning toward the tablet option. The software looks really cool. I need to try it sometime.
UPDATE: I printed a bracket to mount some 40mm cooling fans, but all my small fans are 50mm, so I printed a 50mm bracket. Seems I chose one bad fan (rattles) so I'll have to replace that at some point. It makes a huge difference. I'll do another post on integrating it with the electronics.

Links

http://www.thingiverse.com/thing:208137 - thumbscrews
http://www.thingiverse.com/thing:267927 - Z-Axis Endstop Arm

Sunday, February 26, 2012

Building a CNC Machine - Linear Bearings & X-Axis

I've been back and forth between buying the parts to build a RepRap off eBay or designing something myself. I've also been concerned that the Prusa frame wouldn't be strong enough to handle pcb routing. So I decided to build a somewhat heavier duty cnc machine to do pcb routing, but make it able to run an extruder. I may just use it with the extruder or use it as a RepStrap to print the parts for a Prusa at a later date. I intend to use the Sanguinololu board I built to control it.

Linear Bearings

The linear bearing were a hangup for me, all the best ideas were either expensive (v-groove bearings, 1/2"+ linear bearings), or looked flimsy for my application (8mm linear bearings).

I've seen this design on the internet before, and couldn't come up with a better solution that didn't cost a small fortune.

I bought 100 608zz bearings, some angle iron and a big bag of 5/16" nuts, 5/16" x 1" bolts and 1/4" washers. I made a jig to ensure the holes were in the right place, clamped it to the drill press and here's what I came up with.

I will weld 1 1/2" angle to the backs to make mounting brackets. 

Specs: 
  • 1" angle iron cut to 4"
  • Holes drilled at 1/2" and 1 1/8" in from each end (roughly)
  • Clamped to a jig to ensure holes are perfectly aligned in relation to the center
  • Each bearing has a 1/4" washer on each end of the 608zz bearing, a 5/16"x1" bolt and 2 nuts (one on each side of the angle iron)

X Axis
With the bearing design done I started the X-axis
I wanted a bigger work area that the RepRap's 8"x8"x5.5" My X-axis has 11 3/4" max travel. I was going for 12", but the frame interferes. I'll probably limit it to 11-11 1/2". the Y-axis should be about the same, haven't decided on the Z axis yet, I have 8" in mind, but probably between 6-10"

Specs:
  • Slides are 16" long, allowing 12" travel (without the cross pieces). the slides are structural frame parts. they have 1 1/2 angle iron welded to the back of each end to attach them to the cross pieces
  • Cross pieces are 18" wide, allowing slides to be bolted at 15 3/4" wide. It will work out to 16" when I do the Y axis mounts (1/8 added per side)
X-Axis
It seems very sturdy, I stood on it, and it was still easy to move. I'm out of 1" angle iron again, so that's it for now. I still need to attach a table, mount a stepper motor, and it hook up a lead screw of some sort.

Closeup View
 Weight Test


Tuesday, December 27, 2011

Sanguinololu 1.3a - Part 3:Not Out of The Woods Yet

See Also:
Part 1 - Build
Part 2 -  Trouble in Paradise


After the events of the last 2 parts I thought the Sanguinololu was finally working properly. But that would have been too easy, right? (I wouldn't have called it easy.) Of course not, something's still not right. Now I could upload and download firmware fine, and they seem to work. Except...
  • Both boards seem to reset or reboot at random.
  • One board gets a lot of serial errors, I resoldered the FTDI chip several times. I'm convinced my soldering is OK.
  • I noticed that touching my scope's 10x probe to the resonator pins produced serial errors and seemed to crash the 1284p some times
Turns out the Sanguino, from which I tried to use the bootloader and related software, as per the instructions on the Sanguinololu wiki page, is built with a crystal oscillator, not a ceramic resonator, so the fuse settings may be different. The Mighty 1284p bootloader is also set to a crystal oscillator.

I used http://www.engbedded.com/fusecalc/ to calculate new fuse settings

I burned Mighty 1284p bootloader with new fuse settings (changed in boards.txt):
Low 0xD6
High 0xDC
Ext  0xFD

I ran the controller connected to usb (no motors or external power) for over 3500 lines of g-code without error. Previously it would error some where between when it connected (before the build even started) and definitely before 200 lines of g-code.

I hooked up my motors and ran another build. I haven't built a frame yet, I've got other projects to finish first, but it ran the motors for a full build (11222 lines, the sample build-benchmart.stl), so we'll call it good for now.

From what I have been able to find the fuse settings for the Sanguino and Mighty 1284p are just plain wrong for the Sanguinololu. They are for a external crystal oscillator. Apparently the full sweep oscillator setting is required for a resonator. The above settings seem very stable so far.

UPDTATE: I just got a 644p to play with, I haven't had a lot of time for testing yet, but it seems stable on both the default settings (ext crystal osc) and my modified fuse settings. I think almost everyone uses the 644p and this may be the reason I haven't found anyone else with this problem. I'm inclined to believe that my setting (full swing osc - ceramic resonator) is correct for both micros, but the 644p doesn't mind the wrong setting nearly as much as the 1284p. I've still got more tests to run on it, so I'll update as I go.

Wednesday, December 14, 2011

Sanguinololu 1.3a - Part 2: Trouble in Paradise

See Also:
Part 1 - Build
Part 3 - Not Out of the Woods Yet

Part 2 of my RepRap build. As noted in part 1 I had some trouble right off the bat.

NOTE: Part 3 include additional information concerning the bootloader and fuse settings. I highly recommend you read it before burning your bootloader


FTDI 
 According to the Sanguinololu wiki page, you should test the FTDI chip after installing the USB port and related components. all you have to do is:

1. Plug the board into your computer.
2. Install the driver software.
3. Connect to the COM port with something like Putty
4. Short the RX0 and TX0 pins together (use a piece of wire or something, it needs to work for about 1 second, don't worry about soldering it or anything.)
5. Type stuff on your keyboard, it should show up when the pins are shorted, and stop when disconnected.
6. If this worked your FTDI chip is operating properly.



 Of course this did not happen for me. The first board my brain wasn't fully engaged and I forgot to add flux, then tried to solder it with an iron, even though I had a hot air reflow station just sitting there. Stupid! I managed to bend a couple pins slightly up, just enough that they wouldn't connect.

 So after a half hour of fixing it all looked good, but the computer didn't recognize anything attached. I went over the pins one at a time with a soldering iron with a really fine tip, just putting a little down pressure on each one. Now the computer recognized it, loaded up putty and the loopback worked fine. 


The second board I did with the hot air and a good dose of flux. It looked beautiful compared to my first attempt, like a factory placed chip. It was immediately recognized by the computer, but the loopback didn't work. I took it off, ran a blob of solder across the pads to wet them, removed the excess, and replaced the chip on the board. Then it worked fine.

 Bootloader


 The wiki said the ATMEGA1284p was a drop in replacement for the 644p. I checked the specs, for a dollar or so more I'd go for the 1284p. Now, I'm not quite sure what they mean by "drop in compatible", it does indeed fit in the slot and it does indeed work with the board. After 5 hours of hacking. The first problem was the bootloader. I downloaded the 0023 version from here (the options were 0018, which doesn't support the 1284p and 0023 which does). I had arduino version 0022 and that didn't work. I downloaded 1.0, that seemed to. I burned the bootloader with the Arduino ISP as noted in the wiki. At some point I changed the last 3 line of hardware /  Sanguino / boards.txt to:


atmega1284.build.mcu=atmega1284p
atmega1284.build.f_cpu=16000000L
atmega1284.build.core=arduino


It seemed to burn fine, no errors.

 Using an Arduino to Flash the bootloader onto a 1284p

I put the chip in the Sanguinololu plugged it in and loaded the Sprinter firmware into arduino 1.0 (despite it claiming to not work with 1.0) Surprise! it errored out on the compile, couldn't find "arduino.h". Also wouldn't compile with 0022 (don't remember the exact error), but claimed to be compatible with 0018, so I downloaded that.

UPDATE: The "arduino.h" error can be corrected by creating "INSTALL_LOCATION/Arduino-1.0/hardware/Sanguino/cores/arduino/Arduino.h" and putting "<#include WProgram.h>" in it. I didn't figure this out, but I lost the reference. (Semi off-topic note: replace "Sanguino" with "Arduino" for other boards - uno, duemilanove, etc.)

It compiled fine with 0018, I copied the Sanguino files from the hardware folder of 1.0 over and tryed to upload it to the board. Nope, 0018 has no idea what a 1284p is. I finally managed to get the following fron 1.0's hardware/tools/avr/etc/avrdude.conf:


#------------------------------------------------------------
# ATmega1284P
#------------------------------------------------------------

# similar to ATmega164p

part
    id               = "m1284p";
    desc             = "ATMEGA1284P";
    has_jtag         = yes;
    stk500_devcode   = 0x82; # no STK500v1 support, use the ATmega16 one
    avr910_devcode   = 0x74;
    signature        = 0x1e 0x97 0x05;
    pagel            = 0xd7;
    bs2              = 0xa0;
    chip_erase_delay = 9000;
    pgm_enable       = "1 0 1 0  1 1 0 0    0 1 0 1  0 0 1 1",
                       "x x x x  x x x x    x x x x  x x x x";

    chip_erase       = "1 0 1 0  1 1 0 0    1 0 0 x  x x x x",
                       "x x x x  x x x x    x x x x  x x x x";

    timeout        = 200;
    stabdelay        = 100;
    cmdexedelay        = 25;
    synchloops        = 32;
    bytedelay        = 0;
    pollindex        = 3;
    pollvalue        = 0x53;
    predelay        = 1;
    postdelay        = 1;
    pollmethod        = 1;

    pp_controlstack     =
        0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F,
        0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F,
        0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B,
        0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02;
    hventerstabdelay    = 100;
    progmodedelay       = 0;
    latchcycles         = 6;
    togglevtg           = 1;
    poweroffdelay       = 15;
    resetdelayms        = 1;
    resetdelayus        = 0;
    hvleavestabdelay    = 15;
    chiperasepulsewidth = 0;
    chiperasepolltimeout = 10;
    programfusepulsewidth = 0;
    programfusepolltimeout = 5;
    programlockpulsewidth = 0;
    programlockpolltimeout = 5;

    idr                 = 0x31;
    spmcr               = 0x57;
    allowfullpagebitstream = no;

    memory "eeprom"
        paged           = no; /* leave this "no" */
        page_size       = 8;  /* for parallel programming */
        size            = 4096;
        min_write_delay = 9000;
        max_write_delay = 9000;
        readback_p1     = 0xff;
        readback_p2     = 0xff;
    read            = "  1   0   1   0      0   0   0   0",
                          "  0   0   x   x    a11 a10  a9  a8",
                          " a7  a6  a5  a4     a3  a2  a1  a0",
                          "  o   o   o   o      o   o   o   o";

    write           = "  1   1   0   0      0   0   0   0",
                          "  0   0   x   x    a11 a10  a9  a8",
                          " a7  a6  a5  a4     a3  a2  a1  a0",
                          "  i   i   i   i      i   i   i   i";

    loadpage_lo    = "  1   1   0   0      0   0   0   1",
              "  0   0   0   0      0   0   0   0",
              "  0   0   0   0      0  a2  a1  a0",
              "  i   i   i   i      i   i   i   i";

    writepage    = "  1   1   0   0      0   0   1   0",
              "  0   0   x   x    a11 a10  a9  a8",
              " a7  a6  a5  a4     a3   0   0   0",
              "  x   x   x   x      x   x   x   x";

    mode        = 0x41;
    delay        = 10;
    blocksize    = 128;
    readsize    = 256;
      ;

    memory "flash"
        paged           = yes;
        size            = 131072;
        page_size       = 256;
        num_pages       = 512;
        min_write_delay = 4500;
        max_write_delay = 4500;
        readback_p1     = 0xff;
        readback_p2     = 0xff;
        read_lo         = "  0   0   1   0      0   0   0   0",
                          "a15 a14 a13 a12    a11 a10  a9  a8",
                          " a7  a6  a5  a4     a3  a2  a1  a0",
                          "  o   o   o   o      o   o   o   o";

        read_hi         = "  0   0   1   0      1   0   0   0",
                          "a15 a14 a13 a12    a11 a10  a9  a8",
                          " a7  a6  a5  a4     a3  a2  a1  a0",
                          "  o   o   o   o      o   o   o   o";

        loadpage_lo     = "  0   1   0   0      0   0   0   0",
                          "  0   0   x   x      x   x   x   x",
                          "  x  a6  a5  a4     a3  a2  a1  a0",
                          "  i   i   i   i      i   i   i   i";

        loadpage_hi     = "  0   1   0   0      1   0   0   0",
                          "  0   0   x   x      x   x   x   x",
                          "  x  a6  a5  a4     a3  a2  a1  a0",
                          "  i   i   i   i      i   i   i   i";

        writepage       = "  0   1   0   0      1   1   0   0",
                          "a15 a14 a13 a12    a11 a10  a9  a8",
                          " a7   x   x   x      x   x   x   x",
                          "  x   x   x   x      x   x   x   x";

    mode        = 0x41;
    delay        = 10;
    blocksize    = 256;
    readsize    = 256;
      ;

    memory "lock"
        size            = 1;
        read            = "0 1 0 1  1 0 0 0   0 0 0 0  0 0 0 0",
                          "x x x x  x x x x   x x o o  o o o o";

        write           = "1 0 1 0  1 1 0 0   1 1 1 x  x x x x",
                          "x x x x  x x x x   1 1 i i  i i i i";
        min_write_delay = 9000;
        max_write_delay = 9000;
      ;

    memory "lfuse"
        size            = 1;
        read            = "0 1 0 1  0 0 0 0   0 0 0 0  0 0 0 0",
                          "x x x x  x x x x   o o o o  o o o o";

        write           = "1 0 1 0  1 1 0 0   1 0 1 0  0 0 0 0",
                          "x x x x  x x x x   i i i i  i i i i";
        min_write_delay = 9000;
        max_write_delay = 9000;
      ;

    memory "hfuse"
        size            = 1;
        read            = "0 1 0 1  1 0 0 0   0 0 0 0  1 0 0 0",
                          "x x x x  x x x x   o o o o  o o o o";

        write           = "1 0 1 0  1 1 0 0   1 0 1 0  1 0 0 0",
                          "x x x x  x x x x   i i i i  i i i i";
        min_write_delay = 9000;
        max_write_delay = 9000;
      ;

    memory "efuse"
        size            = 1;

        read            = "0 1 0 1  0 0 0 0  0 0 0 0  1 0 0 0",
                          "x x x x  x x x x  o o o o  o o o o";

        write           = "1 0 1 0  1 1 0 0  1 0 1 0  0 1 0 0",
                          "x x x x  x x x x  1 1 1 1  1 i i i";
        min_write_delay = 9000;
        max_write_delay = 9000;
      ;

    memory "signature"
        size            = 3;
        read            = "0  0  1  1   0  0  0  0   x  x  x  x   x  x  x  x",
                          "x  x  x  x   x  x a1 a0   o  o  o  o   o  o  o  o";
      ;

    memory "calibration"
        size            = 1;

        read            = "0 0 1 1  1 0 0 0   0 0 0 x  x x x x",
                          "0 0 0 0  0 0 0 0   o o o o  o o o o";
        ;
  ;

It goes right above:
#------------------------------------------------------------
# ATmega162
#------------------------------------------------------------
Now I get a
avrdude: stk500_getsync(): not in sync: resp=0x00 avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x51
Which basically means "something is wrong". It can't connect to the chip at all. I fought with this for a while, and it just wouldn't connect. Even 1.0 refused, not even the "blink" sample code.

I reburned the bootloader with the 8mhz and 16mhz options (the 644p option errored as not the right chip, so the arduino isp was communicating), neither worked, I changed the
"atmega1284.build.f_cpu=16000000L" to "atmega1284.build.f_cpu=8000000L" (as it was 
originally), commented the last 3 lines out (as they were originally), nothing worked.

Finally, when I was thinking I had bricked the chip I found a different bootloader for the 1284, the Mighty 1284p. I burned the bootloader, popped the chip back in the Sanguinololu, and uploaded the blink code.  It Worked! I had a square wave on the scope and everything!

Unfortunately Mighty 1284p is only compatible with arduino 1.0. Using the Sanguino 1284p 16mhz setting in 0018 couldn't upload sprinter. I changed the settings in the Sanguinololu boards.txt to match the Mighty 1284p and Sprinter uploaded fine.

I don't know if the Sanguino bootloader would have worked with 0023, I'm assuming it's something with my setup. The 644p is compatible with 0018, as is Sprinter, if I had known the trouble it would be to get Sprinter on the 1284p I'd have bought 644p's. But it's done, and I'm happy.
Steve


UPDATE
I decided I hadn't given the Sanguino bootloader a fair chance, it was for 0023 and I didn't use that.

I downloaded Arduino 0023, decompressed the Sanguino files into the hardware directory. Same thing, had to do both of the above hacks to get it to write the bootloader, which it again completed successfully. Exactly the same problem too, unable to upload Sprinter (or blink) to it.

I put the Mighty 1284p bootloader back on and uploaded Sprinter fine. Is something different about my chips? My ISP? Who knows? I sure don't.
Steve

Sanguinololu 1.3a - Part 1: Build

See Also:
Part 2 -  Trouble in Paradise
Part 3 - Not Out of the Woods Yet

I've been playing with electronics a bit lately. I've built a bench power supply and an ESR Meter.

I make a case for the Power supply out of an old atx psu case, but haven't found a good one for the ESR meter.

Then I found the RepRap. Of Course! Why buy a box for $5 when I could build a machine that would print me one for just $500? So it was settled.

Oh yea, my brother is building a cnc machine and after the tedious job of wiring up those two projects a cnc pcb router seemed like a really good idea. I'm not sure if the reprap frame is sturdy enough for what I have in mind, but I'm going to build something along that line. Of course the most fun part of the whole project is the electronics. After looking around a bit I decided to build a Sanguinololu to control the machine.

I bought bare PCB's, and assembled pololu (stepstick) boards from ebay, all the components from Mouser (BOM from the Sanguinololu page)

The FTDI Chip Installed:
The USB jack and related Components:
The Pololu Headers, decoupling Caps, etc:
I'm really bad about taking pictures, I am improving, but at this point I got busy and stopped taking pictures, so we skip way ahead to the completed board:
The Pololu Drivers arrived the today:
The Pololu drivers came with tiny heatsinks, here is the completed board, drivers and all:

I did one Sanguinololu for my brother and one for me, the first took about 6hrs, the second about 2. I had some trouble and I'll cover that in another post.
Steve