Push button to stepper motor

Hi, I am brand new to Arduino and have a Arduino uno. I found a YouTube video with the code of what I want the unit to do and I uploaded it to it but it is not working properly. All I want is for the Arduino to turn the stepper motor one 360degree rotation clockwise at the push of a button and stop. I want this to only happen every time I push the button, but the unit is turning on every 30 second’s automatically and rotating for exactly 38 seconds and stopping. I don’t want this to happen. I’ve spent days trying to remove lines of code and change things to stop this from happening but I can’t figure it out. Also, don’t even need the code to move the motor counter clockwise, if anyone could help me edit out the second button altogether.


Here is the code:


int Pin1 = 10;//IN1 is connected to 10 
int Pin2 = 11;//IN2 is connected to 11  
int Pin3 = 12;//IN3 is connected to 12  
int Pin4 = 13;//IN4 is connected to 13 
int switchCW  =2;//define input pin for CW push button
int switchCCW =3;//define input pin for CCW push button
int speedFactor =1;//1=fastest, 2=slower or 3 more slower



int correction_CW = 150;
int correction_CCW = 150;

const int CW =1;
const int CCW =2;
const int STOP =3;
int poleStep = 0; 
const int SPR=64*64;

int pole1[] ={0,0,0,0, 0,1,1,1, 0};//pole1, 8 step values
int pole2[] ={0,0,0,1, 1,1,0,0, 0};//pole2, 8 step values
int pole3[] ={0,1,1,1, 0,0,0,0, 0};//pole3, 8 step values
int pole4[] ={1,1,0,0, 0,0,0,1, 0};//pole4, 8 step values





int count=0;
int  dirStatus = STOP;// stores direction status 3= stop (do not change)

void setup() 
{ 
  //Robojax.com Stepper Push button One Revolution STPB-3
  Serial.begin(9600);
  Serial.begin("Robojax Video for Stepper Motor STPB-2");  
 pinMode(Pin1, OUTPUT);//define pin for ULN2003 in1 
 pinMode(Pin2, OUTPUT);//define pin for ULN2003 in2   
 pinMode(Pin3, OUTPUT);//define pin for ULN2003 in3   
 pinMode(Pin4, OUTPUT);//define pin for ULN2003 in4   

 pinMode(switchCW,INPUT_PULLUP);
 pinMode(switchCCW,INPUT_PULLUP);  
 
} 
 void loop() 
{ 
  //Robojax.com Stepper Push button One Revolution STPB-3
  if(digitalRead(switchCCW) == LOW) 
  {
    dirStatus =CCW;
    count =0;
  }else if(digitalRead(switchCW) == LOW)
  {
   dirStatus  = CW;  
    count =0;   
  }
  if(digitalRead(switchCW) == LOW && digitalRead(switchCCW) == LOW)
  {
    dirStatus  = STOP;
    delay(200);
  }
 if(dirStatus ==CW){ 
   poleStep++; 
   count++;   
   if(count+correction_CCW <= SPR)
   {
    driveStepper(poleStep);      
   }else{
      driveStepper(8);  
   }
  
 }else if(dirStatus ==CCW){ 
   poleStep--; 
   count++;   
   if(count+correction_CW <=SPR)
   {
    driveStepper(poleStep);      
   }else{
      driveStepper(8);  
   }   
 }else{
  driveStepper(8);   
 }
 if(poleStep>7){ 
   poleStep=0;
 } 
 if(poleStep<0){ 
   poleStep=7; 
 } 
 delay(speedFactor); 
  //Robojax.com Stepper Push button One Revolution STPB-3

}// loop


/*
 * @brief moves motor to specific angle 
 * @param "angle" is integer representing the angle
 * @return does not return anything
 * 
 * www.Robojax.com code Ap1il 19 2020 at 01:22 in Ajax, Ontario, Canada
 */
void driveStepper(int c)
{
     digitalWrite(Pin1, pole1[c]);  
     digitalWrite(Pin2, pole2[c]); 
     digitalWrite(Pin3, pole3[c]); 
     digitalWrite(Pin4, pole4[c]);
     if(c ==8)
     {
      digitalWrite(switchCW, HIGH); 
      digitalWrite(switchCCW, HIGH);               
     }
}//driveStepper ends here

Hi, @shrunkenned
Welcome to the forum.

Thanks for using code tags. :+1: :+1:

What stepper motor and driver are you using?

Thanks.. Tom.. :smiley: :+1: :coffee: :australia:

1 Like

Thanks for the reply, It is a Stepper motor 28BYJ-48 with ULN2003.

What does this do :thinking:

  if (c == 8)
  {
    digitalWrite(switchCW, HIGH);
    digitalWrite(switchCCW, HIGH);
  }

The code you have posted has absolutely nothing coded which would do any kind of timing.

The code you have posted has absolutely nothing that would make the code start from alone once every 30 seconds.

The only way I can think of that this starts from alone would be wrong wiring of the push-buttons so the wires act as antennas catching up electromagnetic noise. But then the start stop would be randomly.

Are you sure that the code you have posted is the one that is running on your microcontroller?

You seem to be pretty lazy about researching on the internet for demo-codes
I quogeled with keywords

arduino 28BYJ-48 with ULN2003

and found plenty of hits

there is one at makerguides that even has multiple demo-codes for different libraries

demonstrating how to make the stepper-motor do one rotation

This info should be enough to find it.

If you have this demo-code running
try your own attempt to modify it to use a button to initiate the 360-degree turn.

If it does not work quogle for "button press" state-change-detection

best regards Stefan

1 Like

Hi,
Can you please post some images of your project?
So we can see your component layout?

Thanks.. Tom.. :smiley: :+1: :coffee: :australia:

1 Like

Not really sure, the YouTube creator actually mentioned that and said that it can be removed but if there are issues with switching put it back. I’ve tried both ways, removed and left there and it operates the same way. I did notice that if I plug it in and touch nothing then nothing happens, but if I touch a button for clockwise or counter clockwise then that is when the every 30 seconds the unit turns on by itself and stays on for 38 seconds, and it also turns the direction that was last pressed, CW or CCW.

I highly doubt that the code that is running on your arduino is the same code that you posted.

Did you upload different codes?
If a code fails to compile this code-version is not uploaded to the microcontroller. Instead the previously uploaded code will start.

This is the reason why I add this to all of my code for easy identifying which code is running

void PrintFileNameDateTime() {
  Serial.println( F("Code running comes from file ") );
  Serial.println( F(__FILE__) );
  Serial.print( F("  compiled ") );
  Serial.print( F(__DATE__) );
  Serial.print( F(" ") );
  Serial.println( F(__TIME__) );  
}


void setup() {
  Serial.begin(115200);
  Serial.println("Setup-Start");
  PrintFileNameDateTime();
}


void loop() {

}

best regards Stefan

If you have a pin defined as
pinMode(pin, INPUT_PULLUP);
and you do
digitalWrite(pin, HIGH);
nothing happens.

If there were no freedom of speech of nonsense, the author should be banned on youtube, however.

the above generates an error. did you mean "println" instead of "begin"

the logic looks over complicated. what's the purpose of count and why are there cases where driverStepper() isn't given poleStep?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.