I'm coding stepper motor and joystick so that I can play this game I created with the arduino but I'm having trouble with something. Below is my code, and everything works fine (when the joystick is moved the stepper motor moves in the same direction at the speed), but I want it so that if I move the joystick a little bit, the stepper motor goes a little slower than the speed, and the more I move it (to the right for example) the faster it gets until its completely to the right and is at the set speed. Can someone help me with this please. Thanks
#define step_pin 25 // Pin 25 connected to Steps pin on EasyDriver
#define dir_pin 23 // Pin 23 connected to Direction pin
#define MS1 28 // Pin 10 connected to MS1 pin
#define MS2 30 // Pin 11 connected to MS2 pin
#define SLEEP 32 // Pin 28 connected to SLEEP pin
#define X_pin A0 // Pin A0 connected to joystick x axis
#define Joy_switch 52 // Pin 4 connected to joystick switch
int step_speed = 10; // Speed of Stepper motor (higher = slower)
void setup() {
pinMode(MS1, OUTPUT);
pinMode(MS2, OUTPUT);
pinMode(dir_pin, OUTPUT);
pinMode(step_pin, OUTPUT);
pinMode(SLEEP, OUTPUT);
pinMode(Joy_switch, INPUT_PULLUP);
digitalWrite(SLEEP, HIGH); // Wake up EasyDriver
delay(5); // Wait for EasyDriver wake up
/* Configure type of Steps on EasyDriver:
// MS1 MS2
//
// LOW LOW = Full Step //
// HIGH LOW = Half Step //
// LOW HIGH = A quarter of Step //
// HIGH HIGH = An eighth of Step //
*/
digitalWrite(MS1, LOW); // Configures to Full Steps
digitalWrite(MS2, LOW); // Configures to Full Steps
}
void loop() {
if (!digitalRead(Joy_switch)) { // If Joystick switch is clicked
delay(500); // delay for deboucing
switch (step_speed) { // check current value of step_speed and change it
case 1:
step_speed=10; // slow speed
break;
case 3:
step_speed=1; // fast speed
break;
case 10:
step_speed=3; // medium speed
break;
}
}
if (analogRead(X_pin) > 712) { // If joystick is moved Left
digitalWrite(dir_pin, LOW); // (HIGH = anti-clockwise / LOW = clockwise)
digitalWrite(step_pin, HIGH);
delay(step_speed);
digitalWrite(step_pin, LOW);
delay(step_speed);
}
if (analogRead(X_pin) < 312) { // If joystick is moved right
digitalWrite(dir_pin, HIGH); // (HIGH = anti-clockwise / LOW = clockwise)
digitalWrite(step_pin, HIGH);
delay(step_speed);
digitalWrite(step_pin, LOW);
delay(step_speed);
}
}
Hi thanks for the reply! This still doesn't work. There aren't the different speeds I can go through and also moving it to the left doesn't work. It's very choppy and moving it to the max right makes it go way too fast. Please help
I'm coding stepper motor and joystick so that I can play this game I created with the arduino but I'm having trouble with something. Below is my code, and everything works fine (when the joystick is moved the stepper motor moves in the same direction at the speed), but I want it so that if I move the joystick a little bit, the stepper motor goes a little slower than the speed, and the more I move it (to the right for example) the faster it gets until its completely to the right and is at the set speed. Can someone help me with this please. Thanks
#define step_pin 25 // Pin 25 connected to Steps pin on EasyDriver
#define dir_pin 23 // Pin 23 connected to Direction pin
#define MS1 28 // Pin 10 connected to MS1 pin
#define MS2 30 // Pin 11 connected to MS2 pin
#define SLEEP 32 // Pin 28 connected to SLEEP pin
#define X_pin A0 // Pin A0 connected to joystick x axis
#define Joy_switch 52 // Pin 4 connected to joystick switch
int step_speed = 10; // Speed of Stepper motor (higher = slower)
void setup() {
pinMode(MS1, OUTPUT);
pinMode(MS2, OUTPUT);
pinMode(dir_pin, OUTPUT);
pinMode(step_pin, OUTPUT);
pinMode(SLEEP, OUTPUT);
pinMode(Joy_switch, INPUT_PULLUP);
digitalWrite(SLEEP, HIGH); // Wake up EasyDriver
delay(5); // Wait for EasyDriver wake up
/* Configure type of Steps on EasyDriver:
// MS1 MS2
//
// LOW LOW = Full Step //
// HIGH LOW = Half Step //
// LOW HIGH = A quarter of Step //
// HIGH HIGH = An eighth of Step //
*/
digitalWrite(MS1, LOW); // Configures to Full Steps
digitalWrite(MS2, LOW); // Configures to Full Steps
}
void loop() {
if (!digitalRead(Joy_switch)) { // If Joystick switch is clicked
delay(500); // delay for deboucing
switch (step_speed) { // check current value of step_speed and change it
case 1:
step_speed=10; // slow speed
break;
case 3:
step_speed=1; // fast speed
break;
case 10:
step_speed=3; // medium speed
break;
}
}
if (analogRead(X_pin) > 712) { // If joystick is moved Left
digitalWrite(dir_pin, LOW); // (HIGH = anti-clockwise / LOW = clockwise)
digitalWrite(step_pin, HIGH);
delay(step_speed);
digitalWrite(step_pin, LOW);
delay(step_speed);
}
if (analogRead(X_pin) < 312) { // If joystick is moved right
digitalWrite(dir_pin, HIGH); // (HIGH = anti-clockwise / LOW = clockwise)
digitalWrite(step_pin, HIGH);
delay(step_speed);
digitalWrite(step_pin, LOW);
delay(step_speed);
}
}
You can use the map() function to convert the range of values returned by analogRead() to the range required for step_speed thus making the speed proportional to the stick movement which is what you want I think
There isn't one solution, because you don't have one thing you want to do. You want to read different values from the joystick, right? The value means something for you, not only it being lesser than 312 or bigger than 712. Read the joystick and place its value in a variable. Can you do that?
The other thing you want is to run the stepper motor at different speeds. How do you do that? Write code, where you do int speed = 50;
Then you set the speed of the stepper motor according to the variable speed. Change the value in your code to check if it affects the stepper motor. Can you do that?
If either task is beyond your skills, figure out how to do them. Don't think they are one task.
What is the full sketch? There was nothing further in or attached to your post. Without seeing your entire sketch I have no guess as to why it might be acting the way you say it is acting.
Are you running on an Arduino UNO, Nano, or MEGA? Some other models have analogRead() return values up to 4096.