Requests for help: Gcode cam follower/ tangential knife control.

For those interested, here is what our current script spits out.
This is just a simple circle.
G1 Z0
G1 X12.5629 Y0.5687 U92.8147 ( Delta = 42.1853 Val = 267.185 )
G1 X12.3774 Y1.8196 U98.4351 ( Delta = 5.62044 Val = 261.565 )
G1 X12.0701 Y3.0462 U104.065 ( Delta = 5.62971 Val = 255.935 )
G1 X11.6441 Y4.2369 U109.686 ( Delta = 5.62101 Val = 250.314 )
G1 X11.1034 Y5.38 U115.315 ( Delta = 5.62889 Val = 244.685 )
G1 X10.4533 Y6.4647 U120.936 ( Delta = 5.62107 Val = 239.064 )
G1 X9.7 Y7.4804 U126.563 ( Delta = 5.62692 Val = 233.437 )
G1 X8.8508 Y8.4174 U132.186 ( Delta = 5.62321 Val = 227.814 )
G1 X7.9138 Y9.2666 U137.814 ( Delta = 5.62818 Val = 222.186 )
G1 X6.8981 Y10.0199 U143.437 ( Delta = 5.62321 Val = 216.563 )
G1 X5.8134 Y10.67 U149.064 ( Delta = 5.62692 Val = 210.936 )
G1 X4.6703 Y11.2107 U154.685 ( Delta = 5.62107 Val = 205.315 )
G1 X3.4796 Y11.6367 U160.314 ( Delta = 5.62889 Val = 199.686 )
G1 X2.2529 Y11.944 U165.936 ( Delta = 5.62211 Val = 194.064 )
G1 X1.0021 Y12.1295 U171.564 ( Delta = 5.62795 Val = 188.436 )
G1 X0.261 Y12.1916 U177.185 ( Delta = 5.6211 Val = 182.815 )
G1 X1.524 Y12.1295 U182.815 ( Delta = 5.62956 Val = 177.185 )
G1 X2.7749 Y11.944 U188.435 ( Delta = 5.62021 Val = 171.565 )
G1 X4.0016 Y11.6367 U194.064 ( Delta = 5.62861 Val = 165.936 )
G1 X5.1922 Y11.2107 U199.687 ( Delta = 5.62364 Val = 160.313 )
G1 X6.3354 Y10.67 U205.313 ( Delta = 5.62542 Val = 154.687 )
G1 X7.42 Y10.0199 U210.938 ( Delta = 5.62534 Val = 149.062 )
G1 X8.4357 Y9.2666 U216.563 ( Delta = 5.62459 Val = 143.437 )
G1 X9.3727 Y8.4174 U222.186 ( Delta = 5.62321 Val = 137.814 )
G1 X10.222 Y7.4804 U227.811 ( Delta = 5.62482 Val = 132.189 )
G1 X10.9753 Y6.4647 U233.437 ( Delta = 5.62657 Val = 126.563 )
G1 X11.6254 Y5.38 U239.064 ( Delta = 5.62692 Val = 120.936 )
G1 X12.166 Y4.2369 U244.689 ( Delta = 5.62517 Val = 115.311 )
G1 X12.5921 Y3.0462 U250.31 ( Delta = 5.62052 Val = 109.69 )
G1 X12.8993 Y1.8196 U255.94 ( Delta = 5.62967 Val = 104.06 )
G1 X13.0849 Y0.5687 U261.56 ( Delta = 5.62084 Val = 98.4396 )
G1 X13.1469 Y0.6944 U267.19 ( Delta = 5.62944 Val = 92.8101 )
G1 X13.0849 Y1.9574 U272.81 ( Delta = 5.6205 Val = 87.1896 )
G1 X12.8993 Y3.2083 U278.44 ( Delta = 5.62922 Val = 81.5604 )
G1 X12.5921 Y4.435 U284.059 ( Delta = 5.61974 Val = 75.9407 )
G1 X12.166 Y5.6256 U289.692 ( Delta = 5.6323 Val = 70.3084 )
G1 X11.6254 Y6.7688 U295.309 ( Delta = 5.61706 Val = 64.6913 )
G1 X10.9753 Y7.8534 U300.938 ( Delta = 5.62944 Val = 59.0619 )
G1 X10.222 Y8.8691 U306.563 ( Delta = 5.62459 Val = 53.4373 )
G1 X9.3727 Y9.8061 U312.189 ( Delta = 5.62657 Val = 47.8107 )
G1 X8.4357 Y10.6553 U317.814 ( Delta = 5.62482 Val = 42.1859 )
G1 X7.42 Y11.4086 U323.437 ( Delta = 5.62321 Val = 36.5627 )
G1 X6.3354 Y12.0588 U329.058 ( Delta = 5.6207 Val = 30.942 )
G1 X5.1922 Y12.5994 U334.691 ( Delta = 5.63332 Val = 25.3087 )
G1 X4.0016 Y13.0254 U340.313 ( Delta = 5.62133 Val = 19.6874 )
G1 X2.7749 Y13.3327 U345.936 ( Delta = 5.62364 Val = 14.0637 )
G1 X1.524 Y13.5183 U351.56 ( Delta = 5.62413 Val = 8.43958 )
G1 X0.261 Y13.5803 U357.19 ( Delta = 5.62922 Val = 2.81036 )
G1 X1.0021 Y13.5183 U362.81 ( Delta = 5.6205 Val = 357.19 )
G1 X2.2529 Y13.3327 U368.44 ( Delta = 5.63011 Val = 351.56 )
G1 X3.4796 Y13.0254 U374.064 ( Delta = 5.62347 Val = 345.936 )
G1 X4.6703 Y12.5994 U379.686 ( Delta = 5.62211 Val = 340.314 )
G1 X5.8134 Y12.0588 U385.311 ( Delta = 5.62479 Val = 334.689 )
G1 X6.8981 Y11.4086 U390.94 ( Delta = 5.62906 Val = 329.06 )
G1 X7.9138 Y10.6553 U396.563 ( Delta = 5.62303 Val = 323.437 )
G1 X8.8508 Y9.8061 U402.186 ( Delta = 5.62321 Val = 317.814 )
G1 X9.7 Y8.8691 U407.814 ( Delta = 5.62818 Val = 312.186 )
G1 X10.4533 Y7.8534 U413.437 ( Delta = 5.62321 Val = 306.563 )
G1 X11.1034 Y6.7688 U419.062 ( Delta = 5.62459 Val = 300.938 )
G1 X11.6441 Y5.6256 U424.687 ( Delta = 5.62534 Val = 295.313 )
G1 X12.0701 Y4.435 U430.313 ( Delta = 5.62542 Val = 289.687 )
G1 X12.3774 Y3.2083 U435.936 ( Delta = 5.62364 Val = 284.064 )
G1 X12.5629 Y1.9574 U441.565 ( Delta = 5.62861 Val = 278.435 )
G1 X12.625 Y0.6944 U447.185 ( Delta = 5.62021 Val = 272.815 )On this one we keep the U on the same line, just for testing.
Indeed if we wanted to do it correctly we would need to have the U on its own line, so its going the correct direction before the move. we have tested both. I just dont like waiting for every stop.
Currently my U stepper has a gear down ratio of something like 1:100 . this makes it compact but it can not spin fast... I think if i had it moving faster it would look more smooth.
Say is there something I can do with the Jerk settings or anywhere else to make the moves smother? Even tho there are stops at every point with U on its own line in the code?
Thanks!
~Russ

