#include <AccelStepper.h>
#include <Keypad.h>

// Define the number of steps per revolution for your stepper motors
const int STEPS = 20;

// Joystick input pins
#define joystickXPin A0  // Joystick X-axis input
#define joystickYPin A1  // Joystick Y-axis input

// Motor driver pins
const int enablePins[] = {4, 5, 6, 7, 8, 9};  // Enable pins of the motor drivers
const int motorStepPins[] = {10, 11, 12, 13, A2, A3};  // Step pins of the motor drivers
const int motorDirPins[] = {14, 15, 16, 17, A4, A5};  // Direction pins of the motor drivers

// Keypad pins
const byte ROWS = 4; // Define the number of rows and columns of the keypad
const byte COLS = 4;
char keys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {18, 19, 20, 21}; // Connect to the row pinouts of the keypad
byte colPins[COLS] = {22, 23, 24, 25}; // Connect to the column pinouts of the keypad
Keypad keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

// Number of motors
const int numMotors = 6;

// Create an array of AccelStepper instances for each motor
AccelStepper motors[numMotors];

// Array to store the states of each motor (activated or deactivated)
bool motorStates[numMotors] = {false};

void setup() {
  // Set up motor driver pins
  for (int i = 0; i < numMotors; i++) {
    pinMode(enablePins[i], OUTPUT);
    digitalWrite(enablePins[i], LOW);
    motors[i] = AccelStepper(AccelStepper::DRIVER, motorStepPins[i], motorDirPins[i]);
    motors[i].setMaxSpeed(1000);
    motors[i].setAcceleration(500);
  }
}

void loop() {
  // Check for keypad input
  char key = keypad.getKey();

  // If "0" is pressed, stop all motors
  if (key == '0') {
    for (int i = 0; i < numMotors; i++) {
      motors[i].stop();
      motorStates[i] = false;
    }
  }

  // Map the keypad input to the motor index
  int motorIndex = -1;
  switch (key) {
    case '1':
      motorIndex = 0;
      break;
    case '2':
      motorIndex = 1;
      break;
    case '3':
      motorIndex = 2;
      break;
    case '4':
      motorIndex = 3;
      break;
    case '5':
      motorIndex = 4;
      break;
    case '6':
      motorIndex = 5;
      break;
    default:
      break;
  }

  // If a valid motor index is selected, toggle the motor state
  if (motorIndex >= 0 && motorIndex < numMotors) {
    motorStates[motorIndex] = !motorStates[motorIndex];
  }

  // Control the motors based on their states
  for (int i = 0; i < numMotors; i++) {
    if (motorStates[i]) {
      int joystickX = analogRead(joystickXPin);
      int joystickY = analogRead(joystickYPin);

      int motorSpeed = map(joystickY, 0, 1023, 0, 1000);
      int motorDirection = (joystickX > 512) ? -1 : 1;

      motors[i].setSpeed(motorSpeed * motorDirection);
      motors[i].move(motorDirection * STEPS);
      motors[i].run();
    } else {
      motors[i].stop();
    }
  }
}
mega:SCL
mega:SDA
mega:AREF
mega:GND.1
mega:13
mega:12
mega:11
mega:10
mega:9
mega:8
mega:7
mega:6
mega:5
mega:4
mega:3
mega:2
mega:1
mega:0
mega:14
mega:15
mega:16
mega:17
mega:18
mega:19
mega:20
mega:21
mega:5V.1
mega:5V.2
mega:22
mega:23
mega:24
mega:25
mega:26
mega:27
mega:28
mega:29
mega:30
mega:31
mega:32
mega:33
mega:34
mega:35
mega:36
mega:37
mega:38
mega:39
mega:40
mega:41
mega:42
mega:43
mega:44
mega:45
mega:46
mega:47
mega:48
mega:49
mega:50
mega:51
mega:52
mega:53
mega:GND.4
mega:GND.5
mega:IOREF
mega:RESET
mega:3.3V
mega:5V
mega:GND.2
mega:GND.3
mega:VIN
mega:A0
mega:A1
mega:A2
mega:A3
mega:A4
mega:A5
mega:A6
mega:A7
mega:A8
mega:A9
mega:A10
mega:A11
mega:A12
mega:A13
mega:A14
mega:A15
stepper1:A-
stepper1:A+
stepper1:B+
stepper1:B-
joystick1:VCC
joystick1:VERT
joystick1:HORZ
joystick1:SEL
joystick1:GND
A4988
drv1:ENABLE
drv1:MS1
drv1:MS2
drv1:MS3
drv1:RESET
drv1:SLEEP
drv1:STEP
drv1:DIR
drv1:GND.1
drv1:VDD
drv1:1B
drv1:1A
drv1:2A
drv1:2B
drv1:GND.2
drv1:VMOT
A4988
drv2:ENABLE
drv2:MS1
drv2:MS2
drv2:MS3
drv2:RESET
drv2:SLEEP
drv2:STEP
drv2:DIR
drv2:GND.1
drv2:VDD
drv2:1B
drv2:1A
drv2:2A
drv2:2B
drv2:GND.2
drv2:VMOT
stepper2:A-
stepper2:A+
stepper2:B+
stepper2:B-
keypad1:R1
keypad1:R2
keypad1:R3
keypad1:R4
keypad1:C1
keypad1:C2
keypad1:C3
keypad1:C4
stepper3:A-
stepper3:A+
stepper3:B+
stepper3:B-
stepper4:A-
stepper4:A+
stepper4:B+
stepper4:B-
A4988
drv3:ENABLE
drv3:MS1
drv3:MS2
drv3:MS3
drv3:RESET
drv3:SLEEP
drv3:STEP
drv3:DIR
drv3:GND.1
drv3:VDD
drv3:1B
drv3:1A
drv3:2A
drv3:2B
drv3:GND.2
drv3:VMOT
A4988
drv4:ENABLE
drv4:MS1
drv4:MS2
drv4:MS3
drv4:RESET
drv4:SLEEP
drv4:STEP
drv4:DIR
drv4:GND.1
drv4:VDD
drv4:1B
drv4:1A
drv4:2A
drv4:2B
drv4:GND.2
drv4:VMOT