BE@R lab / Mbed 2 deprecated dog_V3_3_testmotor

Dependencies:   Communication_Robot QEI iSerial mbed motion_control

Fork of dog_V3_2_testmotor by BE@R lab

Committer:
soulx
Date:
Sat Jul 25 16:32:46 2015 +0000
Revision:
14:7fe99764b2d0
Parent:
13:218c22a620cc
Child:
15:40ccb6433500
Child:
16:ec0cba3631bc

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
soulx 0:2433ddae2772 1 #include "mbed.h"
soulx 0:2433ddae2772 2 #include "pin_config.h"
soulx 0:2433ddae2772 3
soulx 6:8d80c84e0c09 4 #include "communication.h"
soulx 6:8d80c84e0c09 5 #include "protocol.h"
soulx 11:336dd293daa1 6 #include "iSerial.h"
soulx 6:8d80c84e0c09 7
soulx 10:53cb691e22bf 8 #include "motor_relay.h"
soulx 10:53cb691e22bf 9 #include "motion_control.h"
soulx 10:53cb691e22bf 10
soulx 14:7fe99764b2d0 11 #include "QEI.h"
soulx 14:7fe99764b2d0 12
soulx 6:8d80c84e0c09 13 //set frequancy unit in Hz
soulx 6:8d80c84e0c09 14 #define F_UPDATE 10.0f
soulx 6:8d80c84e0c09 15 #define TIMER_UPDATE 1.0f/F_UPDATE
soulx 6:8d80c84e0c09 16
soulx 6:8d80c84e0c09 17 //counter not receive from station
soulx 6:8d80c84e0c09 18 #define TIMEOUT_RESPONE_COMMAND 5
soulx 10:53cb691e22bf 19
soulx 14:7fe99764b2d0 20 //
soulx 14:7fe99764b2d0 21 #define PULSE_RESOLUTION 500
soulx 14:7fe99764b2d0 22
soulx 10:53cb691e22bf 23 MOTION_CONTROL leg_left_upper(INA_L_U,INB_L_U,LIMIT_LU_U,LIMIT_LU_D,VR_LU);
soulx 10:53cb691e22bf 24 MOTION_CONTROL leg_left_lower(INA_L_L,INB_L_L,LIMIT_LL_U,LIMIT_LL_D,VR_LL);
soulx 10:53cb691e22bf 25 MOTION_CONTROL leg_right_upper(INA_R_U,INB_R_U,LIMIT_RU_U,LIMIT_RU_D,VR_RU);
soulx 10:53cb691e22bf 26 MOTION_CONTROL leg_right_lower(INA_R_L,INB_R_L,LIMIT_RL_U,LIMIT_RL_D,VR_RL);
soulx 10:53cb691e22bf 27
soulx 0:2433ddae2772 28 DigitalOut myled(LED1);
soulx 0:2433ddae2772 29 DigitalIn mybutton(USER_BUTTON);
soulx 0:2433ddae2772 30
soulx 6:8d80c84e0c09 31 //communication config
soulx 6:8d80c84e0c09 32 //serial for debug
soulx 13:218c22a620cc 33 Serial pc(USBTX, USBRX);
soulx 6:8d80c84e0c09 34 //serial for xbee
soulx 6:8d80c84e0c09 35 COMMUNICATION pan_a(TX_XBEE, RX_XBEE,115200,1000,1000); // tx, rx
soulx 0:2433ddae2772 36
soulx 14:7fe99764b2d0 37 QEI wheel (ENCODE_A, ENCODE_B, ENCODE_Z, PULSE_RESOLUTION);
soulx 14:7fe99764b2d0 38
soulx 11:336dd293daa1 39 //Fuction prototye
soulx 11:336dd293daa1 40 void getCommand();
soulx 11:336dd293daa1 41 // init function
soulx 11:336dd293daa1 42 void calibration();
soulx 11:336dd293daa1 43 void test_position();
soulx 12:2564eac22e0a 44 void test_status();
soulx 14:7fe99764b2d0 45 void test_sleep();
soulx 14:7fe99764b2d0 46 void test_sit();
soulx 14:7fe99764b2d0 47 void test_stand();
soulx 14:7fe99764b2d0 48
soulx 12:2564eac22e0a 49 void test_limit();
soulx 12:2564eac22e0a 50 void test_motor();
soulx 0:2433ddae2772 51
soulx 12:2564eac22e0a 52 void routine();
soulx 12:2564eac22e0a 53
soulx 13:218c22a620cc 54 void serial_control();
soulx 13:218c22a620cc 55
soulx 12:2564eac22e0a 56 void management(ANDANTE_PROTOCOL_PACKET *packet);
soulx 0:2433ddae2772 57
soulx 11:336dd293daa1 58 void copy_data(ANDANTE_PROTOCOL_PACKET *scr, ANDANTE_PROTOCOL_PACKET *dst);
soulx 0:2433ddae2772 59
soulx 6:8d80c84e0c09 60
soulx 6:8d80c84e0c09 61 //set foreground
soulx 6:8d80c84e0c09 62 Ticker Update_command;
soulx 6:8d80c84e0c09 63
soulx 11:336dd293daa1 64 Timer t;
soulx 11:336dd293daa1 65
soulx 12:2564eac22e0a 66 //struct
soulx 12:2564eac22e0a 67 struct PARAM_WRITE {
soulx 12:2564eac22e0a 68 uint16_t left_up;
soulx 12:2564eac22e0a 69 uint16_t left_down;
soulx 12:2564eac22e0a 70 uint16_t right_up;
soulx 12:2564eac22e0a 71 uint16_t right_down;
soulx 12:2564eac22e0a 72 };
soulx 12:2564eac22e0a 73
soulx 11:336dd293daa1 74 //variable
soulx 12:2564eac22e0a 75 //volatile ANDANTE_PROTOCOL_PACKET *param;
soulx 11:336dd293daa1 76 volatile uint8_t status=0;
soulx 12:2564eac22e0a 77 //volatile PARAM_WRITE buff;
soulx 12:2564eac22e0a 78 PARAM_WRITE buff;
soulx 6:8d80c84e0c09 79
soulx 13:218c22a620cc 80 int serial_data;
soulx 13:218c22a620cc 81
soulx 0:2433ddae2772 82 //Main function
soulx 0:2433ddae2772 83 int main()
soulx 0:2433ddae2772 84 {
soulx 12:2564eac22e0a 85 //int state=0;
soulx 12:2564eac22e0a 86
soulx 11:336dd293daa1 87 pc.baud(115200);
soulx 11:336dd293daa1 88 pc.printf("Welcome to DOGWHEELSCHAIR\n");
soulx 12:2564eac22e0a 89
soulx 14:7fe99764b2d0 90 buff.left_up = 63;
soulx 14:7fe99764b2d0 91 buff.right_up =63;
soulx 14:7fe99764b2d0 92 buff.left_down = 63;
soulx 14:7fe99764b2d0 93 buff.right_down = 63;
soulx 12:2564eac22e0a 94
soulx 11:336dd293daa1 95 if(mybutton == 0) {
soulx 11:336dd293daa1 96 calibration();
soulx 11:336dd293daa1 97 } else {
soulx 11:336dd293daa1 98 pc.printf("Lock position Min-Max...");
soulx 14:7fe99764b2d0 99 leg_left_upper.SetMaxPosition(62787);
soulx 14:7fe99764b2d0 100 leg_left_upper.SetMinPosition(29353);
soulx 11:336dd293daa1 101
soulx 14:7fe99764b2d0 102 leg_left_lower.SetMaxPosition(57000);
soulx 14:7fe99764b2d0 103 leg_left_lower.SetMinPosition(8200);
soulx 11:336dd293daa1 104
soulx 14:7fe99764b2d0 105 leg_right_upper.SetMaxPosition(43494);
soulx 14:7fe99764b2d0 106 leg_right_upper.SetMinPosition(12028);
soulx 11:336dd293daa1 107
soulx 14:7fe99764b2d0 108 leg_right_lower.SetMaxPosition(53383);
soulx 14:7fe99764b2d0 109 leg_right_lower.SetMinPosition(12584);
soulx 11:336dd293daa1 110 pc.printf("pass\n");
soulx 11:336dd293daa1 111 }
soulx 11:336dd293daa1 112
soulx 11:336dd293daa1 113 Update_command.attach(&getCommand,TIMER_UPDATE);
soulx 11:336dd293daa1 114
soulx 13:218c22a620cc 115 serial_control();
soulx 13:218c22a620cc 116 //test_motor();
soulx 13:218c22a620cc 117 //test_limit();
soulx 12:2564eac22e0a 118 test_status();
soulx 12:2564eac22e0a 119 routine();
soulx 11:336dd293daa1 120 }
soulx 11:336dd293daa1 121
soulx 11:336dd293daa1 122 void getCommand()
soulx 11:336dd293daa1 123 {
soulx 11:336dd293daa1 124 static uint8_t count =0;
soulx 11:336dd293daa1 125
soulx 11:336dd293daa1 126 ANDANTE_PROTOCOL_PACKET packet;
soulx 11:336dd293daa1 127
soulx 11:336dd293daa1 128 uint8_t status = pan_a.receiveCommunicatePacket(&packet);
soulx 11:336dd293daa1 129 myled=0;
soulx 11:336dd293daa1 130
soulx 11:336dd293daa1 131 if(status == ANDANTE_ERRBIT_NONE) {
soulx 11:336dd293daa1 132 if(count >2 && count <10) {
soulx 11:336dd293daa1 133 count--;
soulx 11:336dd293daa1 134 } else {
soulx 11:336dd293daa1 135 count=0;
soulx 5:f07cbb5a86c3 136 }
soulx 11:336dd293daa1 137
soulx 11:336dd293daa1 138
soulx 12:2564eac22e0a 139 //pan_a.sendCommunicatePacket(&packet);
soulx 11:336dd293daa1 140
soulx 11:336dd293daa1 141 //update command
soulx 11:336dd293daa1 142 //setControl(&packet);
soulx 11:336dd293daa1 143
soulx 12:2564eac22e0a 144
soulx 11:336dd293daa1 145 } else if(status == ANDANTE_ERRBIT_READ_TIMEOUT) {
soulx 11:336dd293daa1 146 count++;
soulx 11:336dd293daa1 147 }
soulx 5:f07cbb5a86c3 148
soulx 11:336dd293daa1 149 if(count >= TIMEOUT_RESPONE_COMMAND) {
soulx 11:336dd293daa1 150 //stop robot
soulx 11:336dd293daa1 151 count++;
soulx 11:336dd293daa1 152 myled=1;
soulx 11:336dd293daa1 153 // setSpeedControl(0.0);
soulx 11:336dd293daa1 154 }
soulx 11:336dd293daa1 155 }
soulx 0:2433ddae2772 156
soulx 11:336dd293daa1 157 void calibration()
soulx 11:336dd293daa1 158 {
soulx 11:336dd293daa1 159 //calibration
soulx 11:336dd293daa1 160 pc.printf("Calibration [START]\n");
soulx 11:336dd293daa1 161 leg_left_upper.calibration();
soulx 11:336dd293daa1 162 pc.printf("Left_UPPER\n");
soulx 11:336dd293daa1 163 pc.printf("max_position = %d\n",leg_left_upper.GetMaxPosition());
soulx 11:336dd293daa1 164 pc.printf("min_position = %d\n",leg_left_upper.GetMinPosition());
soulx 11:336dd293daa1 165 leg_left_lower.calibration();
soulx 11:336dd293daa1 166 pc.printf("Left_Lower\n");
soulx 11:336dd293daa1 167 pc.printf("max_position = %d\n",leg_left_lower.GetMaxPosition());
soulx 11:336dd293daa1 168 pc.printf("min_position = %d\n",leg_left_lower.GetMinPosition());
soulx 11:336dd293daa1 169 leg_right_upper.calibration();
soulx 11:336dd293daa1 170 pc.printf("right_UPPER\n");
soulx 11:336dd293daa1 171 pc.printf("max_position = %d\n",leg_right_upper.GetMaxPosition());
soulx 11:336dd293daa1 172 pc.printf("min_position = %d\n",leg_right_upper.GetMinPosition());
soulx 11:336dd293daa1 173 leg_right_lower.calibration();
soulx 11:336dd293daa1 174 pc.printf("right_Lower\n");
soulx 11:336dd293daa1 175 pc.printf("max_position = %d\n",leg_right_lower.GetMaxPosition());
soulx 11:336dd293daa1 176 pc.printf("min_position = %d\n",leg_right_lower.GetMinPosition());
soulx 0:2433ddae2772 177
soulx 11:336dd293daa1 178 pc.printf("Calibration [FINISH]\n");
soulx 11:336dd293daa1 179 pc.printf("RUN mode [START]\n");
soulx 11:336dd293daa1 180 wait(1);
soulx 11:336dd293daa1 181 }
soulx 11:336dd293daa1 182
soulx 11:336dd293daa1 183 void test_position()
soulx 11:336dd293daa1 184 {
soulx 11:336dd293daa1 185 uint8_t state;
soulx 11:336dd293daa1 186 do {
soulx 10:53cb691e22bf 187 /*
soulx 10:53cb691e22bf 188 state=0;
soulx 10:53cb691e22bf 189 //leg_left_upper.position_control(500);
soulx 10:53cb691e22bf 190 if(leg_left_lower.position_control(500) ==2)
soulx 10:53cb691e22bf 191 state++;
soulx 10:53cb691e22bf 192 if(leg_right_upper.position_control(500) == 2)
soulx 10:53cb691e22bf 193 state++;
soulx 10:53cb691e22bf 194 if(leg_right_lower.position_control(500) == 2)
soulx 10:53cb691e22bf 195 state++;
soulx 10:53cb691e22bf 196 */
soulx 10:53cb691e22bf 197 state = leg_left_upper.position_control(32);
soulx 10:53cb691e22bf 198 pc.printf("state_lu %d\n",state);
soulx 10:53cb691e22bf 199 state = leg_left_lower.position_control(32);
soulx 10:53cb691e22bf 200 pc.printf("state_ll %d\n",state);
soulx 10:53cb691e22bf 201 state = leg_right_upper.position_control(32);
soulx 10:53cb691e22bf 202 pc.printf("state_ru %d\n",state);
soulx 11:336dd293daa1 203 state = leg_right_lower.position_control(32);
soulx 10:53cb691e22bf 204 pc.printf("state_rl %d\n",state);
soulx 10:53cb691e22bf 205 state=0;
soulx 11:336dd293daa1 206 } while(state != 2);
soulx 10:53cb691e22bf 207 pc.printf("[Finish test]\n");
soulx 12:2564eac22e0a 208 }
soulx 12:2564eac22e0a 209
soulx 12:2564eac22e0a 210 void test_status()
soulx 14:7fe99764b2d0 211 {
soulx 12:2564eac22e0a 212 uint16_t state=0;
soulx 13:218c22a620cc 213 pc.printf("Test_status\n");
soulx 12:2564eac22e0a 214 t.start();
soulx 12:2564eac22e0a 215 while(1) {
soulx 12:2564eac22e0a 216
soulx 13:218c22a620cc 217 if(pc.readable() == 1) {
soulx 13:218c22a620cc 218 serial_data = pc.getc();
soulx 13:218c22a620cc 219 }
soulx 12:2564eac22e0a 220
soulx 12:2564eac22e0a 221 if(t.read() > 10.0f) {
soulx 12:2564eac22e0a 222 t.reset();
soulx 12:2564eac22e0a 223 if(status >3) {
soulx 12:2564eac22e0a 224 status =0;
soulx 12:2564eac22e0a 225 } else {
soulx 12:2564eac22e0a 226 status++;
soulx 12:2564eac22e0a 227 }
soulx 12:2564eac22e0a 228 }
soulx 12:2564eac22e0a 229
soulx 12:2564eac22e0a 230 if(status == 0) {
soulx 12:2564eac22e0a 231 state =0;
soulx 12:2564eac22e0a 232 // sleep
soulx 12:2564eac22e0a 233 state += leg_left_upper.position_control(0);
soulx 12:2564eac22e0a 234 state += leg_right_upper.position_control(0);
soulx 12:2564eac22e0a 235 state += leg_left_lower.position_control(64);
soulx 12:2564eac22e0a 236 state += leg_right_lower.position_control(64);
soulx 12:2564eac22e0a 237 if(state == 8) {
soulx 12:2564eac22e0a 238 myled=1;
soulx 12:2564eac22e0a 239 } else {
soulx 12:2564eac22e0a 240 myled=0;
soulx 12:2564eac22e0a 241 }
soulx 12:2564eac22e0a 242 } else if(status == 1 || status ==3) {
soulx 12:2564eac22e0a 243 state =0;
soulx 12:2564eac22e0a 244 // sit
soulx 12:2564eac22e0a 245 state += leg_left_upper.position_control(64);
soulx 12:2564eac22e0a 246 state += leg_right_upper.position_control(64);
soulx 12:2564eac22e0a 247 state += leg_left_lower.position_control(64);
soulx 12:2564eac22e0a 248 state += leg_right_lower.position_control(64);
soulx 12:2564eac22e0a 249 if(state == 8) {
soulx 12:2564eac22e0a 250 myled=1;
soulx 12:2564eac22e0a 251 } else {
soulx 12:2564eac22e0a 252 myled=0;
soulx 12:2564eac22e0a 253 }
soulx 12:2564eac22e0a 254 } else if(status == 2) {
soulx 12:2564eac22e0a 255 state =0;
soulx 12:2564eac22e0a 256 // stand
soulx 12:2564eac22e0a 257 state += leg_left_upper.position_control(64);
soulx 12:2564eac22e0a 258 state += leg_right_upper.position_control(64);
soulx 12:2564eac22e0a 259 state += leg_left_lower.position_control(0);
soulx 12:2564eac22e0a 260 state += leg_right_lower.position_control(0);
soulx 12:2564eac22e0a 261 if(state == 8) {
soulx 12:2564eac22e0a 262 myled=1;
soulx 12:2564eac22e0a 263 } else {
soulx 12:2564eac22e0a 264 myled=0;
soulx 12:2564eac22e0a 265 }
soulx 12:2564eac22e0a 266 }
soulx 12:2564eac22e0a 267 }
soulx 12:2564eac22e0a 268 //t.stop();
soulx 12:2564eac22e0a 269 }
soulx 12:2564eac22e0a 270
soulx 12:2564eac22e0a 271 void management(ANDANTE_PROTOCOL_PACKET *packet)
soulx 12:2564eac22e0a 272 {
soulx 12:2564eac22e0a 273 switch(packet->instructionErrorId) {
soulx 12:2564eac22e0a 274 case 0x01:
soulx 12:2564eac22e0a 275 buff.left_up = Utilities::ConvertUInt8ArrayToInt16(packet->parameter);
soulx 12:2564eac22e0a 276 break;
soulx 12:2564eac22e0a 277 case 0x02:
soulx 12:2564eac22e0a 278 buff.left_down = Utilities::ConvertUInt8ArrayToInt16(packet->parameter);
soulx 12:2564eac22e0a 279 break;
soulx 12:2564eac22e0a 280 case 0x03:
soulx 12:2564eac22e0a 281 buff.right_up = Utilities::ConvertUInt8ArrayToInt16(packet->parameter);
soulx 12:2564eac22e0a 282 break;
soulx 12:2564eac22e0a 283 case 0x04:
soulx 12:2564eac22e0a 284 buff.right_down = Utilities::ConvertUInt8ArrayToInt16(packet->parameter);
soulx 12:2564eac22e0a 285 break;
soulx 12:2564eac22e0a 286 }
soulx 12:2564eac22e0a 287 }
soulx 12:2564eac22e0a 288
soulx 12:2564eac22e0a 289 void routine()
soulx 12:2564eac22e0a 290 {
soulx 12:2564eac22e0a 291 uint8_t state=0;
soulx 12:2564eac22e0a 292 // PARAM_WRITE pos = buff;
soulx 12:2564eac22e0a 293 while(1) {
soulx 12:2564eac22e0a 294 state =0;
soulx 12:2564eac22e0a 295 // sit
soulx 12:2564eac22e0a 296 state += leg_left_upper.position_control(buff.left_up);
soulx 12:2564eac22e0a 297 state += leg_right_upper.position_control(buff.right_up);
soulx 12:2564eac22e0a 298 state += leg_left_lower.position_control(buff.left_down);
soulx 12:2564eac22e0a 299 state += leg_right_lower.position_control(buff.right_down);
soulx 12:2564eac22e0a 300 if(state == 8) {
soulx 12:2564eac22e0a 301 myled=1;
soulx 12:2564eac22e0a 302 } else {
soulx 12:2564eac22e0a 303 myled=0;
soulx 12:2564eac22e0a 304 }
soulx 12:2564eac22e0a 305 }
soulx 12:2564eac22e0a 306 }
soulx 12:2564eac22e0a 307
soulx 12:2564eac22e0a 308 void test_limit()
soulx 12:2564eac22e0a 309 {
soulx 12:2564eac22e0a 310 pc.printf("TEST LIMIT ALL\n");
soulx 13:218c22a620cc 311 t.start();
soulx 14:7fe99764b2d0 312 // while(1) {
soulx 13:218c22a620cc 313 if(t.read() > 1.0f) {
soulx 13:218c22a620cc 314 t.reset();
soulx 13:218c22a620cc 315 pc.printf("leftUP_limit_up = ");
soulx 13:218c22a620cc 316 if(leg_left_upper.GetLimitUp() == 1)
soulx 13:218c22a620cc 317 pc.printf("shot\n");
soulx 13:218c22a620cc 318 else
soulx 13:218c22a620cc 319 pc.printf("open\n");
soulx 12:2564eac22e0a 320
soulx 13:218c22a620cc 321 pc.printf("leftUP_limit_down = ");
soulx 13:218c22a620cc 322 if(leg_left_upper.GetLimitDown() == 1)
soulx 13:218c22a620cc 323 pc.printf("shot\n");
soulx 13:218c22a620cc 324 else
soulx 13:218c22a620cc 325 pc.printf("open\n");
soulx 12:2564eac22e0a 326
soulx 13:218c22a620cc 327 pc.printf("leftLOW_limit_up = ");
soulx 13:218c22a620cc 328 if(leg_left_lower.GetLimitUp() == 1)
soulx 13:218c22a620cc 329 pc.printf("shot\n");
soulx 13:218c22a620cc 330 else
soulx 13:218c22a620cc 331 pc.printf("open\n");
soulx 12:2564eac22e0a 332
soulx 13:218c22a620cc 333 pc.printf("leftLow_limit_down = ");
soulx 13:218c22a620cc 334 if(leg_left_lower.GetLimitDown() == 1)
soulx 13:218c22a620cc 335 pc.printf("shot\n");
soulx 13:218c22a620cc 336 else
soulx 13:218c22a620cc 337 pc.printf("open\n");
soulx 12:2564eac22e0a 338
soulx 12:2564eac22e0a 339 ///////////////////////////////////////////////////////////////
soulx 13:218c22a620cc 340 pc.printf("rightUP_limit_up = ");
soulx 13:218c22a620cc 341 if(leg_right_upper.GetLimitUp() == 1)
soulx 13:218c22a620cc 342 pc.printf("shot\n");
soulx 13:218c22a620cc 343 else
soulx 13:218c22a620cc 344 pc.printf("open\n");
soulx 12:2564eac22e0a 345
soulx 13:218c22a620cc 346 pc.printf("rightUP_limit_down = ");
soulx 13:218c22a620cc 347 if(leg_right_upper.GetLimitDown() == 1)
soulx 13:218c22a620cc 348 pc.printf("shot\n");
soulx 13:218c22a620cc 349 else
soulx 13:218c22a620cc 350 pc.printf("open\n");
soulx 12:2564eac22e0a 351
soulx 13:218c22a620cc 352 pc.printf("rightLOW_limit_up = ");
soulx 13:218c22a620cc 353 if(leg_right_lower.GetLimitUp() == 1)
soulx 13:218c22a620cc 354 pc.printf("shot\n");
soulx 13:218c22a620cc 355 else
soulx 13:218c22a620cc 356 pc.printf("open\n");
soulx 12:2564eac22e0a 357
soulx 13:218c22a620cc 358 pc.printf("rightLow_limit_down = ");
soulx 13:218c22a620cc 359 if(leg_right_lower.GetLimitDown() == 1)
soulx 13:218c22a620cc 360 pc.printf("shot\n");
soulx 13:218c22a620cc 361 else
soulx 13:218c22a620cc 362 pc.printf("open\n");
soulx 12:2564eac22e0a 363
soulx 13:218c22a620cc 364 pc.printf("\n\n");
soulx 13:218c22a620cc 365 }
soulx 14:7fe99764b2d0 366 // }
soulx 14:7fe99764b2d0 367 t.stop();
soulx 12:2564eac22e0a 368 }
soulx 12:2564eac22e0a 369
soulx 12:2564eac22e0a 370 void test_motor()
soulx 12:2564eac22e0a 371 {
soulx 12:2564eac22e0a 372 uint8_t state=0;
soulx 12:2564eac22e0a 373
soulx 12:2564eac22e0a 374 pc.printf("TEST MOTOR DELAY\n");
soulx 12:2564eac22e0a 375 t.start();
soulx 12:2564eac22e0a 376 while(1) {
soulx 12:2564eac22e0a 377 if(t.read() > 1.5f) {
soulx 12:2564eac22e0a 378 t.reset();
soulx 12:2564eac22e0a 379 if(state >1) {
soulx 12:2564eac22e0a 380 state =0;
soulx 12:2564eac22e0a 381 } else {
soulx 12:2564eac22e0a 382 state++;
soulx 12:2564eac22e0a 383 }
soulx 12:2564eac22e0a 384 }
soulx 12:2564eac22e0a 385
soulx 12:2564eac22e0a 386 if(state ==0) {
soulx 12:2564eac22e0a 387 leg_left_upper.limit_motor(1);
soulx 12:2564eac22e0a 388 leg_right_upper.limit_motor(1);
soulx 12:2564eac22e0a 389 leg_left_lower.limit_motor(1);
soulx 12:2564eac22e0a 390 leg_right_lower.limit_motor(1);
soulx 12:2564eac22e0a 391 } else {
soulx 12:2564eac22e0a 392 {
soulx 12:2564eac22e0a 393 leg_left_upper.limit_motor(2);
soulx 12:2564eac22e0a 394 leg_right_upper.limit_motor(2);
soulx 12:2564eac22e0a 395 leg_left_lower.limit_motor(2);
soulx 12:2564eac22e0a 396 leg_right_lower.limit_motor(2);
soulx 12:2564eac22e0a 397 }
soulx 12:2564eac22e0a 398 }
soulx 12:2564eac22e0a 399 }
soulx 13:218c22a620cc 400 }
soulx 13:218c22a620cc 401
soulx 13:218c22a620cc 402 void serial_control()
soulx 13:218c22a620cc 403 {
soulx 13:218c22a620cc 404
soulx 14:7fe99764b2d0 405 uint16_t left_up=63;
soulx 13:218c22a620cc 406 uint16_t left_down=0;
soulx 14:7fe99764b2d0 407 uint16_t right_up=63;
soulx 13:218c22a620cc 408 uint16_t right_down=0;
soulx 13:218c22a620cc 409
soulx 14:7fe99764b2d0 410 uint16_t offset_ll=11400;
soulx 14:7fe99764b2d0 411 uint16_t offset_rl=17800;
soulx 13:218c22a620cc 412
soulx 13:218c22a620cc 413 uint8_t state=0;
soulx 13:218c22a620cc 414
soulx 13:218c22a620cc 415 t.start();
soulx 13:218c22a620cc 416
soulx 13:218c22a620cc 417 while(1) {
soulx 13:218c22a620cc 418 if(pc.readable() == 1) {
soulx 13:218c22a620cc 419 serial_data = pc.getc();
soulx 13:218c22a620cc 420 }
soulx 13:218c22a620cc 421
soulx 13:218c22a620cc 422 switch(serial_data) {
soulx 13:218c22a620cc 423 case 'q':
soulx 14:7fe99764b2d0 424 if(left_up >=63) {
soulx 13:218c22a620cc 425 left_up= 63;
soulx 13:218c22a620cc 426 } else {
soulx 13:218c22a620cc 427 left_up++;
soulx 13:218c22a620cc 428 }
soulx 14:7fe99764b2d0 429 serial_data=0;
soulx 13:218c22a620cc 430 break;
soulx 13:218c22a620cc 431
soulx 13:218c22a620cc 432 case 'a':
soulx 14:7fe99764b2d0 433 if(left_up >=63 || left_up <=0) {
soulx 13:218c22a620cc 434 left_up= 0;
soulx 13:218c22a620cc 435 } else {
soulx 13:218c22a620cc 436 left_up--;
soulx 13:218c22a620cc 437 }
soulx 14:7fe99764b2d0 438 serial_data=0;
soulx 13:218c22a620cc 439 break;
soulx 13:218c22a620cc 440
soulx 13:218c22a620cc 441 case 'z':
soulx 14:7fe99764b2d0 442 if(left_up >=53) {
soulx 13:218c22a620cc 443 left_up= 63;
soulx 13:218c22a620cc 444 } else {
soulx 13:218c22a620cc 445 left_up+=10;
soulx 13:218c22a620cc 446 }
soulx 14:7fe99764b2d0 447 serial_data=0;
soulx 13:218c22a620cc 448 break;
soulx 13:218c22a620cc 449
soulx 13:218c22a620cc 450 case 'Z':
soulx 14:7fe99764b2d0 451 if(left_up >=53 || left_up <=10) {
soulx 13:218c22a620cc 452 left_up= 0;
soulx 13:218c22a620cc 453 } else {
soulx 13:218c22a620cc 454 left_up-=10;
soulx 13:218c22a620cc 455 }
soulx 14:7fe99764b2d0 456 serial_data=0;
soulx 13:218c22a620cc 457 break;
soulx 13:218c22a620cc 458
soulx 13:218c22a620cc 459 case 'w':
soulx 14:7fe99764b2d0 460 if(left_down >=63) {
soulx 13:218c22a620cc 461 left_down= 63;
soulx 13:218c22a620cc 462 } else {
soulx 13:218c22a620cc 463 left_down++;
soulx 13:218c22a620cc 464 }
soulx 14:7fe99764b2d0 465 serial_data=0;
soulx 13:218c22a620cc 466 break;
soulx 13:218c22a620cc 467
soulx 13:218c22a620cc 468 case 's':
soulx 14:7fe99764b2d0 469 if(left_down >=63 || left_down <=0) {
soulx 13:218c22a620cc 470 left_down= 0;
soulx 13:218c22a620cc 471 } else {
soulx 13:218c22a620cc 472 left_down--;
soulx 13:218c22a620cc 473 }
soulx 14:7fe99764b2d0 474 serial_data=0;
soulx 13:218c22a620cc 475 break;
soulx 13:218c22a620cc 476
soulx 13:218c22a620cc 477 case 'x':
soulx 14:7fe99764b2d0 478 if(left_down >=53) {
soulx 13:218c22a620cc 479 left_down= 63;
soulx 13:218c22a620cc 480 } else {
soulx 13:218c22a620cc 481 left_down+=10;
soulx 13:218c22a620cc 482 }
soulx 14:7fe99764b2d0 483 serial_data=0;
soulx 13:218c22a620cc 484 break;
soulx 13:218c22a620cc 485
soulx 13:218c22a620cc 486 case 'X':
soulx 14:7fe99764b2d0 487 if(left_down >=53 || left_down <=10) {
soulx 13:218c22a620cc 488 left_down= 0;
soulx 13:218c22a620cc 489 } else {
soulx 13:218c22a620cc 490 left_down-=10;
soulx 13:218c22a620cc 491 }
soulx 14:7fe99764b2d0 492 serial_data=0;
soulx 13:218c22a620cc 493 break;
soulx 13:218c22a620cc 494
soulx 13:218c22a620cc 495
soulx 13:218c22a620cc 496 case 'e':
soulx 14:7fe99764b2d0 497 if(right_up >=63) {
soulx 13:218c22a620cc 498 right_up= 63;
soulx 13:218c22a620cc 499 } else {
soulx 13:218c22a620cc 500 right_up++;
soulx 13:218c22a620cc 501 }
soulx 14:7fe99764b2d0 502 serial_data=0;
soulx 13:218c22a620cc 503 break;
soulx 13:218c22a620cc 504
soulx 13:218c22a620cc 505 case 'd':
soulx 14:7fe99764b2d0 506 if(right_up >=63 || right_up <=0) {
soulx 13:218c22a620cc 507 right_up= 0;
soulx 13:218c22a620cc 508 } else {
soulx 13:218c22a620cc 509 right_up--;
soulx 13:218c22a620cc 510 }
soulx 14:7fe99764b2d0 511 serial_data=0;
soulx 13:218c22a620cc 512 break;
soulx 13:218c22a620cc 513
soulx 13:218c22a620cc 514 case 'c':
soulx 14:7fe99764b2d0 515 if(right_up >=53) {
soulx 13:218c22a620cc 516 right_up= 63;
soulx 13:218c22a620cc 517 } else {
soulx 13:218c22a620cc 518 right_up+=10;
soulx 13:218c22a620cc 519 }
soulx 14:7fe99764b2d0 520 serial_data=0;
soulx 13:218c22a620cc 521 break;
soulx 13:218c22a620cc 522
soulx 13:218c22a620cc 523 case 'C':
soulx 14:7fe99764b2d0 524 if(right_up >=53 || right_up <=10) {
soulx 13:218c22a620cc 525 right_up= 0;
soulx 13:218c22a620cc 526 } else {
soulx 13:218c22a620cc 527 right_up-=10;
soulx 13:218c22a620cc 528 }
soulx 14:7fe99764b2d0 529 serial_data=0;
soulx 13:218c22a620cc 530 break;
soulx 13:218c22a620cc 531
soulx 13:218c22a620cc 532
soulx 13:218c22a620cc 533
soulx 13:218c22a620cc 534
soulx 13:218c22a620cc 535 case 'r':
soulx 14:7fe99764b2d0 536 if(right_down >=63) {
soulx 13:218c22a620cc 537 right_down= 63;
soulx 13:218c22a620cc 538 } else {
soulx 13:218c22a620cc 539 right_down++;
soulx 13:218c22a620cc 540 }
soulx 14:7fe99764b2d0 541 serial_data=0;
soulx 13:218c22a620cc 542 break;
soulx 13:218c22a620cc 543
soulx 13:218c22a620cc 544 case 'f':
soulx 14:7fe99764b2d0 545 if(right_down >=63 || right_down <=0) {
soulx 13:218c22a620cc 546 right_down= 0;
soulx 13:218c22a620cc 547 } else {
soulx 13:218c22a620cc 548 right_down--;
soulx 13:218c22a620cc 549 }
soulx 14:7fe99764b2d0 550 serial_data=0;
soulx 14:7fe99764b2d0 551
soulx 13:218c22a620cc 552 break;
soulx 13:218c22a620cc 553
soulx 13:218c22a620cc 554 case 'v':
soulx 14:7fe99764b2d0 555 if(right_down >=53) {
soulx 13:218c22a620cc 556 right_down= 63;
soulx 13:218c22a620cc 557 } else {
soulx 13:218c22a620cc 558 right_down+=10;
soulx 13:218c22a620cc 559 }
soulx 14:7fe99764b2d0 560 serial_data=0;
soulx 14:7fe99764b2d0 561
soulx 13:218c22a620cc 562 break;
soulx 13:218c22a620cc 563
soulx 13:218c22a620cc 564 case 'V':
soulx 14:7fe99764b2d0 565 if(right_down >=53 || right_down <=10) {
soulx 13:218c22a620cc 566 right_down= 0;
soulx 13:218c22a620cc 567 } else {
soulx 13:218c22a620cc 568 right_down-=10;
soulx 13:218c22a620cc 569 }
soulx 14:7fe99764b2d0 570 serial_data=0;
soulx 13:218c22a620cc 571 break;
soulx 13:218c22a620cc 572
soulx 13:218c22a620cc 573 case 'p':
soulx 13:218c22a620cc 574 test_status();
soulx 13:218c22a620cc 575 break;
soulx 13:218c22a620cc 576
soulx 14:7fe99764b2d0 577 case '7':
soulx 14:7fe99764b2d0 578 test_sleep();
soulx 14:7fe99764b2d0 579 break;
soulx 14:7fe99764b2d0 580
soulx 14:7fe99764b2d0 581 case '8':
soulx 14:7fe99764b2d0 582 test_sit();
soulx 14:7fe99764b2d0 583 break;
soulx 14:7fe99764b2d0 584
soulx 14:7fe99764b2d0 585 case '9':
soulx 14:7fe99764b2d0 586 test_stand();
soulx 14:7fe99764b2d0 587 break;
soulx 14:7fe99764b2d0 588
soulx 13:218c22a620cc 589 case 'y':
soulx 13:218c22a620cc 590 if(offset_ll > 30000) {
soulx 13:218c22a620cc 591 offset_ll =30000;
soulx 13:218c22a620cc 592 } else {
soulx 13:218c22a620cc 593
soulx 13:218c22a620cc 594 offset_ll+=100;
soulx 13:218c22a620cc 595 }
soulx 13:218c22a620cc 596 leg_left_lower.SetOffset(offset_ll);
soulx 14:7fe99764b2d0 597 serial_data=0;
soulx 13:218c22a620cc 598 break;
soulx 13:218c22a620cc 599
soulx 13:218c22a620cc 600 case 'h':
soulx 13:218c22a620cc 601 if(offset_ll <= 100) {
soulx 13:218c22a620cc 602 offset_ll =0;
soulx 13:218c22a620cc 603 } else {
soulx 13:218c22a620cc 604
soulx 13:218c22a620cc 605 offset_ll-=100;
soulx 13:218c22a620cc 606 }
soulx 13:218c22a620cc 607 leg_left_lower.SetOffset(offset_ll);
soulx 14:7fe99764b2d0 608 serial_data=0;
soulx 13:218c22a620cc 609 break;
soulx 13:218c22a620cc 610
soulx 13:218c22a620cc 611 case 'u':
soulx 13:218c22a620cc 612 if(offset_rl > 30000) {
soulx 13:218c22a620cc 613 offset_rl =30000;
soulx 13:218c22a620cc 614 } else {
soulx 13:218c22a620cc 615
soulx 13:218c22a620cc 616 offset_rl+=100;
soulx 13:218c22a620cc 617 }
soulx 13:218c22a620cc 618 leg_right_lower.SetOffset(offset_rl);
soulx 14:7fe99764b2d0 619 serial_data=0;
soulx 13:218c22a620cc 620 break;
soulx 13:218c22a620cc 621
soulx 13:218c22a620cc 622 case 'j':
soulx 13:218c22a620cc 623 if(offset_rl <= 100) {
soulx 13:218c22a620cc 624 offset_rl =0;
soulx 13:218c22a620cc 625 } else {
soulx 13:218c22a620cc 626
soulx 13:218c22a620cc 627 offset_rl-=100;
soulx 13:218c22a620cc 628 }
soulx 13:218c22a620cc 629 leg_right_lower.SetOffset(offset_rl);
soulx 14:7fe99764b2d0 630 serial_data=0;
soulx 13:218c22a620cc 631 break;
soulx 13:218c22a620cc 632
soulx 14:7fe99764b2d0 633 case '0':
soulx 13:218c22a620cc 634 leg_left_lower.SetMode(0);
soulx 13:218c22a620cc 635 leg_right_lower.SetMode(0);
soulx 13:218c22a620cc 636 pc.printf("MODE 0:ON\n");
soulx 14:7fe99764b2d0 637 serial_data=0;
soulx 13:218c22a620cc 638 break;
soulx 13:218c22a620cc 639 case '1':
soulx 13:218c22a620cc 640 leg_left_lower.SetMode(1);
soulx 13:218c22a620cc 641 leg_right_lower.SetMode(1);
soulx 13:218c22a620cc 642 pc.printf("MODE 1:ON\n");
soulx 14:7fe99764b2d0 643 serial_data=0;
soulx 13:218c22a620cc 644 break;
soulx 13:218c22a620cc 645 case '2':
soulx 13:218c22a620cc 646 leg_left_lower.SetMode(2);
soulx 13:218c22a620cc 647 leg_right_lower.SetMode(2);
soulx 13:218c22a620cc 648 pc.printf("MODE 2:ON\n");
soulx 14:7fe99764b2d0 649 serial_data=0;
soulx 14:7fe99764b2d0 650 break;
soulx 14:7fe99764b2d0 651 case '5':
soulx 14:7fe99764b2d0 652 wheel.reset();
soulx 14:7fe99764b2d0 653 serial_data=0;
soulx 14:7fe99764b2d0 654 break;
soulx 14:7fe99764b2d0 655
soulx 14:7fe99764b2d0 656 case '[':
soulx 14:7fe99764b2d0 657 test_limit();
soulx 13:218c22a620cc 658 break;
soulx 13:218c22a620cc 659 }
soulx 13:218c22a620cc 660
soulx 14:7fe99764b2d0 661 if(t.read() > 0.7f) {
soulx 13:218c22a620cc 662 t.reset();
soulx 13:218c22a620cc 663 pc.printf("left_up %d\n",left_up);
soulx 13:218c22a620cc 664 pc.printf("left_down %d\n",left_down);
soulx 13:218c22a620cc 665 pc.printf("right_up %d\n",right_up);
soulx 13:218c22a620cc 666 pc.printf("right_down %d\n",right_down);
soulx 13:218c22a620cc 667 pc.printf("offset_ll %d\n",offset_ll);
soulx 13:218c22a620cc 668 pc.printf("offset_rl %d\n",offset_rl);
soulx 14:7fe99764b2d0 669 pc.printf("Pulses is: %i\n", wheel.getPulses());
soulx 13:218c22a620cc 670 pc.printf("\n");
soulx 13:218c22a620cc 671
soulx 13:218c22a620cc 672 }
soulx 14:7fe99764b2d0 673 //serial_data=0;
soulx 13:218c22a620cc 674 state =0;
soulx 13:218c22a620cc 675
soulx 14:7fe99764b2d0 676 if(serial_data ==0) {
soulx 14:7fe99764b2d0 677 state += leg_left_upper.position_control(left_up);
soulx 14:7fe99764b2d0 678 state += leg_right_upper.position_control(right_up);
soulx 14:7fe99764b2d0 679 state += leg_left_lower.position_control(left_down);
soulx 14:7fe99764b2d0 680 state += leg_right_lower.position_control(right_down);
soulx 14:7fe99764b2d0 681 if(state == 8) {
soulx 14:7fe99764b2d0 682 myled=1;
soulx 14:7fe99764b2d0 683 } else {
soulx 14:7fe99764b2d0 684 myled=0;
soulx 14:7fe99764b2d0 685 }
soulx 13:218c22a620cc 686 }
soulx 13:218c22a620cc 687 }
soulx 14:7fe99764b2d0 688 }
soulx 14:7fe99764b2d0 689
soulx 14:7fe99764b2d0 690 void test_limit_motor(uint8_t dirction)
soulx 14:7fe99764b2d0 691 {
soulx 14:7fe99764b2d0 692 int state;
soulx 14:7fe99764b2d0 693 while(1) {
soulx 14:7fe99764b2d0 694 state = leg_left_upper.limit_motor(dirction);
soulx 14:7fe99764b2d0 695 pc.printf("state_lu %d\n",state);
soulx 14:7fe99764b2d0 696 state = leg_left_lower.limit_motor(dirction);
soulx 14:7fe99764b2d0 697 pc.printf("state_ll %d\n",state);
soulx 14:7fe99764b2d0 698 state = leg_right_upper.limit_motor(dirction);
soulx 14:7fe99764b2d0 699 pc.printf("state_ru %d\n",state);
soulx 14:7fe99764b2d0 700 state = leg_right_lower.limit_motor(dirction);
soulx 14:7fe99764b2d0 701 pc.printf("state_rl %d\n",state);
soulx 14:7fe99764b2d0 702 }
soulx 14:7fe99764b2d0 703 }
soulx 14:7fe99764b2d0 704
soulx 14:7fe99764b2d0 705 void test_sit()
soulx 14:7fe99764b2d0 706 {
soulx 14:7fe99764b2d0 707 uint16_t state=0;
soulx 14:7fe99764b2d0 708 // pc.printf("Test_sit\n");
soulx 14:7fe99764b2d0 709 //t.start();
soulx 14:7fe99764b2d0 710 // while(1) {
soulx 14:7fe99764b2d0 711 // sit
soulx 14:7fe99764b2d0 712 state += leg_left_upper.position_control(64);
soulx 14:7fe99764b2d0 713 state += leg_right_upper.position_control(64);
soulx 14:7fe99764b2d0 714 state += leg_left_lower.position_control(64);
soulx 14:7fe99764b2d0 715 state += leg_right_lower.position_control(64);
soulx 14:7fe99764b2d0 716 if(state == 8) {
soulx 14:7fe99764b2d0 717 myled=1;
soulx 14:7fe99764b2d0 718 } else {
soulx 14:7fe99764b2d0 719 myled=0;
soulx 14:7fe99764b2d0 720 }
soulx 14:7fe99764b2d0 721
soulx 14:7fe99764b2d0 722 // }
soulx 14:7fe99764b2d0 723 }
soulx 14:7fe99764b2d0 724
soulx 14:7fe99764b2d0 725 void test_stand()
soulx 14:7fe99764b2d0 726 {
soulx 14:7fe99764b2d0 727 uint16_t state=0;
soulx 14:7fe99764b2d0 728 // pc.printf("Test_stand\n");
soulx 14:7fe99764b2d0 729 // t.start();
soulx 14:7fe99764b2d0 730 // while(1) {
soulx 14:7fe99764b2d0 731
soulx 14:7fe99764b2d0 732 // stand
soulx 14:7fe99764b2d0 733 state += leg_left_upper.position_control(64);
soulx 14:7fe99764b2d0 734 state += leg_right_upper.position_control(64);
soulx 14:7fe99764b2d0 735 state += leg_left_lower.position_control(0);
soulx 14:7fe99764b2d0 736 state += leg_right_lower.position_control(0);
soulx 14:7fe99764b2d0 737 if(state == 8) {
soulx 14:7fe99764b2d0 738 myled=1;
soulx 14:7fe99764b2d0 739 } else {
soulx 14:7fe99764b2d0 740 myled=0;
soulx 14:7fe99764b2d0 741 }
soulx 14:7fe99764b2d0 742 // }
soulx 14:7fe99764b2d0 743 }
soulx 14:7fe99764b2d0 744
soulx 14:7fe99764b2d0 745 void test_sleep()
soulx 14:7fe99764b2d0 746 {
soulx 14:7fe99764b2d0 747 uint16_t state=0;
soulx 14:7fe99764b2d0 748 // pc.printf("Test_sleep\n");
soulx 14:7fe99764b2d0 749 // t.start();
soulx 14:7fe99764b2d0 750 // while(1) {
soulx 14:7fe99764b2d0 751
soulx 14:7fe99764b2d0 752 // sleep
soulx 14:7fe99764b2d0 753 state += leg_left_upper.position_control(0);
soulx 14:7fe99764b2d0 754 state += leg_right_upper.position_control(0);
soulx 14:7fe99764b2d0 755 state += leg_left_lower.position_control(64);
soulx 14:7fe99764b2d0 756 state += leg_right_lower.position_control(64);
soulx 14:7fe99764b2d0 757 if(state == 8) {
soulx 14:7fe99764b2d0 758 myled=1;
soulx 14:7fe99764b2d0 759 } else {
soulx 14:7fe99764b2d0 760 myled=0;
soulx 14:7fe99764b2d0 761 }
soulx 14:7fe99764b2d0 762 // }
soulx 6:8d80c84e0c09 763 }