@Kulitorum here.
I tried to use G2 and G3 but they are not interpolated very nice in current firmware and pausing during a G2 or G3 messes up and the printhead moves in random directions. I talked to dc42 about this, but I guess the current use of G2 and G3 is too low for him to spend time with it.
So I use very short lines of a max of 5 mm. With good jerk and acceleration parameters, that moves smoothly and allows me to pause a print at any time within 25mm, in regards to 45 commands being buffered in firmware.
Your slicer should keep an eye on overflow (crossing 360 degrees) and if needed "rewind" the rotation back to 0 to untangle your wires.
Now watching thread, if you need more help. Unfortunatly I can't share my code.
Kulitorum

Hello! Wonderful to see you here. And thanks for any help you can give.
Can you post your jerk settings?
So you are using G1 commands for everything?
If so. Are you using U commands on a new line? Or are you just using them on the same line as the XY accordance? It seems that it depends on if its a cornner or not...Any thing i should look out for that you had trubble with would be greaty appreciated if you could note those here.
I would like to run at higher speeds, so i may have more trouble than you have had getting things to run smoth.
Again thanks for sharing what you can!
~Russ

Well, my machine is a lot larger then yours, so comparing acceleration and jerk settings don't really make much sense.
Yes, I use G1 for everything, and have the U coordinate together with my XY coordinates. Ofcause my U coordinate is a tangent to a half vector between the line before and the line after the vertex, so you need to do some calculation there. You will need to have the coords XYU on the same line to get anything smooth. Increase your jerk until you start loosing steps, then increase your power on each motor until they reach 5060c and lower the jerk until it don't fail no more.
Hope this helps. If you need more help, setup remote control of your computer and a webcam, and I can control your computer and we can adjust it together over skype
Kulitorum

