Cum să controlezi patru motoare de curent continuu cu Sabertooth 2X25A și placa Arduino UNO

Sabertooth 2X25A este un driver de motoare folosit în mod frecvent la roboții de teren, roboții de tăiat iarbă, sau oricare alţi roboţi care nu depășesc greutatea de 130Kg. Eu l-am cumpărat pentru un robot de tăiat iarbă, însă recunosc că nu m-am ocupat încă de proiect.

Prețul unui astfel de driver de motoare este mare și depăşesşte suma de 125 USD, cât este pe Amazon, dacă adăugăm și transportul.

Majoritatea soluțiilor de control găsite pe Internet se aplică roboților controlați de la distanță cu o telecomandă cu două sau mai multe canale. Soluția nu se potrivește și roboților autonomi. Așa că m-am apucat să studiez configurarările driverului și cum poate fi controlat cu un Arduino UNO fără intervenţie din partea mea.

Driverul de motoare are un set de comutatoare care permite driverului să funcționeze într-un mod anume. În acest tutorial, am folosit modul denumit în manual: Simplified Serial Mode (comutatoarele DIP 1, 3, 5 și 6 pe ON, celelalte pe OFF).

Comutatoarele DIP 1, 3, 5 și 6 pe ON, celelalte pe OFF

Comutatoarele DIP 1, 3, 5 și 6 pe ON, celelalte pe OFF

Conectarea la Arduino UNO:

  • Sabertooth 0V la pinul GND al Arduino
  • Sabertooth 5V la pinul Vin al Arduino
  • Sabertooth S1 la pinul TX al Arduino

Conectarea la Arduino UNO

Conectarea la Arduino UNO

Conectarea cu motoarele de curent continuu:

  • 2 X motor de curent continuu la M1A și M1B
  • 2 X motor de curent continuu la M2A și M2B
  • bateria la B+ și B-
Conectarea cu motoarele de curent continuu

Conectarea cu motoarele de curent continuu

/**
 * @file         Sabertooth 2 X 25A Motor Driver.ino
 * @author       calinezu.ro | acelasi cod l-am folosit si pe blogul intorobotics.com
 * @version      V1.0
 * @date         2016/06/03
 * @description  this file is sample code for the Sabertooth 2 X 25A Motor Driver and Arduino UNO
 */

 
/*Sending a character between 1 and 127 will control motor 1.
1 is full reverse, 64 is stop and 127 is full forward.
Sending a character between 128 and 255 will control motor 2.
128 is full reverse, 192 is stop and 255 is full forward.
Character 0 (hex 0x00) is a special case. Sending this character will shut down both motors.
Source:http://www.robotmarketplace.com/products/images/Sabertooth2x25.pdf
*/


//simplifierd serial limits for each motor
#define SBT_MOTOR1_FULL_FORWARD 127
#define SBT_MOTOR1_FULL_REVERSE 1

#define SBT_MOTOR2_FULL_FORWARD 255
#define SBT_MOTOR2_FULL_REVERSE 128

//shut down both motors
#define SBT_ALL_STOP  0

void setup() {
  Serial.begin(9600);
  killMotors();
}

void loop() {
  fastForward();//move fast forward for 3 seconds
  delay(3000);
 
  killMotors();
 
  fastReverse(); //move fast reverse for 3 seconds
  delay(3000);
 
  killMotors();

  turnLeft(); //turn left for one second
  delay(1000);
 
  turnRight(); //turn right for one second
  delay(1000);
 
  killMotors();
}

 void fastForward(){  //motors fast forward
    Serial.write(SBT_MOTOR1_FULL_FORWARD);  
    Serial.write(SBT_MOTOR2_FULL_FORWARD);
    Serial.println("motors fast forward");
  }


 void fastReverse(){  //motors fast reverse
    Serial.write(SBT_MOTOR1_FULL_REVERSE);  
    Serial.write(SBT_MOTOR2_FULL_REVERSE);
    Serial.println("motors fast reverse");
  }

  void turnLeft(){  //motor 1 full reverse and motor 2 full forward to turn left
    Serial.write(SBT_MOTOR1_FULL_REVERSE);  
    Serial.write(SBT_MOTOR2_FULL_FORWARD);
    Serial.println("motor 1 full reverse and motor 2 full forward to turn left");
  }  

  void turnRight(){  //motor 1 full forward and motor 2 full reverse to turn right
    Serial.write(SBT_MOTOR1_FULL_FORWARD);  
    Serial.write(SBT_MOTOR2_FULL_REVERSE);
    Serial.println("motor 1 full forward and motor 2 full reverse to turn right");
  }

  void killMotors(){
    Serial.write(SBT_ALL_STOP);   //kill motors for 0.5 second
    Serial.println("kill motors for half a second");
    delay(500);  
    }

Şi o scurtă demonstraţie cum funcţionează:

Leave a Reply

Câmpurile obligatorii sunt marcate cu *.