Hello everyone - first time posting so I apologize for any formatting errors. I am attempting to control two stepper motors with the X and Y axes of a 2-axis joystick. I have a working code for just one axis/motor, shown here:
#define DRIVER_STEP_PIN 2
#define DRIVER_DIR_PIN 3
#define POT_PIN A0
#define DEADZONE 50
#define MIN_DRIVER_PULSE_PERIOD_US 50 //max speed
#define MAX_DRIVER_PULSE_PERIOD_US 3000 //min speed
enum Driver_pulse_state_enum {PULSE_IDLE, PULSE_HIGH, PULSE_LOW};
unsigned long time_now = 0;
uint16_t driver_pulse_hold_time_us = MIN_DRIVER_PULSE_PERIOD_US/2;
uint8_t driver_pulse_state = PULSE_IDLE;
int normalized_analog_value = 0;
uint8_t idle_flag = 1;
void setup() {
pinMode(DRIVER_STEP_PIN, OUTPUT);
pinMode(DRIVER_DIR_PIN, OUTPUT);
}
void loop() {
normalized_analog_value = analogRead(POT_PIN) - 512;
if(abs(normalized_analog_value)-DEADZONE < 0){
idle_flag = 1;
}
else{
idle_flag = 0;
}
driver_pulse_hold_time_us = map(abs(normalized_analog_value), DEADZONE, 512, MAX_DRIVER_PULSE_PERIOD_US, MIN_DRIVER_PULSE_PERIOD_US)/2;
if(!idle_flag && driver_pulse_state == PULSE_IDLE){
write_pulse_high();
}
if((micros() - time_now > driver_pulse_hold_time_us) && (driver_pulse_state == PULSE_LOW)){
write_pulse_high();
}
if((micros() - time_now > driver_pulse_hold_time_us) && (driver_pulse_state == PULSE_HIGH)){
write_pulse_low();
}
}
void write_pulse_high(void){
driver_pulse_state = PULSE_HIGH;
if(normalized_analog_value > 0){
digitalWrite(DRIVER_DIR_PIN, HIGH);
}
else if(normalized_analog_value < 0){
digitalWrite(DRIVER_DIR_PIN, LOW);
}
digitalWrite(DRIVER_STEP_PIN, HIGH);
time_now = micros();
}
void write_pulse_low(void){
digitalWrite(DRIVER_STEP_PIN, LOW);
time_now = micros();
if(!idle_flag){
driver_pulse_state = PULSE_LOW;
}
else{
driver_pulse_state = PULSE_IDLE;
}
}
The problem I'm having is when attempting to modify the code to add the second axis/motor, I get an error while verifying: " 'write_Ypulse_low' was not declared in this scope." Any help would be appreciated.
#define XDRIVER_STEP_PIN 2
#define XDRIVER_DIR_PIN 3
#define XPOT_PIN A0
#define YDRIVER_STEP_PIN 3
#define YDRIVER_DIR_PIN 4
#define YPOT_PIN A1
#define XDEADZONE 50
#define XMIN_DRIVER_PULSE_PERIOD_US 50 //max speed
#define XMAX_DRIVER_PULSE_PERIOD_US 3000 //min speed
#define YDEADZONE 50
#define YMIN_DRIVER_PULSE_PERIOD_US 50 //max speed
#define YMAX_DRIVER_PULSE_PERIOD_US 3000 //min speed
enum XDriver_pulse_state_enum {XPULSE_IDLE, XPULSE_HIGH, XPULSE_LOW};
enum YDriver_pulse_state_enum {YPULSE_IDLE, YPULSE_HIGH, YPULSE_LOW};
unsigned long Xtime_now = 0;
unsigned long Ytime_now = 0;
uint16_t Xdriver_pulse_hold_time_us = XMIN_DRIVER_PULSE_PERIOD_US/2;
uint8_t Xdriver_pulse_state = XPULSE_IDLE;
int Xnormalized_analog_value = 0;
uint8_t Xidle_flag = 1;
uint16_t Ydriver_pulse_hold_time_us = YMIN_DRIVER_PULSE_PERIOD_US/2;
uint8_t Ydriver_pulse_state = YPULSE_IDLE;
int Ynormalized_analog_value = 0;
uint8_t Yidle_flag = 1;
void setup() {
pinMode(XDRIVER_STEP_PIN, OUTPUT);
pinMode(XDRIVER_DIR_PIN, OUTPUT);
pinMode(YDRIVER_STEP_PIN, OUTPUT);
pinMode(YDRIVER_DIR_PIN, OUTPUT);
}
void loop() {
Xnormalized_analog_value = analogRead(XPOT_PIN) - 512;
if(abs(Xnormalized_analog_value)-XDEADZONE < 0){
Xidle_flag = 1;
}
else{
Xidle_flag = 0;
}
Ynormalized_analog_value = analogRead(YPOT_PIN) - 512;
if(abs(Ynormalized_analog_value)-YDEADZONE < 0){
Yidle_flag = 1;
}
else{
Yidle_flag = 0;
}
Xdriver_pulse_hold_time_us = map(abs(Xnormalized_analog_value), XDEADZONE, 512, XMAX_DRIVER_PULSE_PERIOD_US, XMIN_DRIVER_PULSE_PERIOD_US)/2;
if(!Xidle_flag && Xdriver_pulse_state == XPULSE_IDLE){
write_Xpulse_high();
}
if((micros() - Xtime_now > Xdriver_pulse_hold_time_us) && (Xdriver_pulse_state == XPULSE_LOW)){
write_Xpulse_high();
}
if((micros() - Xtime_now > Xdriver_pulse_hold_time_us) && (Xdriver_pulse_state == XPULSE_HIGH)){
write_Xpulse_low();
}
Ydriver_pulse_hold_time_us = map(abs(Ynormalized_analog_value), YDEADZONE, 512, YMAX_DRIVER_PULSE_PERIOD_US, YMIN_DRIVER_PULSE_PERIOD_US)/2;
if(!Yidle_flag && Ydriver_pulse_state == YPULSE_IDLE){
write_Ypulse_high();
}
if((micros() - Ytime_now > Ydriver_pulse_hold_time_us) && (Ydriver_pulse_state == YPULSE_LOW)){
write_Ypulse_high();
}
if((micros() - Ytime_now > Ydriver_pulse_hold_time_us) && (Ydriver_pulse_state == YPULSE_HIGH)){
write_Ypulse_low();
}
}
void write_Xpulse_high(void){
Xdriver_pulse_state = XPULSE_HIGH;
if(Xnormalized_analog_value > 0){
digitalWrite(XDRIVER_DIR_PIN, HIGH);
}
else if(Xnormalized_analog_value < 0){
digitalWrite(XDRIVER_DIR_PIN, LOW);
}
digitalWrite(XDRIVER_STEP_PIN, HIGH);
Xtime_now = micros();
}
void write_Ypulse_high(void){
Ydriver_pulse_state = YPULSE_HIGH;
if(Ynormalized_analog_value > 0){
digitalWrite(YDRIVER_DIR_PIN, HIGH);
}
else if(Ynormalized_analog_value < 0){
digitalWrite(YDRIVER_DIR_PIN, LOW);
}
digitalWrite(YDRIVER_STEP_PIN, HIGH);
Ytime_now = micros();
}
void write_Xpulse_low(void){
digitalWrite(XDRIVER_STEP_PIN, LOW);
Xtime_now = micros();
if(!Xidle_flag){
Xdriver_pulse_state = XPULSE_LOW;
}
else{
Xdriver_pulse_state = XPULSE_IDLE;
}
void write_Ypulse_low(void){
digitalWrite(YDRIVER_STEP_PIN, LOW);
Ytime_now = micros();
if(!Yidle_flag){
Ydriver_pulse_state = YPULSE_LOW;
}
else{
Ydriver_pulse_state = YPULSE_IDLE;
}