Guillaume Chauvon
/
Asserve12
asser1
commande_moteurs.cpp@2:5764f89a27f6, 2019-04-17 (annotated)
- Committer:
- GuillaumeCH
- Date:
- Wed Apr 17 18:55:22 2019 +0000
- Revision:
- 2:5764f89a27f6
- Child:
- 3:1dba6eca01ad
p
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
GuillaumeCH | 2:5764f89a27f6 | 1 | |
GuillaumeCH | 2:5764f89a27f6 | 2 | #include "mbed.h" |
GuillaumeCH | 2:5764f89a27f6 | 3 | |
GuillaumeCH | 2:5764f89a27f6 | 4 | #include "commande_moteurs.h" |
GuillaumeCH | 2:5764f89a27f6 | 5 | #include "hardware.h" |
GuillaumeCH | 2:5764f89a27f6 | 6 | #include "reglages.h" |
GuillaumeCH | 2:5764f89a27f6 | 7 | #include "math_precalc.h" |
GuillaumeCH | 2:5764f89a27f6 | 8 | |
GuillaumeCH | 2:5764f89a27f6 | 9 | #include "odometrie.h" |
GuillaumeCH | 2:5764f89a27f6 | 10 | |
GuillaumeCH | 2:5764f89a27f6 | 11 | |
GuillaumeCH | 2:5764f89a27f6 | 12 | void commande_vitesse(float vitesse_G,float vitesse_D){ //fonction pour commander les moteurs sans avoir à utiliser set_PWM |
GuillaumeCH | 2:5764f89a27f6 | 13 | |
GuillaumeCH | 2:5764f89a27f6 | 14 | int sens_G=signe(vitesse_G); |
GuillaumeCH | 2:5764f89a27f6 | 15 | int sens_D=signe(vitesse_D); |
GuillaumeCH | 2:5764f89a27f6 | 16 | double vitesse_local_G=abs(vitesse_G); |
GuillaumeCH | 2:5764f89a27f6 | 17 | double vitesse_local_D=abs(vitesse_D); |
GuillaumeCH | 2:5764f89a27f6 | 18 | |
GuillaumeCH | 2:5764f89a27f6 | 19 | if(abs(vitesse_G) > 900){ |
GuillaumeCH | 2:5764f89a27f6 | 20 | vitesse_local_G=900; |
GuillaumeCH | 2:5764f89a27f6 | 21 | } |
GuillaumeCH | 2:5764f89a27f6 | 22 | if(abs(vitesse_G)<10){ |
GuillaumeCH | 2:5764f89a27f6 | 23 | vitesse_local_G=10; |
GuillaumeCH | 2:5764f89a27f6 | 24 | } |
GuillaumeCH | 2:5764f89a27f6 | 25 | if(abs(vitesse_D) > 900){ |
GuillaumeCH | 2:5764f89a27f6 | 26 | vitesse_local_D=900; |
GuillaumeCH | 2:5764f89a27f6 | 27 | } |
GuillaumeCH | 2:5764f89a27f6 | 28 | if(abs(vitesse_D)< 10){ |
GuillaumeCH | 2:5764f89a27f6 | 29 | vitesse_local_D=10; |
GuillaumeCH | 2:5764f89a27f6 | 30 | |
GuillaumeCH | 2:5764f89a27f6 | 31 | } |
GuillaumeCH | 2:5764f89a27f6 | 32 | ; |
GuillaumeCH | 2:5764f89a27f6 | 33 | int VG_int = (int) vitesse_local_G*sens_G*COEFF_MOTEUR_G; |
GuillaumeCH | 2:5764f89a27f6 | 34 | int VD_int = (int) vitesse_local_D*sens_D*COEFF_MOTEUR_D; |
GuillaumeCH | 2:5764f89a27f6 | 35 | float VG_f = vitesse_local_G*sens_G*COEFF_MOTEUR_G; |
GuillaumeCH | 2:5764f89a27f6 | 36 | float VD_f = vitesse_local_D*sens_D*COEFF_MOTEUR_D; |
GuillaumeCH | 2:5764f89a27f6 | 37 | float centieme_D = (VD_f-VD_int)*1000; |
GuillaumeCH | 2:5764f89a27f6 | 38 | float centieme_G = (VG_f-VG_int)*1000; |
GuillaumeCH | 2:5764f89a27f6 | 39 | if ((rand()%1000) < centieme_G){ |
GuillaumeCH | 2:5764f89a27f6 | 40 | VG_int+=1; |
GuillaumeCH | 2:5764f89a27f6 | 41 | } |
GuillaumeCH | 2:5764f89a27f6 | 42 | if ((rand()%1000) < centieme_D){ |
GuillaumeCH | 2:5764f89a27f6 | 43 | VD_int+=1; |
GuillaumeCH | 2:5764f89a27f6 | 44 | } |
GuillaumeCH | 2:5764f89a27f6 | 45 | printf("vitesseG : %f, vitesseD : %f, %d, %d", VG_f, VD_f, VG_int, VD_int); |
GuillaumeCH | 2:5764f89a27f6 | 46 | set_PWM_moteur_G(VD_int);//le branchements des moteurs est à vérifier ( fonctionne dans l'état actuel du robots |
GuillaumeCH | 2:5764f89a27f6 | 47 | set_PWM_moteur_D(VG_int);// |
GuillaumeCH | 2:5764f89a27f6 | 48 | } |
GuillaumeCH | 2:5764f89a27f6 | 49 | void vitesse_nulle_G(int zero){ |
GuillaumeCH | 2:5764f89a27f6 | 50 | if(zero == 0){ |
GuillaumeCH | 2:5764f89a27f6 | 51 | set_PWM_moteur_G(0); |
GuillaumeCH | 2:5764f89a27f6 | 52 | } |
GuillaumeCH | 2:5764f89a27f6 | 53 | } |
GuillaumeCH | 2:5764f89a27f6 | 54 | void vitesse_nulle_D(int zero){ |
GuillaumeCH | 2:5764f89a27f6 | 55 | if(zero == 0){ |
GuillaumeCH | 2:5764f89a27f6 | 56 | set_PWM_moteur_D(0); |
GuillaumeCH | 2:5764f89a27f6 | 57 | } |
GuillaumeCH | 2:5764f89a27f6 | 58 | } |
GuillaumeCH | 2:5764f89a27f6 | 59 | void reculer_un_peu(int distance){ |
GuillaumeCH | 2:5764f89a27f6 | 60 | motors_on(); |
GuillaumeCH | 2:5764f89a27f6 | 61 | long int x_ini = get_x_actuel(); |
GuillaumeCH | 2:5764f89a27f6 | 62 | long int y_ini = get_y_actuel(); |
GuillaumeCH | 2:5764f89a27f6 | 63 | double angle_vise_deg = get_angle(); |
GuillaumeCH | 2:5764f89a27f6 | 64 | double angle_vise=angle_vise_deg*3.142/180; |
GuillaumeCH | 2:5764f89a27f6 | 65 | double angle = get_angle(); |
GuillaumeCH | 2:5764f89a27f6 | 66 | |
GuillaumeCH | 2:5764f89a27f6 | 67 | long int x_local_ini = x_ini*cos(angle_vise) + y_ini*sin(angle_vise); |
GuillaumeCH | 2:5764f89a27f6 | 68 | long int y_local_ini = y_ini*cos(angle_vise) - x_ini*sin(angle_vise); |
GuillaumeCH | 2:5764f89a27f6 | 69 | |
GuillaumeCH | 2:5764f89a27f6 | 70 | long int x_actuel = get_x_actuel(); |
GuillaumeCH | 2:5764f89a27f6 | 71 | long int y_actuel = get_y_actuel(); |
GuillaumeCH | 2:5764f89a27f6 | 72 | long int x_local = x_actuel*cos(angle_vise) + y_actuel*sin(angle_vise)-x_local_ini; |
GuillaumeCH | 2:5764f89a27f6 | 73 | long int y_local = y_actuel*cos(angle_vise) - x_actuel*sin(angle_vise)-y_local_ini; |
GuillaumeCH | 2:5764f89a27f6 | 74 | |
GuillaumeCH | 2:5764f89a27f6 | 75 | float vitesse_G; |
GuillaumeCH | 2:5764f89a27f6 | 76 | float vitesse_D; |
GuillaumeCH | 2:5764f89a27f6 | 77 | |
GuillaumeCH | 2:5764f89a27f6 | 78 | angle = get_angle(); |
GuillaumeCH | 2:5764f89a27f6 | 79 | |
GuillaumeCH | 2:5764f89a27f6 | 80 | printf("YOOOO\n\n "); |
GuillaumeCH | 2:5764f89a27f6 | 81 | while (distance+x_local>0){ |
GuillaumeCH | 2:5764f89a27f6 | 82 | |
GuillaumeCH | 2:5764f89a27f6 | 83 | vitesse_G = (distance+x_local)/70; |
GuillaumeCH | 2:5764f89a27f6 | 84 | vitesse_D = vitesse_G; |
GuillaumeCH | 2:5764f89a27f6 | 85 | if(vitesse_G >150){ |
GuillaumeCH | 2:5764f89a27f6 | 86 | vitesse_G=150; |
GuillaumeCH | 2:5764f89a27f6 | 87 | vitesse_D=150; |
GuillaumeCH | 2:5764f89a27f6 | 88 | } |
GuillaumeCH | 2:5764f89a27f6 | 89 | if (vitesse_G<-150){ |
GuillaumeCH | 2:5764f89a27f6 | 90 | vitesse_G=-150; |
GuillaumeCH | 2:5764f89a27f6 | 91 | vitesse_D=-150; |
GuillaumeCH | 2:5764f89a27f6 | 92 | } |
GuillaumeCH | 2:5764f89a27f6 | 93 | |
GuillaumeCH | 2:5764f89a27f6 | 94 | angle = get_angle(); |
GuillaumeCH | 2:5764f89a27f6 | 95 | vitesse_G = vitesse_G - 1.5*diff_angle(angle_vise_deg,angle) - 0.015*y_local; // petit asser en angle |
GuillaumeCH | 2:5764f89a27f6 | 96 | vitesse_D = vitesse_D + 1.5*diff_angle(angle_vise_deg,angle) + 0.015*y_local; |
GuillaumeCH | 2:5764f89a27f6 | 97 | |
GuillaumeCH | 2:5764f89a27f6 | 98 | commande_vitesse(-vitesse_G,-vitesse_D); |
GuillaumeCH | 2:5764f89a27f6 | 99 | actualise_position(); |
GuillaumeCH | 2:5764f89a27f6 | 100 | x_actuel = get_x_actuel(); |
GuillaumeCH | 2:5764f89a27f6 | 101 | y_actuel = get_y_actuel(); |
GuillaumeCH | 2:5764f89a27f6 | 102 | x_local = x_actuel*cos(angle_vise) + y_actuel*sin(angle_vise)-x_local_ini; |
GuillaumeCH | 2:5764f89a27f6 | 103 | y_local = y_actuel*cos(angle_vise) - x_actuel*sin(angle_vise)-y_local_ini; |
GuillaumeCH | 2:5764f89a27f6 | 104 | printf(" VG : %f VD : %f ; x_local : %d, y_local : %d, angle_vise : %f",vitesse_G,vitesse_D, x_local,y_local, angle_vise);// sqrt((x_ini - x_actuel)*(x_ini - x_actuel) + (y_ini - y_actuel)*(y_ini - y_actuel)), y_actuel, (x_actuel - x_ini)*(x_actuel - x_ini) + (y_actuel - y_ini)*(y_actuel - y_ini)); |
GuillaumeCH | 2:5764f89a27f6 | 105 | |
GuillaumeCH | 2:5764f89a27f6 | 106 | } |
GuillaumeCH | 2:5764f89a27f6 | 107 | test_rotation_abs(angle_vise_deg); |
GuillaumeCH | 2:5764f89a27f6 | 108 | vitesse_nulle_G(0); |
GuillaumeCH | 2:5764f89a27f6 | 109 | vitesse_nulle_D(0); |
GuillaumeCH | 2:5764f89a27f6 | 110 | wait(0.3); |
GuillaumeCH | 2:5764f89a27f6 | 111 | motors_stop(); |
GuillaumeCH | 2:5764f89a27f6 | 112 | } |
GuillaumeCH | 2:5764f89a27f6 | 113 | |
GuillaumeCH | 2:5764f89a27f6 | 114 | void ligne_droite(long int distance) |
GuillaumeCH | 2:5764f89a27f6 | 115 | { |
GuillaumeCH | 2:5764f89a27f6 | 116 | // le robot avance en ligne droite sur une distance donnée, à la vitesse voulue (entre 0 et 900) |
GuillaumeCH | 2:5764f89a27f6 | 117 | motors_on(); |
GuillaumeCH | 2:5764f89a27f6 | 118 | long int x_ini = get_x_actuel(); |
GuillaumeCH | 2:5764f89a27f6 | 119 | long int y_ini = get_y_actuel(); |
GuillaumeCH | 2:5764f89a27f6 | 120 | double angle_vise_deg = get_angle(); |
GuillaumeCH | 2:5764f89a27f6 | 121 | double angle_vise=angle_vise_deg*3.142/180; |
GuillaumeCH | 2:5764f89a27f6 | 122 | double angle = get_angle(); |
GuillaumeCH | 2:5764f89a27f6 | 123 | |
GuillaumeCH | 2:5764f89a27f6 | 124 | long int x_local_ini = x_ini*cos(angle_vise) + y_ini*sin(angle_vise); |
GuillaumeCH | 2:5764f89a27f6 | 125 | long int y_local_ini = y_ini*cos(angle_vise) - x_ini*sin(angle_vise); |
GuillaumeCH | 2:5764f89a27f6 | 126 | |
GuillaumeCH | 2:5764f89a27f6 | 127 | long int x_actuel = get_x_actuel(); |
GuillaumeCH | 2:5764f89a27f6 | 128 | long int y_actuel = get_y_actuel(); |
GuillaumeCH | 2:5764f89a27f6 | 129 | long int x_local = x_actuel*cos(angle_vise) + y_actuel*sin(angle_vise)-x_local_ini; |
GuillaumeCH | 2:5764f89a27f6 | 130 | long int y_local = y_actuel*cos(angle_vise) - x_actuel*sin(angle_vise)-y_local_ini; |
GuillaumeCH | 2:5764f89a27f6 | 131 | |
GuillaumeCH | 2:5764f89a27f6 | 132 | float vitesse_G; |
GuillaumeCH | 2:5764f89a27f6 | 133 | float vitesse_D; |
GuillaumeCH | 2:5764f89a27f6 | 134 | |
GuillaumeCH | 2:5764f89a27f6 | 135 | angle = get_angle(); |
GuillaumeCH | 2:5764f89a27f6 | 136 | |
GuillaumeCH | 2:5764f89a27f6 | 137 | printf("YOOOO\n\n "); |
GuillaumeCH | 2:5764f89a27f6 | 138 | while (distance-x_local>0){ |
GuillaumeCH | 2:5764f89a27f6 | 139 | |
GuillaumeCH | 2:5764f89a27f6 | 140 | vitesse_G = (distance-x_local)/70; |
GuillaumeCH | 2:5764f89a27f6 | 141 | vitesse_D = vitesse_G; |
GuillaumeCH | 2:5764f89a27f6 | 142 | if(vitesse_G >400){ |
GuillaumeCH | 2:5764f89a27f6 | 143 | vitesse_G=400; |
GuillaumeCH | 2:5764f89a27f6 | 144 | vitesse_D=400; |
GuillaumeCH | 2:5764f89a27f6 | 145 | } |
GuillaumeCH | 2:5764f89a27f6 | 146 | if (vitesse_G<-400){ |
GuillaumeCH | 2:5764f89a27f6 | 147 | vitesse_G=-400; |
GuillaumeCH | 2:5764f89a27f6 | 148 | vitesse_D=-400; |
GuillaumeCH | 2:5764f89a27f6 | 149 | } |
GuillaumeCH | 2:5764f89a27f6 | 150 | |
GuillaumeCH | 2:5764f89a27f6 | 151 | angle = get_angle(); |
GuillaumeCH | 2:5764f89a27f6 | 152 | vitesse_G = vitesse_G + 1.5*diff_angle(angle_vise_deg,angle) + 0.015*y_local; // petit asser en angle |
GuillaumeCH | 2:5764f89a27f6 | 153 | vitesse_D = vitesse_D - 1.5*diff_angle(angle_vise_deg,angle) - 0.015*y_local; |
GuillaumeCH | 2:5764f89a27f6 | 154 | |
GuillaumeCH | 2:5764f89a27f6 | 155 | commande_vitesse(vitesse_G,vitesse_D); |
GuillaumeCH | 2:5764f89a27f6 | 156 | actualise_position(); |
GuillaumeCH | 2:5764f89a27f6 | 157 | x_actuel = get_x_actuel(); |
GuillaumeCH | 2:5764f89a27f6 | 158 | y_actuel = get_y_actuel(); |
GuillaumeCH | 2:5764f89a27f6 | 159 | x_local = x_actuel*cos(angle_vise) + y_actuel*sin(angle_vise)-x_local_ini; |
GuillaumeCH | 2:5764f89a27f6 | 160 | y_local = y_actuel*cos(angle_vise) - x_actuel*sin(angle_vise)-y_local_ini; |
GuillaumeCH | 2:5764f89a27f6 | 161 | printf(" VG : %f VD : %f ; x_local : %d, y_local : %d, angle_vise : %f",vitesse_G,vitesse_D, x_local,y_local, angle_vise);// sqrt((x_ini - x_actuel)*(x_ini - x_actuel) + (y_ini - y_actuel)*(y_ini - y_actuel)), y_actuel, (x_actuel - x_ini)*(x_actuel - x_ini) + (y_actuel - y_ini)*(y_actuel - y_ini)); |
GuillaumeCH | 2:5764f89a27f6 | 162 | |
GuillaumeCH | 2:5764f89a27f6 | 163 | } |
GuillaumeCH | 2:5764f89a27f6 | 164 | test_rotation_abs(angle_vise_deg); |
GuillaumeCH | 2:5764f89a27f6 | 165 | vitesse_nulle_G(0); |
GuillaumeCH | 2:5764f89a27f6 | 166 | vitesse_nulle_D(0); |
GuillaumeCH | 2:5764f89a27f6 | 167 | wait(0.3); |
GuillaumeCH | 2:5764f89a27f6 | 168 | motors_stop(); |
GuillaumeCH | 2:5764f89a27f6 | 169 | } |
GuillaumeCH | 2:5764f89a27f6 | 170 | |
GuillaumeCH | 2:5764f89a27f6 | 171 | void test_rotation_rel(double angle_vise) |
GuillaumeCH | 2:5764f89a27f6 | 172 | { |
GuillaumeCH | 2:5764f89a27f6 | 173 | // rotation de angle_vise |
GuillaumeCH | 2:5764f89a27f6 | 174 | motors_on(); |
GuillaumeCH | 2:5764f89a27f6 | 175 | float vitesse; |
GuillaumeCH | 2:5764f89a27f6 | 176 | double angle = get_angle(); |
GuillaumeCH | 2:5764f89a27f6 | 177 | angle_vise+=angle; |
GuillaumeCH | 2:5764f89a27f6 | 178 | borne_angle_d(angle_vise); |
GuillaumeCH | 2:5764f89a27f6 | 179 | |
GuillaumeCH | 2:5764f89a27f6 | 180 | while (abs(diff_angle(angle,angle_vise))>0.08) |
GuillaumeCH | 2:5764f89a27f6 | 181 | { |
GuillaumeCH | 2:5764f89a27f6 | 182 | vitesse=1.3*diff_angle(angle,angle_vise); |
GuillaumeCH | 2:5764f89a27f6 | 183 | commande_vitesse(-vitesse,vitesse); |
GuillaumeCH | 2:5764f89a27f6 | 184 | actualise_position(); |
GuillaumeCH | 2:5764f89a27f6 | 185 | angle = get_angle(); |
GuillaumeCH | 2:5764f89a27f6 | 186 | printf("vitesse : %f", vitesse); |
GuillaumeCH | 2:5764f89a27f6 | 187 | } |
GuillaumeCH | 2:5764f89a27f6 | 188 | |
GuillaumeCH | 2:5764f89a27f6 | 189 | //printf(" x et y recu : %lf, %ld. distance parcourue : %ld ", sqrt((x_ini - x_actuel)*(x_ini - x_actuel) + (y_ini - y_actuel)*(y_ini - y_actuel)), y_actuel, (x_actuel - x_ini)*(x_actuel - x_ini) + (y_actuel - y_ini)*(y_actuel - y_ini)); |
GuillaumeCH | 2:5764f89a27f6 | 190 | |
GuillaumeCH | 2:5764f89a27f6 | 191 | vitesse_nulle_G(0); |
GuillaumeCH | 2:5764f89a27f6 | 192 | vitesse_nulle_D(0); |
GuillaumeCH | 2:5764f89a27f6 | 193 | wait(0.2); |
GuillaumeCH | 2:5764f89a27f6 | 194 | motors_stop(); |
GuillaumeCH | 2:5764f89a27f6 | 195 | } |
GuillaumeCH | 2:5764f89a27f6 | 196 | |
GuillaumeCH | 2:5764f89a27f6 | 197 | |
GuillaumeCH | 2:5764f89a27f6 | 198 | void test_rotation_abs(double angle_vise) |
GuillaumeCH | 2:5764f89a27f6 | 199 | { |
GuillaumeCH | 2:5764f89a27f6 | 200 | double angle_rel = borne_angle_d(angle_vise-get_angle()); |
GuillaumeCH | 2:5764f89a27f6 | 201 | test_rotation_rel(angle_rel); |
GuillaumeCH | 2:5764f89a27f6 | 202 | } |