Pages: [1]   Go Down
Author Topic: Some help with older code pre 1.0 (motor control)  (Read 535 times)
0 Members and 1 Guest are viewing this topic.
Charleston, SC
Offline Offline
Full Member
***
Karma: 1
Posts: 157
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hello,
I'm beginning to try and put together some code/try out a few things.
I found some code but it seems to be for an older version, pre 1.0
It has:
Code:
SaberSerial.print(0, BYTE);
Which according to the updated 1.0 code, should be:
Code:
Serial.write(val);

There are a few instances of this old code in the program below.  Having a bit of trouble getting it to work with the updated library 1.0.

Here is the full program:
Code:
//TWIN WHEELER MODIFIED FOR ARDUINO SIMPLIFIED SERIAL PROTOCOL TO SABERTOOTH V2

//**********THIS VERSION JUST TESTS COMMUNICATION BETWEEN ARDUINO AND SABERTOOTH AND MOTORS PLUS DEADMAN SWITCH****************
//*********** DEADMAN SWITCH MUST BE PRESSED IN, MOTORS WILL STOP IF RELEASED **********************
//MOTORS WILL INCREASE IN SPEED BY 10% EVERY 5 SECONDS UNTIL 50% OF FULL POWER IS REACHED
//THEY WILL THEN GO DOWN TO ZERO IN STEPS OF 10%.

//BOTH WHEELS SHOULD BE SPINNING IN SAME DIRECTION AT THE SAME SPEED AT ALL TIMES ELSE YOU WILL HAVE WIRED ONE MOTOR UP BACK TO FRONT

//SABERTOOTH MUST HAVE DIP SWITCHES SET TO THE SERIAL MODE:i.e. DIP switches 1, 3, 5 and 6 set to ON, the remainder set to OFF

//IMU NOT CONNECTED AT THIS POINT (CAN BE PHYSICALLY CONNECTED IF YOU LIKE BUT ARDUINO WILL NOT BE READING IT AT ALL)

//ONLY THING YOU NEED IS DEAD MAN SWITCH TO DIGITAL PIN 9 (+5V TO PIN 9 WHEN SWITCH PRESSED, PULL DOWN RESISTOR FROM PIN 9 TO GND KEEPS IT AT 0V OTHERWISE)




//J. Dingley  March 1 2011 For Arduino 328 Duemalinove or similar with a 3.3V accessory power output
//i.e. the current standard Arduino board.




#include <SoftwareSerial.h>


//******************** IMPORTANT ***************************
//Set dip switches on the Sabertooth for simplified serial and 9600 Buadrate. Diagram of this on my Instructables page//
//i.e. DIP switches 1, 3, 5 and 6 set to ON, the remainder set to OFF
//******************** IMPORTANT ***************************


//Digital pin 13 is serial transmit pin to sabertooth
#define SABER_TX_PIN  13
//Not used but still initialised, Digital pin 12 is serial receive from Sabertooth
#define SABER_RX_PIN  12

//set baudrate to match sabertooth dip settings
#define SABER_BAUDRATE  9600

//simplifierd serial limits for each motor
#define SABER_MOTOR1_FULL_FORWARD 127
#define SABER_MOTOR1_FULL_REVERSE 1

#define SABER_MOTOR2_FULL_FORWARD 255
#define SABER_MOTOR2_FULL_REVERSE 128

//motor level to send when issuing full stop command
#define SABER_ALL_STOP  0


SoftwareSerial SaberSerial = SoftwareSerial (SABER_RX_PIN, SABER_TX_PIN );
                                             
void initSabertooth (void)  {
  //initialise software to communicate with sabertooth
pinMode ( SABER_TX_PIN, OUTPUT );


SaberSerial.begin( SABER_BAUDRATE );
//2 sec delay to let it settle
delay (2000);
SaberSerial.print(0, BYTE);   //kill motors when first switched on
}


float level = 0;

int u;

//float k1;
//int k2;
//int k3;
int k4;


signed char Motor1percent;
signed char Motor2percent;






//DIGITAL INPUT
int deadmanbuttonPin = 9;  // deadman button is digital input pin 9


void setup()                    // run once, when the sketch starts
{
  initSabertooth( );
    //analogINPUTS

  //digital inputs
  pinMode(deadmanbuttonPin, INPUT);
 

 
 
    Serial.begin(9600);      // HARD wired Serial feedback to PC for debugging in Wiring

 
}








void sample_inputs()  {
 
   
 
  k4 = digitalRead(deadmanbuttonPin);  //this is needed - if you let go the motors both stop for your own safety
 
 
 
}









