Library for Sabertooth motor driver ported from the oficial Arduino library. Packetized Serial Mode
I ported the official arduino library for Sabertooth dual motor drivers. In the porting process I did not used const methods as the original library does, but the functionality stays the same. I also added some methods that I find useful. According to the documentation of the driver this code should be compatible with SyRen drivers.
Diff: Sabertooth.cpp
- Revision:
- 0:70797f033fe0
- Child:
- 1:013fa8604413
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Sabertooth.cpp Mon Feb 20 11:10:08 2017 +0000 @@ -0,0 +1,141 @@ +/* +Arduino Library for SyRen/Sabertooth Packet Serial +Copyright (c) 2012-2013 Dimension Engineering LLC +http://www.dimensionengineering.com/arduino + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER +RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE +USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/* +* Ported to mbed by Litan Virgil, 2017 +* I added some features that I found useful. +* Also I removed "const" methods +*/ + +#include "Sabertooth.h" +#include "ArduinoMath.h"//compatibility with arduino math methods + +Sabertooth::Sabertooth(PinName Tx, uint8_t address, int baudrate) : _sabertoothserial(Tx, NC) { + _address = address; + _sabertoothserial.baud(baudrate); +} + +void Sabertooth::initializeComunication(void){ + wait(1.5); // wait for sabertooth to initialized + _sabertoothserial.putc(START_CHARACTER); + wait(0.5); +} + +void Sabertooth::go(int aSpeed, int bSpeed){ + motor(1, aSpeed); + motor(2, bSpeed); +} + +void Sabertooth::stop(){ + go(0, 0); +} + +void Sabertooth::goDT(int drivePower, int turnPower){ + drive(drivePower); + turn(turnPower); +} + +void Sabertooth::go(int aSpeed, int bSpeed, float secs){ + go(aSpeed, bSpeed); + timeOff.attach(callback(this,&Sabertooth::stop), secs); // time to off +} + +void Sabertooth::goDT(int drivePower, int turnPower, float secs){ + goDT(drivePower, turnPower); + timeOff.attach(callback(this,&Sabertooth::stop), secs); // time to off +} + + +void Sabertooth::command(uint8_t command, uint8_t value) { + _sabertoothserial.putc(_address); + _sabertoothserial.putc(command); + _sabertoothserial.putc(value); + _sabertoothserial.putc((_address+command+value) & 0x7f); //checksum +} + +void Sabertooth::throttleCommand(uint8_t command, int power) +{ + power = ArduinoMath::constrain(power, -126, 126); + this->command(command, (uint8_t)abs(power)); +} + +void Sabertooth::motor(int power) +{ + motor(1, power); +} + +void Sabertooth::motor(uint8_t motor, int power) +{ + if (motor < 1 || motor > 2) { return; } + throttleCommand((motor == 2 ? 4 : 0) + (power < 0 ? 1 : 0), power); +} + +void Sabertooth::drive(int power) +{ + throttleCommand(power < 0 ? 9 : 8, power); +} + +void Sabertooth::turn(int power) +{ + throttleCommand(power < 0 ? 11 : 10, power); +} + +void Sabertooth::setMinVoltage(uint8_t value) +{ + command(2, (uint8_t)ArduinoMath::min(value, 120)); +} + +void Sabertooth::setMaxVoltage(uint8_t value) +{ + command(3, (uint8_t)ArduinoMath::min(value, 127)); +} + +void Sabertooth::setDeadband(uint8_t value) +{ + command(17, (uint8_t)ArduinoMath::min(value, 127)); +} + +void Sabertooth::setRamping(uint8_t value) +{ + command(16, (uint8_t)ArduinoMath::constrain(value, 0, 80)); +} + +void Sabertooth::setTimeout(int milliseconds) +{ + command(14, (uint8_t)((ArduinoMath::constrain(milliseconds, 0, 12700) + 99) / 100)); +} + + +void Sabertooth::setBaudRate(int baudRate) +{ + uint8_t value; + switch (baudRate) + { + case 2400: value = 1; break; + case 9600: default: value = 2; break; + case 19200: value = 3; break; + case 38400: value = 4; break; + case 115200: value = 5; break; + } + command(15, value); + // Sabertooth takes about 200 ms after setting the baud rate to + // respond to commands again (it restarts). + // So, this 500 ms wait should deal with this. + wait(0.5); +} +