/* Pins for the CNC Shield v3 X_STP_PIN 2 Y_STP_PIN 3 Z_STP_PIN 4 X_DIR_PIN 5 Y_DIR_PIN 6 Z_DIR_PIN 7 SHIELD_EN_PIN 8 pos useage for turning steppers off for realligment */ // INCLUDES #include #include // Define the stepper motor connections const int Z_DIR_PIN = 7; // Z Takeup Reels Direction Pin const int Z_STP_PIN = 4; // Z Takeup Reels Step Pin const int X_DIR_PIN = 5; // X Capstans Direction Pin const int X_STP_PIN = 2; // X Capstans Step Pin const int stepsPerRev = 200; // Number of steps for a full rotation(360) // SPROCKET(CAPSTAN) const int stepsPerRev2 = 200; // Number of steps for a full rotation(360) // Takeup Reel const int microSteps = 16; // 16th microstepping //const int takeupMaxSpeed = 250; // Takeup Reel Max Speed //const int takeupSpeed = 250; // Takeup Reel Speed //const int capstanMaxSpeed = 600; // Capstan Reel Max Speed //const int capstanSpeed = 600; // Capstan Reel Speed 120 //const int capstanAccel = 99999999; // * Sets the steppers acceleration to a high number so that the stepper //const int takeupAccel = 99999999; // * number so that the stepper Doesn't acceralate. 99999999 const int takeupMaxSpeed = 450; // Takeup Reel Max Speed const int takeupSpeed = 450; // Takeup Reel Speed const int capstanMaxSpeed = 900; // Capstan Reel Max Speed const int capstanSpeed = 900; // Capstan Reel Speed 120 const int capstanAccel = 800; // * Sets the steppers acceleration to a high number so that the stepper const int takeupAccel = 99999999; // * number so that the stepper Doesn't acceralate. 99999999 int steps = 800; // Number of steps to move x amount of 8mm cine film frames. /* __________________ | STEPS | FRAMES | |-------|--------| | 100 | 6 | | 200 | 12 | 1 | 300 | 18 | | 400 | 24 | 2 | 500 | 30 | | 600 | 36 | 3 | 700 | 42 | | 800 | 48 | 4 | 900 | 54 | | 1000 | 60 | 5 */ // Create two new instances of the AccelStepper class AccelStepper takeup(AccelStepper::DRIVER, Z_STP_PIN, Z_DIR_PIN); // Runs all the time unless switch is pressed! AccelStepper capstan(AccelStepper::DRIVER, X_STP_PIN, X_DIR_PIN); // Runs only when told to via serial coms // SWITCH SETUP ezButton tensionSW(9); // Create ezButton object that attach to pin 7; ezButton stopButton(11); // Create ezButton object that attach to pin 3; bool isTakeupActive = false; // Flag to track the status of the takeup stepper bool isCapstanContinuous = false; // Flag to indicate capstan continuous movement void setup() { Serial.begin(9600); // Initialize serial communication at 9600 baud Serial.println(""); Serial.println("M = Move"); // Serial.println("T = Activate Takeup Stepper"); // Serial.println("X = enable capstan continuous movement"); // Serial.println(""); tensionSW.setDebounceTime(50); // set debounce time to 50 milliseconds takeup.setMaxSpeed(takeupMaxSpeed); // Set the maximum speed of the stepper motor takeup.setSpeed(takeupSpeed); // Set the speed of the stepper motor takeup.setAcceleration(takeupAccel); // Set the acceleration of the stepper motor capstan.setMaxSpeed(capstanMaxSpeed); // Set the maximum speed of the stepper motor capstan.setSpeed(capstanSpeed); // Set the speed of the stepper motor capstan.setAcceleration(capstanAccel); // Set the acceleration of the stepper motor takeup.move(999999999); // * Tells the Takeup stepper to to move x steps // * when takeup.run() is called in the loop. } void loop() { serialCheck(); tensionSW.loop(); // Checks that status of the switch stopButton.loop(); switchReleased(); // code for when the switch is released switchPressed(); // code for when the switch is pressed if (isTakeupActive) { takeup.run(); } if (isCapstanContinuous) { capstan.move(steps * microSteps); capstan.run(); if (stopButton.isPressed()) { isCapstanContinuous = false; // Stop the capstan continuous movement capstan.stop(); Serial.println("Capstan movement stopped."); } } else { capstan.run(); } } void serialCheck() { // Note: we shall process one command at a time! This means: reset the // following variable to zero as soon as the command is done processing. static char current_command; // Do not proceed with another command until we're done with the current one! if (current_command == 0) { if (Serial.available() > 0) { current_command = Serial.read(); // Perform a single action upon receiving a command. Makes code easier to read. switch (current_command) { default: current_command = 0; break; // Ignore unknown commands case 'M': capstan.move(steps * 16); break; // Move the motor 100 steps case 'T': // Activate the takeup stepper isTakeupActive = true; break; case 'A': // Activate the takeup stepper isTakeupActive = false; //not sure this is working! break; case 'X': // enable capstan continuous movement isCapstanContinuous = true; break; } } } else { // Send a message when the motor is done moving: if (capstan.isRunning() == false) { current_command = 0; // Reset the current_command Serial.println("S"); // Send message "We're done!" } } } void switchReleased() { if (tensionSW.isReleased()) { Serial.println("MOVING - Trigger Released"); takeup.move(999999999); } } void switchPressed() { if (tensionSW.isPressed()) { Serial.println("STOPPED - Trigger Pressed"); takeup.stop(); } }