#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
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
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-
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
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