diff --git a/config.h b/config.h index d93b89c..1bbc7ea 100644 --- a/config.h +++ b/config.h @@ -34,8 +34,8 @@ #define Y_STEPS_PER_INCH Y_STEPS_PER_MM*INCHES_PER_MM #define Z_STEPS_PER_INCH Z_STEPS_PER_MM*INCHES_PER_MM -#define RAPID_FEEDRATE 960.0 // in millimeters per minute -#define DEFAULT_FEEDRATE 960.0 +#define RAPID_FEEDRATE 480.0 // in millimeters per minute +#define DEFAULT_FEEDRATE 480.0 #define STEPPERS_ENABLE_DDR DDRD #define STEPPERS_ENABLE_PORT PORTD diff --git a/gcode/braid_cut2d.gcode b/gcode/braid_cut2d.gcode new file mode 100644 index 0000000..3d78460 --- /dev/null +++ b/gcode/braid_cut2d.gcode @@ -0,0 +1,2518 @@ +T1M6 +G17 +G0Z20.000 +G0X0.000Y0.000S8000M3 +G0X0.000Y-33.519Z6.000 +G1Z-1.000 +G1X0.327Y-33.521 +F120.0 +X0.654Y-33.526 +X0.980Y-33.534 +X1.304Y-33.546 +X1.626Y-33.562 +X1.946Y-33.580 +X2.262Y-33.602 +X2.574Y-33.628 +X2.882Y-33.656 +X3.185Y-33.688 +X3.483Y-33.724 +X3.775Y-33.762 +X4.060Y-33.805 +X4.339Y-33.850 +X4.610Y-33.898 +X4.874Y-33.950 +X5.130Y-34.005 +X5.376Y-34.064 +X5.614Y-34.125 +X5.842Y-34.190 +X6.060Y-34.257 +X6.268Y-34.328 +X6.466Y-34.402 +X6.652Y-34.479 +X6.827Y-34.559 +X6.990Y-34.642 +X7.141Y-34.728 +X7.280Y-34.817 +X7.407Y-34.909 +X7.521Y-35.003 +X7.621Y-35.101 +X7.709Y-35.201 +X7.783Y-35.304 +X7.843Y-35.410 +X7.890Y-35.518 +X7.923Y-35.629 +X7.942Y-35.743 +X7.946Y-35.859 +X7.937Y-35.977 +X7.914Y-36.098 +X7.876Y-36.221 +X7.824Y-36.347 +X7.758Y-36.475 +X7.677Y-36.605 +X7.583Y-36.738 +X7.474Y-36.872 +X7.352Y-37.009 +X7.216Y-37.148 +X7.066Y-37.289 +X6.903Y-37.431 +X6.536Y-37.722 +X6.333Y-37.870 +X6.118Y-38.020 +X5.650Y-38.324 +X5.399Y-38.479 +X5.135Y-38.635 +X4.576Y-38.951 +X3.334Y-39.598 +X2.971Y-39.776 +X2.599Y-39.955 +X1.828Y-40.317 +X0.193Y-41.050 +X-3.302Y-42.537 +X-3.747Y-42.723 +X-4.191Y-42.908 +X-5.074Y-43.278 +X-6.803Y-44.012 +X-9.961Y-45.432 +X-10.315Y-45.603 +X-10.659Y-45.773 +X-11.312Y-46.107 +X-11.620Y-46.272 +X-11.915Y-46.434 +X-12.466Y-46.753 +X-12.720Y-46.909 +X-12.960Y-47.063 +X-13.186Y-47.214 +X-13.396Y-47.364 +X-13.591Y-47.510 +X-13.770Y-47.654 +X-13.933Y-47.796 +X-14.080Y-47.935 +X-14.211Y-48.071 +X-14.326Y-48.204 +X-14.424Y-48.334 +X-14.505Y-48.462 +X-14.570Y-48.586 +X-14.618Y-48.707 +X-14.649Y-48.825 +X-14.663Y-48.940 +X-14.661Y-49.052 +X-14.642Y-49.160 +X-14.607Y-49.265 +X-14.556Y-49.366 +X-14.488Y-49.464 +X-14.404Y-49.559 +X-14.305Y-49.649 +X-14.190Y-49.737 +X-14.068Y-49.815 +X-13.934Y-49.889 +X-13.787Y-49.961 +X-13.628Y-50.029 +X-13.456Y-50.094 +X-13.273Y-50.155 +X-13.078Y-50.213 +X-12.872Y-50.267 +X-12.655Y-50.318 +X-12.428Y-50.366 +X-12.190Y-50.410 +X-11.944Y-50.450 +X-11.688Y-50.487 +X-11.423Y-50.520 +X-11.150Y-50.549 +X-10.870Y-50.575 +X-10.582Y-50.597 +X-10.287Y-50.616 +X-9.987Y-50.630 +X-9.680Y-50.641 +X-9.368Y-50.649 +X-9.052Y-50.652 +X-8.732Y-50.652 +X-8.408Y-50.648 +X-8.081Y-50.640 +X-7.751Y-50.628 +X-7.420Y-50.613 +X-7.087Y-50.594 +X-6.754Y-50.571 +X-6.420Y-50.544 +X-6.087Y-50.513 +X-5.754Y-50.479 +X-5.424Y-50.441 +X-5.095Y-50.399 +X-4.769Y-50.353 +X-4.446Y-50.304 +X-4.127Y-50.250 +X-3.812Y-50.193 +X-3.198Y-50.068 +X-2.899Y-50.000 +X-2.606Y-49.928 +X-2.321Y-49.852 +X-2.043Y-49.773 +X-1.773Y-49.690 +X-1.511Y-49.603 +X-1.015Y-49.419 +X-0.781Y-49.322 +X-0.557Y-49.221 +X-0.343Y-49.116 +X-0.141Y-49.009 +X0.050Y-48.897 +X0.230Y-48.783 +X0.398Y-48.664 +X0.553Y-48.543 +X0.696Y-48.418 +X0.826Y-48.290 +X0.943Y-48.159 +X1.046Y-48.024 +X1.136Y-47.887 +X1.213Y-47.746 +X1.275Y-47.602 +X1.323Y-47.455 +X1.357Y-47.308 +X1.377Y-47.159 +X1.383Y-47.006 +X1.375Y-46.851 +X1.353Y-46.693 +X1.317Y-46.532 +X1.267Y-46.369 +X1.203Y-46.203 +X1.126Y-46.035 +X1.034Y-45.864 +X0.929Y-45.691 +X0.810Y-45.515 +X0.677Y-45.338 +X0.531Y-45.157 +X0.199Y-44.791 +X0.014Y-44.604 +X-0.184Y-44.416 +X-0.617Y-44.033 +X-1.624Y-43.245 +X-1.903Y-43.044 +X-2.193Y-42.841 +X-2.801Y-42.432 +X-4.125Y-41.596 +X-4.475Y-41.384 +X-4.833Y-41.171 +X-5.567Y-40.743 +X-7.098Y-39.876 +X-10.296Y-38.118 +X-10.698Y-37.897 +X-11.099Y-37.676 +X-11.894Y-37.235 +X-13.448Y-36.356 +X-13.825Y-36.137 +X-14.197Y-35.919 +X-14.923Y-35.485 +X-16.288Y-34.625 +X-16.636Y-34.395 +X-16.973Y-34.165 +X-17.613Y-33.711 +X-17.915Y-33.486 +X-18.204Y-33.262 +X-18.743Y-32.821 +X-18.992Y-32.602 +X-19.227Y-32.386 +X-19.447Y-32.171 +X-19.652Y-31.959 +X-19.843Y-31.749 +X-20.017Y-31.540 +X-20.176Y-31.335 +X-20.320Y-31.131 +X-20.447Y-30.930 +X-20.558Y-30.731 +X-20.653Y-30.535 +X-20.731Y-30.341 +X-20.793Y-30.150 +X-20.838Y-29.961 +X-20.867Y-29.776 +X-20.879Y-29.593 +X-20.875Y-29.413 +X-20.854Y-29.236 +X-20.817Y-29.062 +X-20.764Y-28.891 +X-20.695Y-28.723 +X-20.610Y-28.559 +X-20.510Y-28.397 +X-20.394Y-28.239 +X-20.263Y-28.084 +X-20.117Y-27.932 +X-19.957Y-27.784 +X-19.782Y-27.639 +X-19.594Y-27.498 +X-19.392Y-27.360 +X-19.177Y-27.226 +X-18.950Y-27.095 +X-18.710Y-26.968 +X-18.459Y-26.845 +X-18.197Y-26.725 +X-17.924Y-26.609 +X-17.641Y-26.497 +X-17.349Y-26.389 +X-16.737Y-26.183 +X-16.419Y-26.086 +X-16.094Y-25.993 +X-15.763Y-25.904 +X-15.426Y-25.818 +X-15.083Y-25.737 +X-14.736Y-25.660 +X-14.030Y-25.516 +X-13.672Y-25.451 +X-13.313Y-25.389 +X-12.953Y-25.332 +X-12.591Y-25.278 +X-12.230Y-25.228 +X-11.870Y-25.182 +X-11.511Y-25.140 +X-11.155Y-25.103 +X-10.824Y-25.071 +X-10.497Y-25.043 +X-10.173Y-25.018 +X-9.853Y-24.996 +X-9.538Y-24.978 +X-9.228Y-24.964 +X-8.924Y-24.952 +X-8.625Y-24.944 +X-8.334Y-24.940 +X-8.049Y-24.939 +X-7.772Y-24.941 +X-7.504Y-24.946 +X-7.243Y-24.955 +X-6.992Y-24.967 +X-6.750Y-24.982 +X-6.518Y-25.000 +X-6.295Y-25.022 +X-6.084Y-25.047 +X-5.883Y-25.075 +X-5.694Y-25.106 +X-5.517Y-25.140 +X-5.351Y-25.177 +X-5.197Y-25.217 +X-5.057Y-25.260 +X-4.928Y-25.306 +X-4.813Y-25.355 +X-4.711Y-25.407 +X-4.623Y-25.461 +X-4.548Y-25.518 +X-4.487Y-25.578 +X-4.439Y-25.641 +X-4.406Y-25.707 +X-4.387Y-25.775 +X-4.382Y-25.845 +X-4.392Y-25.918 +X-4.416Y-25.994 +X-4.454Y-26.072 +X-4.506Y-26.152 +X-4.572Y-26.235 +X-4.653Y-26.320 +X-4.748Y-26.407 +X-4.857Y-26.496 +X-4.980Y-26.588 +X-5.117Y-26.681 +X-5.267Y-26.777 +X-5.431Y-26.874 +X-5.798Y-27.074 +X-6.001Y-27.177 +X-6.216Y-27.282 +X-6.683Y-27.496 +X-7.755Y-27.942 +X-8.049Y-28.057 +X-8.353Y-28.173 +X-8.990Y-28.409 +X-10.362Y-28.891 +X-10.753Y-29.024 +X-11.151Y-29.158 +X-11.968Y-29.428 +X-13.658Y-29.973 +X-17.113Y-31.067 +X-17.538Y-31.202 +X-17.959Y-31.337 +X-18.788Y-31.604 +X-20.370Y-32.127 +X-20.746Y-32.255 +X-21.113Y-32.382 +X-21.817Y-32.631 +X-23.093Y-33.111 +X-23.381Y-33.226 +X-23.656Y-33.339 +X-24.164Y-33.560 +X-24.397Y-33.667 +X-24.615Y-33.772 +X-25.005Y-33.974 +X-25.177Y-34.072 +X-25.332Y-34.167 +X-25.472Y-34.259 +X-25.595Y-34.349 +X-25.701Y-34.436 +X-25.791Y-34.520 +X-25.864Y-34.601 +X-25.920Y-34.679 +X-25.960Y-34.754 +X-25.982Y-34.826 +X-25.987Y-34.895 +X-25.976Y-34.961 +X-25.948Y-35.023 +X-25.903Y-35.082 +X-25.841Y-35.138 +X-25.763Y-35.190 +X-25.669Y-35.239 +X-25.559Y-35.284 +X-25.433Y-35.325 +X-25.291Y-35.363 +X-25.134Y-35.397 +X-24.963Y-35.428 +X-24.777Y-35.455 +X-24.577Y-35.477 +X-24.367Y-35.496 +X-24.144Y-35.511 +X-23.909Y-35.522 +X-23.661Y-35.529 +X-23.403Y-35.532 +X-23.133Y-35.532 +X-22.853Y-35.527 +X-22.563Y-35.519 +X-22.263Y-35.506 +X-21.955Y-35.490 +X-21.638Y-35.470 +X-21.313Y-35.445 +X-20.981Y-35.416 +X-20.643Y-35.384 +X-20.299Y-35.347 +X-19.949Y-35.306 +X-19.595Y-35.261 +X-19.237Y-35.212 +X-18.875Y-35.158 +X-18.511Y-35.101 +X-18.145Y-35.039 +X-17.777Y-34.973 +X-17.041Y-34.829 +X-16.673Y-34.751 +X-16.306Y-34.668 +X-15.580Y-34.491 +X-15.222Y-34.396 +X-14.867Y-34.297 +X-14.172Y-34.086 +X-13.833Y-33.975 +X-13.501Y-33.859 +X-13.176Y-33.740 +X-12.858Y-33.616 +X-12.548Y-33.488 +X-12.248Y-33.357 +X-11.675Y-33.082 +X-11.404Y-32.938 +X-11.144Y-32.791 +X-10.896Y-32.639 +X-10.659Y-32.484 +X-10.435Y-32.326 +X-10.223Y-32.163 +X-10.025Y-31.997 +X-9.840Y-31.827 +X-9.669Y-31.653 +X-9.512Y-31.476 +X-9.370Y-31.295 +X-9.242Y-31.111 +X-9.130Y-30.923 +X-9.033Y-30.732 +X-8.951Y-30.538 +X-8.885Y-30.340 +X-8.835Y-30.139 +X-8.801Y-29.934 +X-8.782Y-29.727 +X-8.780Y-29.517 +X-8.794Y-29.303 +X-8.825Y-29.087 +X-8.871Y-28.867 +X-8.934Y-28.645 +X-9.006Y-28.435 +X-9.093Y-28.223 +X-9.194Y-28.008 +X-9.308Y-27.792 +X-9.435Y-27.573 +X-9.577Y-27.352 +X-9.898Y-26.903 +X-10.078Y-26.676 +X-10.271Y-26.446 +X-10.693Y-25.982 +X-10.922Y-25.748 +X-11.162Y-25.511 +X-11.675Y-25.034 +X-11.948Y-24.793 +X-12.230Y-24.550 +X-12.824Y-24.061 +X-14.114Y-23.068 +X-17.000Y-21.038 +X-17.380Y-20.782 +X-17.762Y-20.525 +X-18.532Y-20.010 +X-20.077Y-18.979 +X-20.462Y-18.721 +X-20.845Y-18.464 +X-21.602Y-17.949 +X-23.072Y-16.925 +X-23.427Y-16.671 +X-23.776Y-16.417 +X-24.454Y-15.911 +X-25.717Y-14.911 +X-26.011Y-14.664 +X-26.295Y-14.418 +X-26.833Y-13.930 +X-27.086Y-13.688 +X-27.328Y-13.447 +X-27.777Y-12.971 +X-28.000Y-12.715 +X-28.209Y-12.461 +X-28.404Y-12.210 +X-28.583Y-11.961 +X-28.746Y-11.713 +X-28.894Y-11.469 +X-29.026Y-11.226 +X-29.142Y-10.986 +X-29.242Y-10.749 +X-29.325Y-10.514 +X-29.391Y-10.281 +X-29.441Y-10.052 +X-29.475Y-9.825 +X-29.491Y-9.601 +X-29.491Y-9.380 +X-29.475Y-9.162 +X-29.441Y-8.947 +X-29.391Y-8.735 +X-29.325Y-8.526 +X-29.242Y-8.320 +X-29.144Y-8.118 +X-29.029Y-7.919 +X-28.899Y-7.723 +X-28.753Y-7.531 +X-28.592Y-7.342 +X-28.416Y-7.156 +X-28.226Y-6.974 +X-28.022Y-6.796 +X-27.804Y-6.621 +X-27.572Y-6.450 +X-27.071Y-6.119 +X-26.802Y-5.959 +X-26.522Y-5.803 +X-25.929Y-5.502 +X-25.617Y-5.358 +X-25.296Y-5.217 +X-24.628Y-4.948 +X-24.283Y-4.819 +X-23.930Y-4.694 +X-23.207Y-4.457 +X-22.838Y-4.344 +X-22.465Y-4.236 +X-21.707Y-4.031 +X-21.325Y-3.935 +X-20.941Y-3.842 +X-20.170Y-3.670 +X-19.786Y-3.590 +X-19.402Y-3.515 +X-18.642Y-3.375 +X-18.266Y-3.312 +X-17.894Y-3.252 +X-17.527Y-3.197 +X-17.164Y-3.145 +X-16.808Y-3.098 +X-16.459Y-3.055 +X-16.116Y-3.015 +X-15.781Y-2.980 +X-15.477Y-2.951 +X-15.179Y-2.925 +X-14.891Y-2.902 +X-14.611Y-2.883 +X-14.340Y-2.867 +X-14.078Y-2.855 +X-13.827Y-2.845 +X-13.586Y-2.839 +X-13.355Y-2.837 +X-13.136Y-2.837 +X-12.929Y-2.841 +X-12.733Y-2.848 +X-12.549Y-2.858 +X-12.378Y-2.871 +X-12.220Y-2.888 +X-12.074Y-2.907 +X-11.942Y-2.929 +X-11.823Y-2.955 +X-11.717Y-2.983 +X-11.626Y-3.014 +X-11.548Y-3.048 +X-11.484Y-3.084 +X-11.435Y-3.124 +X-11.400Y-3.166 +X-11.379Y-3.210 +X-11.372Y-3.258 +X-11.380Y-3.308 +X-11.403Y-3.360 +X-11.440Y-3.415 +X-11.491Y-3.472 +X-11.556Y-3.532 +X-11.636Y-3.594 +X-11.729Y-3.658 +X-11.837Y-3.724 +X-11.959Y-3.793 +X-12.094Y-3.863 +X-12.242Y-3.936 +X-12.404Y-4.010 +X-12.767Y-4.165 +X-12.967Y-4.245 +X-13.179Y-4.327 +X-13.639Y-4.495 +X-14.691Y-4.850 +X-14.979Y-4.942 +X-15.277Y-5.036 +X-15.897Y-5.225 +X-17.230Y-5.617 +X-20.146Y-6.431 +X-20.516Y-6.532 +X-20.887Y-6.634 +X-21.630Y-6.837 +X-23.106Y-7.241 +X-25.895Y-8.028 +X-26.218Y-8.123 +X-26.535Y-8.218 +X-27.145Y-8.403 +X-28.260Y-8.760 +X-28.514Y-8.846 +X-28.759Y-8.930 +X-29.214Y-9.095 +X-29.425Y-9.175 +X-29.624Y-9.253 +X-29.986Y-9.404 +X-30.149Y-9.477 +X-30.298Y-9.548 +X-30.435Y-9.617 +X-30.559Y-9.684 +X-30.669Y-9.749 +X-30.766Y-9.812 +X-30.849Y-9.872 +X-30.918Y-9.931 +X-30.974Y-9.987 +X-31.016Y-10.041 +X-31.043Y-10.092 +X-31.057Y-10.141 +X-31.057Y-10.188 +X-31.043Y-10.232 +X-31.015Y-10.273 +X-30.972Y-10.312 +X-30.916Y-10.349 +X-30.847Y-10.382 +X-30.763Y-10.413 +X-30.666Y-10.441 +X-30.556Y-10.466 +X-30.432Y-10.489 +X-30.295Y-10.508 +X-30.146Y-10.525 +X-29.984Y-10.539 +X-29.809Y-10.549 +X-29.622Y-10.557 +X-29.424Y-10.562 +X-29.214Y-10.563 +X-28.992Y-10.562 +X-28.760Y-10.557 +X-28.517Y-10.549 +X-28.242Y-10.537 +X-27.955Y-10.521 +X-27.657Y-10.501 +X-27.349Y-10.477 +X-27.031Y-10.450 +X-26.703Y-10.418 +X-26.366Y-10.383 +X-26.021Y-10.343 +X-25.668Y-10.300 +X-25.308Y-10.253 +X-24.568Y-10.146 +X-24.191Y-10.086 +X-23.808Y-10.023 +X-23.032Y-9.883 +X-22.640Y-9.807 +X-22.245Y-9.728 +X-21.453Y-9.556 +X-21.057Y-9.463 +X-20.662Y-9.367 +X-19.876Y-9.162 +X-19.487Y-9.054 +X-19.101Y-8.941 +X-18.343Y-8.704 +X-17.972Y-8.579 +X-17.606Y-8.450 +X-16.896Y-8.180 +X-16.552Y-8.040 +X-16.217Y-7.895 +X-15.574Y-7.594 +X-15.268Y-7.438 +X-14.972Y-7.277 +X-14.414Y-6.946 +X-14.153Y-6.774 +X-13.905Y-6.599 +X-13.669Y-6.420 +X-13.447Y-6.237 +X-13.239Y-6.051 +X-13.044Y-5.862 +X-12.864Y-5.669 +X-12.699Y-5.472 +X-12.549Y-5.272 +X-12.414Y-5.069 +X-12.294Y-4.862 +X-12.190Y-4.652 +X-12.102Y-4.439 +X-12.030Y-4.223 +X-11.975Y-4.003 +X-11.935Y-3.781 +X-11.911Y-3.555 +X-11.904Y-3.327 +X-11.914Y-3.096 +X-11.939Y-2.862 +X-11.981Y-2.625 +X-12.038Y-2.386 +X-12.112Y-2.144 +X-12.202Y-1.899 +X-12.300Y-1.669 +X-12.412Y-1.436 +X-12.537Y-1.201 +X-12.675Y-0.965 +X-12.826Y-0.726 +X-12.990Y-0.486 +X-13.355Y0.001 +X-13.555Y0.246 +X-13.768Y0.494 +X-14.226Y0.993 +X-15.266Y2.009 +X-15.550Y2.266 +X-15.842Y2.524 +X-16.451Y3.043 +X-17.752Y4.093 +X-20.572Y6.219 +X-20.935Y6.486 +X-21.298Y6.753 +X-22.024Y7.287 +X-23.456Y8.353 +X-23.807Y8.618 +X-24.154Y8.883 +X-24.835Y9.411 +X-26.125Y10.458 +X-26.431Y10.717 +X-26.728Y10.975 +X-27.297Y11.489 +X-27.568Y11.744 +X-27.830Y11.997 +X-28.322Y12.500 +X-28.552Y12.749 +X-28.771Y12.997 +X-28.978Y13.243 +X-29.174Y13.487 +X-29.357Y13.729 +X-29.528Y13.970 +X-29.686Y14.209 +X-29.831Y14.446 +X-29.974Y14.700 +X-30.101Y14.953 +X-30.212Y15.202 +X-30.307Y15.449 +X-30.385Y15.694 +X-30.447Y15.936 +X-30.492Y16.175 +X-30.521Y16.411 +X-30.532Y16.644 +X-30.527Y16.874 +X-30.505Y17.102 +X-30.466Y17.326 +X-30.411Y17.547 +X-30.338Y17.765 +X-30.249Y17.980 +X-30.144Y18.191 +X-30.022Y18.399 +X-29.884Y18.603 +X-29.730Y18.805 +X-29.561Y19.002 +X-29.376Y19.196 +X-29.176Y19.386 +X-28.962Y19.573 +X-28.733Y19.756 +X-28.490Y19.935 +X-28.233Y20.111 +X-27.964Y20.282 +X-27.681Y20.450 +X-27.386Y20.614 +X-27.080Y20.774 +X-26.434Y21.081 +X-26.096Y21.229 +X-25.748Y21.373 +X-25.025Y21.648 +X-24.652Y21.780 +X-24.272Y21.907 +X-23.493Y22.149 +X-23.095Y22.264 +X-22.693Y22.375 +X-21.877Y22.583 +X-21.466Y22.681 +X-21.053Y22.775 +X-20.223Y22.949 +X-19.809Y23.030 +X-19.396Y23.107 +X-18.575Y23.247 +X-18.169Y23.311 +X-17.767Y23.371 +X-16.977Y23.478 +X-16.591Y23.525 +X-16.211Y23.568 +X-15.838Y23.606 +X-15.473Y23.641 +X-15.116Y23.671 +X-14.769Y23.698 +X-14.430Y23.720 +X-14.102Y23.739 +X-13.791Y23.753 +X-13.490Y23.763 +X-13.200Y23.769 +X-12.922Y23.772 +X-12.657Y23.771 +X-12.404Y23.766 +X-12.164Y23.758 +X-11.937Y23.746 +X-11.724Y23.730 +X-11.525Y23.711 +X-11.340Y23.688 +X-11.171Y23.662 +X-11.016Y23.633 +X-10.876Y23.600 +X-10.752Y23.564 +X-10.643Y23.524 +X-10.549Y23.481 +X-10.472Y23.435 +X-10.411Y23.386 +X-10.365Y23.334 +X-10.336Y23.279 +X-10.323Y23.221 +X-10.326Y23.161 +X-10.344Y23.097 +X-10.379Y23.030 +X-10.430Y22.961 +X-10.497Y22.889 +X-10.579Y22.815 +X-10.676Y22.738 +X-10.789Y22.659 +X-10.917Y22.577 +X-11.060Y22.493 +X-11.217Y22.407 +X-11.389Y22.318 +X-11.773Y22.135 +X-11.985Y22.041 +X-12.210Y21.945 +X-12.697Y21.747 +X-12.958Y21.645 +X-13.230Y21.542 +X-13.806Y21.331 +X-15.066Y20.894 +X-15.401Y20.782 +X-15.742Y20.670 +X-16.442Y20.441 +X-17.896Y19.977 +X-20.868Y19.035 +X-21.208Y18.926 +X-21.545Y18.817 +X-22.208Y18.600 +X-23.472Y18.173 +X-23.772Y18.068 +X-24.066Y17.964 +X-24.629Y17.759 +X-25.650Y17.361 +X-25.881Y17.265 +X-26.101Y17.170 +X-26.509Y16.984 +X-26.696Y16.893 +X-26.871Y16.804 +X-27.184Y16.631 +X-27.322Y16.547 +X-27.447Y16.465 +X-27.559Y16.385 +X-27.658Y16.306 +X-27.743Y16.230 +X-27.815Y16.156 +X-27.873Y16.084 +X-27.917Y16.014 +X-27.947Y15.946 +X-27.963Y15.880 +X-27.965Y15.817 +X-27.953Y15.756 +X-27.927Y15.697 +X-27.887Y15.641 +X-27.832Y15.588 +X-27.764Y15.537 +X-27.681Y15.488 +X-27.585Y15.442 +X-27.475Y15.399 +X-27.351Y15.358 +X-27.214Y15.321 +X-27.063Y15.286 +X-26.899Y15.253 +X-26.723Y15.224 +X-26.533Y15.198 +X-26.332Y15.174 +X-26.118Y15.154 +X-25.892Y15.136 +X-25.654Y15.122 +X-25.405Y15.110 +X-25.145Y15.102 +X-24.875Y15.097 +X-24.594Y15.095 +X-24.304Y15.096 +X-24.004Y15.100 +X-23.694Y15.107 +X-23.377Y15.118 +X-23.051Y15.132 +X-22.717Y15.149 +X-22.376Y15.170 +X-21.998Y15.196 +X-21.613Y15.226 +X-21.221Y15.260 +X-20.822Y15.298 +X-20.418Y15.340 +X-20.010Y15.385 +X-19.180Y15.489 +X-18.761Y15.547 +X-18.339Y15.609 +X-17.492Y15.744 +X-17.067Y15.818 +X-16.644Y15.896 +X-15.800Y16.064 +X-15.382Y16.154 +X-14.967Y16.248 +X-14.150Y16.448 +X-13.749Y16.554 +X-13.354Y16.664 +X-12.583Y16.895 +X-12.209Y17.017 +X-11.844Y17.142 +X-11.140Y17.405 +X-10.803Y17.542 +X-10.477Y17.683 +X-9.858Y17.975 +X-9.566Y18.127 +X-9.287Y18.283 +X-9.021Y18.442 +X-8.768Y18.604 +X-8.529Y18.771 +X-8.305Y18.940 +X-8.094Y19.113 +X-7.899Y19.290 +X-7.718Y19.470 +X-7.553Y19.653 +X-7.403Y19.839 +X-7.270Y20.029 +X-7.152Y20.221 +X-7.050Y20.417 +X-6.965Y20.616 +X-6.895Y20.818 +X-6.843Y21.023 +X-6.806Y21.230 +X-6.787Y21.441 +X-6.783Y21.654 +X-6.796Y21.870 +X-6.826Y22.088 +X-6.872Y22.309 +X-6.933Y22.532 +X-7.011Y22.758 +X-7.104Y22.986 +X-7.213Y23.217 +X-7.338Y23.449 +X-7.477Y23.684 +X-7.631Y23.921 +X-7.982Y24.401 +X-8.165Y24.627 +X-8.360Y24.855 +X-8.782Y25.315 +X-9.751Y26.251 +X-10.017Y26.488 +X-10.291Y26.726 +X-10.863Y27.204 +X-12.089Y28.170 +X-12.409Y28.413 +X-12.734Y28.657 +X-13.395Y29.145 +X-14.749Y30.124 +X-17.457Y32.077 +X-17.785Y32.320 +X-18.108Y32.561 +X-18.740Y33.042 +X-19.930Y33.994 +X-20.210Y34.229 +X-20.481Y34.463 +X-20.997Y34.927 +X-21.240Y35.157 +X-21.474Y35.386 +X-21.910Y35.838 +X-22.111Y36.062 +X-22.302Y36.284 +X-22.480Y36.505 +X-22.646Y36.723 +X-22.800Y36.940 +X-22.941Y37.155 +X-23.069Y37.367 +X-23.183Y37.578 +X-23.285Y37.786 +X-23.373Y37.993 +X-23.447Y38.197 +X-23.507Y38.398 +X-23.553Y38.598 +X-23.585Y38.795 +X-23.602Y38.989 +X-23.606Y39.181 +X-23.593Y39.386 +X-23.563Y39.588 +X-23.516Y39.787 +X-23.452Y39.983 +X-23.372Y40.175 +X-23.274Y40.364 +X-23.160Y40.550 +X-23.029Y40.732 +X-22.882Y40.910 +X-22.719Y41.086 +X-22.539Y41.257 +X-22.344Y41.425 +X-22.134Y41.589 +X-21.908Y41.749 +X-21.668Y41.906 +X-21.413Y42.059 +X-21.144Y42.208 +X-20.862Y42.353 +X-20.566Y42.494 +X-20.257Y42.631 +X-19.937Y42.763 +X-19.604Y42.892 +X-18.906Y43.138 +X-18.542Y43.254 +X-18.168Y43.366 +X-17.785Y43.474 +X-17.394Y43.578 +X-16.995Y43.678 +X-16.589Y43.773 +X-15.758Y43.950 +X-15.335Y44.033 +X-14.908Y44.111 +X-14.476Y44.184 +X-14.042Y44.253 +X-13.606Y44.318 +X-13.168Y44.379 +X-12.289Y44.486 +X-11.851Y44.534 +X-11.414Y44.576 +X-10.978Y44.615 +X-10.546Y44.649 +X-10.116Y44.679 +X-9.691Y44.704 +X-9.271Y44.726 +X-8.856Y44.742 +X-8.447Y44.755 +X-8.044Y44.763 +X-7.650Y44.767 +X-7.263Y44.766 +X-6.885Y44.762 +X-6.516Y44.753 +X-6.157Y44.740 +X-5.808Y44.723 +X-5.471Y44.702 +X-5.145Y44.676 +X-4.830Y44.647 +X-4.529Y44.613 +X-4.240Y44.576 +X-3.965Y44.535 +X-3.703Y44.489 +X-3.456Y44.440 +X-3.227Y44.388 +X-3.013Y44.332 +X-2.813Y44.273 +X-2.629Y44.210 +X-2.459Y44.144 +X-2.305Y44.074 +X-2.167Y44.001 +X-2.044Y43.925 +X-1.938Y43.845 +X-1.847Y43.762 +X-1.773Y43.675 +X-1.715Y43.586 +X-1.673Y43.494 +X-1.647Y43.398 +X-1.638Y43.299 +X-1.645Y43.198 +X-1.667Y43.094 +X-1.706Y42.987 +X-1.761Y42.877 +X-1.832Y42.765 +X-1.918Y42.650 +X-2.019Y42.532 +X-2.135Y42.412 +X-2.267Y42.290 +X-2.412Y42.166 +X-2.572Y42.039 +X-2.934Y41.779 +X-3.134Y41.646 +X-3.347Y41.511 +X-3.810Y41.235 +X-4.059Y41.095 +X-4.319Y40.953 +X-4.869Y40.664 +X-6.076Y40.071 +X-8.785Y38.840 +X-9.139Y38.683 +X-9.494Y38.526 +X-10.205Y38.212 +X-11.612Y37.583 +X-14.215Y36.343 +X-14.490Y36.201 +X-14.756Y36.061 +X-15.263Y35.782 +X-15.503Y35.645 +X-15.734Y35.508 +X-16.165Y35.239 +X-16.365Y35.106 +X-16.553Y34.975 +X-16.730Y34.845 +X-16.895Y34.717 +X-17.049Y34.590 +X-17.190Y34.465 +X-17.318Y34.341 +X-17.434Y34.219 +X-17.537Y34.099 +X-17.626Y33.981 +X-17.702Y33.865 +X-17.764Y33.751 +X-17.813Y33.639 +X-17.847Y33.528 +X-17.868Y33.420 +X-17.875Y33.315 +X-17.867Y33.211 +X-17.845Y33.110 +X-17.809Y33.011 +X-17.759Y32.914 +X-17.695Y32.820 +X-17.616Y32.728 +X-17.523Y32.639 +X-17.417Y32.552 +X-17.296Y32.468 +X-17.162Y32.387 +X-17.014Y32.308 +X-16.852Y32.232 +X-16.677Y32.159 +X-16.489Y32.089 +X-16.288Y32.021 +X-16.075Y31.956 +X-15.849Y31.895 +X-15.611Y31.836 +X-15.361Y31.780 +X-15.099Y31.727 +X-14.827Y31.677 +X-14.543Y31.631 +X-14.250Y31.587 +X-13.946Y31.547 +X-13.632Y31.509 +X-13.309Y31.475 +X-12.977Y31.444 +X-12.637Y31.417 +X-12.289Y31.392 +X-11.933Y31.371 +X-11.570Y31.353 +X-11.201Y31.338 +X-10.825Y31.327 +X-10.444Y31.319 +X-10.058Y31.314 +X-9.667Y31.313 +X-9.273Y31.315 +X-8.874Y31.320 +X-8.473Y31.329 +X-8.069Y31.341 +X-7.630Y31.358 +X-7.188Y31.379 +X-6.746Y31.404 +X-6.303Y31.433 +X-5.861Y31.466 +X-5.421Y31.503 +X-4.982Y31.544 +X-4.546Y31.589 +X-4.113Y31.638 +X-3.684Y31.691 +X-3.260Y31.748 +X-2.841Y31.809 +X-2.428Y31.873 +X-2.021Y31.942 +X-1.231Y32.091 +X-0.848Y32.171 +X-0.475Y32.255 +X-0.110Y32.343 +X0.243Y32.434 +X0.587Y32.530 +X0.919Y32.629 +X1.547Y32.838 +X1.842Y32.948 +X2.124Y33.061 +X2.392Y33.178 +X2.647Y33.299 +X2.887Y33.423 +X3.112Y33.550 +X3.323Y33.681 +X3.518Y33.815 +X3.698Y33.952 +X3.862Y34.092 +X4.010Y34.236 +X4.142Y34.383 +X4.257Y34.533 +X4.356Y34.685 +X4.439Y34.841 +X4.505Y35.000 +X4.554Y35.161 +X4.586Y35.325 +X4.602Y35.492 +X4.602Y35.662 +X4.584Y35.834 +X4.551Y36.008 +X4.501Y36.185 +X4.435Y36.364 +X4.353Y36.546 +X4.255Y36.730 +X4.142Y36.916 +X4.014Y37.104 +X3.871Y37.294 +X3.713Y37.486 +X3.356Y37.876 +X3.157Y38.073 +X2.944Y38.272 +X2.483Y38.675 +X1.425Y39.496 +X1.155Y39.690 +X0.877Y39.885 +X0.300Y40.277 +X-0.925Y41.070 +X-3.540Y42.667 +X-3.871Y42.867 +X-4.202Y43.066 +X-4.858Y43.463 +X-6.136Y44.252 +X-6.444Y44.447 +X-6.748Y44.642 +X-7.337Y45.028 +X-8.430Y45.788 +X-8.682Y45.975 +X-8.926Y46.161 +X-9.383Y46.527 +X-9.596Y46.708 +X-9.799Y46.887 +X-10.170Y47.241 +X-10.337Y47.415 +X-10.493Y47.587 +X-10.636Y47.757 +X-10.766Y47.925 +X-10.884Y48.091 +X-10.988Y48.255 +X-11.078Y48.416 +X-11.155Y48.576 +X-11.218Y48.733 +X-11.267Y48.888 +X-11.301Y49.040 +X-11.322Y49.190 +X-11.328Y49.337 +X-11.319Y49.482 +X-11.296Y49.624 +X-11.259Y49.763 +X-11.207Y49.900 +X-11.140Y50.033 +X-11.059Y50.164 +X-10.963Y50.293 +X-10.853Y50.418 +X-10.729Y50.540 +X-10.591Y50.659 +X-10.439Y50.775 +X-10.276Y50.886 +X-10.100Y50.994 +X-9.912Y51.098 +X-9.710Y51.200 +X-9.496Y51.298 +X-9.270Y51.394 +X-8.783Y51.574 +X-8.522Y51.660 +X-8.250Y51.742 +X-7.968Y51.821 +X-7.675Y51.897 +X-7.372Y51.969 +X-7.059Y52.038 +X-6.407Y52.165 +X-6.068Y52.223 +X-5.722Y52.278 +X-5.368Y52.330 +X-5.006Y52.378 +X-4.639Y52.422 +X-4.265Y52.463 +X-3.886Y52.500 +X-3.501Y52.533 +X-3.112Y52.563 +X-2.719Y52.590 +X-2.322Y52.613 +X-1.923Y52.632 +X-1.521Y52.647 +X-1.116Y52.659 +X-0.711Y52.667 +X-0.304Y52.672 +X0.103Y52.673 +X0.510Y52.670 +X0.916Y52.664 +X1.321Y52.654 +X1.724Y52.640 +X2.125Y52.623 +X2.524Y52.602 +X2.919Y52.577 +X3.310Y52.549 +X3.696Y52.517 +X4.078Y52.481 +X4.455Y52.442 +X4.826Y52.400 +X5.190Y52.354 +X5.548Y52.304 +X5.898Y52.251 +X6.241Y52.194 +X6.576Y52.134 +X6.902Y52.070 +X7.219Y52.003 +X7.526Y51.933 +X7.824Y51.859 +X8.389Y51.701 +X8.656Y51.617 +X8.911Y51.530 +X9.154Y51.439 +X9.386Y51.346 +X9.606Y51.249 +X9.814Y51.149 +X10.009Y51.046 +X10.191Y50.939 +X10.374Y50.821 +X10.541Y50.698 +X10.693Y50.573 +X10.829Y50.444 +X10.948Y50.311 +X11.052Y50.175 +X11.139Y50.036 +X11.209Y49.894 +X11.263Y49.748 +X11.301Y49.600 +X11.323Y49.448 +X11.327Y49.293 +X11.316Y49.136 +X11.288Y48.975 +X11.245Y48.812 +X11.185Y48.646 +X11.109Y48.478 +X11.018Y48.307 +X10.912Y48.133 +X10.790Y47.957 +X10.654Y47.779 +X10.503Y47.598 +X10.159Y47.230 +X9.967Y47.043 +X9.762Y46.854 +X9.314Y46.470 +X8.282Y45.681 +X7.999Y45.480 +X7.707Y45.278 +X7.098Y44.870 +X5.798Y44.041 +X3.014Y42.350 +X2.662Y42.138 +X2.311Y41.925 +X1.617Y41.500 +X0.273Y40.654 +X-0.049Y40.444 +X-0.365Y40.234 +X-0.975Y39.817 +X-2.088Y38.994 +X-2.324Y38.805 +X-2.551Y38.617 +X-2.974Y38.245 +X-3.170Y38.061 +X-3.354Y37.878 +X-3.687Y37.516 +X-3.836Y37.338 +X-3.972Y37.162 +X-4.096Y36.987 +X-4.206Y36.813 +X-4.304Y36.642 +X-4.388Y36.473 +X-4.459Y36.305 +X-4.515Y36.139 +X-4.558Y35.976 +X-4.587Y35.815 +X-4.602Y35.655 +X-4.603Y35.498 +X-4.589Y35.343 +X-4.561Y35.191 +X-4.519Y35.041 +X-4.462Y34.893 +X-4.391Y34.748 +X-4.306Y34.605 +X-4.207Y34.465 +X-4.094Y34.327 +X-3.967Y34.192 +X-3.826Y34.060 +X-3.671Y33.930 +X-3.503Y33.803 +X-3.321Y33.679 +X-3.126Y33.558 +X-2.919Y33.440 +X-2.698Y33.324 +X-2.466Y33.212 +X-2.221Y33.102 +X-1.697Y32.893 +X-1.418Y32.792 +X-1.128Y32.695 +X-0.828Y32.601 +X-0.518Y32.510 +X-0.198Y32.422 +X0.131Y32.338 +X0.814Y32.178 +X1.168Y32.104 +X1.529Y32.032 +X1.897Y31.964 +X2.271Y31.899 +X2.651Y31.838 +X3.037Y31.780 +X3.822Y31.674 +X4.221Y31.626 +X4.622Y31.581 +X5.027Y31.540 +X5.434Y31.502 +X5.842Y31.468 +X6.252Y31.437 +X6.662Y31.410 +X7.072Y31.386 +X7.515Y31.363 +X7.957Y31.345 +X8.398Y31.331 +X8.835Y31.321 +X9.269Y31.315 +X9.699Y31.313 +X10.123Y31.315 +X10.543Y31.321 +X10.956Y31.330 +X11.362Y31.344 +X11.761Y31.362 +X12.152Y31.383 +X12.534Y31.409 +X12.907Y31.438 +X13.269Y31.471 +X13.622Y31.508 +X13.963Y31.549 +X14.293Y31.593 +X14.611Y31.641 +X14.916Y31.693 +X15.209Y31.749 +X15.487Y31.808 +X15.753Y31.870 +X16.003Y31.936 +X16.240Y32.006 +X16.461Y32.079 +X16.667Y32.155 +X16.858Y32.235 +X17.033Y32.318 +X17.191Y32.404 +X17.334Y32.493 +X17.460Y32.586 +X17.570Y32.681 +X17.662Y32.780 +X17.739Y32.881 +X17.798Y32.986 +X17.840Y33.093 +X17.866Y33.203 +X17.875Y33.316 +X17.867Y33.431 +X17.842Y33.549 +X17.801Y33.670 +X17.743Y33.793 +X17.669Y33.918 +X17.579Y34.045 +X17.473Y34.175 +X17.352Y34.307 +X17.215Y34.441 +X17.063Y34.577 +X16.897Y34.715 +X16.522Y34.997 +X16.314Y35.140 +X16.093Y35.285 +X15.614Y35.580 +X15.357Y35.729 +X15.089Y35.879 +X14.522Y36.184 +X13.280Y36.806 +X12.957Y36.960 +X12.628Y37.115 +X11.954Y37.427 +X10.561Y38.054 +X7.746Y39.303 +X7.404Y39.457 +X7.067Y39.611 +X6.409Y39.915 +X5.172Y40.511 +X4.883Y40.657 +X4.603Y40.802 +X4.074Y41.087 +X3.825Y41.227 +X3.588Y41.365 +X3.148Y41.636 +X2.947Y41.769 +X2.760Y41.900 +X2.585Y42.029 +X2.425Y42.156 +X2.278Y42.280 +X2.146Y42.402 +X2.028Y42.522 +X1.926Y42.639 +X1.839Y42.754 +X1.767Y42.866 +X1.711Y42.976 +X1.671Y43.083 +X1.646Y43.187 +X1.638Y43.289 +X1.645Y43.387 +X1.669Y43.483 +X1.709Y43.576 +X1.765Y43.665 +X1.838Y43.752 +X1.926Y43.835 +X2.030Y43.915 +X2.150Y43.992 +X2.286Y44.065 +X2.438Y44.135 +X2.605Y44.202 +X2.787Y44.265 +X2.984Y44.324 +X3.195Y44.380 +X3.421Y44.433 +X3.661Y44.481 +X3.915Y44.526 +X4.182Y44.568 +X4.443Y44.603 +X4.714Y44.635 +X4.996Y44.663 +X5.289Y44.688 +X5.591Y44.710 +X5.902Y44.728 +X6.223Y44.743 +X6.552Y44.754 +X6.890Y44.762 +X7.235Y44.766 +X7.587Y44.767 +X7.946Y44.764 +X8.311Y44.758 +X8.683Y44.748 +X9.059Y44.735 +X9.440Y44.717 +X9.826Y44.697 +X10.216Y44.672 +X10.608Y44.644 +X11.004Y44.613 +X11.401Y44.578 +X11.800Y44.539 +X12.602Y44.450 +X13.003Y44.400 +X13.403Y44.347 +X13.803Y44.289 +X14.201Y44.229 +X14.596Y44.164 +X14.990Y44.096 +X15.766Y43.949 +X16.148Y43.870 +X16.525Y43.787 +X17.263Y43.611 +X17.623Y43.518 +X17.976Y43.421 +X18.661Y43.217 +X18.991Y43.109 +X19.313Y42.999 +X19.626Y42.884 +X19.929Y42.767 +X20.223Y42.645 +X20.506Y42.521 +X21.041Y42.262 +X21.292Y42.127 +X21.531Y41.990 +X21.758Y41.849 +X21.974Y41.704 +X22.176Y41.557 +X22.366Y41.407 +X22.544Y41.253 +X22.708Y41.097 +X22.859Y40.937 +X22.996Y40.775 +X23.119Y40.609 +X23.229Y40.441 +X23.325Y40.269 +X23.407Y40.095 +X23.475Y39.919 +X23.529Y39.739 +X23.571Y39.541 +X23.597Y39.341 +X23.606Y39.137 +X23.599Y38.930 +X23.575Y38.721 +X23.534Y38.508 +X23.477Y38.293 +X23.404Y38.075 +X23.315Y37.855 +X23.211Y37.632 +X23.091Y37.406 +X22.955Y37.178 +X22.805Y36.948 +X22.640Y36.716 +X22.268Y36.244 +X22.061Y36.005 +X21.841Y35.765 +X21.364Y35.278 +X20.274Y34.284 +X19.975Y34.031 +X19.668Y33.778 +X19.029Y33.267 +X17.670Y32.234 +X17.316Y31.974 +X16.959Y31.713 +X16.236Y31.190 +X14.771Y30.140 +X14.405Y29.877 +X14.040Y29.614 +X13.319Y29.089 +X11.923Y28.043 +X11.588Y27.783 +X11.260Y27.524 +X10.626Y27.008 +X10.322Y26.752 +X10.027Y26.497 +X9.467Y25.990 +X9.203Y25.738 +X8.951Y25.488 +X8.482Y24.992 +X8.266Y24.747 +X8.064Y24.503 +X7.700Y24.021 +X7.550Y23.799 +X7.412Y23.578 +X7.288Y23.359 +X7.177Y23.143 +X7.079Y22.928 +X6.995Y22.715 +X6.925Y22.504 +X6.868Y22.295 +X6.826Y22.089 +X6.798Y21.884 +X6.784Y21.682 +X6.785Y21.483 +X6.800Y21.285 +X6.829Y21.091 +X6.873Y20.898 +X6.931Y20.708 +X7.003Y20.521 +X7.090Y20.336 +X7.191Y20.154 +X7.306Y19.975 +X7.434Y19.799 +X7.577Y19.625 +X7.733Y19.454 +X7.903Y19.286 +X8.085Y19.121 +X8.281Y18.959 +X8.489Y18.800 +X8.710Y18.644 +X8.943Y18.491 +X9.188Y18.341 +X9.711Y18.051 +X9.989Y17.910 +X10.278Y17.773 +X10.884Y17.508 +X11.201Y17.381 +X11.527Y17.257 +X12.203Y17.019 +X12.552Y16.905 +X12.908Y16.795 +X13.639Y16.584 +X14.012Y16.484 +X14.390Y16.387 +X15.159Y16.204 +X15.548Y16.118 +X15.940Y16.035 +X16.729Y15.880 +X17.126Y15.808 +X17.522Y15.739 +X18.315Y15.612 +X18.709Y15.554 +X19.102Y15.499 +X19.492Y15.448 +X19.879Y15.401 +X20.263Y15.357 +X20.642Y15.316 +X21.017Y15.279 +X21.387Y15.245 +X21.744Y15.215 +X22.095Y15.189 +X22.440Y15.166 +X22.778Y15.146 +X23.109Y15.129 +X23.431Y15.116 +X23.746Y15.106 +X24.052Y15.099 +X24.349Y15.095 +X24.636Y15.095 +X24.914Y15.097 +X25.181Y15.103 +X25.438Y15.112 +X25.684Y15.123 +X25.919Y15.138 +X26.142Y15.156 +X26.354Y15.177 +X26.553Y15.200 +X26.740Y15.227 +X26.914Y15.256 +X27.076Y15.288 +X27.225Y15.323 +X27.360Y15.361 +X27.482Y15.402 +X27.591Y15.445 +X27.686Y15.491 +X27.767Y15.539 +X27.835Y15.590 +X27.888Y15.643 +X27.928Y15.699 +X27.954Y15.757 +X27.965Y15.818 +X27.963Y15.881 +X27.947Y15.946 +X27.917Y16.014 +X27.873Y16.083 +X27.816Y16.155 +X27.744Y16.229 +X27.660Y16.305 +X27.562Y16.382 +X27.451Y16.462 +X27.327Y16.544 +X27.042Y16.712 +X26.881Y16.799 +X26.707Y16.887 +X26.326Y17.069 +X26.118Y17.162 +X25.900Y17.256 +X25.433Y17.449 +X24.385Y17.849 +X21.934Y18.690 +X21.575Y18.807 +X21.212Y18.925 +X20.474Y19.161 +X18.977Y19.635 +X16.040Y20.572 +X15.691Y20.686 +X15.348Y20.800 +X14.684Y21.024 +X13.458Y21.457 +X13.176Y21.562 +X12.904Y21.666 +X12.396Y21.868 +X12.159Y21.966 +X11.936Y22.063 +X11.528Y22.250 +X11.345Y22.340 +X11.176Y22.429 +X11.022Y22.515 +X10.882Y22.599 +X10.757Y22.681 +X10.648Y22.760 +X10.554Y22.836 +X10.476Y22.910 +X10.413Y22.982 +X10.367Y23.051 +X10.337Y23.117 +X10.323Y23.180 +X10.325Y23.240 +X10.344Y23.298 +X10.379Y23.352 +X10.430Y23.403 +X10.497Y23.452 +X10.580Y23.497 +X10.680Y23.538 +X10.795Y23.577 +X10.926Y23.612 +X11.072Y23.644 +X11.233Y23.673 +X11.410Y23.698 +X11.601Y23.719 +X11.807Y23.737 +X12.027Y23.751 +X12.260Y23.762 +X12.507Y23.769 +X12.767Y23.772 +X13.040Y23.771 +X13.325Y23.767 +X13.601Y23.760 +X13.887Y23.749 +X14.182Y23.734 +X14.486Y23.717 +X14.799Y23.696 +X15.120Y23.671 +X15.448Y23.643 +X15.784Y23.612 +X16.126Y23.577 +X16.475Y23.538 +X16.829Y23.496 +X17.188Y23.450 +X17.552Y23.401 +X17.921Y23.348 +X18.667Y23.232 +X19.045Y23.169 +X19.424Y23.102 +X20.187Y22.957 +X20.569Y22.879 +X20.951Y22.797 +X21.712Y22.623 +X22.090Y22.531 +X22.466Y22.435 +X23.208Y22.232 +X23.574Y22.125 +X23.935Y22.015 +X24.641Y21.784 +X24.985Y21.663 +X25.323Y21.538 +X25.977Y21.279 +X26.292Y21.144 +X26.599Y21.006 +X27.186Y20.719 +X27.465Y20.571 +X27.734Y20.419 +X27.993Y20.264 +X28.241Y20.106 +X28.477Y19.944 +X28.702Y19.779 +X29.116Y19.440 +X29.305Y19.266 +X29.481Y19.088 +X29.644Y18.908 +X29.794Y18.724 +X29.930Y18.538 +X30.053Y18.349 +X30.162Y18.156 +X30.258Y17.961 +X30.339Y17.763 +X30.406Y17.563 +X30.459Y17.359 +X30.498Y17.153 +X30.522Y16.944 +X30.532Y16.733 +X30.528Y16.519 +X30.510Y16.303 +X30.474Y16.066 +X30.421Y15.826 +X30.352Y15.583 +X30.266Y15.337 +X30.164Y15.089 +X30.046Y14.839 +X29.912Y14.586 +X29.762Y14.330 +X29.597Y14.073 +X29.417Y13.813 +X29.014Y13.287 +X28.791Y13.021 +X28.555Y12.753 +X28.044Y12.211 +X27.769Y11.938 +X27.483Y11.663 +X26.879Y11.109 +X25.553Y9.985 +X22.573Y7.693 +X22.183Y7.405 +X21.791Y7.116 +X21.005Y6.537 +X19.442Y5.382 +X19.058Y5.094 +X18.678Y4.806 +X17.931Y4.232 +X16.513Y3.095 +X16.178Y2.813 +X15.852Y2.532 +X15.229Y1.974 +X14.933Y1.697 +X14.649Y1.422 +X14.115Y0.876 +X13.867Y0.606 +X13.632Y0.337 +X13.411Y0.071 +X13.204Y-0.194 +X13.010Y-0.457 +X12.832Y-0.717 +X12.668Y-0.976 +X12.520Y-1.232 +X12.395Y-1.469 +X12.284Y-1.703 +X12.188Y-1.936 +X12.105Y-2.167 +X12.036Y-2.395 +X11.982Y-2.621 +X11.942Y-2.844 +X11.916Y-3.065 +X11.905Y-3.284 +X11.908Y-3.500 +X11.926Y-3.713 +X11.959Y-3.924 +X12.005Y-4.132 +X12.067Y-4.338 +X12.142Y-4.540 +X12.232Y-4.740 +X12.336Y-4.937 +X12.453Y-5.131 +X12.584Y-5.322 +X12.729Y-5.510 +X12.887Y-5.695 +X13.059Y-5.877 +X13.243Y-6.055 +X13.439Y-6.231 +X13.648Y-6.403 +X13.869Y-6.572 +X14.101Y-6.738 +X14.345Y-6.901 +X14.599Y-7.060 +X14.864Y-7.216 +X15.423Y-7.518 +X15.717Y-7.664 +X16.020Y-7.806 +X16.650Y-8.080 +X16.976Y-8.212 +X17.309Y-8.340 +X17.994Y-8.586 +X18.344Y-8.704 +X18.700Y-8.818 +X19.423Y-9.035 +X20.902Y-9.426 +X21.276Y-9.515 +X21.650Y-9.600 +X22.396Y-9.759 +X22.767Y-9.833 +X23.137Y-9.903 +X23.868Y-10.033 +X24.228Y-10.092 +X24.584Y-10.148 +X24.936Y-10.200 +X25.282Y-10.249 +X25.622Y-10.294 +X25.956Y-10.336 +X26.604Y-10.408 +X26.910Y-10.438 +X27.208Y-10.465 +X27.498Y-10.489 +X27.779Y-10.509 +X28.051Y-10.527 +X28.313Y-10.540 +X28.565Y-10.551 +X28.807Y-10.558 +X29.038Y-10.562 +X29.258Y-10.563 +X29.466Y-10.561 +X29.663Y-10.556 +X29.848Y-10.547 +X30.020Y-10.536 +X30.180Y-10.522 +X30.327Y-10.504 +X30.462Y-10.484 +X30.583Y-10.461 +X30.690Y-10.435 +X30.784Y-10.406 +X30.865Y-10.374 +X30.932Y-10.340 +X30.984Y-10.303 +X31.023Y-10.263 +X31.048Y-10.221 +X31.058Y-10.176 +X31.055Y-10.128 +X31.037Y-10.078 +X31.006Y-10.026 +X30.960Y-9.971 +X30.900Y-9.914 +X30.827Y-9.855 +X30.739Y-9.794 +X30.638Y-9.730 +X30.524Y-9.664 +X30.396Y-9.596 +X30.255Y-9.527 +X30.100Y-9.455 +X29.754Y-9.306 +X29.562Y-9.228 +X29.359Y-9.149 +X28.917Y-8.986 +X27.902Y-8.642 +X27.624Y-8.553 +X27.336Y-8.462 +X26.734Y-8.278 +X25.440Y-7.896 +X22.592Y-7.100 +X22.191Y-6.990 +X21.787Y-6.879 +X20.978Y-6.659 +X19.371Y-6.218 +X18.976Y-6.109 +X18.584Y-6.000 +X17.814Y-5.783 +X16.349Y-5.360 +X16.002Y-5.257 +X15.664Y-5.155 +X15.016Y-4.954 +X14.708Y-4.856 +X14.410Y-4.759 +X13.850Y-4.569 +X13.589Y-4.477 +X13.340Y-4.387 +X12.883Y-4.212 +X12.675Y-4.127 +X12.482Y-4.045 +X12.140Y-3.886 +X11.991Y-3.810 +X11.859Y-3.737 +X11.741Y-3.665 +X11.640Y-3.597 +X11.555Y-3.531 +X11.486Y-3.467 +X11.433Y-3.406 +X11.397Y-3.348 +X11.377Y-3.293 +X11.373Y-3.241 +X11.386Y-3.191 +X11.415Y-3.145 +X11.460Y-3.101 +X11.522Y-3.061 +X11.600Y-3.024 +X11.694Y-2.990 +X11.803Y-2.959 +X11.928Y-2.932 +X12.068Y-2.908 +X12.223Y-2.887 +X12.393Y-2.870 +X12.578Y-2.856 +X12.776Y-2.846 +X12.989Y-2.840 +X13.214Y-2.837 +X13.453Y-2.838 +X13.704Y-2.842 +X13.967Y-2.850 +X14.242Y-2.862 +X14.527Y-2.878 +X14.824Y-2.897 +X15.130Y-2.921 +X15.425Y-2.946 +X15.727Y-2.975 +X16.037Y-3.007 +X16.353Y-3.042 +X16.676Y-3.081 +X17.005Y-3.124 +X17.678Y-3.219 +X18.021Y-3.272 +X18.368Y-3.329 +X19.071Y-3.452 +X19.426Y-3.519 +X19.783Y-3.590 +X20.499Y-3.742 +X20.857Y-3.823 +X21.214Y-3.908 +X21.925Y-4.088 +X22.277Y-4.183 +X22.626Y-4.282 +X23.314Y-4.491 +X23.652Y-4.600 +X23.984Y-4.713 +X24.632Y-4.949 +X24.947Y-5.073 +X25.254Y-5.199 +X25.846Y-5.463 +X26.129Y-5.600 +X26.404Y-5.740 +X26.669Y-5.884 +X26.925Y-6.031 +X27.170Y-6.181 +X27.405Y-6.334 +X27.842Y-6.650 +X28.043Y-6.813 +X28.232Y-6.979 +X28.409Y-7.149 +X28.573Y-7.321 +X28.725Y-7.496 +X28.863Y-7.674 +X28.989Y-7.855 +X29.101Y-8.039 +X29.199Y-8.226 +X29.283Y-8.416 +X29.353Y-8.609 +X29.409Y-8.804 +X29.451Y-9.002 +X29.479Y-9.203 +X29.492Y-9.406 +X29.491Y-9.612 +X29.475Y-9.820 +X29.445Y-10.031 +X29.401Y-10.244 +X29.342Y-10.459 +X29.269Y-10.677 +X29.181Y-10.897 +X29.080Y-11.119 +X28.964Y-11.344 +X28.823Y-11.589 +X28.666Y-11.837 +X28.493Y-12.087 +X28.305Y-12.340 +X28.102Y-12.594 +X27.883Y-12.851 +X27.403Y-13.370 +X27.142Y-13.632 +X26.868Y-13.897 +X26.281Y-14.430 +X24.969Y-15.514 +X24.615Y-15.788 +X24.252Y-16.064 +X23.501Y-16.617 +X21.917Y-17.734 +X18.570Y-19.985 +X18.148Y-20.266 +X17.729Y-20.547 +X16.897Y-21.108 +X15.285Y-22.222 +X14.896Y-22.498 +X14.515Y-22.774 +X13.775Y-23.321 +X12.409Y-24.400 +X12.095Y-24.666 +X11.792Y-24.930 +X11.223Y-25.453 +X10.958Y-25.712 +X10.707Y-25.968 +X10.246Y-26.475 +X10.038Y-26.725 +X9.845Y-26.973 +X9.667Y-27.218 +X9.505Y-27.461 +X9.359Y-27.702 +X9.229Y-27.940 +X9.115Y-28.175 +X9.017Y-28.407 +X8.938Y-28.632 +X8.874Y-28.855 +X8.827Y-29.074 +X8.796Y-29.291 +X8.781Y-29.505 +X8.782Y-29.716 +X8.799Y-29.923 +X8.833Y-30.128 +X8.882Y-30.329 +X8.947Y-30.527 +X9.028Y-30.722 +X9.125Y-30.914 +X9.236Y-31.102 +X9.363Y-31.286 +X9.505Y-31.467 +X9.661Y-31.645 +X9.832Y-31.819 +X10.016Y-31.989 +X10.214Y-32.155 +X10.425Y-32.318 +X10.649Y-32.477 +X10.885Y-32.633 +X11.393Y-32.932 +X11.664Y-33.076 +X11.945Y-33.215 +X12.536Y-33.483 +X12.846Y-33.611 +X13.163Y-33.735 +X13.821Y-33.971 +X14.160Y-34.082 +X14.504Y-34.190 +X15.209Y-34.393 +X15.568Y-34.488 +X15.930Y-34.579 +X16.661Y-34.748 +X17.029Y-34.827 +X17.397Y-34.901 +X17.766Y-34.971 +X18.134Y-35.037 +X18.501Y-35.099 +X18.865Y-35.157 +X19.585Y-35.260 +X19.940Y-35.305 +X20.290Y-35.346 +X20.634Y-35.383 +X20.973Y-35.416 +X21.305Y-35.444 +X21.630Y-35.469 +X21.947Y-35.490 +X22.256Y-35.506 +X22.556Y-35.519 +X22.847Y-35.527 +X23.128Y-35.532 +X23.398Y-35.532 +X23.657Y-35.529 +X23.904Y-35.522 +X24.140Y-35.511 +X24.363Y-35.496 +X24.559Y-35.479 +X24.745Y-35.459 +X24.918Y-35.435 +X25.079Y-35.408 +X25.228Y-35.378 +X25.364Y-35.345 +X25.487Y-35.309 +X25.597Y-35.269 +X25.694Y-35.227 +X25.777Y-35.182 +X25.847Y-35.133 +X25.902Y-35.082 +X25.944Y-35.028 +X25.972Y-34.972 +X25.986Y-34.912 +X25.986Y-34.850 +X25.971Y-34.785 +X25.942Y-34.717 +X25.899Y-34.647 +X25.842Y-34.575 +X25.771Y-34.499 +X25.685Y-34.422 +X25.586Y-34.342 +X25.472Y-34.260 +X25.345Y-34.175 +X25.204Y-34.088 +X24.883Y-33.909 +X24.702Y-33.815 +X24.509Y-33.720 +X24.085Y-33.525 +X23.855Y-33.424 +X23.613Y-33.321 +X23.095Y-33.112 +X21.933Y-32.673 +X19.198Y-31.738 +X12.952Y-29.747 +X12.533Y-29.612 +X12.117Y-29.477 +X11.302Y-29.208 +X9.752Y-28.680 +X9.384Y-28.550 +X9.026Y-28.422 +X8.340Y-28.168 +X7.104Y-27.677 +X6.826Y-27.559 +X6.561Y-27.442 +X6.073Y-27.213 +X5.850Y-27.102 +X5.643Y-26.992 +X5.272Y-26.780 +X5.111Y-26.677 +X4.965Y-26.577 +X4.835Y-26.479 +X4.721Y-26.383 +X4.623Y-26.290 +X4.542Y-26.199 +X4.478Y-26.112 +X4.430Y-26.026 +X4.398Y-25.944 +X4.384Y-25.865 +X4.385Y-25.788 +X4.403Y-25.714 +X4.438Y-25.644 +X4.489Y-25.576 +X4.556Y-25.512 +X4.639Y-25.450 +X4.738Y-25.392 +X4.852Y-25.337 +X4.981Y-25.286 +X5.126Y-25.238 +X5.285Y-25.193 +X5.458Y-25.152 +X5.646Y-25.115 +X5.847Y-25.080 +X6.061Y-25.050 +X6.287Y-25.023 +X6.527Y-25.000 +X6.777Y-24.980 +X7.040Y-24.964 +X7.313Y-24.952 +X7.596Y-24.944 +X7.889Y-24.939 +X8.191Y-24.939 +X8.502Y-24.942 +X8.820Y-24.949 +X9.146Y-24.960 +X9.478Y-24.975 +X9.817Y-24.994 +X10.161Y-25.017 +X10.510Y-25.044 +X10.839Y-25.072 +X11.171Y-25.104 +X11.506Y-25.140 +X11.842Y-25.179 +X12.180Y-25.221 +X12.519Y-25.267 +X13.196Y-25.370 +X13.534Y-25.427 +X13.870Y-25.487 +X14.204Y-25.550 +X14.535Y-25.617 +X14.864Y-25.688 +X15.188Y-25.762 +X15.824Y-25.920 +X16.134Y-26.004 +X16.438Y-26.092 +X16.736Y-26.183 +X17.027Y-26.277 +X17.311Y-26.375 +X17.587Y-26.476 +X18.113Y-26.689 +X18.362Y-26.800 +X18.602Y-26.914 +X18.832Y-27.032 +X19.052Y-27.152 +X19.260Y-27.276 +X19.457Y-27.403 +X19.643Y-27.534 +X19.817Y-27.667 +X19.979Y-27.803 +X20.128Y-27.943 +X20.264Y-28.085 +X20.387Y-28.230 +X20.497Y-28.379 +X20.594Y-28.530 +X20.676Y-28.684 +X20.745Y-28.840 +X20.800Y-29.000 +X20.841Y-29.162 +X20.867Y-29.327 +X20.879Y-29.494 +X20.876Y-29.664 +X20.859Y-29.837 +X20.828Y-30.012 +X20.781Y-30.189 +X20.721Y-30.369 +X20.645Y-30.551 +X20.556Y-30.735 +X20.452Y-30.922 +X20.333Y-31.110 +X20.201Y-31.301 +X20.055Y-31.494 +X19.894Y-31.688 +X19.721Y-31.885 +X19.533Y-32.084 +X19.120Y-32.486 +X18.893Y-32.690 +X18.655Y-32.896 +X18.142Y-33.311 +X17.874Y-33.517 +X17.595Y-33.724 +X17.007Y-34.142 +X15.720Y-34.991 +X12.798Y-36.727 +X12.410Y-36.947 +X12.018Y-37.167 +X11.225Y-37.607 +X9.621Y-38.487 +X6.455Y-40.236 +X6.074Y-40.452 +X5.697Y-40.668 +X4.960Y-41.096 +X3.566Y-41.941 +X3.237Y-42.149 +X2.916Y-42.356 +X2.302Y-42.766 +X1.194Y-43.568 +X0.944Y-43.764 +X0.706Y-43.959 +X0.264Y-44.342 +X0.062Y-44.531 +X-0.128Y-44.718 +X-0.469Y-45.085 +X-0.620Y-45.266 +X-0.758Y-45.444 +X-0.882Y-45.620 +X-0.993Y-45.794 +X-1.090Y-45.965 +X-1.173Y-46.134 +X-1.243Y-46.301 +X-1.298Y-46.465 +X-1.342Y-46.640 +X-1.371Y-46.812 +X-1.382Y-46.980 +X-1.378Y-47.146 +X-1.357Y-47.308 +X-1.320Y-47.467 +X-1.267Y-47.622 +X-1.198Y-47.775 +X-1.114Y-47.923 +X-1.014Y-48.068 +X-0.899Y-48.210 +X-0.769Y-48.348 +X-0.625Y-48.482 +X-0.466Y-48.612 +X-0.293Y-48.739 +X-0.107Y-48.862 +X0.093Y-48.981 +X0.305Y-49.097 +X0.530Y-49.208 +X0.766Y-49.315 +X1.014Y-49.419 +X1.273Y-49.518 +X1.822Y-49.705 +X2.110Y-49.792 +X2.407Y-49.875 +X2.713Y-49.954 +X3.026Y-50.029 +X3.346Y-50.100 +X3.672Y-50.166 +X4.004Y-50.229 +X4.341Y-50.287 +X4.683Y-50.340 +X5.028Y-50.390 +X5.376Y-50.435 +X5.727Y-50.476 +X6.080Y-50.513 +X6.433Y-50.545 +X6.787Y-50.573 +X7.141Y-50.597 +X7.494Y-50.617 +X7.845Y-50.632 +X8.194Y-50.643 +X8.540Y-50.650 +X8.882Y-50.652 +X9.220Y-50.651 +X9.553Y-50.645 +X9.881Y-50.635 +X10.202Y-50.620 +X10.516Y-50.602 +X10.823Y-50.579 +X11.122Y-50.552 +X11.412Y-50.521 +X11.693Y-50.486 +X11.964Y-50.447 +X12.225Y-50.404 +X12.475Y-50.356 +X12.714Y-50.305 +X12.941Y-50.250 +X13.155Y-50.191 +X13.357Y-50.128 +X13.546Y-50.061 +X13.721Y-49.990 +X13.882Y-49.916 +X14.020Y-49.843 +X14.144Y-49.767 +X14.256Y-49.688 +X14.355Y-49.605 +X14.441Y-49.520 +X14.513Y-49.431 +X14.571Y-49.340 +X14.615Y-49.245 +X14.645Y-49.148 +X14.662Y-49.048 +X14.664Y-48.944 +X14.651Y-48.838 +X14.625Y-48.730 +X14.584Y-48.618 +X14.529Y-48.504 +X14.459Y-48.387 +X14.376Y-48.268 +X14.278Y-48.146 +X14.166Y-48.022 +X14.040Y-47.896 +X13.900Y-47.767 +X13.747Y-47.635 +X13.399Y-47.366 +X13.206Y-47.228 +X12.999Y-47.088 +X12.548Y-46.803 +X11.504Y-46.209 +X11.215Y-46.057 +X10.916Y-45.902 +X10.287Y-45.589 +X8.923Y-44.948 +X5.870Y-43.614 +X5.468Y-43.444 +X5.063Y-43.274 +X4.246Y-42.931 +X2.603Y-42.244 +X-0.599Y-40.871 +X-1.025Y-40.682 +X-1.444Y-40.493 +X-2.257Y-40.118 +X-3.764Y-39.380 +X-4.113Y-39.199 +X-4.450Y-39.019 +X-5.084Y-38.665 +X-5.380Y-38.490 +X-5.662Y-38.317 +X-6.181Y-37.977 +X-6.417Y-37.810 +X-6.637Y-37.645 +X-6.841Y-37.483 +X-7.028Y-37.322 +X-7.199Y-37.165 +X-7.352Y-37.009 +X-7.488Y-36.856 +X-7.607Y-36.706 +X-7.708Y-36.559 +X-7.791Y-36.414 +X-7.856Y-36.272 +X-7.904Y-36.133 +X-7.934Y-35.997 +X-7.946Y-35.864 +X-7.941Y-35.734 +X-7.918Y-35.608 +X-7.877Y-35.484 +X-7.819Y-35.364 +X-7.744Y-35.247 +X-7.652Y-35.134 +X-7.543Y-35.024 +X-7.418Y-34.918 +X-7.277Y-34.815 +X-7.121Y-34.716 +X-6.949Y-34.620 +X-6.762Y-34.528 +X-6.560Y-34.440 +X-6.345Y-34.356 +X-6.116Y-34.276 +X-5.874Y-34.199 +X-5.620Y-34.127 +X-5.353Y-34.058 +X-5.076Y-33.993 +X-4.787Y-33.933 +X-4.489Y-33.876 +X-4.181Y-33.824 +X-3.864Y-33.775 +X-3.539Y-33.731 +X-3.207Y-33.691 +X-2.867Y-33.655 +X-2.522Y-33.623 +X-2.172Y-33.596 +X-1.817Y-33.572 +X-1.458Y-33.553 +X-1.096Y-33.538 +X-0.732Y-33.528 +X-0.366Y-33.521 +X0.000Y-33.519 +G0Z6.000 +G0X37.560Y12.327Z6.000 +G1Z-1.000 +G1Y0.876 +X49.011 +Y12.327 +X37.560 +G0Z6.000 +G0Y0.876 +G1Z-1.000 +G1Y-10.575 +X49.011 +Y0.876 +X37.560 +G0Z6.000 +G0X49.011Y12.327 +G1Z-1.000 +G1X52.084Y15.011 +G0Z6.000 +G0X49.011Y0.876 +G1Z-1.000 +G1X52.084Y6.213 +Y15.011 +X43.286 +X37.560Y12.327 +G0Z6.000 +G0X49.011Y-10.575 +G1Z-1.000 +G1X52.084Y-2.585 +Y6.213 +X49.011Y0.876 +G0Z6.000 +G0Z20.000 +G0X0.000Y0.000 +M30 diff --git a/motion_control.c b/motion_control.c index 00fd1f0..3914e39 100644 --- a/motion_control.c +++ b/motion_control.c @@ -81,13 +81,7 @@ void compute_and_set_step_pace(double feed_rate, double millimeters_of_travel, u void mc_line(double x, double y, double z, float feed_rate, int invert_feed_rate) { // Flags to keep track of which axes to step - uint8_t step_bits; - uint8_t axis; // loop variable - int8_t direction[3]; // The direction of travel along each axis (-1, 0 or 1) - int32_t target[3], // The target position in absolute steps - step_count[3], // Absolute steps of travel along each axis - counter[3], // A counter used in the bresenham algorithm for line plotting - maximum_steps; // The larges absolute step-count of any axis + int32_t target[3]; // The target position in absolute steps // Setup --------------------------------------------------------------------------------------------------- PORTD |= (1<<4); @@ -164,184 +158,6 @@ void mc_line(double x, double y, double z, float feed_rate, int invert_feed_rate void mc_arc(double theta, double angular_travel, double radius, double linear_travel, int axis_1, int axis_2, int axis_linear, double feed_rate, int invert_feed_rate) { - uint32_t start_x, start_y; // The start position in the coordinate system local to the circle - uint32_t diagonal_error; // A variable to keep track of varations in the error-value during - // the tracing of the arc - - int8_t direction[3]; // The direction of travel along each axis (-1, 0 or 1) - int8_t angular_direction; // 1 = clockwise, -1 = anticlockwise - int32_t x, y, target_x, target_y; // current position and target position in the - // local coordinate system of the arc-generator where [0,0] is the - // center of the arc. - int target_direction_x, target_direction_y; // signof(target_x)*angular_direction precalculated for speed - int32_t error; // error is always == (x**2 + y**2 - radius**2), - - int dx, dy; // Trace directions - - // Setup arc interpolation -------------------------------------------------------------------------------- - - uint32_t radius_steps = round(radius*X_STEPS_PER_MM); - if(radius_steps == 0) { return; } - // Determine angular direction (+1 = clockwise, -1 = counterclockwise) - angular_direction = signof(angular_travel); - // Calculate the initial position and target position in the local coordinate system of the arc - start_x = x = round(sin(theta)*radius_steps); - start_y = y = round(cos(theta)*radius_steps); - target_x = trunc(sin(theta+angular_travel)*radius_steps); - target_y = trunc(cos(theta+angular_travel)*radius_steps); - // Precalculate these values to optimize target detection - target_direction_x = signof(target_x)*angular_direction; - target_direction_y = signof(target_y)*angular_direction; - // The "error" factor is kept up to date so that it is always == (x**2+y**2-radius**2). When error - // <0 we are inside the arc, when it is >0 we are outside of the arc, and when it is 0 we - // are exactly on top of the arc. - error = x*x + y*y - radius_steps*radius_steps; - - // Estimate length of arc in steps ------------------------------------------------------------------------- - - /* - To support helical motion we need to know in advance how many steppings the arc will need. - The calculations are based on the fact that we trace the circle by offsetting a square. The circle has - four "sides" or quadrants. For each quadrant we step mainly in one axis. The amount steps for one quarter of the - circle (e.g. along the x axis with positive y) is equal to one side of a square inscribed in the circle we - are tracing. - - Quadrants of the circle - - +---- 0 ----+ 0 - y is always positive and |x| < |y| - | | 1 - x is always positive and |x| > |y| - | | 2 - y is always negative and |x| < |y| - 3 + 1 3 - x is always negative and |x| > |y| - | | - | | length of one side: 2*radius/sqrt(2) - +---- 2 ----+ - */ - - // Find the quadrants of the starting point and the target - int start_quadrant = quadrant_of_the_circle(start_x, start_y); - int target_quadrant = quadrant_of_the_circle(target_x, target_y); - uint32_t arc_steps=0; - // Will this whole arc take place within the same quadrant? - if (start_quadrant == target_quadrant && (fabs(angular_travel) <= (M_PI/2))) { - if(quadrant_horizontal(start_quadrant)) { // a horizontal quadrant where x will be the primary direction - arc_steps = labs(target_x-start_x); - } else { // a vertical quadrant where y will be the primary direction - arc_steps = labs(target_y-start_y); - } - } else { // the start and target points are in different quadrants - // Lets estimate the amount of steps along half a quadrant - uint32_t steps_in_half_quadrant = ceil(radius_steps/sqrt(2)); - // Add the steps in the first partial quadrant - arc_steps += steps_in_partial_quadrant(start_x, start_y, - start_quadrant, angular_direction, steps_in_half_quadrant); - // Count the number of full quadrants between the start and end quadrants - uint8_t full_quadrants_traveled = full_quadrants_between(start_quadrant, target_quadrant, angular_direction); - // Add steps for the full quadrants plus some stray steps for "corners" - arc_steps += full_quadrants_traveled*(steps_in_half_quadrant*2+1); - // Add the steps in the final partial quadrant. By inverting the angular direction we get the correct number for - // the target quadrant which steps through the opposite part of the quadrant with respect to the start quadrant. - arc_steps += steps_in_partial_quadrant(target_x, target_y, - target_quadrant, -angular_direction, steps_in_half_quadrant); - } - - // Set up the linear interpolation of the "depth" axis ----------------------------------------------------- - - int32_t linear_steps = labs(st_millimeters_to_steps(linear_travel, axis_linear)); - int linear_direction = signof(linear_travel); - // The number of steppings needed to trace this motion is equal to the motion that require the maximum - // amount of steps: the arc or the line: - int32_t maximum_steps = max(linear_steps, arc_steps); - // Initialize the counters to do 2D linear bresenham as if the motion along the arc itself was a single axis - // of the line, while the linear "depth" axis was the other. - int32_t linear_counter = -maximum_steps/2; - int32_t arc_counter = -maximum_steps/2; - - // Calculate feed rate ------------------------------------------------------------------------------------- - - // We then calculate the millimeters of helical travel - double millimeters_of_travel = hypot(angular_travel*radius, labs(linear_travel)); - // Then we calculate the microseconds between each step as if we will trace the full circle. - // It doesn't matter what fraction of the circle we are actually going to trace. The pace is the same. - compute_and_set_step_pace(feed_rate, millimeters_of_travel, maximum_steps, invert_feed_rate); - - // Execution ----------------------------------------------------------------------------------------------- - - mode = MC_MODE_ARC; - // Set the direction of the linear or "depth" axis, cause it will never change - direction[axis_linear] = linear_direction; - // Cache some stepper bit-masks to speed up the interpolation code - uint8_t axis_1_bit = st_bit_for_stepper(axis_1); - uint8_t axis_2_bit = st_bit_for_stepper(axis_2); - uint8_t axis_linear_bit = st_bit_for_stepper(axis_linear); - uint8_t diagonal_bits = (axis_1_bit | axis_2_bit); - - uint8_t step_bits; - - while(mode) - { - // This loop sets the bits in the step_bits variable for each stepper it wants to step in this cycle. - step_bits = 0; - // The bresenham algorithm chooses when to travel in the depth axis and when to travel along the arc - linear_counter += linear_steps; - if (linear_counter > 0) { - linear_counter -= maximum_steps; - // Move one step in the depth direction: - step_bits |= axis_linear_bit; - } - arc_counter += arc_steps; - if (arc_counter > 0) { - arc_counter -= maximum_steps; - // Do one step of the arc: - // Determine directions for each axis at this point in the arc - dx = (y!=0) ? signof(y) * angular_direction : -signof(x); - dy = (x!=0) ? -signof(x) * angular_direction : -signof(y); - // Take dx and dy which are local to the arc being generated and map them on to the - // selected tool-space-axes for the current arc. - direction[axis_1] = dx; - direction[axis_2] = dy; - // Check which axis will be "major" for this stepping - if (labs(x)= labs(diagonal_error)) { - y += dy; - error = diagonal_error; - step_bits |= diagonal_bits; // step diagonal - } else { - step_bits |= axis_1_bit; // step straight - } - } else { - // Y is major: Step arc vertically - error += 1 + 2*y * dy; - y+=dy; - diagonal_error = error + 1 + 2*x * dx; - if(labs(error) >= labs(diagonal_error)) { - x += dx; - error = diagonal_error; - step_bits |= diagonal_bits; // step diagonal - } else { - step_bits |= axis_2_bit; // step straight - } - } - } - // Tell the steppers to do the stepping - set_stepper_directions(direction); - step_steppers(step_bits); - - // Check if target has been reached. Todo: Simplify/optimize/clarify - if ((x * target_direction_y >= - target_x * target_direction_y) && - (y * target_direction_x <= - target_y * target_direction_x)) - { if ((signof(x) == signof(target_x)) && (signof(y) == signof(target_y))) - { mode = MC_MODE_AT_REST; } } - } - // Update the tool position to the new actual position - position[axis_1] += x-start_x; - position[axis_2] += y-start_y; - position[axis_2] += linear_steps*linear_direction; } void mc_go_home() diff --git a/stepper.c b/stepper.c index ff4704e..0f5c6fa 100644 --- a/stepper.c +++ b/stepper.c @@ -32,47 +32,109 @@ #include "wiring_serial.h" #define TICKS_PER_MICROSECOND (F_CPU/1000000) -#define STEP_BUFFER_SIZE 100 +#define LINE_BUFFER_SIZE 5 -// A marker used to notify the stepper handler of a pace change -#define PACE_CHANGE_MARKER 0xff +struct Line { + uint32_t steps_x, steps_y, steps_z; + uint32_t maximum_steps; + uint32_t iterations; + uint8_t direction_bits; + uint32_t rate; +} -volatile uint8_t step_buffer[STEP_BUFFER_SIZE]; // A buffer for step instructions -volatile int step_buffer_head = 0; -volatile int step_buffer_tail = 0; -volatile uint32_t current_pace; -volatile uint32_t next_pace = 0; +volatile uint8_t line_buffer[LINE_BUFFER_SIZE]; // A buffer for step instructions +volatile int line_buffer_head = 0; +volatile int line_buffer_tail = 0; + +// Variables used by SIG_OUTPUT_COMPARE1A +uint8_t out_bits; +struct Line *current_line; +uint32_t counter_x, counter_y, counter_z; uint8_t stepper_mode = STEPPER_MODE_STOPPED; void config_pace_timer(uint32_t microseconds); +void st_buffer_line(int32_t steps_x, int32_t steps_y, int32_t steps_z, uint32_t rate) { + // Buffer nothing unless stepping subsystem is running + if (stepper_mode != STEPPER_MODE_RUNNING) { return; } + // Calculate the buffer head after we push this byte + int next_buffer_head = (line_buffer_head + 1) % LINE_BUFFER_SIZE; + // If the buffer is full: good! That means we are well ahead of the robot. + // Nap until there is room in the buffer. + while(line_buffer_tail == next_buffer_head) { sleep_mode(); } + + // setup line + struct Line *line = &line_buffer[line_buffer_head]; + line->steps_x = labs(steps_x); + line->steps_y = labs(steps_y); + line->steps_z = labs(steps_y); + line->maximum_steps = max(line->steps_x, max(line->steps_y, line->steps_z)); + line->iterations = line->maximum_steps; + line->rate = rate; + uint8_t direction_bits = 0; + if (steps_x < 0) { direction_bits |= (1<direction_bits = direction_bits; + + // Move buffer head + line_buffer_head = next_buffer_head; +} + // This timer interrupt is executed at the pace set with st_buffer_pace. It pops one instruction from -// the step_buffer, executes it. Then it starts timer2 in order to reset the motor port after +// the line_buffer, executes it. Then it starts timer2 in order to reset the motor port after // five microseconds. SIGNAL(SIG_OUTPUT_COMPARE1A) { - if (step_buffer_head != step_buffer_tail) { - PORTD &= ~(1<<3); - uint8_t popped = step_buffer[step_buffer_tail]; - if(popped == PACE_CHANGE_MARKER) { - // This is not a step-instruction, but a pace-change-marker: change pace - config_pace_timer(next_pace); - next_pace = 0; - } else { - popped ^= STEPPING_INVERT_MASK; - // Set the direction pins a cuple of nanoseconds before we step the steppers - STEPPING_PORT = (STEPPING_PORT & ~DIRECTION_MASK) | (popped & DIRECTION_MASK); - // Then pulse the stepping pins - STEPPING_PORT = (STEPPING_PORT & ~STEP_MASK) | popped; - // Reset step pulse reset timer - TCNT2 = -(((STEP_PULSE_MICROSECONDS-4)*TICKS_PER_MICROSECOND)/8); + // Set the direction pins a cuple of nanoseconds before we step the steppers + STEPPING_PORT = (STEPPING_PORT & ~DIRECTION_MASK) | (out_bits & DIRECTION_MASK); + // Then pulse the stepping pins + STEPPING_PORT = (STEPPING_PORT & ~STEP_MASK) | out_bits; + // Reset step pulse reset timer + TCNT2 = -(((STEP_PULSE_MICROSECONDS-4)*TICKS_PER_MICROSECOND)/8); + + // If there is no current line, attempt to pop one from the buffer + if (current_line == NULL) { + // Anything in the buffer? + if (line_buffer_head != line_buffer_tail) { + // Retrieve a new line and get ready to step it + current_line = &line_buffer[line_buffer_tail]; + config_pace_timer(current_line->rate); + counter_x = -current_line->maximum_steps/2; + counter_y = counter_x; + counter_z = counter_x; + // move the line buffer tail to the next instruction + line_buffer_tail = (line_buffer_tail + 1) % LINE_BUFFER_SIZE; } - // move the step buffer tail to the next instruction - step_buffer_tail = (step_buffer_tail + 1) % STEP_BUFFER_SIZE; - } else { - PORTD |= (1<<3); } + + if (current_line != NULL) { + out_bits = current_line->direction_bits; + counter_x += current_line->steps_x; + if (counter_x > 0) { + out_bits |= (1<maximum_steps; + } + counter_y += current_line-> steps_y; + if (counter_y > 0) { + out_bits |= (1<maximum_steps; + } + counter_z += current_line-> steps_z; + if (counter_z > 0) { + out_bits |= (1<maximum_steps; + } + // If current line is finished, reset pointer + current_line->iterations -= 1; + if (current_line->iterations <= 0) { + current_line = NULL; + } + } else { + out_bits = 0; + } + out_bits ^= STEPPING_INVERT_MASK; } // This interrupt is set up by SIG_OUTPUT_COMPARE1A when it sets the motor port bits. It resets @@ -113,25 +175,11 @@ void st_init() config_pace_timer(20000); } -inline void st_buffer_step(uint8_t motor_port_bits) -{ - // Buffer nothing unless stepping subsystem is running - if (stepper_mode != STEPPER_MODE_RUNNING) { return; } - // Calculate the buffer head after we push this byte - int next_buffer_head = (step_buffer_head + 1) % STEP_BUFFER_SIZE; - // If the buffer is full: good! That means we are well ahead of the robot. - // Nap until there is room for more steps. - while(step_buffer_tail == next_buffer_head) { sleep_mode(); } - // Push byte - step_buffer[step_buffer_head] = motor_port_bits; - step_buffer_head = next_buffer_head; -} - // Block until all buffered steps are executed void st_synchronize() { if (stepper_mode == STEPPER_MODE_RUNNING) { - while(step_buffer_tail != step_buffer_head) { sleep_mode(); } + while(line_buffer_tail != line_buffer_head) { sleep_mode(); } } else { st_flush(); } @@ -141,7 +189,8 @@ void st_synchronize() void st_flush() { cli(); - step_buffer_tail = step_buffer_head; + line_buffer_tail = line_buffer_head; + current_line = NULL; sei(); } @@ -169,23 +218,6 @@ inline void st_stop() stepper_mode = STEPPER_MODE_STOPPED; } -// Buffer a pace change. Pace is the rate with which steps are executed. It is measured in microseconds from step to step. -// It is continually adjusted to achieve constant actual feed rate. Unless pace-changes was buffered along with the steps -// they govern they might change at slightly wrong moments in time as the pace would change while the stepper buffer was -// still churning out the previous movement. -void st_buffer_pace(uint32_t microseconds) -{ - // Do nothing if the pace in unchanged or the stepping subsytem is not running - if ((current_pace == microseconds) || (stepper_mode != STEPPER_MODE_RUNNING)) { return; } - // If the single-element pace "buffer" is full, sleep until it is popped - while (next_pace != 0) { - sleep_mode(); - } - // Buffer the pace change - next_pace = microseconds; - st_buffer_step(PACE_CHANGE_MARKER); // Place a pace-change marker in the step-buffer -} - // Returns a bitmask with the stepper bit for the given axis set uint8_t st_bit_for_stepper(int axis) { switch(axis) { diff --git a/stepper.h b/stepper.h index 29fa722..6c859d8 100644 --- a/stepper.h +++ b/stepper.h @@ -35,14 +35,8 @@ void st_init(); // Returns a bitmask with the stepper bit for the given axis set uint8_t st_bit_for_stepper(int axis); -// Buffer a pace change. Pace is the rate with which steps are executed. It is measured in microseconds from step to step. -// It is continually adjusted to achieve constant actual feed rate. Unless pace-changes was buffered along with the steps -// they govern they might change at slightly wrong moments in time as the pace would change while the stepper buffer was -// still churning out the previous movement. -void st_buffer_pace(uint32_t microseconds); - -// Buffer a new instruction for the steppers -inline void st_buffer_step(uint8_t motor_port_bits); +// Buffer a new line segment (might block until there is room in the buffer) +void st_buffer_line(int32_t steps_x, int32_t steps_y, int32_t steps_z, uint32_t rate); // Block until all buffered steps are executed void st_synchronize();