📅 2024-09-13
🎵 Signs - The Five Man Electrical Band
So … I want to 3D print multi-coloured signs. But my printer does not have multi-colour or multi-material capabilities, so with conventional methods, I would be limited to countless manual filament changes or stacking of colours. I developed a process that can overcome these limitations, using some G-code trickery and Z-hopping. With this process, a four-coloured sign only needs three manual filament changes.
The full documentation including screenshots and example files can be found at my Printables account:
https://www.printables.com/model/1005970
How does it work?
Each colour must be in its own STL file. The STLs get loaded into PrusaSlicer and then get merged into a single model. This allows us to set a Z coordinate offset for each colour – for convenience, I use much to high offsets so the colours float in mid air. By doing this, we assure that the colours get printed one after the other.
Now, we need to „un-float“ the colours and set the layers on top of each other. We do that by tricking the printer into an adjusted Z position. Let's say, our second colour floats 10 mm above the base of the sign (first colour). In the after-layer-change G-code, we add the following:
{if layer_z == 10.2} M400 ; finish moves G0 Z1.2 ; go back down to base plate M600 ; filament change G92 Z10.2 ; adjust Z position {endif}
The G92 command makes the printer „think“ it's on Z=10.2 now, despite still being at 1.2 mm (moved to by the G0 command).
Note the if layer_z == 10.2 does not say exactly 10 mm. This is because PrusaSlicer puts the coordinate origin of each model in the model's centre. Figuring out the right offsets is a bit tricky – but we can just try it until we find the right combination because PrusaSlicer will give us a correct preview of the finished print.
So … that was not too hard – we have the second colour in place. But how do we get the next colours printed without tearing through, what's already printed? By setting a sufficiently high Z hop distance! That way, travel moves will always fly over printed parts. That's also why this process only really works for flat objects … like signs 🤓
All we need to do is to let the model for the next colour hover even higher (say, Z=25 mm) and put more after layer-change G-code like this
{if layer_z == 25.4} M400 G0 Z10.4 M600 G92 Z25.4 {endif}
The M400 finish moves command is important so that the printer clears its cached moves before going into the filament change. Otherwise, we might dunk the nozzle into already printed parts after right filament change.
More colours go on in the same way – just load more STLs, let them hover higher and higher and put more lines of G-code.
I really enjoy making signs like that. They also make great gifts – like the „machine operation only by engineers“ sign showcased here.
Thin writing needs a 0,25 mm nozzle. I use it with 0,2 mm layer height … officially, that does not work – but it comes out just fine.
Here's an example with four different colours. The number of objects can be increased in PrusaSlicer, as usual … so „mass production“ is possible with minimal filament changes and effort.
For me, OpenSCAD is the best tool to generate the different STLs. Simple geometries and text can be generated directly in OpenSCAD, more complicated things get imported as an SVG and then extruded accordingly. By putting each colour in a module, I generate the separate STLs by just commenting out all but the one module I want to output.
Here's all the „machine operation“ sign needs:
myellow(); mblack(); mred(); $fa = 1; $fs = 0.5; module myellow(){ // Base color("yellow") difference(){ cube([200, 100, 1.01]); translate([9, 9, -1]) cylinder(h=3, d=3.5); // ... simple, repetitive code for three more cylinders as screw holes ... }; }; module mblack() { // Frame color("black") translate([3, 3, 1]) difference(){ cube([194, 94, 0.8]); translate([1.5, 1.5, -0.1]) cube([191, 91, 1]); }; // SVG Import color("black") translate([8, 18, 1]) scale([0.35, 0.35, 1]) linear_extrude(0.8) import("Warnzeichen.svg"); }; module mred() { // Text sfont="DIN 1451 fette Breitschrift 1936"; color("red") translate([138, 12.5, 1.2]) scale([0.68, 1, 1]) linear_extrude(0.8) { translate([0, 63, 0]) text("Maschinen-", font=sfont, halign="center", size=16); translate([0, 42, 0]) text("bedienung", font=sfont, halign="center", size=16); translate([0, 21, 0]) text("nur durch", font=sfont, halign="center", size=16); text("Ingenieure", font=sfont, halign="center", size=16); } };