Communication


In order to get several Ultimakers to print one object it is required for each machine to communicate, at least to a limited degree, what it is doing.  For instance, the Z-axis (vertical) movement can only be done once all printers have finished their respective layers.


In our case of two Ultimakers this will mean one main control machine (Master) will wait for the second machine(Slave) before it will move the printing bed, afterwards both will continue printing their next layer.

To achieve this we are trying to set up a simple 1-bit communication line using left over analogue pins on the Arduino control boards. Simplified this will mean we are capable of sending basic yes/no signal between the printers to indicate if they ready or when they should continue.  In a full scale scenario using more than two printer heads you would likely use a complete communication protocol but we decided on this basic approach because there is a lack of programming skills present in our team.

Using this principle we can utilize and adjust g-code commands already present on standard Ultimaker firmware. Unfortunately this will still mean all printers require our own adjusted firmware to be installed, so far we have not found a way around this because current firmware does not allow the use of g-code to interpret and respond to input from the pins on the Arduino.

It does allow for sending a signal to those pins using the M42 command which we can use as our output. From there we can adjust one of the commands (M600)  used for halting the printer and wait for user interaction(a button press on the machine). The plan is to add a second condition for continuing, the signal of a specified pin controlled by the other printer, using two wires ensures the interacting goes both ways without interference.

The g-code command order will end up looking something like this:

Master code Slave code
The end of the layer just printed. The end of the layer just printed.
M600 //Wait until other printer signals it’s ready M42 //tell master you finished layer
M600 //Wait until other printer signals it’s ready
T1G1  //Command used to move printing bed.T0
M42 //tell slave to continuing printing

Both continue printing next layer

There are still a few issues to deal with, firstly the specifying of the pins looked at by the M600 command. It can be added to the firmware directly but this will limit flexibility and might even mean we need two different firmware versions for each printer. This of course is far from ideal so the second option will make the firmware code more complex so it can handle g-code based specification, for example: M600 P13 S255 will use the M600 command and look at pin #13 to have a high value before continuing.

The second problem is of a broader nature, and that is the inherent issue when using two vertical z-axis that need to move simultaneous. We expect our rudimentary set up to not experience to many problems with this, but synchronising this movement definitely needs to be looked at in some way.

Be Sociable, Share!