void set_motor()   {
  unsigned char cSpeedVal_Motor1 = 0;
  unsigned char cSpeedVal_Motor2 = 0;
 
 
//set motors using the simplified serial Sabertooth protocol (same for smaller 2 x 5 Watt Sabertooth by the way)
               
 Motor1percent = (signed char) level;
 Motor2percent = (signed char) level;


Serial.print("level ");
Serial.println(level);

 
 if (Motor1percent > 100) Motor1percent = 100;
 if (Motor1percent < -100) Motor1percent = -100;
 if (Motor2percent > 100) Motor2percent = 100;
 if (Motor2percent < -100) Motor2percent = -100;
 
 //if not pressing deadman button on hand controller - cut everything
   if (k4 < 1) {
    level = 0;
   
    Motor1percent = 0;
    Motor2percent = 0;
    Serial.println("Pressing Dead Man Button");
    delay(1000);
               }
 
 cSpeedVal_Motor1 = map (Motor1percent,
                         -100,
                         100,
                         SABER_MOTOR1_FULL_REVERSE,
                         SABER_MOTOR1_FULL_FORWARD);
                         
 cSpeedVal_Motor2 = map (Motor2percent,
                         -100,
                          100,
                         SABER_MOTOR2_FULL_REVERSE,
                         SABER_MOTOR2_FULL_FORWARD);
                         
 SaberSerial.print (cSpeedVal_Motor1, BYTE);
 SaberSerial.print (cSpeedVal_Motor2, BYTE);
 
 /*
 //debugging
  Serial.print("Motor1percent = ");
  Serial.print(Motor1percent);
  Serial.print ("  level = ");
  Serial.println (level);
 
  Serial.print("Motor2percent = ");
  Serial.println(Motor2percent);
  Serial.print("cSpeedVal_Motor1 = ");
  Serial.println(cSpeedVal_Motor1);
  Serial.print("cSpeedVal_Motor2 = ");
  Serial.println(cSpeedVal_Motor2);
  */
 delay(5000); //5 second delay
 
}











void loop ()   {
 
 



 for (u=0; u<5; u++) {
 
  level= u * 10; //level = 0 then 10, then 20 until it gets to 50% of max motor power. each set motor routine has 5 sec delay at end of it
  sample_inputs(); //check the dead man button still pressed in
  set_motor();
 
           }
           
           
  for (u=0; u<5; u++) {
 
  level= (5- u) * 10; //level = 50 then 40, then 30 then 20 until it gets to 0% of max motor power. each set motor routine has 5 sec delay at end of it
  sample_inputs();//check the dead man button still pressed in
  set_motor();
 
           }         
           
       
           
  }

Logged


Seattle, WA USA
Offline Offline
Brattain Member
*****
Karma: 654
Posts: 50931
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Having a bit of trouble getting it to work with the updated library 1.0.
Having a bit of trouble knowing what works, and what doesn't work. What problem are we trying to help you solve?
Logged

Massachusetts, USA
Offline Offline
Tesla Member
***
Karma: 212
Posts: 8975
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

This version compiles.  Just had to change the three lines that used the BYTE keyword.
Code:
// TWIN WHEELER MODIFIED FOR ARDUINO SIMPLIFIED SERIAL PROTOCOL TO SABERTOOTH V2

// **********THIS VERSION JUST TESTS COMMUNICATION BETWEEN ARDUINO AND SABERTOOTH AND MOTORS PLUS DEADMAN SWITCH****************
// *********** DEADMAN SWITCH MUST BE PRESSED IN, MOTORS WILL STOP IF RELEASED **********************
// MOTORS WILL INCREASE IN SPEED BY 10% EVERY 5 SECONDS UNTIL 50% OF FULL POWER IS REACHED
// THEY WILL THEN GO DOWN TO ZERO IN STEPS OF 10%.

// BOTH WHEELS SHOULD BE SPINNING IN SAME DIRECTION AT THE SAME SPEED AT ALL TIMES ELSE YOU WILL HAVE WIRED ONE MOTOR UP BACK TO FRON

// SABERTOOTH MUST HAVE DIP SWITCHES SET TO THE SERIAL MODE:i.e. DIP switches 1, 3, 5 and 6 set to ON, the remainder set to OFF

// IMU NOT CONNECTED AT THIS POINT (CAN BE PHYSICALLY CONNECTED IF YOU LIKE BUT ARDUINO WILL NOT BE READING IT AT ALL)

// ONLY THING YOU NEED IS DEAD MAN SWITCH TO DIGITAL PIN 9 (+5V TO PIN 9 WHEN SWITCH PRESSED, PULL DOWN RESISTOR FROM PIN 9 TO GND
// KEEPS IT AT 0V OTHERWISE)

// J. Dingley  March 1 2011 For Arduino 328 Duemalinove or similar with a 3.3V accessory power output
// i.e. the current standard Arduino board.

#include <SoftwareSerial.h>


//******************** IMPORTANT ***************************
//Set dip switches on the Sabertooth for simplified serial and 9600 Buadrate. Diagram of this on my Instructables page//
//i.e. DIP switches 1, 3, 5 and 6 set to ON, the remainder set to OFF
//******************** IMPORTANT ***************************


