a
Embed:
(wiki syntax)
Show/hide line numbers
RoboClaw.cpp
00001 #include "RoboClaw.h" 00002 #include <stdarg.h> 00003 00004 #define MAXTRY 1 00005 #define SetDWORDval(arg) (uint8_t)(arg>>24),(uint8_t)(arg>>16),(uint8_t)(arg>>8),(uint8_t)arg 00006 #define SetWORDval(arg) (uint8_t)(arg>>8),(uint8_t)arg 00007 00008 RoboClaw::RoboClaw(uint8_t adr, int baudrate, PinName rx, PinName tx, double _read_timeout) : _roboclaw(rx, tx){ 00009 _roboclaw.set_baud(baudrate);//_roboclaw.baud(baudrate); 00010 00011 rx_in = 0; 00012 address = adr; 00013 //readTime = 0.0; 00014 //readTimer.start(); 00015 read_timeout = _read_timeout; 00016 00017 } 00018 00019 void RoboClaw::crc_clear(){ 00020 crc = 0; 00021 } 00022 00023 00024 void RoboClaw::flushSerialBuffer(void) { 00025 char char1[1]; 00026 00027 while (_roboclaw.readable()) { 00028 _roboclaw.read_timeout(char1,1,read_timeout); 00029 } 00030 return; } 00031 00032 void RoboClaw::crc_update (uint8_t data){ 00033 int i; 00034 crc = crc ^ ((uint16_t)data << 8); 00035 for (i=0; i<8; i++) { 00036 if (crc & 0x8000) 00037 crc = (crc << 1) ^ 0x1021; 00038 else 00039 crc <<= 1; 00040 } 00041 } 00042 00043 uint16_t RoboClaw::crc_get(){ 00044 return crc; 00045 } 00046 00047 uint16_t RoboClaw::crc16(uint8_t *packet, int nBytes){ 00048 uint16_t crc_; 00049 for (int byte = 0; byte < nBytes; byte++) { 00050 crc_ = crc_ ^ ((uint16_t)packet[byte] << 8); 00051 for (uint8_t bit = 0; bit < 8; bit++) { 00052 if (crc_ & 0x8000) { 00053 crc_ = (crc_ << 1) ^ 0x1021; 00054 } else { 00055 crc_ = crc_ << 1; 00056 } 00057 } 00058 } 00059 return crc_; 00060 } 00061 00062 void RoboClaw::write_n(uint8_t cnt, ... ){ 00063 uint8_t count = 0; 00064 char dat[1]; 00065 char r_dat[1]; 00066 r_dat[0] = ' '; 00067 char crc_[2]; 00068 do { 00069 _roboclaw.flush(); 00070 00071 crc_clear(); 00072 va_list marker; 00073 va_start( marker, cnt ); 00074 for(uint8_t index=0; index<cnt; index++) { 00075 uint8_t data = va_arg(marker, unsigned int); 00076 dat[0] = data; 00077 crc_update(data); 00078 _roboclaw.write(dat,1); 00079 } 00080 va_end( marker ); 00081 uint16_t crc = crc_get(); 00082 crc_[0]=crc>>8; 00083 crc_[1]=crc; 00084 _roboclaw.write(crc_,2); 00085 _roboclaw.read_timeout(r_dat,1,read_timeout); 00086 00087 count ++; 00088 00089 }while((uint16_t)r_dat[0] != 0xFF&& count <=MAXTRY); 00090 00091 } 00092 00093 void RoboClaw::write_(uint8_t command, uint8_t data, bool reading, bool crcon){ 00094 // _roboclaw.putc(address); 00095 // _roboclaw.putc(command); 00096 00097 if(reading == false) { 00098 if(crcon == true) { 00099 uint8_t packet[2] = {address, command}; 00100 uint16_t checksum = crc16(packet,2); 00101 // _roboclaw.putc(checksum>>8); 00102 // _roboclaw.putc(checksum); 00103 } else { 00104 uint8_t packet[3] = {address, command, data}; 00105 uint16_t checksum = crc16(packet,3); 00106 // _roboclaw.putc(data); 00107 // _roboclaw.putc(checksum>>8); 00108 // _roboclaw.putc(checksum); 00109 } 00110 } 00111 } 00112 00113 bool RoboClaw::read_n(uint8_t address, uint8_t cmd, int n_byte, int32_t &value){ 00114 uint16_t read_byte[n_byte]; 00115 uint16_t received_crc; 00116 int dataRead=0; 00117 char tx_buffer[2]; 00118 00119 tx_buffer[0] = address; 00120 tx_buffer[1] = cmd; 00121 00122 rx_in = 0; 00123 crc_clear(); 00124 00125 _roboclaw.flush(); 00126 _roboclaw.write(tx_buffer,2); 00127 00128 crc_update(address); 00129 crc_update(cmd); 00130 00131 dataRead = _roboclaw.read_timeout(rx_buffer,7,read_timeout); 00132 //printf("d: %d\r\n", dataRead); 00133 //printf("add: %x, cmd: %x, 0: %x, 1: %x, 2: %x, 3: %x, 4: %x, 5: %x, 6: %x \r\n",(uint16_t)tx_buffer[0],(uint16_t)tx_buffer[1],(uint16_t)rx_buffer[0],(uint16_t)rx_buffer[1],(uint16_t)rx_buffer[2],(uint16_t)rx_buffer[3],(uint16_t)rx_buffer[4],(uint16_t)rx_buffer[5],(uint16_t)rx_buffer[6]); 00134 //printf("dopo del read\r\n"); 00135 for(int i = 0; i<=n_byte-3; i++){ 00136 crc_update((uint16_t)rx_buffer[i]); 00137 } 00138 00139 received_crc = (uint16_t)rx_buffer[n_byte-2]<<8; 00140 received_crc |= (uint16_t)rx_buffer[n_byte-1]; 00141 00142 if(received_crc == crc_get()){ 00143 value = (uint16_t)rx_buffer[0]<<24; 00144 value |= (uint16_t)rx_buffer[1]<<16; 00145 value |= (uint16_t)rx_buffer[2]<<8; 00146 value |= (uint16_t)rx_buffer[3]; 00147 return true; 00148 }else{ 00149 //printf("crc: %x \r\n", crc_get()); 00150 //printf("received crc: %x \r\n", received_crc); 00151 printf("err \r\n"); 00152 00153 00154 return false; 00155 } 00156 } 00157 00158 00159 void RoboClaw::ForwardM1(int speed){ 00160 write_(M1FORWARD,speed,false,false); 00161 } 00162 00163 void RoboClaw::BackwardM1(int speed){ 00164 write_(M1BACKWARD,speed,false,false); 00165 } 00166 00167 void RoboClaw::ForwardM2(int speed){ 00168 write_(M2FORWARD,speed,false,false); 00169 } 00170 00171 void RoboClaw::BackwardM2(int speed){ 00172 write_(M2BACKWARD,speed,false,false); 00173 } 00174 00175 void RoboClaw::Forward(int speed){ 00176 write_(MIXEDFORWARD,speed,false,false); 00177 } 00178 00179 void RoboClaw::Backward(int speed){ 00180 write_(MIXEDBACKWARD,speed,false,false); 00181 } 00182 00183 void RoboClaw::ReadFirm(){ 00184 write_(GETVERSION,0x00,true,false); 00185 } 00186 00187 bool RoboClaw::ReadEncM1(int32_t &encPulse){ 00188 int32_t value=0; 00189 if (read_n(address, GETM1ENC, 7, value) == true){ 00190 encPulse = value; 00191 return true; 00192 }else{ 00193 return false; 00194 } 00195 } 00196 00197 bool RoboClaw::ReadEncM2(int32_t &encPulse){ 00198 int32_t value=0; 00199 if (read_n(address, GETM2ENC, 7, value) == true){ 00200 encPulse = value; 00201 return true; 00202 }else{ 00203 return false; 00204 } 00205 } 00206 00207 bool RoboClaw::ReadSpeedM1(int32_t &speed){ 00208 int32_t value=0; 00209 if (read_n(address, GETM1SPEED, 7, value) == true){ 00210 speed = value; 00211 return true; 00212 }else{ 00213 return false; 00214 } 00215 } 00216 00217 bool RoboClaw::ReadSpeedM2(int32_t &speed){ 00218 int32_t value=0; 00219 if (read_n(address, GETM2SPEED, 7, value) == true){ 00220 speed = value; 00221 return true; 00222 }else{ 00223 return false; 00224 } 00225 } 00226 00227 00228 bool RoboClaw::ReadCurrentM1M2(int32_t& currentM1, int32_t& currentM2){ 00229 int32_t value=0; 00230 if (read_n(address, GETCURRENTS, 6, value) == true){ 00231 currentM1 = value>>16; 00232 currentM2 = value&0xFFFF; 00233 return true; 00234 }else{ 00235 return false; 00236 } 00237 00238 } 00239 00240 void RoboClaw::ResetEnc(){ 00241 write_n(2,address,RESETENC); 00242 } 00243 00244 void RoboClaw::SpeedM1(int32_t speed){ 00245 write_n(6,address,M1SPEED,SetDWORDval(speed)); 00246 } 00247 00248 void RoboClaw::SpeedM2(int32_t speed){ 00249 write_n(6,address,M2SPEED,SetDWORDval(speed)); 00250 } 00251 00252 void RoboClaw::SpeedAccelM1(int32_t accel, int32_t speed){ 00253 write_n(10,address,M1SPEEDACCEL,SetDWORDval(accel),SetDWORDval(speed)); 00254 } 00255 00256 void RoboClaw::SpeedAccelM2(int32_t accel, int32_t speed){ 00257 write_n(10,address,M2SPEEDACCEL,SetDWORDval(accel),SetDWORDval(speed)); 00258 } 00259 00260 void RoboClaw::SpeedAccelM1M2(int32_t accel, int32_t speed1, int32_t speed2){ 00261 write_n(14,address,MIXEDSPEEDACCEL,SetDWORDval(accel),SetDWORDval(speed1),SetDWORDval(speed2)); 00262 } 00263 00264 void RoboClaw::SpeedDistanceM1(int32_t speed, uint32_t distance, uint8_t buffer){ 00265 write_n(11,address,M1SPEEDDIST,SetDWORDval(speed),SetDWORDval(distance),buffer); 00266 } 00267 00268 void RoboClaw::SpeedDistanceM2(int32_t speed, uint32_t distance, uint8_t buffer){ 00269 write_n(11,address,M2SPEEDDIST,SetDWORDval(speed),SetDWORDval(distance),buffer); 00270 } 00271 00272 void RoboClaw::SpeedAccelDistanceM1(int32_t accel, int32_t speed, uint32_t distance, uint8_t buffer){ 00273 write_n(15,address,M1SPEEDACCELDIST,SetDWORDval(accel),SetDWORDval(speed),SetDWORDval(distance),buffer); 00274 } 00275 00276 void RoboClaw::SpeedAccelDistanceM2(int32_t accel, int32_t speed, uint32_t distance, uint8_t buffer){ 00277 write_n(15,address,M2SPEEDACCELDIST,SetDWORDval(accel),SetDWORDval(speed),SetDWORDval(distance),buffer); 00278 } 00279 00280 void RoboClaw::SpeedAccelDeccelPositionM1(uint32_t accel, int32_t speed, uint32_t deccel, int32_t position, uint8_t flag){ 00281 write_n(19,address,M1SPEEDACCELDECCELPOS,SetDWORDval(accel),SetDWORDval(speed),SetDWORDval(deccel),SetDWORDval(position),flag); 00282 } 00283 00284 void RoboClaw::SpeedAccelDeccelPositionM2(uint32_t accel, int32_t speed, uint32_t deccel, int32_t position, uint8_t flag){ 00285 write_n(19,address,M2SPEEDACCELDECCELPOS,SetDWORDval(accel),SetDWORDval(speed),SetDWORDval(deccel),SetDWORDval(position),flag); 00286 } 00287 00288 void RoboClaw::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){ 00289 write_n(35,address,MIXEDSPEEDACCELDECCELPOS,SetDWORDval(accel1),SetDWORDval(speed1),SetDWORDval(deccel1),SetDWORDval(position1),SetDWORDval(accel2),SetDWORDval(speed2),SetDWORDval(deccel2),SetDWORDval(position2),flag); 00290 } 00291
Generated on Tue Aug 16 2022 09:44:47 by 1.7.2