Stepper motor control and Limit switch using a Joystick


Parts list

- Arduino Uno r3
- Stepper motor NEMA17 x 2
- TB6560 Stepper Driver x2
- Jumper wire
- Joystick Module
- Hall sensor module x 2

Connecting

Arduino Pin 2 ⟶ Clk+ of TB6560 ( X-Axis )
Arduino Pin 4 ⟶ Dir + of TB6560 ( X-Axis )
Arduino Pin 6 ⟶ En+ of TB6560 ( X-Axis )

Arduino Pin 3 ⟶ Clk+ of TB6560 ( Y-Axis )
Arduino Pin 5 ⟶ Dir + of TB6560 ( Y-Axis )
Arduino Pin 6 ⟶ En+ of TB6560 ( Y-Axis )

Arduino Pin 10 ⟶ Pin Out of Hall Sensor module ( X-Axis)
Arduino Pin 11 ⟶ Pin Out of Hall Sensor module ( Y-Axis)


Arduino Sketch

/*
 *  State
 */
#define MOVEXY_STATE    101

#define joyMin 300 
#define joyMax 800

#define stpX 2
#define stpY 3
#define dirX 4
#define dirY 5

#define enXY 6
#define limitX 10
#define limitY 11


//Declare variables for functions


int joyX = A0;
int joyY = A1;


int joyVal;
int lastDirX = LOW;
int lastDirY = LOW;

bool bStep = false;

int state = MOVEXY_STATE;


void setup() {

  Serial.begin(9600); //Open Serial connection for debugging
  
  pinMode(stpX, OUTPUT);
  pinMode(dirX, OUTPUT);

  pinMode(stpY, OUTPUT);
  pinMode(dirY, OUTPUT);

  pinMode(enXY, OUTPUT);

  pinMode( limitY , INPUT);
  pinMode( limitX , INPUT);

  
  digitalWrite(stpX, LOW);
  digitalWrite(dirX, LOW);

  digitalWrite(stpY, LOW);
  digitalWrite(dirY, LOW);
  
  digitalWrite(enXY, HIGH);

}

//Main loop
void loop() {

   
    switch( state ){      
      case MOVEXY_STATE : moveXYFunc();                          
      break;                     
    }

  
}  
void stepMotor( int stepPort){
  
     digitalWrite(stepPort,HIGH); //Trigger one step forward
     delayMicroseconds(300);
     digitalWrite(stepPort,LOW); //Pull step pin low so it can be triggered again
     delayMicroseconds(300);
}

void moveXYFunc(){
  
   digitalWrite(enXY, HIGH);
   
   while( (analogRead(joyX) < joyMin ) || (analogRead(joyX) > joyMax )){

           joyVal = analogRead(joyX);
           
           digitalWrite(enXY, LOW);
           
           if( joyVal < joyMin){
             digitalWrite(dirX, LOW);
             //Serial.println("LOW");
           }
           else if( joyVal > joyMax){
          
               digitalWrite(dirX, HIGH);
              // Serial.println("HIGH");
           }
           
            bStep = true;
          if( digitalRead( limitX ) == LOW  ){
               
               if( lastDirX == digitalRead( dirX ) ){
                    digitalWrite(enXY, HIGH);
                    bStep = false;
               }
          }else{
              lastDirX = digitalRead( dirX );
          }

          if( bStep){           
             stepMotor( stpX);
          }
  
   } // while loop

   
   digitalWrite(enXY, HIGH);

   while( (analogRead(joyY) < joyMin ) || (analogRead(joyY) > joyMax )){

           joyVal = analogRead(joyY);

                      
           digitalWrite(enXY, LOW);
           
           if( joyVal < joyMin){
             digitalWrite(dirY, LOW);
           //  Serial.println("LOW");
           }
           else if( joyVal > joyMax){
          
               digitalWrite(dirY, HIGH);
              // Serial.println("HIGH");
   
           }
           
          bStep = true;
          if( digitalRead( limitY ) == LOW  ){
               
               if( lastDirY == digitalRead( dirY ) ){
                    digitalWrite(enXY, HIGH);
                    bStep = false;
               }
          }else{
              lastDirY = digitalRead( dirY );
          }

          if( bStep){           
             stepMotor( stpY);
          }
  
   } // while loop
   
}






ความคิดเห็น