Mechatro5 / Mbed OS LINE_TRACE_CAR

Dependencies:   BMX055 Motor Way

Committer:
yasunorihirakawa
Date:
Thu Jan 16 05:13:02 2020 +0000
Revision:
10:cea77ea5af93
Parent:
8:1c1c72c69af4
Child:
11:5ae0c22d5473
aa

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yasunorihirakawa 4:5588f67b8c48 1 //本命
Arima 0:532ef32974cf 2 #include "mbed.h"
yasunorihirakawa 1:bb85c9fe1ba3 3 #include "motor.h"
153r173067 5:17314fc7b175 4 #include "BMX055.h"
yasunorihirakawa 6:c024519cce11 5 #include "way.h"
yasunorihirakawa 1:bb85c9fe1ba3 6
yasunorihirakawa 6:c024519cce11 7 BMX055 bmx(D0, D1);
yasunorihirakawa 6:c024519cce11 8 DigitalIn button(D2);
yasunorihirakawa 1:bb85c9fe1ba3 9 DigitalOut motor_mode(D9);
yasunorihirakawa 3:efc081576a33 10 DigitalOut LED(D10);
yasunorihirakawa 6:c024519cce11 11 Motor motorL(D5, D6);
yasunorihirakawa 6:c024519cce11 12 Motor motorR(D3, D4);
yasunorihirakawa 6:c024519cce11 13 InterruptIn pg1(D12);
yasunorihirakawa 6:c024519cce11 14 InterruptIn pg2(D11);
yasunorihirakawa 3:efc081576a33 15 AnalogIn reflectorFL(A6);
yasunorihirakawa 3:efc081576a33 16 AnalogIn reflectorFM(A3);
yasunorihirakawa 3:efc081576a33 17 AnalogIn reflectorFR(A2);
yasunorihirakawa 3:efc081576a33 18 AnalogIn reflectorBL(A1);
yasunorihirakawa 3:efc081576a33 19 AnalogIn reflectorBR(A0);
153r173067 5:17314fc7b175 20
yasunorihirakawa 1:bb85c9fe1ba3 21 Thread thread_trace;
yasunorihirakawa 1:bb85c9fe1ba3 22 Thread thread_motor;
153r173067 5:17314fc7b175 23 Thread sensor_thread;
153r173067 5:17314fc7b175 24
yasunorihirakawa 10:cea77ea5af93 25 const float INTVAL_REFLECTOR(0.01);//0.01);
153r173067 5:17314fc7b175 26 const float INTVAL_MOTOR(0.25);
yasunorihirakawa 1:bb85c9fe1ba3 27
yasunorihirakawa 6:c024519cce11 28 const float pi = 3.14159265359;
yasunorihirakawa 6:c024519cce11 29 const float gear_ratio = 1 / 38.2;
yasunorihirakawa 10:cea77ea5af93 30 const float tire_size = 0.057 / 2;
yasunorihirakawa 6:c024519cce11 31
yasunorihirakawa 1:bb85c9fe1ba3 32 float dist = 0.0;
yasunorihirakawa 4:5588f67b8c48 33 float x = 0.0;
yasunorihirakawa 4:5588f67b8c48 34 float y = 0.0;
153r173067 5:17314fc7b175 35 float fast_rpm = 0;
yasunorihirakawa 2:09ea66e396c1 36 float standard_rpm = 0;
153r173067 5:17314fc7b175 37 float slow_rpm = 0;
153r173067 5:17314fc7b175 38
153r173067 5:17314fc7b175 39 bool lock = false;
yasunorihirakawa 1:bb85c9fe1ba3 40
yasunorihirakawa 1:bb85c9fe1ba3 41 void count_pg1()
yasunorihirakawa 1:bb85c9fe1ba3 42 {
yasunorihirakawa 1:bb85c9fe1ba3 43 motorL.count();
yasunorihirakawa 1:bb85c9fe1ba3 44 }
yasunorihirakawa 1:bb85c9fe1ba3 45
yasunorihirakawa 1:bb85c9fe1ba3 46 void count_pg2()
yasunorihirakawa 1:bb85c9fe1ba3 47 {
yasunorihirakawa 1:bb85c9fe1ba3 48 motorR.count();
153r173067 5:17314fc7b175 49 }
yasunorihirakawa 1:bb85c9fe1ba3 50
yasunorihirakawa 1:bb85c9fe1ba3 51 void line_trace()
Arima 0:532ef32974cf 52 {
yasunorihirakawa 3:efc081576a33 53 //const float fast_rpm = 0;
yasunorihirakawa 3:efc081576a33 54 //const float standard_rpm = 0;
yasunorihirakawa 3:efc081576a33 55 //const float slow_rpm = 0;
yasunorihirakawa 4:5588f67b8c48 56 static float gap_pre = 0.0;
yasunorihirakawa 6:c024519cce11 57 const float KP = 850;
yasunorihirakawa 10:cea77ea5af93 58 const float KD = 0;
yasunorihirakawa 7:ce2920da874b 59 const float K = 0.01;
yasunorihirakawa 1:bb85c9fe1ba3 60 const int L = 0;
yasunorihirakawa 1:bb85c9fe1ba3 61 const int R = 1;
153r173067 5:17314fc7b175 62
yasunorihirakawa 1:bb85c9fe1ba3 63 int flag;
153r173067 5:17314fc7b175 64
yasunorihirakawa 4:5588f67b8c48 65 motorL.Set_phase(L);
yasunorihirakawa 4:5588f67b8c48 66 motorR.Set_phase(R);
153r173067 5:17314fc7b175 67
153r173067 5:17314fc7b175 68 float target_azimuth = 0.0;
153r173067 5:17314fc7b175 69 float current_azimuth = 0.0;
153r173067 5:17314fc7b175 70 float curvature = 0.0;
153r173067 5:17314fc7b175 71 float tread = 0.097;
yasunorihirakawa 10:cea77ea5af93 72
yasunorihirakawa 10:cea77ea5af93 73 fast_rpm = 1200;
yasunorihirakawa 10:cea77ea5af93 74 standard_rpm = 1200;
yasunorihirakawa 10:cea77ea5af93 75 slow_rpm = 1200;
153r173067 5:17314fc7b175 76
yasunorihirakawa 6:c024519cce11 77 while (1)
153r173067 5:17314fc7b175 78 {
yasunorihirakawa 10:cea77ea5af93 79 /*if(reflectorFL > 0.1)
153r173067 5:17314fc7b175 80 {
yasunorihirakawa 10:cea77ea5af93 81 flag = L;
153r173067 5:17314fc7b175 82 }
yasunorihirakawa 10:cea77ea5af93 83 if(reflectorFR > 0.1)
yasunorihirakawa 6:c024519cce11 84 {
yasunorihirakawa 10:cea77ea5af93 85 flag = R;
yasunorihirakawa 10:cea77ea5af93 86 }*/
yasunorihirakawa 10:cea77ea5af93 87 if( reflectorFM<=0.4 && reflectorBL<=0.1 && reflectorBR<=0.1 )//&& reflectorFL<=0.1 && reflectorFR<=0.1 )
yasunorihirakawa 10:cea77ea5af93 88 {
yasunorihirakawa 10:cea77ea5af93 89 if( flag == L )
yasunorihirakawa 6:c024519cce11 90 {
yasunorihirakawa 10:cea77ea5af93 91 motorL.Set_phase(L);
yasunorihirakawa 10:cea77ea5af93 92 motorL.Set_target(0);
yasunorihirakawa 10:cea77ea5af93 93 motorR.Set_phase(R);
yasunorihirakawa 10:cea77ea5af93 94 motorR.Set_target(slow_rpm);
yasunorihirakawa 10:cea77ea5af93 95 //printf("turnL\n");
yasunorihirakawa 6:c024519cce11 96 }
yasunorihirakawa 6:c024519cce11 97 else
yasunorihirakawa 6:c024519cce11 98 {
yasunorihirakawa 10:cea77ea5af93 99 motorL.Set_phase(L);
yasunorihirakawa 10:cea77ea5af93 100 motorL.Set_target(slow_rpm);
yasunorihirakawa 10:cea77ea5af93 101 motorR.Set_phase(R);
yasunorihirakawa 10:cea77ea5af93 102 motorR.Set_target(0);
yasunorihirakawa 10:cea77ea5af93 103 //printf("turnR\n");
yasunorihirakawa 10:cea77ea5af93 104 }
yasunorihirakawa 6:c024519cce11 105 }
yasunorihirakawa 6:c024519cce11 106 else
yasunorihirakawa 6:c024519cce11 107 {
yasunorihirakawa 10:cea77ea5af93 108 if( reflectorFM > 0.4 )
yasunorihirakawa 6:c024519cce11 109 {
yasunorihirakawa 6:c024519cce11 110 motorL.Set_phase(L);
yasunorihirakawa 6:c024519cce11 111 motorL.Set_target(fast_rpm);
yasunorihirakawa 6:c024519cce11 112 motorR.Set_phase(R);
yasunorihirakawa 6:c024519cce11 113 motorR.Set_target(fast_rpm);
yasunorihirakawa 6:c024519cce11 114 }
yasunorihirakawa 6:c024519cce11 115 else
yasunorihirakawa 6:c024519cce11 116 {
yasunorihirakawa 10:cea77ea5af93 117 if( reflectorBL.read() >= reflectorBR.read() )
yasunorihirakawa 6:c024519cce11 118 {
yasunorihirakawa 10:cea77ea5af93 119 float voltage_gap = reflectorBL.read() - reflectorBR.read();
yasunorihirakawa 10:cea77ea5af93 120 motorR.Set_phase(R);
yasunorihirakawa 10:cea77ea5af93 121 motorR.Set_target(standard_rpm + KP * voltage_gap + KD * (voltage_gap - gap_pre));
yasunorihirakawa 6:c024519cce11 122 motorL.Set_phase(L);
yasunorihirakawa 10:cea77ea5af93 123 motorL.Set_target(standard_rpm - KP * voltage_gap + KD * (voltage_gap - gap_pre));
yasunorihirakawa 10:cea77ea5af93 124 gap_pre = voltage_gap;
yasunorihirakawa 10:cea77ea5af93 125 flag = L;
yasunorihirakawa 6:c024519cce11 126 }
yasunorihirakawa 6:c024519cce11 127 else
yasunorihirakawa 6:c024519cce11 128 {
yasunorihirakawa 10:cea77ea5af93 129 float voltage_gap = reflectorBR.read() - reflectorBL.read();
yasunorihirakawa 6:c024519cce11 130 motorR.Set_phase(R);
yasunorihirakawa 10:cea77ea5af93 131 motorR.Set_target(standard_rpm - KP * voltage_gap + KD * (voltage_gap - gap_pre));
yasunorihirakawa 10:cea77ea5af93 132 motorL.Set_phase(L);
yasunorihirakawa 10:cea77ea5af93 133 motorL.Set_target(standard_rpm + KP * voltage_gap + KD * (voltage_gap - gap_pre));
yasunorihirakawa 10:cea77ea5af93 134 gap_pre = voltage_gap;
yasunorihirakawa 10:cea77ea5af93 135 flag = R;
yasunorihirakawa 6:c024519cce11 136 }
yasunorihirakawa 6:c024519cce11 137 }
yasunorihirakawa 10:cea77ea5af93 138 }
153r173067 5:17314fc7b175 139
yasunorihirakawa 10:cea77ea5af93 140 /*
yasunorihirakawa 4:5588f67b8c48 141 float gap_min = 0.0;
yasunorihirakawa 4:5588f67b8c48 142 int i_min = 0;
yasunorihirakawa 6:c024519cce11 143 for (int i = 0; i < 478; i++)
yasunorihirakawa 4:5588f67b8c48 144 {
yasunorihirakawa 6:c024519cce11 145 float dist_gap = dist - way[i][2];
153r173067 5:17314fc7b175 146 if (dist_gap < gap_min)
yasunorihirakawa 1:bb85c9fe1ba3 147 {
yasunorihirakawa 4:5588f67b8c48 148 gap_min = dist_gap;
yasunorihirakawa 4:5588f67b8c48 149 i_min = i;
yasunorihirakawa 4:5588f67b8c48 150 }
yasunorihirakawa 4:5588f67b8c48 151 }
yasunorihirakawa 6:c024519cce11 152
yasunorihirakawa 6:c024519cce11 153 float l = sqrt( pow((x-way[i_min][0]), 2) + pow((y-way[i_min][1]), 2) );
yasunorihirakawa 6:c024519cce11 154 float dv = K*l;
yasunorihirakawa 6:c024519cce11 155 float drpm = dv*60 / ( gear_ratio * 2 * pi * tire_size );
yasunorihirakawa 6:c024519cce11 156
yasunorihirakawa 6:c024519cce11 157 motorL.Set_target( standard_rpm + drpm );
yasunorihirakawa 6:c024519cce11 158 motorR.Set_target( standard_rpm - drpm );
yasunorihirakawa 10:cea77ea5af93 159 */
yasunorihirakawa 6:c024519cce11 160
153r173067 5:17314fc7b175 161 printf("%f %f %f %f %f flag: %d \n", reflectorFL.read(), reflectorFM.read(), reflectorFR.read(), reflectorBL.read(), reflectorBR.read(), flag);
yasunorihirakawa 4:5588f67b8c48 162 wait(INTVAL_REFLECTOR);
yasunorihirakawa 6:c024519cce11 163 }
yasunorihirakawa 3:efc081576a33 164 }
yasunorihirakawa 3:efc081576a33 165
yasunorihirakawa 1:bb85c9fe1ba3 166 void odometry()
yasunorihirakawa 1:bb85c9fe1ba3 167 {
153r173067 5:17314fc7b175 168 static float v_pre = 0.0;
153r173067 5:17314fc7b175 169 static float x_dot_pre = 0.0;
153r173067 5:17314fc7b175 170 static float y_dot_pre = 0.0;
yasunorihirakawa 1:bb85c9fe1ba3 171 static float dist_count = 0.0;
yasunorihirakawa 1:bb85c9fe1ba3 172
153r173067 5:17314fc7b175 173 float vl = motorL.Get_rpm() / 60 * gear_ratio * 2 * pi * tire_size;
153r173067 5:17314fc7b175 174 float vr = motorR.Get_rpm() / 60 * gear_ratio * 2 * pi * tire_size;
153r173067 5:17314fc7b175 175 float v = (vl + vr) / 2;
153r173067 5:17314fc7b175 176 float x_dot = v * cos(bmx.get_azimuth_machineframe());
153r173067 5:17314fc7b175 177 float y_dot = v * sin(bmx.get_azimuth_machineframe());
153r173067 5:17314fc7b175 178
153r173067 5:17314fc7b175 179 dist += (v + v_pre) * INTVAL_MOTOR / 2;
153r173067 5:17314fc7b175 180 dist_count += (v + v_pre) * INTVAL_MOTOR / 2;
153r173067 5:17314fc7b175 181 x += (x_dot + x_dot_pre) * INTVAL_MOTOR / 2;
yasunorihirakawa 8:1c1c72c69af4 182 y += (y_dot + y_dot_pre) * INTVAL_MOTOR / 2;
yasunorihirakawa 1:bb85c9fe1ba3 183 v_pre = v;
yasunorihirakawa 4:5588f67b8c48 184 x_dot_pre = x;
yasunorihirakawa 4:5588f67b8c48 185 y_dot_pre = y;
153r173067 5:17314fc7b175 186
yasunorihirakawa 3:efc081576a33 187 if (dist<=2000)
yasunorihirakawa 3:efc081576a33 188 {
yasunorihirakawa 3:efc081576a33 189 fast_rpm = 2500;
yasunorihirakawa 3:efc081576a33 190 standard_rpm = 2000;
yasunorihirakawa 3:efc081576a33 191 slow_rpm = 1200;
yasunorihirakawa 3:efc081576a33 192 }
yasunorihirakawa 3:efc081576a33 193 else if(dist<=2400)
yasunorihirakawa 3:efc081576a33 194 {
yasunorihirakawa 3:efc081576a33 195 fast_rpm = 2000;
yasunorihirakawa 3:efc081576a33 196 standard_rpm = 1500;
yasunorihirakawa 3:efc081576a33 197 slow_rpm = 1200;
yasunorihirakawa 3:efc081576a33 198 }
yasunorihirakawa 3:efc081576a33 199 else if(dist<=4400)
yasunorihirakawa 3:efc081576a33 200 {
yasunorihirakawa 3:efc081576a33 201 fast_rpm = 2500;
yasunorihirakawa 3:efc081576a33 202 standard_rpm = 2000;
yasunorihirakawa 3:efc081576a33 203 slow_rpm = 1200;
yasunorihirakawa 3:efc081576a33 204 }
yasunorihirakawa 3:efc081576a33 205 else
yasunorihirakawa 3:efc081576a33 206 {
yasunorihirakawa 3:efc081576a33 207 fast_rpm = 1500;
yasunorihirakawa 3:efc081576a33 208 standard_rpm = 1200;
yasunorihirakawa 3:efc081576a33 209 slow_rpm = 1200;
yasunorihirakawa 10:cea77ea5af93 210 }
153r173067 5:17314fc7b175 211
yasunorihirakawa 3:efc081576a33 212 //printf("%f\n", dist);
153r173067 5:17314fc7b175 213
153r173067 5:17314fc7b175 214 if (dist_count >= 200)
yasunorihirakawa 1:bb85c9fe1ba3 215 {
yasunorihirakawa 1:bb85c9fe1ba3 216 LED = !LED;
yasunorihirakawa 1:bb85c9fe1ba3 217 dist_count -= 200;
Arima 0:532ef32974cf 218 }
yasunorihirakawa 1:bb85c9fe1ba3 219 }
yasunorihirakawa 1:bb85c9fe1ba3 220
yasunorihirakawa 1:bb85c9fe1ba3 221 void control_motor()
yasunorihirakawa 1:bb85c9fe1ba3 222 {
153r173067 5:17314fc7b175 223 while (1)
yasunorihirakawa 1:bb85c9fe1ba3 224 {
yasunorihirakawa 1:bb85c9fe1ba3 225 motorL.drive();
yasunorihirakawa 1:bb85c9fe1ba3 226 motorR.drive();
yasunorihirakawa 10:cea77ea5af93 227 //odometry();
yasunorihirakawa 1:bb85c9fe1ba3 228 wait(INTVAL_MOTOR);
yasunorihirakawa 1:bb85c9fe1ba3 229 }
153r173067 5:17314fc7b175 230 }
153r173067 5:17314fc7b175 231
153r173067 5:17314fc7b175 232 void update()
153r173067 5:17314fc7b175 233 {
153r173067 5:17314fc7b175 234 while (true)
153r173067 5:17314fc7b175 235 {
153r173067 5:17314fc7b175 236 if (!lock)
153r173067 5:17314fc7b175 237 {
153r173067 5:17314fc7b175 238 bmx.Update_posture();
153r173067 5:17314fc7b175 239 }
153r173067 5:17314fc7b175 240 }
153r173067 5:17314fc7b175 241 }
yasunorihirakawa 1:bb85c9fe1ba3 242
yasunorihirakawa 1:bb85c9fe1ba3 243 int main()
153r173067 5:17314fc7b175 244 {
yasunorihirakawa 1:bb85c9fe1ba3 245 motor_mode = 1;
yasunorihirakawa 1:bb85c9fe1ba3 246 LED = 1;
yasunorihirakawa 1:bb85c9fe1ba3 247
yasunorihirakawa 1:bb85c9fe1ba3 248 pg1.rise(&count_pg1);
yasunorihirakawa 1:bb85c9fe1ba3 249 pg1.fall(&count_pg1);
yasunorihirakawa 1:bb85c9fe1ba3 250 pg2.rise(&count_pg2);
yasunorihirakawa 1:bb85c9fe1ba3 251 pg2.fall(&count_pg2);
153r173067 5:17314fc7b175 252
153r173067 5:17314fc7b175 253 while (true)
153r173067 5:17314fc7b175 254 {
153r173067 5:17314fc7b175 255 if (button == 0)
153r173067 5:17314fc7b175 256 {
153r173067 5:17314fc7b175 257 wait(1);
153r173067 5:17314fc7b175 258 break;
153r173067 5:17314fc7b175 259 }
153r173067 5:17314fc7b175 260 }
153r173067 5:17314fc7b175 261
153r173067 5:17314fc7b175 262 bmx.mag_calibration(button);
153r173067 5:17314fc7b175 263
153r173067 5:17314fc7b175 264 printf("準備完了\n");
153r173067 5:17314fc7b175 265 while (true)
153r173067 5:17314fc7b175 266 {
153r173067 5:17314fc7b175 267 if (button == 0)
153r173067 5:17314fc7b175 268 {
153r173067 5:17314fc7b175 269 wait(1);
153r173067 5:17314fc7b175 270 break;
153r173067 5:17314fc7b175 271 }
153r173067 5:17314fc7b175 272 }
153r173067 5:17314fc7b175 273
153r173067 5:17314fc7b175 274 bmx.set_initial_mag();
153r173067 5:17314fc7b175 275 bmx.set_initial_acc();
153r173067 5:17314fc7b175 276
yasunorihirakawa 6:c024519cce11 277 sensor_thread.start(callback(update));
yasunorihirakawa 6:c024519cce11 278 thread_trace.start(callback(line_trace));
yasunorihirakawa 1:bb85c9fe1ba3 279 thread_motor.start(callback(control_motor));
153r173067 5:17314fc7b175 280
yasunorihirakawa 6:c024519cce11 281 while (true)
153r173067 5:17314fc7b175 282 {
153r173067 5:17314fc7b175 283 if (button == 0)
153r173067 5:17314fc7b175 284 {
153r173067 5:17314fc7b175 285 bmx.posture.w = 1;
153r173067 5:17314fc7b175 286 bmx.posture.x = 0;
153r173067 5:17314fc7b175 287 bmx.posture.y = 0;
153r173067 5:17314fc7b175 288 bmx.posture.z = 0;
153r173067 5:17314fc7b175 289 lock = true;
153r173067 5:17314fc7b175 290 wait(0.1);
153r173067 5:17314fc7b175 291 bmx.set_initial_mag();
153r173067 5:17314fc7b175 292 bmx.set_initial_acc();
153r173067 5:17314fc7b175 293 lock = false;
153r173067 5:17314fc7b175 294 }
yasunorihirakawa 6:c024519cce11 295 }
Arima 0:532ef32974cf 296 }