#!/usr/bin/perl use strict; my $pi = 3.1415926; my $r = 1/8; # 1/4" endmill my $phi_start = 0; my $phi_end = 2*$pi; my $phi_step_degrees = 2; # 2 degrees my $phi_step = $phi_step_degrees * (2*$pi/360); my $xmark = 0.001; my $x_circle = 200; # 0.1" my $ymark = 0.001; my $y_circle = 200; # 0.1" my $x0 = 0; my $y0 = 0; my $R = 1; my $x_start = $x0 + ($R-$r)*cos( $phi_start ); my $y_start = $y0 + ($R-$r)*sin( $phi_start ); my $x_start_dial = 0; my $y_start_dial = 0; my $old_x_dial = $x_start_dial; my $old_y_dial = $y_start_dial; my $old_x_move = 0; my $old_y_move = 0; my $old_x = $x_start; my $old_y = $y_start; sub direction { my $q = shift; return "<=" if $q < 0; return "=>" if $q > 0; return "=="; } print "Set X dial to $x_start_dial\n"; print "Set Y dial to $y_start_dial\n"; my $i = 0; for( my $phi = $phi_start + $phi_step; $phi <= $phi_end; $phi += $phi_step ) { $i++; # Compute x, y! my $x = $x0 + ($R-$r)*cos( $phi ); my $y = $y0 + ($R-$r)*sin( $phi ); # Regardless of how to compute x, y! my $new_x_dial = ( int( $x/$xmark - $x_start/$xmark ) + $x_start_dial ) % $x_circle; # Y axis is reversed -- CW rotation of Y handle decreases Y my $new_y_dial = ( int( $y_start/$ymark - $y/$ymark ) + $y_start_dial ) % $y_circle; my $x_move = 0; my $y_move = 0; if( defined $old_x ) { $x_move = $x-$old_x; $y_move = $y-$old_y; if( $old_x_move * $x_move < 0 ) { print "IMPORTANT!!! Reverse backlash for X right now (but keep dial at $old_x_dial)\n"; } if( $old_y_move * $y_move < 0 ) { print "IMPORTANT!!! Reverse backlash for Y right now (but keep dial at $old_y_dial)\n"; } $old_x_move = $x_move; $old_y_move = $y_move; } $old_x = $x; $old_y = $y; $old_x_dial = $new_x_dial; $old_y_dial = $new_y_dial; print "$i: Move X " . direction( $x_move ) . " $new_x_dial, Y " . direction( $y_move ) . " $new_y_dial\n"; }