/*Minimal code for controling my Vinyl Record Cutting Lathe using : - a stepper motor with A4988 driver - 3 push buttons HOME GO (Engrave) STOP (Abort) - a potentiometer (engraving speed fine tuning) Ambroise de Vries (Fabacademy 2021) */ // end-stop switch int switchState = 0; // Run button int runState = 0; // Home button int homState = 0; // Stop button int endState = 0; // X ingraving distance max long nbRev = 50; // to be adapted // Define stepper motor connections and steps per revolution: //#define enPin 1 #define dirPin 2 #define stepPin 3 #define MS1Pin 4 #define MS2Pin 5 #define MS3Pin 6 #define switchPin 7 //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 8 #define buttonEnd 9 #define buttonRun 10 bool HomeDone = false; void setup() { // Declare pins as input: pinMode(switchPin, INPUT); // initialize digital pin with switch as an input pinMode(buttonRun, INPUT); // initialize digital pin with button as an input // Declare pins as output: // pinMode(enPin, OUTPUT); pinMode(stepPin, OUTPUT); pinMode(dirPin, OUTPUT); pinMode(MS1Pin, OUTPUT); pinMode(MS2Pin, OUTPUT); pinMode(MS3Pin, OUTPUT); // initial motor settings // digitalWrite(enPin, LOW); // Stepper is enable (default) digitalWrite(stepPin, LOW); digitalWrite(dirPin, HIGH); digitalWrite(MS1Pin, HIGH); // 1/16 microstepping digitalWrite(MS2Pin, HIGH); // 1/16 microstepping digitalWrite(MS3Pin, HIGH); // 1/16 microstepping // initialize the serial port: Serial.begin(9600); } void loop() { //========================================================== // Homing homState = digitalRead(buttonHom); if (HomeDone == false) { Homing(); HomeDone = true; } else if (homState == 1) { Homing(); } //========================================================== // Engraving runState = digitalRead(buttonRun); // engage engraving when RUN button as been activated if (runState == 1) { // Serial.println("Engraving"); // digitalWrite(enPin, LOW); // enable Stepper driver // Set motor direction digitalWrite(dirPin, LOW); // Spin the stepper motor for (long i = 0; i < nbRev * stepsPerRevolution; i++) { // read the potentiometer value: int potRead = analogRead(A0); // 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(){ // Serial.println("Homing"); // Set rotation direction digitalWrite(dirPin, HIGH); // read the state of the end-stop switchState = digitalRead(switchPin); while (switchState == true) { // These four lines result in 1 step: digitalWrite(stepPin, HIGH); delayMicroseconds(homSpeed); digitalWrite(stepPin, LOW); delayMicroseconds(homSpeed); // read the state of the end-stop switchState = digitalRead(switchPin); } // digitalWrite(enPin, HIGH); // disable Stepper driver } // End Homing ===================================================