Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
00001 #include "mbed.h" 00002 #include "Servo.h" 00003 #include "command.h" 00004 00005 #define MAX_DATA 1800 00006 #define TIME_INTERRAPUT_US 16000 00007 00008 #define TARGETPOSITION_COMMAND 0x64 00009 #define SET_TARGETPOSITION_COMMAND 0x67 00010 #define SERVO_MOVE_COMMAND 0x58 00011 #define POWER_ON_COMMAND 0x59 00012 #define POWER_OFF_COMMAND 0x5A 00013 #define SENDDATA_COMMAND 0x05 00014 #define INIT_COMMAND 0x66 00015 00016 #define TARGETPOSITION_BYTE 7 00017 #define INIT_BYTE 6 00018 #define SERVO_MOVE_BYTE 3 00019 #define POWER_ONOFF_BYTE 3 00020 #define SENDDATA_BYTE 3 00021 00022 #define ACK 0x06 00023 #define NACK 0x15 00024 00025 Ticker flipper; 00026 Serial device(USBTX, USBRX); // tx, rx 00027 DigitalOut myLed1(LED1); 00028 DigitalOut myLed2(LED2); 00029 DigitalOut myLed3(LED3); 00030 00031 Command servo1(p21); 00032 Command servo2(p22); 00033 Command servo3(p23); 00034 Command servo4(p24); 00035 Command servo5(p25); 00036 Command servo6(p26); 00037 00038 AnalogIn ain1(p15); 00039 AnalogIn ain2(p16); 00040 AnalogIn ain3(p17); 00041 AnalogIn ain4(p18); 00042 AnalogIn ain5(p19); 00043 AnalogIn ain6(p20); 00044 00045 I2C i2c(p9,p10); 00046 00047 typedef struct{ 00048 short int target; 00049 short int preTarget; 00050 long perTime; 00051 bool moveFlag; 00052 int resolution; 00053 int positionNow; 00054 }servo_t; 00055 servo_t servo[7]; 00056 00057 void flip() { 00058 for(int it=1;it<7;it++){ 00059 if(servo[it].moveFlag==true){ 00060 servo[it].positionNow+=servo[it].resolution; 00061 if((servo[it].target-servo[it].preTarget > 0 && servo[it].positionNow-servo[it].target > 0) || (servo[it].target-servo[it].preTarget < 0 && servo[it].positionNow-servo[it].target < 0)){ 00062 servo[it].moveFlag=false; 00063 servo[it].preTarget = servo[it].target; 00064 servo[it].positionNow = servo[it].target; 00065 if(it == 1){ 00066 myLed1 = 0; 00067 }else if(it == 2){ 00068 myLed2 = 0; 00069 }else if(it == 3){ 00070 myLed3 = 0; 00071 } 00072 } 00073 switch(it){ 00074 case 1: 00075 servo1=(double)servo[it].positionNow/MAX_DATA; 00076 break; 00077 case 2: 00078 servo2=(double)servo[it].positionNow/MAX_DATA; 00079 break; 00080 case 3: 00081 servo3=(double)servo[it].positionNow/MAX_DATA; 00082 break; 00083 case 4: 00084 servo4=(double)servo[it].positionNow/MAX_DATA; 00085 break; 00086 case 5: 00087 servo5=(double)servo[it].positionNow/MAX_DATA; 00088 break; 00089 case 6: 00090 servo6=(double)servo[it].positionNow/MAX_DATA; 00091 break; 00092 } 00093 } 00094 } 00095 } 00096 00097 00098 int main() { 00099 device.baud(115200); 00100 flipper.attach_us(&flip, TIME_INTERRAPUT_US); 00101 // i2c.frequency(40000); 00102 char cmd[6]; 00103 char add[1]; 00104 char init[2]; 00105 add[0] = 0x01; 00106 init[0] = 0x2A; 00107 init[1] = 0x01; 00108 // while(i2c.write(0x3A,init,2)); 00109 00110 for(int it=0;it<7;it++){ 00111 servo[it].target=900; 00112 servo[it].perTime=0; 00113 servo[it].moveFlag=false; 00114 servo[it].preTarget=900; 00115 servo[it].resolution=0; 00116 servo[it].positionNow=900; 00117 } 00118 00119 myLed1=0; 00120 myLed2=0; 00121 myLed3=0; 00122 int valueNumber=0; 00123 int id=0; 00124 int command=0; 00125 int getValue=0; 00126 int checkSum=0; 00127 00128 while(1){ 00129 if(device.readable()){ 00130 valueNumber++; 00131 getValue = device.getc(); 00132 switch(valueNumber){ 00133 case 1: //get ID 00134 id = getValue; 00135 checkSum = getValue; 00136 break; 00137 case 2: //get command upbyte 00138 command = getValue; 00139 checkSum += getValue; 00140 break; 00141 case 3: 00142 case 4: 00143 case 5: 00144 case 6: 00145 case 7: 00146 //servo_move_command 00147 if(command == SERVO_MOVE_COMMAND){ 00148 if((valueNumber == SERVO_MOVE_BYTE && (checkSum & 0x0FF) == getValue) || valueNumber < SERVO_MOVE_BYTE){ 00149 if(0 < id && id < 7){ 00150 if(servo[id].moveFlag == true) 00151 servo[id].preTarget = servo[id].positionNow; 00152 servo[id].resolution = (servo[id].target-servo[id].preTarget)/(servo[id].perTime/(TIME_INTERRAPUT_US/1000.00000)); 00153 if(servo[id].resolution != 0){ 00154 servo[id].moveFlag = true; 00155 if(id == 1) 00156 myLed1 = 1; 00157 else if(id == 2) 00158 myLed2 = 2; 00159 else if(id == 3) 00160 myLed3 = 3; 00161 } 00162 }else if(id == 0x0FE){ 00163 for(int it=1; it<7; it++){ 00164 if(servo[it].resolution != 0){ 00165 servo[it].moveFlag = true; 00166 if(it == 1) 00167 myLed1 = 1; 00168 else if(it == 2) 00169 myLed2 = 2; 00170 else if(it == 3) 00171 myLed3 = 3; 00172 } 00173 } 00174 } 00175 if(valueNumber == SERVO_MOVE_BYTE){ 00176 device.putc(id); 00177 device.putc(ACK); //ACK 00178 valueNumber = 0; 00179 } 00180 }else{ 00181 device.putc(id); 00182 device.putc(NACK); //NACK 00183 valueNumber = 0; 00184 } 00185 } 00186 00187 00188 //senddata command check 00189 if(command == SENDDATA_COMMAND){ 00190 if((valueNumber == SENDDATA_BYTE && (checkSum & 0xFF) == getValue) || valueNumber < SENDDATA_BYTE){ 00191 myLed1 = 1; 00192 00193 /* i2c.write(0x3A,add,1); 00194 i2c.read(0x3A,cmd,6); 00195 */ 00196 00197 int send_data; 00198 switch(id){ 00199 case 1: //x 00200 // myLed1 = 1; 00201 send_data = ain1.read_u16(); 00202 device.putc(send_data >> 8); 00203 device.putc(send_data & 0xFF); 00204 break; 00205 case 2: //y 00206 send_data = ain2.read_u16(); 00207 device.putc(send_data >> 8); 00208 device.putc(send_data & 0xFF); 00209 break; 00210 case 3: //z 00211 send_data = ain3.read_u16(); 00212 device.putc(send_data >> 8); 00213 device.putc(send_data & 0xFF); 00214 break; 00215 case 4: //other 00216 send_data = ain4.read_u16(); 00217 device.putc(send_data >> 8); 00218 device.putc(send_data & 0xFF); 00219 break; 00220 case 5: //other 00221 send_data = ain5.read_u16(); 00222 device.putc(send_data >> 8); 00223 device.putc(send_data & 0xFF); 00224 break; 00225 case 6: //other 00226 send_data = ain6.read_u16(); 00227 device.putc(send_data >> 8); 00228 device.putc(send_data & 0xFF); 00229 break; 00230 default: 00231 device.putc(0); 00232 device.putc(0); 00233 device.putc(id); 00234 device.putc(NACK); //NACK 00235 valueNumber = 0; 00236 break; 00237 } 00238 00239 if(valueNumber == SENDDATA_BYTE && id<=6){ 00240 device.putc(id); 00241 device.putc(ACK); //ACK 00242 valueNumber = 0; 00243 } 00244 }else{ 00245 device.putc(0); 00246 device.putc(0); 00247 device.putc(id); 00248 device.putc(NACK); //NACK 00249 valueNumber = 0; 00250 } 00251 } 00252 00253 //power_onoff command check 00254 if(command == POWER_ON_COMMAND){ 00255 if((valueNumber == POWER_ONOFF_BYTE && (checkSum & 0xFF) == getValue) || valueNumber < POWER_ONOFF_BYTE){ 00256 switch(id){ 00257 case 1: 00258 servo1.on(); 00259 break; 00260 case 2: 00261 servo2.on(); 00262 break; 00263 case 3: 00264 servo3.on(); 00265 break; 00266 case 4: 00267 servo4.on(); 00268 break; 00269 case 5: 00270 servo5.on(); 00271 break; 00272 case 6: 00273 servo6.on(); 00274 break; 00275 default : 00276 device.putc(id); 00277 device.putc(NACK); //NACK 00278 valueNumber = 0; 00279 break; 00280 } 00281 if(valueNumber == POWER_ONOFF_BYTE){ 00282 device.putc(id); 00283 device.putc(ACK); //ACK 00284 valueNumber = 0; 00285 } 00286 }else{ 00287 device.putc(id); 00288 device.putc(NACK); //NACK 00289 valueNumber = 0; 00290 } 00291 } 00292 00293 //power_onoff command check 00294 if(command == POWER_OFF_COMMAND){ 00295 if((valueNumber == POWER_ONOFF_BYTE && (checkSum & 0xFF) == getValue) || valueNumber < POWER_ONOFF_BYTE){ 00296 switch(id){ 00297 case 1: 00298 servo1.off(); 00299 break; 00300 case 2: 00301 servo2.off(); 00302 break; 00303 case 3: 00304 servo3.off(); 00305 break; 00306 case 4: 00307 servo4.off(); 00308 break; 00309 case 5: 00310 servo5.off(); 00311 break; 00312 case 6: 00313 servo6.off(); 00314 break; 00315 default : 00316 device.putc(id); 00317 device.putc(NACK); //NACK 00318 valueNumber = 0; 00319 break; 00320 } 00321 if(valueNumber == POWER_ONOFF_BYTE){ 00322 device.putc(id); 00323 device.putc(ACK); //ACK 00324 valueNumber = 0; 00325 } 00326 }else{ 00327 device.putc(id); 00328 device.putc(NACK); //NACK 00329 valueNumber = 0; 00330 } 00331 } 00332 00333 //init command check 00334 if(command == INIT_COMMAND){ 00335 if((valueNumber == INIT_BYTE && (checkSum & 0xFF) == getValue) || valueNumber < INIT_BYTE){ 00336 switch(id){ 00337 case 1: 00338 servo1.homePosition(valueNumber,getValue); 00339 break; 00340 case 2: 00341 servo2.homePosition(valueNumber,getValue); 00342 break; 00343 case 3: 00344 servo3.homePosition(valueNumber,getValue); 00345 break; 00346 case 4: 00347 servo4.homePosition(valueNumber,getValue); 00348 break; 00349 case 5: 00350 servo5.homePosition(valueNumber,getValue); 00351 break; 00352 case 6: 00353 servo6.homePosition(valueNumber,getValue); 00354 break; 00355 default : 00356 device.putc(id); 00357 device.putc(NACK); //NACK 00358 valueNumber = 0; 00359 break; 00360 } 00361 if(valueNumber == INIT_BYTE){ 00362 device.putc(id); 00363 device.putc(ACK); //ACK 00364 valueNumber = 0; 00365 } 00366 }else{ 00367 device.putc(id); 00368 device.putc(NACK); //NACK 00369 valueNumber = 0; 00370 } 00371 } 00372 00373 //move command check 00374 if(command == TARGETPOSITION_COMMAND || command == SET_TARGETPOSITION_COMMAND){ 00375 if((valueNumber == TARGETPOSITION_BYTE && (checkSum & 0xFF) == getValue) || valueNumber < TARGETPOSITION_BYTE){ 00376 switch(id){ 00377 case 1: 00378 servo1.targetPosition(valueNumber,getValue); 00379 servo[id].target = servo1.getPosition(); 00380 servo[id].perTime = servo1.getTime(); 00381 break; 00382 case 2: 00383 servo2.targetPosition(valueNumber,getValue); 00384 servo[id].target = servo2.getPosition(); 00385 servo[id].perTime = servo2.getTime(); 00386 break; 00387 case 3: 00388 servo3.targetPosition(valueNumber,getValue); 00389 servo[id].target = servo3.getPosition(); 00390 servo[id].perTime = servo3.getTime(); 00391 break; 00392 case 4: 00393 servo4.targetPosition(valueNumber,getValue); 00394 servo[id].target = servo4.getPosition(); 00395 servo[id].perTime = servo4.getTime(); 00396 break; 00397 case 5: 00398 servo5.targetPosition(valueNumber,getValue); 00399 servo[id].target = servo5.getPosition(); 00400 servo[id].perTime = servo5.getTime(); 00401 break; 00402 case 6: 00403 servo6.targetPosition(valueNumber,getValue); 00404 servo[id].target = servo6.getPosition(); 00405 servo[id].perTime = servo6.getTime(); 00406 break; 00407 } 00408 if(valueNumber == TARGETPOSITION_BYTE){ 00409 device.putc(id); 00410 device.putc(ACK); //ACK 00411 00412 if(command == TARGETPOSITION_COMMAND){ 00413 if(servo[id].moveFlag == true) 00414 servo[id].preTarget = servo[id].positionNow; 00415 servo[id].resolution = (servo[id].target-servo[id].preTarget)/(servo[id].perTime/(TIME_INTERRAPUT_US/1000.00000)); 00416 if(servo[id].resolution != 0){ 00417 servo[id].moveFlag = true; 00418 if(id == 1) 00419 myLed1 = 1; 00420 else if(id == 2) 00421 myLed2 = 2; 00422 else if(id == 3) 00423 myLed3 = 3; 00424 } 00425 } 00426 valueNumber = 0; 00427 } 00428 }else{ 00429 device.putc(id); 00430 device.putc(NACK); //NACK 00431 valueNumber = 0; 00432 } 00433 } 00434 //plus checkSum 00435 checkSum += getValue; 00436 break; 00437 00438 } 00439 } 00440 } 00441 } 00442
Generated on Tue Jul 19 2022 02:08:10 by
1.7.2