搜索代码

STPB-5: Controlling a 28BYJ-48 Stepper Motor with Push Buttons to Any Angle

STPB-5: Controlling a 28BYJ-48 Stepper Motor with Push Buttons to Any Angle

This is the Arduino code to control the 28BYJ-48 stepper motor with push buttons to send it to any angle you set in the code. For each push button, you can set the angle, speed, and direction.
331-Arduino code to control a 28BYJ-48 with a ULN2003 board using as many push buttons as you like | STPB-5
语言: C++
++
/*
 * This is Arduino code to control 28BYJ-48 with ULN2003 board using
  as many push buttons as you want.
  For each push button you can have separate:
  -Speed
  -Direction
  -Angle
  
 Watch Video for instructions.
 You can add as many push buttons as you want and assign different angles, speeds, and directions.

This is video: STPB-5
 * Written by Ahmad Shamshiri for Robojax Robojax.com
 * on Jun 09, 2020 at in Ajax, Ontario, Canada
 * 
 * 
 Watch the video instruction for this sketch: https://youtu.be/4LOpXFkWzD4
 
Related videos:
Introduction to using 28BYJ-48 stepper motor: https://youtu.be/Sl2mzXfTwCs
Control speed of this motor using Potentiometer: https://youtu.be/lrEW8xlSnuY
Control 28BYJ-48 Stepper motor with hand gesture: https://youtu.be/KfAnUgaSDmI
STPB-1 Control 28BYJ-48 Stepper motor with 3 push buttons for CW, CCW and STOP: https://youtu.be/q-H7GbyX5ho
STPB-2 Control 28BYJ-48 Stepper motor with 2 push buttons keep pressed: https://youtu.be/y-F-jjTOYyQ
STPB-3 ONE revolution CW CCW: https://youtu.be/MEEKvjj7vbY
STPB-4 Any (one) Angle push button: https://youtu.be/P_O-0_aOXuA
STPB-5 Any Angle (multiple) push buttons:  https://youtu.be/4LOpXFkWzD4
ESP8266 NodeMCU D1 Mini over WiFi: https://youtu.be/CzvGR0WTllI
ESP32 CW CCW Over WiFi : https://youtu.be/n2oeT6RcU5Q
 

If you found this tutorial helpful, please support by donating via Paypal link on Robojax.com

* 
 * Code is available at http://robojax.com/learn/arduino

 * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been downloaded from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>. 

*/


const int CW =1;
const int CCW =2;
const int STOP =3;

int Pin1 = 8;//IN1 is connected to 8 
int Pin2 = 9;//IN2 is connected to 9  
int Pin3 = 10;//IN3 is connected to 10 
int Pin4 = 11;//IN4 is connected to 11
int switchSTOP =2;//define input pin for STOP push button
int stopType=1;//1=normal stop, 2=hold stop (consumes power)

int speedFactor =1;//1=fastest, 2=slower or 3 more slower

long angles[] = {360, 270, 7655};//angles of each push button
int pushButtons[] ={3, 4, 5};//digial pin for each push button
int directions[] ={CW, CCW, CW};//direction of each push button
int speedFactors[] = {1, 1, 3};//speed for each push button


int correction_CW = 150;//watch video for details
int correction_CCW = 150;//watch video for details


int poleStep = 0; 
long stepVale =0;
const int SPR=64*64;
long goToAngle=0;
int activeButton=0;
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 Any Angle STPB-5
  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(switchSTOP,INPUT_PULLUP); 
 attachInterrupt(digitalPinToInterrupt(switchSTOP), stopMotor, FALLING );
 // see this https://www.arduino.cc/reference/en/language/variables/utilities/sizeof/
 for (byte i = 0; i < (sizeof(pushButtons) / sizeof(pushButtons[0])); i++) {
   pinMode(i,INPUT_PULLUP);
  }


 
} //setup
 void loop() 
{ 
    stepVale = (SPR * goToAngle)/360 ;
  //Robojax.com Stepper Push button Any Angle STPB-5

  //see this https://www.arduino.cc/reference/en/language/variables/utilities/sizeof/
 for (byte i = 0; i < (sizeof(angles) / sizeof(angles[0])); i++) {
    if(digitalRead(pushButtons[i]) == LOW) 
    {
      goToAngle =angles[i];
      dirStatus =directions[i];
      count =0;
      activeButton =i;
    }// if ends
 }//for loop ends
  
  
 if(dirStatus ==CCW){ 
  
   poleStep++; 
   count++;   
   if(count+correction_CCW <= stepVale)
   {
    driveStepper(poleStep);      
   }else{
      stopMotor();  
   }
  //full explanation at Arduino Course on Udemy.com see link above
 }else if(dirStatus ==CW){ 
   poleStep--; 
   count++;   
   if(count+correction_CW <=stepVale)
   {
    driveStepper(poleStep);      
   }else{
      stopMotor();  
   }   
 }else{
  stopMotor();   
 }
 if(poleStep>7){ 
   poleStep=0;
 } 
 if(poleStep<0){ 
   poleStep=7; 
 } 
  delay(speedFactors[activeButton]);
  
  //Robojax.com Stepper Push button Any Angle STPB-5

}// loop


/*
 * @brief moves motor to specific angle 
 * @param "angle" is integer representing the angle
 * @return does not return anything
 * 
 * www.Robojax.com code April 19, 2020 at 01:22 in Ajax, Ontario, Canada
 */
void driveStepper(int c)
{
    //Robojax.com Stepper Push button Any Angle STPB-5
     digitalWrite(Pin1, pole1[c]);  
     digitalWrite(Pin2, pole2[c]); 
     digitalWrite(Pin3, pole3[c]); 
     digitalWrite(Pin4, pole4[c]);

}//driveStepper ends here

/*
 * @brief stops the motor immediately
 * @param none
 * @return does not return anything
 * 
 * www.Robojax.com code June 09, 2020 at 11:09 in Ajax, Ontario, Canada
 */
void stopMotor()
{
  //see this https://www.arduino.cc/reference/en/language/variables/utilities/sizeof/
 for (byte i = 0; i < (sizeof(angles) / sizeof(angles[0])); i++) {
    digitalWrite(pushButtons[i], HIGH); 

 }//for loop ends
 dirStatus = STOP;
 if( stopType ==2)
 {
  driveStepper(8);
 }
}//stopMotor()

文件📁

没有可用的文件。