Created Delta kinematics (mediawiki)

AnHardt 2015-09-24 20:19:43 +02:00
parent f0c1f39c33
commit 60f22e9948

@ -0,0 +1,20 @@
Delta kinematics uses triangulation to control the nozzle position. Three coordinated carriages with rigid arms connect to a single effector where the nozzle is mounted. Delta triangulation has been documented extensively, perhaps nowhere better than in the PDF document [https://docs.google.com/viewer?a=v&pid=forums&srcid=MTgyNjQwODAyMDkxNzQxMTUwNzIBMDc2NTg4NjQ0MjUxMTE1ODY5OTkBdmZiejRRR2phZjhKATAuMQEBdjI Delta Robot Kinematics] by Steve Graves. Marlin performs delta kinematics in real-time during printing, and this can add significant processing overhead. The <code>DELTA_SEGMENTS_PER_SECOND</code> configuration option can be reduced to tune performance when movement is choppy. Combining delta kinematics with a [http://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller Full Graphic Smart Controller] will test the limits of a Mega2560.
The math for inverse kinematics can seem pretty daunting, but it comes down to these basic facts:
* Three Carriages are mounted on three Towers and together move a single Effector.
* Each carriage moves in coordination with the other two (but "doesn't care" about the other two).
* The only numbers that really matter are the distances in the XY plane from each carriage to the effector perimeter.
* Once you know the distance, you can easily get the carriage Z position:
H = DELTA_DIAGONAL_ROD // The hypotenuse of all delta triangles is an arm's length
Dx = Tx - Ex // X difference between carriage and effector center
Dy = Ty - Ey // Y difference between carriage and effector center
Dte = sqrt(Dx^2 + Dy^2) // Distance from carriage XY to effector center (A)
Dte -= EFFECTOR_RADIUS // length to the edge, not the center
// H*sin(acos(A/H))
Ø = acos(Dte/H) // Get the angle Ø from A/H
O = H * sin(Ø) // Opposite side is solved, O=H*(O/H)
Zt = O + z // Add the carriage Z position
Zt += effector_thickness/2 // Now the effector will touch the bed when z=0.
Zt += nozzle_length // Now the nozzle touches the bed at z=0. Done!