@kulitorum said in Requests for help: Gcode cam follower/ tangential knife control.:
I tried to use G2 and G3 but they are not interpolated very nice in current firmware and pausing during a G2 or G3 messes up and the printhead moves in random directions. I talked to dc42 about this, but I guess the current use of G2 and G3 is too low for him to spend time with it.
Have you tried using G2/G3 with recent firmware versions? If you still have problems with G2/G3 when using firmware 2.02RC2, please let me know what they are.

@russgries said in Requests for help: Gcode cam follower/ tangential knife control.:
Can you explain this rounding error.
What is the maximum amount of numbers after the decimal place i can have for the axis?The calculations are done using 32bit floating point values. See https://www.exploringbinary.com/decimalprecisionofbinaryfloatingpointnumbers/ for info about the precision.

Quite a bit has been said since the original question... still, if it helps:
@russgries said in Requests for help: Gcode cam follower/ tangential knife control.:
@danal said in Requests for help: Gcode cam follower/ tangential knife control.:
Russ,
Given David's answer that RepRap does not distinguish axis, and given that GCode (and RepRap) ensure that all axis in a given single move reach their individual endpoints in sync, this all adds up to doing EXACTLY what you want for a coil winder.
That is, if the current XYZ position of the "control point" is somwhere around a coil, ready to make the next coil, and the U axis is "pointed aft" to correctly lay the wire, then a G2 arc move that specifies a next XY 1/4 of the way around the coil, and a U that specifies 90 degrees from where U starts (in the correct positive or negative direction)... that move will smoothly rotate U as XY accelerate, move, deccelerate.
Personally, I'd do 1/4 arcs while debugging so that you can "see" what is happening better.... but once you've confirmed how this all should work, and "good" gcode, then G2 moves that do full circles, one entire coil per G2 line, should be easy.
This is all very hard to put into words... does it make sense?
p.s. I'd still recommend you define your rotational axis as A (not U). This is a widespread standard for extra axis in CNC. It also MIGHT make the Web interface display it better.
Hi Danal,
Thanks for all your feed back,
what your saying makes sense. but let me get something correct.
If i send "G2 X90.6 Y13.8 I5 J10 U45"
David is saying that as the arc move is happening, The U will slowly move around the arc. and the motion will be fluid on the U along the direction of the arc?
Yes, that is the correct fundamental idea.
however, doing it point to point i will need to add the U on the line before the move so i know its going in the right direction. correct?
I would phrase it more as "U is needed on every line". Same idea.

