/*Minimal code for controling my Vinyl Record Cutting Lathe using : - a stepper motor with A4988 driver - belt driven - 3 push buttons HOME REC (Engrave) STOP (Abort) - a potentiometer (PITCH - engraving speed fine tuning) Ambroise de Vries (Fabacademy 2021) */ // X end-stop switch int XState = 0; // REC button int recState = 0; // Home button int homState = 0; // Stop button int endState = 0; // X engraving distance max long MaxRev = 0; // X engraving distance max long nbRev = 400; // to be adapted // Define stepper motor connections and steps per revolution: #define dirPin 15 #define stepPin 16 #define MSPin 17 #define enPin 18 #define XPin 5 // X end-stop #define stepsPerRevolution 3200 // for 1/16 microstepping // Define motor speeds #define homSpeed 50 // Homing speed - increase to go slower #define minSpeed 1000 // Minimum engraving speed - increase to go slower - to be adapted #define topSpeed 100 // Maximum engraving speed - decrease to go faster - to be adapted // button inputs #define buttonHom 6 #define buttonEnd 7 #define buttonRec 8 bool HomeDone = false; void setup() { // Declare pins as input: pinMode(XPin, INPUT); // initialize digital pin with switch as an input pinMode(buttonHom, INPUT); // initialize digital pin with button HOME as an input pinMode(buttonEnd, INPUT); // initialize digital pin with button STOP as an input pinMode(buttonRec, INPUT); // initialize digital pin with button REC as an input // Declare pins as output: pinMode(enPin, OUTPUT); pinMode(stepPin, OUTPUT); pinMode(dirPin, OUTPUT); pinMode(MSPin, OUTPUT); // initial motor settings digitalWrite(enPin, LOW); // Enable stepper (default) digitalWrite(stepPin, LOW); digitalWrite(dirPin, LOW); digitalWrite(MSPin, HIGH); // 1/16 microstepping // initialize the serial port: Serial.begin(115200); } void loop() { //========================================================== // Initial Homing //Serial.println("Initial homing"); homState = digitalRead(buttonHom); if (HomeDone == false) { Homing(); HomeDone = true; } else if (homState == 1) { Homing(); } //========================================================== // Engraving recState = digitalRead(buttonRec); // engage engraving when REC button as been activated if (recState == 1) { //digitalWrite(enPin, LOW); // enable Stepper driver // Set motor direction digitalWrite(dirPin, HIGH); // Spin the stepper motor for (long i = 0; i < nbRev * stepsPerRevolution; i++) { // read the potentiometer value int potRead = analogRead(A6); // map it to a range from 0 to 100: int engSpeed = map(potRead, 0, 1023, topSpeed, minSpeed); // These four lines result in 1 step: digitalWrite(stepPin, HIGH); delayMicroseconds(engSpeed); digitalWrite(stepPin, LOW); delayMicroseconds(engSpeed); // Abort engraving button endState = digitalRead(buttonEnd); if (endState == 1) { break; } } } } //End Loop======================================================== //**************************************************************** // Homing procedure ============================================== //**************************************************************** void Homing(){ // Set rotation direction digitalWrite(dirPin, LOW); // read the state of the X end switch XState = digitalRead(XPin); while (XState == 1) { // tant que X end switch pas activé // These four lines result in 1 step: digitalWrite(stepPin, HIGH); delayMicroseconds(homSpeed); digitalWrite(stepPin, LOW); delayMicroseconds(homSpeed); // Abort homing (STOP button) endState = digitalRead(buttonEnd); if (endState == 1) { break; } // read the state of the X end switch XState = digitalRead(XPin); } } // End Homing ===================================================