Wednesday, May 18, 2011

More Skinning Tests

I ran some more skinning tests this evening, its definitely got promise. This picture shows a 0.4mm carved cube skinned at 0.2mm in the middle. On the right is 0.25mm carved cube and on the left a 0.4mm carved cube for comparison. The outer shell feels very smooth to the touch. It would be good to transfer this to all top surfaces too. It would look better and may make closing PLA structures easier, mine always seem to have problems closing fully.


L: 0.4mm carve : M: 0.4mm carve w/ 0.2mm skin : R: 0.25mm carve




Tomorrow I think I'll try some of the more tricky prints, like the drive gear from the extruder.

Monday, May 16, 2011

Skinning

The best looking prints always have the thinnest layers, however, they take forever to print. It would be really good to have a print that has thin layers on the outside, but the inside is printed with much thicker traces. Now that Skeinforge can easily change layer thickness without lots of tweaking, it should be possible to do this on the fly during a print, rather than just selecting it during the carving process.


This is a concept I'm going to refer to as 'Skinning'. Printing the outer layers at a very thin height, while printing the inner layers at a thicker height. For example, one could print an object where the perimeter is printed with 0.25mm layers, but the inside is printed with 0.5mm layers.


Cross-section of a 'Skinned' print - note fine threads on front and thicker threads inside.




This would require printing at least two perimeter layers (probably first) for every  inner layer, but that shouldn't be a problem.


I've been developing some simple test scripts that take the GCode for a simple sliced object and 'skin' it with an external layer half the carve height. The script is rather basic, but the initial results look very promising. 
Left: 'Skinned' Cube 0.25mm external 0.5mm internal - Right: 0.25mm external & internal.


The 0.25mm default cube took 21m 30s to print, a 0.5mm default cube took 10m 0s to print, where as the hybrid 'skinned' cube took 16m 0s to print. The quality is not quite as good as the Skeinforge carved 0.25mm cube (the translucent PLA makes it hard to see), but my script just scaled the extrusion parameters from the 0.5mm carved cube as a quick and dirty test, it also doesn't take into account that the new perimeter paths are slightly longer (or shorter for the internal ones) than the 0.5mm carve.


Now that I know the concept works I'll work on refining the script to correctly adjust the extrusion rate for the skin height.


It's something that I'd like to turn into a Skeinforge plug-in and make part of the tool chain, it would probably much easier to handle the data within Skeinforge than trying to post-process it.


Eventually every print will look like it was printed with the finest nozzle, but take significantly less time!

Saturday, May 7, 2011

Adding M117 Support to Gen6 Firmware

This article details how I added support for the M117 GCode that I used for the Auto Bed Leveling approach. The standard Gen6 firmware doesn't support this GCode.


This is more for my own recollection in case I need to add it to future builds.


process_g_code.pde: Line 680 (in the switch statement after case 116)


Handle the M117 GCode and return the data in the appropriate format.



case 117:
Serial.print("C: X");
        Serial.print(zeroHit.x);
        Serial.print(" Y");
        Serial.print(zeroHit.y);
        Serial.print(" Z");
        Serial.print(zeroHit.z);
        Serial.print(" E");
        Serial.println(zeroHit.e);
break;


cartesian_dda.pde: Line 391 (in the if (read_switch(min_pin, inv) ) statement)

When an end-stop is hit, store the current step count.

   if (min_pin == X_MIN_PIN)
       zeroHit.x = current;
   if (min_pin == Y_MIN_PIN)
       zeroHit.y = current;
   if (min_pin == Z_MIN_PIN)
       zeroHit.z = current;

configuration.h: Line 329 (just before #endif)

Increase the variables scope.

extern LongPoint zeroHit;

FiveD-GCode_Interpreter.pde: Line 121 (after FloatPoint where_i_am;)

Variable declaration.

LongPoint zeroHit;


That's all there is to it, a quick recompile and upload later and the Gen6 hardware should now support M117.