//Digital pin 13 is serial transmit pin to sabertooth
#define SABER_TX_PIN  13
//Not used but still initialised, Digital pin 12 is serial receive from Sabertooth
#define SABER_RX_PIN  12

//set baudrate to match sabertooth dip settings
#define SABER_BAUDRATE  9600

//simplifierd serial limits for each motor
#define SABER_MOTOR1_FULL_FORWARD 127
#define SABER_MOTOR1_FULL_REVERSE 1

#define SABER_MOTOR2_FULL_FORWARD 255
#define SABER_MOTOR2_FULL_REVERSE 128

//motor level to send when issuing full stop command
#define SABER_ALL_STOP  0

SoftwareSerial SaberSerial = SoftwareSerial (SABER_RX_PIN, SABER_TX_PIN );

void initSabertooth (void)  {
  //initialise software to communicate with sabertooth
  pinMode ( SABER_TX_PIN, OUTPUT );

  SaberSerial.begin( SABER_BAUDRATE );
  //2 sec delay to let it settle
  delay (2000);
  SaberSerial.write((byte)0);   //kill motors when first switched on
}


float level = 0;

int u;

//float k1;
//int k2;
//int k3;
int k4;

signed char Motor1percent;
signed char Motor2percent;

//DIGITAL INPUT
int deadmanbuttonPin = 9;  // deadman button is digital input pin 9

void setup()                    // run once, when the sketch starts
{
  initSabertooth( );
  //analogINPUTS

  //digital inputs
  pinMode(deadmanbuttonPin, INPUT);

  Serial.begin(9600);      // HARD wired Serial feedback to PC for debugging in Wiring
}


void sample_inputs()  {
  k4 = digitalRead(deadmanbuttonPin);  //this is needed - if you let go the motors both stop for your own safety
}


void set_motor()   {
  unsigned char cSpeedVal_Motor1 = 0;
  unsigned char cSpeedVal_Motor2 = 0;

  //set motors using the simplified serial Sabertooth protocol (same for smaller 2 x 5 Watt Sabertooth by the way)

  Motor1percent = (signed char) level;
  Motor2percent = (signed char) level;

  Serial.print("level ");
  Serial.println(level);

  if (Motor1percent > 100) Motor1percent = 100;
  if (Motor1percent < -100) Motor1percent = -100;
  if (Motor2percent > 100) Motor2percent = 100;
  if (Motor2percent < -100) Motor2percent = -100;

  //if not pressing deadman button on hand controller - cut everything
  if (k4 < 1) {
    level = 0;

    Motor1percent = 0;
    Motor2percent = 0;
    Serial.println("Pressing Dead Man Button");
    delay(1000);
  }

  cSpeedVal_Motor1 = map (Motor1percent,
  -100,
  100,
  SABER_MOTOR1_FULL_REVERSE,
  SABER_MOTOR1_FULL_FORWARD);

  cSpeedVal_Motor2 = map (Motor2percent,
  -100,
  100,
  SABER_MOTOR2_FULL_REVERSE,
  SABER_MOTOR2_FULL_FORWARD);

  SaberSerial.write (cSpeedVal_Motor1);
  SaberSerial.write (cSpeedVal_Motor2);

  /*
 //debugging
   Serial.print("Motor1percent = ");
   Serial.print(Motor1percent);
   Serial.print ("  level = ");
   Serial.println (level);
   
   Serial.print("Motor2percent = ");
   Serial.println(Motor2percent);
   Serial.print("cSpeedVal_Motor1 = ");
   Serial.println(cSpeedVal_Motor1);
   Serial.print("cSpeedVal_Motor2 = ");
   Serial.println(cSpeedVal_Motor2);
   */
  delay(5000); //5 second delay

}

void loop ()   {
  for (u=0; u<5; u++) {
    level= u * 10; //level = 0 then 10, then 20 until it gets to 50% of max motor power. each set motor routine has 5 sec delay at end of it
    sample_inputs(); //check the dead man button still pressed in
    set_motor();
  }
  for (u=0; u<5; u++) {
    level= (5- u) * 10; //level = 50 then 40, then 30 then 20 until it gets to 0% of max motor power. each set motor routine has 5 sec delay at end of it
    sample_inputs();//check the dead man button still pressed in
    set_motor();
  }
}
Logged

Send Bitcoin tips to: 1L3CTDoTgrXNA5WyF77uWqt4gUdye9mezN
Send Litecoin tips to : LVtpaq6JgJAZwvnVq3ftVeHafWkcpmuR1e

Charleston, SC
Offline Offline
Full Member
***
Karma: 1
Posts: 157
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

This version compiles.  Just had to change the three lines that used the BYTE keyword.

Thanks John!  Much appreciated. It works smiley

t
Logged


Pages: [1]   Go Up
Jump to: