Solid freeform fabrication: DIY, on the cheap, and made of pure sugar

Windell H. Oskay & Lenore M. Edman
Evil Mad Scientist Laboratories www.evilmadscientist.com

Motivation:
“It would be fun to have a 3D printer...”

http://www.reprap.org/
(Bath University)
Open-source fused-deposition fabber -Extrudes melted plastic “self-replicating” (can make some of its own parts)

Fab@home http://fabathome.org/
Open-source fabber -Extrudes e.g., silicone Available as a kit

(Cornell)

Existing fabricators are great if... You want to build small, high-precision plastic parts, and/or Your company has lots of money to spend on a nifty machine!

Design goals & principles

• Ultra-low cost 3D Fabricator • Build size > resolution • Low media costs • Open source design • Sidestep the patent minefield!

One solution: Build objects out of melted sugar

Box with movable floor (piston)

The Process

Sugar! Hot air gun

Move hot air gun, Selectively fuse sugar

Lower Bed

Add more sugar

Selectively fuse sugar to layer below

Lower Bed

Add more sugar

Selectively fuse sugar to layer below

Hot air gun

Lower Bed (Etc.)

Grow objects, layer by layer

Selective Hot Air Sintering And Melting (SHASAM)

• Very low cost • Low tech: easy and reliable • Eye Safe • No open flame • Works with a variety of media • Good acronym

Why Sugar?

• Seriously cheap! • Safe, non-toxic, biodegradable • Kid friendly. • Tasty! • Potentially good for casting • Remarkably rigid, despite low melting point • Smells great when it melts.

Building the CandyFab 4000

First victim: HP DraftPro pen plotter (Future CandyFab X-axis)

Next victim: HP 7550A pen plotter (Future CandyFab Y-axis)

3rd victim: 12 V Scissor Jack (Future CandyFab Z-axis)

Build volume: 23” x 13” x 9” (!)

Electronic design

• 4-axis control: 3 motion + heater • Custom AVR-based servo motor controls • Use original quadrature-encoded servo motors from HP plotters • Using Make Controller as computer interface (overkill!)

Control System: Big picture

Goto X1,Y1,Z1, Goto X2,Y2,Z2, Goto...

3D model

Computer

Hardware interface

AVR Motor Controller X

AVR Motor Controller Y

AVR Motor Controller Z

AVR Motor Controller T

Locally-managed closed-loop control

Microcontroller choice: AVR + GCC toolchain
• GNU tools for AVR are excellent, extremely well supported • Easy GUI installers for Mac, Windows, full packages for Linux