@russgries said in Requests for help: Gcode cam follower/ tangential knife control.:
Also, are you able to make a simple script program that has an in interface for such a G code generator?
Probably. Let me "check assumptions" on my end. Inputs to such a generator for "cylindrical" coil wraps would need to be:
 Core diameter (what the wire would be wrapped around, even if removed post wrapping).
 Core "length" or "height". In other words, first wrap at z=0 and last wrap at Z=this parameter.
 Wire diameter
 Number of layers
 Packing  even or offset (see below)
 Fudge factor for packing density. Could be called "tightness".
What else?
Even Packing:
OOO OOO OOO OOO OOO OOO OOO OOO OOO OOO OOO OOO
Offset Packing(would really be half spaced, characters will not show that properly)
OOO OOO OOO OOO OOO OOO OOO OOO OOO OOO OOO OOO OOO OOO OOO OOO
And, is there a need for "non cylindrical" winds? Donut/Torus or similar? Those are probably beyond a simple script. Examples:
OO OO OOO OOO OOOOO OOOOO OOOOOO OOOOOO OOOOO OOOOO OOOO OOOO OO OO
OO OO OOO OOO OOOO OOOO OOO OOO OOOO OOOO OOO OOO OO OO

Thanks for the feedback everyone. I will reply to comments sooner than later I hope.
In the meantime I decided to use a stepper motor directly as my tool end. This mainly to reduce any backlash and confusion between how many steps per revolution Ect. Right now I'm using an unknown stepper motor with a very large gear reduction which I cannot tune correctly. (I also re built it for bipolar). It also has a tremendous amount of backlash in the gears and renders it almost useless for this application. It's also not fast enough so I decided to dig through my Box of steppers and I found these really nice point 9ﾟ steppers. I ended up drilling a hole down the center and I'm going to attach my tool end directly on the shaft. This is a nema 17 which is quite large and heavy, but this is to prove the concept it will work, and because it was free in my bin of parts.
Yeah that hole sucked to drill... but i got it!!
Here's a few photos
I'll post more later
Thanks
~Russ

Ok, still haven't had time to sit down and respond to posts... will do shortly.
However i have managed to get this done.
A proper video will be posted on my main YT when its time...
~Russ

One step closer...
But still alot to do.
~Russ

@danal said in Requests for help: Gcode cam follower/ tangential knife control.:
@russgries said in Requests for help: Gcode cam follower/ tangential knife control.:
Also, are you able to make a simple script program that has an in interface for such a G code generator?
Probably. Let me "check assumptions" on my end. Inputs to such a generator for "cylindrical" coil wraps would need to be:
 Core diameter (what the wire would be wrapped around, even if removed post wrapping).
 Core "length" or "height". In other words, first wrap at z=0 and last wrap at Z=this parameter.
 Wire diameter
 Number of layers
 Packing  even or offset (see below)
 Fudge factor for packing density. Could be called "tightness".
What else?
Even Packing:
OOO OOO OOO OOO OOO OOO OOO OOO OOO OOO OOO OOO
Offset Packing(would really be half spaced, characters will not show that properly)
OOO OOO OOO OOO OOO OOO OOO OOO OOO OOO OOO OOO OOO OOO OOO OOO
And, is there a need for "non cylindrical" winds? Donut/Torus or similar? Those are probably beyond a simple script. Examples:
OO OO OOO OOO OOOOO OOOOO OOOOOO OOOOOO OOOOO OOOOO OOOO OOOO OO OO
OO OO OOO OOO OOOO OOOO OOO OOO OOOO OOOO OOO OOO OO OO
I will sendyou a PM and descuss this further!!
Thanks
~Russ

wow, that's all i have to say...
https://www.youtube.com/watch?v=yPXUmXTCtok
https://www.youtube.com/watch?v=aq7Zv7jEf8
~Russ