#include <AccelStepper.h>
// Joystick 1 (for motors 1 & 2)
#define JOY_X 34 // Left-Right
#define JOY_Y 35 // Forward-Backward
// Joystick 2 (for motor 3)
#define JOY2_Y 32 // Up-Down control for Motor 3
// Slide resistor for speed control
#define POT_PIN 33
// Motor 1 & 2 pins - to driver
#define MOTOR1_STEP 26
#define MOTOR1_DIR 27
#define MOTOR2_STEP 14
#define MOTOR2_DIR 12
// Motor 3 pins
#define MOTOR3_STEP 25
#define MOTOR3_DIR 15
// Driver to motor setup
AccelStepper motor1(AccelStepper::DRIVER, MOTOR1_STEP, MOTOR1_DIR);
AccelStepper motor2(AccelStepper::DRIVER, MOTOR2_STEP, MOTOR2_DIR);
AccelStepper motor3(AccelStepper::DRIVER, MOTOR3_STEP, MOTOR3_DIR);
void setup() {
Serial.begin(115200);
// Motor setup
motor1.setMaxSpeed(1000);
motor1.setAcceleration(500);
motor2.setMaxSpeed(1000);
motor2.setAcceleration(500);
motor3.setMaxSpeed(1000); // Independent of slide resistor
motor3.setAcceleration(500);
}
void loop() {
int xValue = analogRead(JOY_X); // Left-Right movement
int yValue = analogRead(JOY_Y); // Forward-Backward movement
int joy2YValue = analogRead(JOY2_Y); // Second joystick for Motor 3
int potValue = analogRead(POT_PIN); // Read potentiometer
// Scale speed factor from 0 to 1000 for motors 1 & 2
int maxSpeed = map(potValue, 0, 4095, 100, 1000);
// Define dead zone to avoid unwanted movement
int deadZone = 300;
int speed1 = 0, speed2 = 0, speed31 = 0;
// Control motors 1 & 2
if (abs(yValue - 2048) > deadZone) { // Forward or Backward motion
int speed = map(yValue, 0, 4095, maxSpeed, -maxSpeed);
speed1 = speed;
speed2 = speed;
} else if (abs(xValue - 2048) > deadZone) { // Turning Left or Right
int speed = map(xValue, 0, 4095, -maxSpeed, maxSpeed);
speed1 = -speed;
speed2 = speed;
}
// Control Motor 3 with second joystick (independent of slide resistor)
if (abs(joy2YValue - 2048) > deadZone) {
int speed3 = map(joy2YValue, 0, 4095, -1000, 1000); // Direct speed mapping
speed31=speed3;
}
// Set and run stepper speeds
motor1.setSpeed(speed1);
motor2.setSpeed(speed2);
motor3.setSpeed(speed31);
motor1.runSpeed();
motor2.runSpeed();
motor3.runSpeed();
}