Simplified view:
uint16_t eepromWord __attribute__((section(".eeprom"))); int main (void) { unsigned int FontWord, m, n; ! ! unsigned char hiByte; uint8_t stringNo, stringNoCopy, i, altset, NoOfStrings; ! uint8_t PA, PB, PD; ! ! ! PGM_P p; ! char buf[100]; ! ! eats most of the SRAM!

! ! ! !

! //8-bit unsigned integers ! ! !

//16-bit unsigned integers

//Set number of characters per string: this

! //Initialization routine: Clear watchdog timer-- this can prevent several things from going wrong. ! MCUSR &= 0xF7; ! ! //Clear WDRF Flag WDTCSR ! = 0x18; ! ! WDTCSR ! = 0x00; DIDR = 3U; ! #ifdef commonanode ! ! ! #endif ! ! !

! //Set stupid bits so we can clear timer... //Disable analog comparator-- save power.

PORTA = 255U; PORTB = 255U; PORTD = 255U;

//Init routine: Check to see if pin D4 is connected to ground. If it is, then we will use // StringSet2 instead of StringSet1 as our list of valid strings. // In the default firmware, this is used to choose whether we should use the holiday phrases or not. // How it's done: Configure pin D4 as an input, with pull-up resistor turned on. // Then, read input value. If input is low, D4 has been pulled low by an external force. DDRD &= ~_BV(PD4); ! PORTD|= _BV(PD4);! asm("nop"); ! this is important. ! ! ! ! ! ! // D4: Input // D4 High ! // Wait one cycle for input to be ready --

altset = 0; NoOfStrings = NoOfStrings1;

//Data direction register: DDRD //Set all ports to output *EXCEPT* PA2 (not used) ! DDRA = 3U; ! DDRB = 255U; ! ! DDRD = 127U; //Turn all LEDs off to begin with: #ifdef commonanode ! PORTA = 255U; ! PORTB = 255U; ! PORTD = 255U; #else ! PORTA = 0; ! PORTB = 0; ! PORTD = 0; #endif ! ! ! ! // Read string number from EEPROM data memory. If good, increment it and save // the new value to EEPROM. This allows us to cycle through the set of strings in flash, // using an new one each time that the unit is reset. if ( eeprom_read_word(&eepromWord) ! else ! ! ! ! stringNoCopy = ! ! if (++stringNo >= NoOfStrings) ! ! > (uint16_t) NoOfStrings) stringNo = 0U;

avr-gcc avr-libc binutils
Compiler & Linker + Libraries

:100000000C9434000C9485000C944F000C944F0019 :100010000C944F000C944F000C944F000C944F0024 :100020000C944F000C944F000C944F000C944F0014 :100030000C944F000C944F000C944F000C944F0004 :100040000C944F000C944F000C944F000C944F00F4 :100050000C944F000C944F000C944F000C944F00E4 :100060000C944F000C944F0011241FBECFEFD4E02E :10007000DEBFCDBF11E0A0E0B1E0E0E1F6E002C0FC :1000800005900D92A030B107D9F711E0A0E0B1E0E2 :1000900001C01D92A430B107E1F70C94CC000C9480 :1000A00000001092000110920101109202011092C2 :1000B000030152985A9A3D98459AE9E6F0E080810A :1000C0008160808380818D7F8083E89A7894089511 :1000D000E89A0895882329F060E070E080E090E0DD :1000E0000895609100017091010180910201909149 :1000F00003010895882341F44093000150930101C6 :10010000609302017093030108951F920F920FB63E :100110000F9211242F933F938F939F93AF93BF938D :1001200029B186B133273695279536952795992796 :10013000689414F8969587951694E1F7822793278B :1001400080FF0CC08091000190910101A0910201FB :10015000B09103010196A11DB11D0BC0809100015A :1001600090910101A0910201B09103010197A109B1 :10017000B1098093000190930101A0930201B09313 :100180000301BF91AF919F918F913F912F910F905C :100190000FBE0F901F901895C9EED4E0DEBFCDBF03 :1001A0000E94510083EA84BD81E085BD17BC18BC64 :1001B00080E68AB91092800081EC8093810088EEFD :1001C0009DEF909385008093840080ED9DE0AFEFDC :1001D000BFEF8093000190930101A0930201B093BF :1001E00003018091000190910101A0910201B09161 :1001F0000301662477244301198A1A8A1B8A1C8A00 :1002000013E2E12E1AEFF12E1FEF012F1FEF112F36 :10021000ED86FE860F87188B19861A861B861C862C :100220004424552400E61AEE1E8B0D8B18861F827F :10023000222433242CED3FEF3E832D831C821B822E :100240001A821982809184009091850081569A4E7D :1002500058F480918400909185008153954798F0DF :100260008B819C81892B79F41092850010928400F7 :1002700090E296BB81EC80938100ACEDBFEFBE8332 :10028000AD831C821B82B59B5CC0EB81FC81EF2B94 :1002900089F4E0908600F0908700FE82ED8281E88C :1002A00080938100B0E2FB2EF6BA01E010E01C83DF :1002B0000B8347C080918600909187002D813E81FD :1002C000821B930B9E838D836CE070E00E94F4028E :1002D0009B018D819E816CE070E00E94F402069784 :1002E00010F02F5F3F4F80E395E790938500809358 :1002F00084001C821B82C901875B93408B5494400D :1003000000F553E0283E350718F428EE33E006C028 :1003100087E0213D380710F020ED37E0285E3340BC :100320008FE190E0DC012A9FC0012B9F900D3A9F46 :10033000900D11247C0100271127E98AFA8A0B8B82 :100340001C8B8091000190910101A0910201B0915C

avrdude

stringNo = (uint8_t) (eeprom_read_word(&eepromWord)) ; stringNo;

stringNo = 0U;

eeprom_write_word(&eepromWord, stringNo); stringNo = stringNoCopy; for (;;) { // main loop

! memcpy_P(&p, &StringSet1[stringNo], sizeof(PGM_P)); ! ! strcpy_P(buf, p); ! ! ! ! //if ((stringNoCopy == 0) && (++stringNo >= NoOfStrings)) ! //Loop through strings in Demo mode! //! stringNo = 0U; ! ! ! ! ! !

! !

if ! }

i = 0; ! ! !

!

while( buf[i] != '\0' ! ) {

.C
! (stringNoCopy == 0) { if (++stringNo >= NoOfStrings) ! ! { ! } m++; ! ! hiByte = FontWord >> 8; ! ! ! ! ! ! ! !

stringNo = 0U;

// i.e., while the string has not ended

.hex
Programmer

//Add a short delay-- an off period-- between characters: //Default delay time value: 2000U, but you can change this value in the range (0,65535U). //This delay is important because it gives visual separation between repeating letters. //Without the delay, the word "TREE" looks like it just says "TRE" ! ! ! ! #ifdef commonanode ! ! ! #else ! ! ! #endif ! ! ! m = 0; while (m <= 850U) ! //Change the length of the short delay here. !

!

PORTA = 255U; PORTB = 255U; PORTD = 255U; PORTA = 0; PORTB = 0; PORTD = 0; ! !

//Retrieve a 16-bit word from the font table up above that describes how the sixteen //segments of the LED display will be lit up. //(Here, word means two bytes-- 16 bits-- not a collection of letters.) ! ! ! ! if (buf[i] == ' ') ! ! ! ! ! else if (buf[i] == '*') ! ! ! ! ! else if (buf[i] == '/') ! ! ! ! ! else ! ! ! ! ! ! ! ! ! ! here. ! //Calculate mapping from fonts onto output pin ports: ! ! ! ! 1)); ! !

FontWord = 0; FontWord = (uint16_t)pgm_read_word(&font_table[26]); FontWord = (uint16_t)pgm_read_word(&font_table[27]); FontWord = (uint16_t)pgm_read_word(&font_table[buf[i] - 'A']); //Note: The ASCII char 'A' is element 0 of the font table. //Want to work with one byte at a time,

PB = (255U & FontWord); PD = ((hiByte & 15U) | ((hiByte & 48U) << PA = ((hiByte & 192U) >> 6); !

!

m = 0;

Closed-loop servo control code (C and/or assembly)

Linked Object Code

Code stored in Flash memory

Ugly--but functional-- prototypes!

Operational testing
First step: Test 2D motion control system & air heater

World’s first CNC toaster!

Next: 3D Modeling software (Many good options...)
Get POV-Ray @

Initial choice: POV-Ray www.povray.org • Freeware with available source • Cross-platform support • Programming language for 3D graphics • Makes slicing easy

Compatibility “Standard” file type for 3D fabbing is .STL

Successfully converted, thus far: Blender, Rhino STL files Others likely including sketchup

Perform slicing operation in POV-Ray:

Mass production!

Mass production!

Improving build quality

(or, “You call that a dodecahedron?”)

Heating element for hot-air rework station (desoldering tool) Up to 500W (using ~50 W), $10

Problems with the current heater
is too • Airflowmelted high: Blows around dry sugar, pushes sugar

• Too large of an area is heated • Inconsistent heating leads to variable color • Unknown heater construction... Not food grade output!

Too much air...

Culinary applications

• Initial tests were not considered “food safe.” • Need to treat sugar like food • Need clean, audited air path • Not recycling sugar through system • Easily cleaned inner liner

First Edible CandyFab Output

Why Sugar?

• Seriously cheap! • Safe, non-toxic. • Kid friendly. • Biodegradable, cleans up easily • Tasty! • Potentially good for casting • Remarkably rigid, despite low melting point • Smells great when it melts.

On beyond sugar....
If it bleeds, we can kill it.

melts

fab

On beyond sugar....
Media choices: whatever can melt in your oven

• Chocolate chips • Waxes • Other sugars, sorbitol, .... • Many plastics (Thermoplastics) • Low melting point glasses (maybe?) • Low melting point metals (Tin, bismuth....)

First durable CandyFabbed Object
Polypropylene pellets

CandyFab
Making Rapid Prototyping a little sweeter!

www.candyfab.org

The CandyFab Project
First Goal: Complete redesign of CandyFab by May 2008: “The CandyFab 5000S”

• Redesign will use “off-the-shelf” components
(no old plotters!)

• All hardware, mechanics, software, firmware
will be open source & cross-platform

The CandyFab Project
Status:

• CandyFab.org has been up one month
(10% of time to May 2008) interests and skills

• 60+ volunteers, with a wide range of • Significant progress on new
heater & nozzle reference designs

Early progress: New heater design by Brian ward

Early progress: CFD simulations by Brian ward

The CandyFab Project
Next Steps (in order):

• Design of new XYZ motion control system
– Sort out control model & types of feedback used

• New architectural model of base
new motor controllers

– Likely choice: CNC routed plywood

• Begin hardware & firmware design of • Design CNC control software
– Possibly branch an existing project

Control System: Big picture

Goto X1,Y1,Z1, Goto X2,Y2,Z2, Goto...

3D model .STL, POV-Ray or set of slices (JPEG)

Computer

Hardware interface (Low-cost AVR)

AVR Motor Controller

AVR Motor Controller

AVR Motor Controller

AVR Motor Controller

Locally-managed closed-loop control

Open-source electronics:
Unusual approach to make design accessible:

Electronic design using open-source tools: the gEDA suite: gSchem + PCB

The future: open-source sculpture?
Sculpture Metatron, by Bathsheba Grossman, released as open source .STL file

CandyFab
Making Rapid Prototyping a little sweeter!

www.candyfab.org