I am planning a huge art installation using multiple steppers. It would be great to get some feedback if this sounds doable using Duet3d.
It basically can be described as three room sized XYZ robots. Each robot has a XY belt driven system mounted from the ceiling that transports a winch. Each winch can lower a steel rope. And on the end of that rope is a sculpture. The idea is that the sculptures perform a prerecorded dance in the space.
Since the setup can be described like an inverted cartesian 3d printer I am planning to use GCode to record the dance. I created an animation in a 3d program and exported that as a list of timed G1 movements. Testing it on my 3d printer worked great. The print head moves exactly as I planned it.
The next step is to do it in large scale. Duet3D seemed like the perfect platform that solves many problems for me. The Duet 3 MB6HC with several Duet 3 EB3HC will have enough flexibility and power to run the up to the 15 steppers that I have planned.
Precision is not important. I am thinking in the scale of cm. The max speed should be about 1m/s. I assume that I need to disable Microstepping.
My plan is that the automation repeats every 30 minutes. To have a smooth movement in curves I am thinking about a resolution of 4 fps (4 GCodes/s). That means that it will be a huge GCode file with 7.200 G1 instructions surrounded by one while statement. If I really build the installation in full size, these G1 statements will have positions for XYZUVWABC axes and 6 extruders in every line.
What do you think about this? Does this sound insane or doable?
I am additionally thinking about making a part interactive using a Raspberry Pi. I am imagining that a program checks inputs, generates the next coordinates and sends G1 commands over the dcs socket. This has to happen multiple times per second.
with open("dcs.socket", "w") as f:
while True:
time = time.monotonic()
input = getInput()
pos = calculateNextPositions(input)
federate = (pos – old_pos).length() / (time – old_time) * 60
f.write(f"G1 X{pos.X} Y{pos.Y} ... F{feedrate} \n")
old_pos = pos
old_time = time
Would this work?