Goes in a Line!

Dependencies:   AVEncoder mbed-src-AV

Fork of Test by 2015-2016_Mouserat

Committer:
intgsull
Date:
Sat Nov 21 03:43:15 2015 +0000
Revision:
2:98efd8dd9077
Parent:
0:13d8a77fb1d7
ir

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jimmery 0:13d8a77fb1d7 1 #include "mbed.h"
jimmery 0:13d8a77fb1d7 2 #include "AVEncoder.h"
jimmery 0:13d8a77fb1d7 3
jimmery 0:13d8a77fb1d7 4 // set things
jimmery 0:13d8a77fb1d7 5 Serial pc(SERIAL_TX, SERIAL_RX);
jimmery 0:13d8a77fb1d7 6 Ticker Systicker;
jimmery 0:13d8a77fb1d7 7 Timer timer;
jimmery 0:13d8a77fb1d7 8
jimmery 0:13d8a77fb1d7 9 PwmOut right_forward(PB_10);
jimmery 0:13d8a77fb1d7 10 PwmOut right_reverse(PA_6);
jimmery 0:13d8a77fb1d7 11 PwmOut left_forward(PA_7);
jimmery 0:13d8a77fb1d7 12 PwmOut left_reverse(PB_6);
jimmery 0:13d8a77fb1d7 13
jimmery 0:13d8a77fb1d7 14 // TODO: change our encoder pins from AnalogIn into:
jimmery 0:13d8a77fb1d7 15 // otherwise, we can also use the AVEncoder thing as well.
jimmery 0:13d8a77fb1d7 16 AVEncoder l_enco(PA_15, PB_3);
jimmery 0:13d8a77fb1d7 17 AVEncoder r_enco(PA_1, PA_10);
jimmery 0:13d8a77fb1d7 18
jimmery 0:13d8a77fb1d7 19 // gyro
jimmery 0:13d8a77fb1d7 20 AnalogIn _gyro(PA_0);
jimmery 0:13d8a77fb1d7 21 // AnalogIn gyro_cal(PC_1) ?? currently this isn't connected.
jimmery 0:13d8a77fb1d7 22
jimmery 0:13d8a77fb1d7 23 //Left Front IR
jimmery 0:13d8a77fb1d7 24 DigitalOut eLF(PC_3);
jimmery 0:13d8a77fb1d7 25 AnalogIn rLF(PC_0);
jimmery 0:13d8a77fb1d7 26 //PC_4 is an ADC
jimmery 0:13d8a77fb1d7 27 //Left Side IR
jimmery 0:13d8a77fb1d7 28 DigitalOut eLS(PC_2);
jimmery 0:13d8a77fb1d7 29 AnalogIn rLS(PC_1);
jimmery 0:13d8a77fb1d7 30
jimmery 0:13d8a77fb1d7 31 //Right Front IR
jimmery 0:13d8a77fb1d7 32 DigitalOut eRF(PC_12);
jimmery 0:13d8a77fb1d7 33 AnalogIn rRF(PA_4);
jimmery 0:13d8a77fb1d7 34
jimmery 0:13d8a77fb1d7 35 //Right Side IR
jimmery 0:13d8a77fb1d7 36 DigitalOut eRS(PC_15);
jimmery 0:13d8a77fb1d7 37 AnalogIn rRS(PB_0);
jimmery 0:13d8a77fb1d7 38
jimmery 0:13d8a77fb1d7 39 DigitalOut myled(LED1);
jimmery 0:13d8a77fb1d7 40
jimmery 0:13d8a77fb1d7 41 volatile float gyro_offset = 0;
jimmery 0:13d8a77fb1d7 42
jimmery 0:13d8a77fb1d7 43 volatile float line_prevError = 0;
jimmery 0:13d8a77fb1d7 44 volatile float enco_prevError = 0;
jimmery 0:13d8a77fb1d7 45 volatile float gyro_prevError = 0;
jimmery 0:13d8a77fb1d7 46
jimmery 0:13d8a77fb1d7 47 volatile float line_accumulator = 0;
jimmery 0:13d8a77fb1d7 48 volatile float line_decayFactor = 1;
jimmery 0:13d8a77fb1d7 49 volatile float enco_accumulator = 0;
jimmery 0:13d8a77fb1d7 50 volatile float enco_decayFactor = 1;
jimmery 0:13d8a77fb1d7 51 volatile float gyro_accumulator = 0;
jimmery 0:13d8a77fb1d7 52 volatile float gyro_decayFactor = 1;
jimmery 0:13d8a77fb1d7 53
jimmery 0:13d8a77fb1d7 54 volatile float left_speed = 0.5;
jimmery 0:13d8a77fb1d7 55 volatile float right_speed = 0.5;
jimmery 0:13d8a77fb1d7 56
jimmery 0:13d8a77fb1d7 57 const float left_max_speed = 6; // max speed is 6 encoder pulses per ms.
jimmery 0:13d8a77fb1d7 58 const float right_max_speed = 6.2;
jimmery 0:13d8a77fb1d7 59
jimmery 0:13d8a77fb1d7 60 const float gyro_propo = 0.75;
jimmery 0:13d8a77fb1d7 61 const float gyro_integ = 0;
jimmery 0:13d8a77fb1d7 62 const float gyro_deriv = 1;
jimmery 0:13d8a77fb1d7 63
jimmery 0:13d8a77fb1d7 64 const float enco_propo = 0.05;
jimmery 0:13d8a77fb1d7 65 const float enco_integ = 0;
jimmery 0:13d8a77fb1d7 66 const float enco_deriv = 5;
jimmery 0:13d8a77fb1d7 67
jimmery 0:13d8a77fb1d7 68 const float spin_enco_weight = 0.5;
jimmery 0:13d8a77fb1d7 69 const float spin_gyro_weight = 1 - spin_enco_weight;
jimmery 0:13d8a77fb1d7 70
intgsull 2:98efd8dd9077 71 const float frontWall = 0.7; //need to calibrate this threshold to a value where mouse can stop in time
intgsull 2:98efd8dd9077 72 //something like this may be useful
intgsull 2:98efd8dd9077 73
jimmery 0:13d8a77fb1d7 74 volatile float enco_error;
jimmery 0:13d8a77fb1d7 75 volatile float enco_pid;
jimmery 0:13d8a77fb1d7 76 volatile float gyro_error;
jimmery 0:13d8a77fb1d7 77 volatile float gyro_pid;
jimmery 0:13d8a77fb1d7 78 volatile float w_error;
jimmery 0:13d8a77fb1d7 79
jimmery 0:13d8a77fb1d7 80 void reset()
jimmery 0:13d8a77fb1d7 81 {
jimmery 0:13d8a77fb1d7 82 l_enco.reset();
jimmery 0:13d8a77fb1d7 83 r_enco.reset();
jimmery 0:13d8a77fb1d7 84 }
jimmery 0:13d8a77fb1d7 85
jimmery 0:13d8a77fb1d7 86 void systick()
jimmery 0:13d8a77fb1d7 87 {
intgsull 2:98efd8dd9077 88 watchOut();
intgsull 2:98efd8dd9077 89
jimmery 0:13d8a77fb1d7 90 enco_error = l_enco.getPulses() - r_enco.getPulses();
jimmery 0:13d8a77fb1d7 91 gyro_error = _gyro.read() - gyro_offset;
jimmery 0:13d8a77fb1d7 92
jimmery 0:13d8a77fb1d7 93 enco_pid = 0;
jimmery 0:13d8a77fb1d7 94 //enco_pid += enco_propo * enco_error;
jimmery 0:13d8a77fb1d7 95 //enco_pid += enco_deriv * (enco_error - enco_prevError);
jimmery 0:13d8a77fb1d7 96
jimmery 0:13d8a77fb1d7 97 gyro_pid = 0;
jimmery 0:13d8a77fb1d7 98 gyro_pid += gyro_propo * gyro_error;
jimmery 0:13d8a77fb1d7 99 gyro_pid += gyro_deriv * (gyro_error - gyro_prevError);
jimmery 0:13d8a77fb1d7 100
jimmery 0:13d8a77fb1d7 101 w_error = spin_enco_weight * enco_pid + spin_gyro_weight * gyro_pid;
jimmery 0:13d8a77fb1d7 102 left_speed += w_error;
jimmery 0:13d8a77fb1d7 103 right_speed -= w_error;
jimmery 0:13d8a77fb1d7 104
jimmery 0:13d8a77fb1d7 105 left_forward = left_speed / left_max_speed;
jimmery 0:13d8a77fb1d7 106 left_reverse = 0;
jimmery 0:13d8a77fb1d7 107 right_forward = right_speed / right_max_speed;
jimmery 0:13d8a77fb1d7 108 right_reverse = 0;
jimmery 0:13d8a77fb1d7 109
jimmery 0:13d8a77fb1d7 110 reset();
jimmery 0:13d8a77fb1d7 111 }
jimmery 0:13d8a77fb1d7 112
jimmery 0:13d8a77fb1d7 113 // computes gyro_offset
jimmery 0:13d8a77fb1d7 114 // uses a "weighted" average.
jimmery 0:13d8a77fb1d7 115 // idea is that the current gyro offset is weighted more than previous ones.
jimmery 0:13d8a77fb1d7 116 // uses the following y(n) = 1/2 * y(n-1) + 1/2 * x(n).
jimmery 0:13d8a77fb1d7 117 // (therefore y(n) = sum of x(i)/2^i from i from 0 to n.)
jimmery 0:13d8a77fb1d7 118 // this maintains that there will be some influence from previous factors, but keeps the current value at a higher weight.
jimmery 0:13d8a77fb1d7 119 // currently this is only in the setup function. we can run this when the mouse is running in a line
jimmery 0:13d8a77fb1d7 120 // when we figure out good line running pid.
jimmery 0:13d8a77fb1d7 121 void offsetCalc()
jimmery 0:13d8a77fb1d7 122 {
jimmery 0:13d8a77fb1d7 123 gyro_offset = gyro_offset / 2 + _gyro.read() / 2;
jimmery 0:13d8a77fb1d7 124 }
jimmery 0:13d8a77fb1d7 125
jimmery 0:13d8a77fb1d7 126
intgsull 2:98efd8dd9077 127 void stop()
intgsull 2:98efd8dd9077 128 {
intgsull 2:98efd8dd9077 129 left_forward = 1;
intgsull 2:98efd8dd9077 130 left_reverse = 1;
intgsull 2:98efd8dd9077 131 right_forward = 1;
intgsull 2:98efd8dd9077 132 right_reverse = 1;
intgsull 2:98efd8dd9077 133 }
intgsull 2:98efd8dd9077 134
intgsull 2:98efd8dd9077 135 void watchOut()
intgsull 2:98efd8dd9077 136 {
intgsull 2:98efd8dd9077 137 eRF = 1;
intgsull 2:98efd8dd9077 138 eLF = 1;
intgsull 2:98efd8dd9077 139 if(rRF > frontWall || rLF > frontWall)
intgsull 2:98efd8dd9077 140 {
intgsull 2:98efd8dd9077 141 eRF = 0;
intgsull 2:98efd8dd9077 142 eLF = 0;
intgsull 2:98efd8dd9077 143 stop();
intgsull 2:98efd8dd9077 144 return;
intgsull 2:98efd8dd9077 145 }
intgsull 2:98efd8dd9077 146 }
intgsull 2:98efd8dd9077 147
intgsull 2:98efd8dd9077 148
jimmery 0:13d8a77fb1d7 149 void setup()
jimmery 0:13d8a77fb1d7 150 {
jimmery 0:13d8a77fb1d7 151 pc.printf("Hello World\r\n");
jimmery 0:13d8a77fb1d7 152
jimmery 0:13d8a77fb1d7 153 eRS = 0;
jimmery 0:13d8a77fb1d7 154 eRF = 0;
jimmery 0:13d8a77fb1d7 155 eLS = 0;
jimmery 0:13d8a77fb1d7 156 eLF = 0;
jimmery 0:13d8a77fb1d7 157
jimmery 0:13d8a77fb1d7 158 myled = 1;
jimmery 0:13d8a77fb1d7 159
jimmery 0:13d8a77fb1d7 160 for ( int i = 0; i < 1000; i++ )
jimmery 0:13d8a77fb1d7 161 {
jimmery 0:13d8a77fb1d7 162 offsetCalc();
jimmery 0:13d8a77fb1d7 163 }
jimmery 0:13d8a77fb1d7 164
jimmery 0:13d8a77fb1d7 165 //left_forward = left_speed / left_max_speed;
jimmery 0:13d8a77fb1d7 166 // left_reverse = 0;
jimmery 0:13d8a77fb1d7 167 // right_forward = right_speed / right_max_speed;
jimmery 0:13d8a77fb1d7 168 // right_reverse = 0;
jimmery 0:13d8a77fb1d7 169
jimmery 0:13d8a77fb1d7 170 wait(2);
jimmery 0:13d8a77fb1d7 171
jimmery 0:13d8a77fb1d7 172 // repeat this for some time frame.
jimmery 0:13d8a77fb1d7 173 Systicker.attach_us(&systick, 1000);
jimmery 0:13d8a77fb1d7 174 }
jimmery 0:13d8a77fb1d7 175
jimmery 0:13d8a77fb1d7 176
jimmery 0:13d8a77fb1d7 177 int main() {
jimmery 0:13d8a77fb1d7 178 setup();
jimmery 0:13d8a77fb1d7 179 while(1) {
jimmery 0:13d8a77fb1d7 180
jimmery 0:13d8a77fb1d7 181 pc.printf("enco_error: %f, gyro_error: %f, w_error: %f\r\n", enco_error, gyro_error, w_error);
jimmery 0:13d8a77fb1d7 182 //wait(1);
jimmery 0:13d8a77fb1d7 183 }
jimmery 0:13d8a77fb1d7 184 }