a

Committer:
marcodesilva
Date:
Tue Sep 28 10:42:56 2021 +0000
Revision:
0:6b67f1bb9c76
d

Who changed what in which revision?

UserRevisionLine numberNew contents of line
marcodesilva 0:6b67f1bb9c76 1 #ifndef ROBOCLAW_H
marcodesilva 0:6b67f1bb9c76 2 #define ROBOCLAW_H
marcodesilva 0:6b67f1bb9c76 3 #include "mbed.h"
marcodesilva 0:6b67f1bb9c76 4 #include "registers.h"
marcodesilva 0:6b67f1bb9c76 5 #include "UARTSerial_mio.h"
marcodesilva 0:6b67f1bb9c76 6 /** The RoboClaw class, yo ucan use the library with : http://www.ionmc.com/RoboClaw-2x15A-Motor-Controller_p_10.html
marcodesilva 0:6b67f1bb9c76 7 * Used to control one or two motors with (or not) encoders
marcodesilva 0:6b67f1bb9c76 8 * @code
marcodesilva 0:6b67f1bb9c76 9 * #include "mbed.h"
marcodesilva 0:6b67f1bb9c76 10 * #include "RoboClaw.h"
marcodesilva 0:6b67f1bb9c76 11 *
marcodesilva 0:6b67f1bb9c76 12 * RoboClaw roboclaw(115200, PA_11, PA_12);
marcodesilva 0:6b67f1bb9c76 13 *
marcodesilva 0:6b67f1bb9c76 14 * int main() {
marcodesilva 0:6b67f1bb9c76 15 * roboclaw.ForwardM1(ADR, 127);
marcodesilva 0:6b67f1bb9c76 16 * while(1);
marcodesilva 0:6b67f1bb9c76 17 * }
marcodesilva 0:6b67f1bb9c76 18 * @endcode
marcodesilva 0:6b67f1bb9c76 19 */
marcodesilva 0:6b67f1bb9c76 20
marcodesilva 0:6b67f1bb9c76 21 class RoboClaw
marcodesilva 0:6b67f1bb9c76 22 {
marcodesilva 0:6b67f1bb9c76 23 public:
marcodesilva 0:6b67f1bb9c76 24 /** Create RoboClaw instance
marcodesilva 0:6b67f1bb9c76 25 */
marcodesilva 0:6b67f1bb9c76 26 RoboClaw(uint8_t adr, int baudrate, PinName rx, PinName tx, double _read_timeout);
marcodesilva 0:6b67f1bb9c76 27
marcodesilva 0:6b67f1bb9c76 28 /** Forward and Backward functions
marcodesilva 0:6b67f1bb9c76 29 * @param address address of the device
marcodesilva 0:6b67f1bb9c76 30 * @param speed speed of the motor (between 0 and 127)
marcodesilva 0:6b67f1bb9c76 31 * @note Forward and Backward functions
marcodesilva 0:6b67f1bb9c76 32 */
marcodesilva 0:6b67f1bb9c76 33 void ForwardM1(int speed);
marcodesilva 0:6b67f1bb9c76 34 void BackwardM1(int speed);
marcodesilva 0:6b67f1bb9c76 35 void ForwardM2(int speed);
marcodesilva 0:6b67f1bb9c76 36 void BackwardM2(int speed);
marcodesilva 0:6b67f1bb9c76 37
marcodesilva 0:6b67f1bb9c76 38 /** Forward and Backward functions
marcodesilva 0:6b67f1bb9c76 39 * @param address address of the device
marcodesilva 0:6b67f1bb9c76 40 * @param speed speed of the motor (between 0 and 127)
marcodesilva 0:6b67f1bb9c76 41 * @note Forward and Backward functions, it turns the two motors
marcodesilva 0:6b67f1bb9c76 42 */
marcodesilva 0:6b67f1bb9c76 43 void Forward(int speed);
marcodesilva 0:6b67f1bb9c76 44 void Backward(int speed);
marcodesilva 0:6b67f1bb9c76 45
marcodesilva 0:6b67f1bb9c76 46 /** Read the Firmware
marcodesilva 0:6b67f1bb9c76 47 * @param address address of the device
marcodesilva 0:6b67f1bb9c76 48 */
marcodesilva 0:6b67f1bb9c76 49 void ReadFirm();
marcodesilva 0:6b67f1bb9c76 50
marcodesilva 0:6b67f1bb9c76 51 /** Read encoder and speed of M1 or M2
marcodesilva 0:6b67f1bb9c76 52 * @param address address of the device
marcodesilva 0:6b67f1bb9c76 53 * @note Read encoder in ticks
marcodesilva 0:6b67f1bb9c76 54 * @note Read speed in ticks per second
marcodesilva 0:6b67f1bb9c76 55 */
marcodesilva 0:6b67f1bb9c76 56 bool ReadEncM1(int32_t &encPulse);
marcodesilva 0:6b67f1bb9c76 57 bool ReadEncM2(int32_t &encPulse);
marcodesilva 0:6b67f1bb9c76 58 bool ReadSpeedM1(int32_t &speed);
marcodesilva 0:6b67f1bb9c76 59 bool ReadSpeedM2(int32_t &speed);
marcodesilva 0:6b67f1bb9c76 60 bool ReadCurrentM1M2(int32_t &currentM1, int32_t &currentM2);
marcodesilva 0:6b67f1bb9c76 61
marcodesilva 0:6b67f1bb9c76 62
marcodesilva 0:6b67f1bb9c76 63 /** Set both encoders to zero
marcodesilva 0:6b67f1bb9c76 64 * @param address address of the device
marcodesilva 0:6b67f1bb9c76 65 */
marcodesilva 0:6b67f1bb9c76 66 void ResetEnc();
marcodesilva 0:6b67f1bb9c76 67
marcodesilva 0:6b67f1bb9c76 68 /** Set speed of Motor with different parameter (only in ticks)
marcodesilva 0:6b67f1bb9c76 69 * @param address address of the device
marcodesilva 0:6b67f1bb9c76 70 * @note Set the Speed
marcodesilva 0:6b67f1bb9c76 71 * @note Set the Speed and Accel
marcodesilva 0:6b67f1bb9c76 72 * @note Set the Speed and Distance
marcodesilva 0:6b67f1bb9c76 73 * @note Set the Speed, Accel and Distance
marcodesilva 0:6b67f1bb9c76 74 * @note Set the Speed, Accel, Decceleration and Position
marcodesilva 0:6b67f1bb9c76 75 */
marcodesilva 0:6b67f1bb9c76 76 void SpeedM1(int32_t speed);
marcodesilva 0:6b67f1bb9c76 77 void SpeedM2(int32_t speed);
marcodesilva 0:6b67f1bb9c76 78 void SpeedAccelM1(int32_t accel, int32_t speed);
marcodesilva 0:6b67f1bb9c76 79 void SpeedAccelM2(int32_t accel, int32_t speed);
marcodesilva 0:6b67f1bb9c76 80 void SpeedAccelM1M2(int32_t accel, int32_t speed1, int32_t speed2);
marcodesilva 0:6b67f1bb9c76 81 void SpeedDistanceM1(int32_t speed, uint32_t distance, uint8_t buffer);
marcodesilva 0:6b67f1bb9c76 82 void SpeedDistanceM2(int32_t speed, uint32_t distance, uint8_t buffer);
marcodesilva 0:6b67f1bb9c76 83 void SpeedAccelDistanceM1(int32_t accel, int32_t speed, uint32_t distance, uint8_t buffer);
marcodesilva 0:6b67f1bb9c76 84 void SpeedAccelDistanceM2(int32_t accel, int32_t speed, uint32_t distance, uint8_t buffer);
marcodesilva 0:6b67f1bb9c76 85 void SpeedAccelDeccelPositionM1(uint32_t accel, int32_t speed, uint32_t deccel, int32_t position, uint8_t flag);
marcodesilva 0:6b67f1bb9c76 86 void SpeedAccelDeccelPositionM2(uint32_t accel, int32_t speed, uint32_t deccel, int32_t position, uint8_t flag);
marcodesilva 0:6b67f1bb9c76 87 void SpeedAccelDeccelPositionM1M2(uint32_t accel1,uint32_t speed1,uint32_t deccel1, int32_t position1,uint32_t accel2,uint32_t speed2,uint32_t deccel2, int32_t position2,uint8_t flag);
marcodesilva 0:6b67f1bb9c76 88
marcodesilva 0:6b67f1bb9c76 89 private:
marcodesilva 0:6b67f1bb9c76 90 UARTSerial_mio _roboclaw;
marcodesilva 0:6b67f1bb9c76 91 uint16_t crc;
marcodesilva 0:6b67f1bb9c76 92 uint8_t address;
marcodesilva 0:6b67f1bb9c76 93 void crc_clear();
marcodesilva 0:6b67f1bb9c76 94 void crc_update(uint8_t data);
marcodesilva 0:6b67f1bb9c76 95 uint16_t crc_get();
marcodesilva 0:6b67f1bb9c76 96
marcodesilva 0:6b67f1bb9c76 97 void write_n(uint8_t cnt, ...);
marcodesilva 0:6b67f1bb9c76 98 void write_(uint8_t command, uint8_t data, bool reading, bool crcon);
marcodesilva 0:6b67f1bb9c76 99
marcodesilva 0:6b67f1bb9c76 100 uint16_t crc16(uint8_t *packet, int nBytes);
marcodesilva 0:6b67f1bb9c76 101 int16_t read_(void);
marcodesilva 0:6b67f1bb9c76 102 bool read_n(uint8_t address, uint8_t cmd, int n_byte, int32_t &value);
marcodesilva 0:6b67f1bb9c76 103 void flushSerialBuffer(void);
marcodesilva 0:6b67f1bb9c76 104 void Rx_interrupt();
marcodesilva 0:6b67f1bb9c76 105 // Circular buffers for serial TX and RX data - used by interrupt routines
marcodesilva 0:6b67f1bb9c76 106 const int buffer_size = 7;
marcodesilva 0:6b67f1bb9c76 107 // might need to increase buffer size for high baud rates
marcodesilva 0:6b67f1bb9c76 108 char rx_buffer[7];
marcodesilva 0:6b67f1bb9c76 109 // Circular buffer pointers
marcodesilva 0:6b67f1bb9c76 110 // volatile makes read-modify-write atomic
marcodesilva 0:6b67f1bb9c76 111 //Timer readTimer;
marcodesilva 0:6b67f1bb9c76 112 //double readTime;
marcodesilva 0:6b67f1bb9c76 113 //double readTimePrec;
marcodesilva 0:6b67f1bb9c76 114 volatile int rx_in;
marcodesilva 0:6b67f1bb9c76 115 double read_timeout;
marcodesilva 0:6b67f1bb9c76 116 // Line buffers for sprintf and sscanf
marcodesilva 0:6b67f1bb9c76 117
marcodesilva 0:6b67f1bb9c76 118 char rx_line[80];
marcodesilva 0:6b67f1bb9c76 119 };
marcodesilva 0:6b67f1bb9c76 120
marcodesilva 0:6b67f1bb9c76 121 #endif