Dependencies: EthernetNetIf mbed
main.cpp@0:ad88907cf227, 2012-04-03 (annotated)
- Committer:
- SED9008
- Date:
- Tue Apr 03 17:46:32 2012 +0000
- Revision:
- 0:ad88907cf227
- Child:
- 1:5721a5772035
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
SED9008 | 0:ad88907cf227 | 1 | #include "mbed.h" |
SED9008 | 0:ad88907cf227 | 2 | #include "EthernetNetIf.h" |
SED9008 | 0:ad88907cf227 | 3 | #include "TCPSocket.h" |
SED9008 | 0:ad88907cf227 | 4 | #include "IMUfilter.h" |
SED9008 | 0:ad88907cf227 | 5 | #include "ADXL345_I2C.h" |
SED9008 | 0:ad88907cf227 | 6 | #include "L3G4200D.h" |
SED9008 | 0:ad88907cf227 | 7 | |
SED9008 | 0:ad88907cf227 | 8 | #define TCP_LISTENING_PORT 1337 |
SED9008 | 0:ad88907cf227 | 9 | //Gravity at Earth's surface in m/s/s |
SED9008 | 0:ad88907cf227 | 10 | #define g0 9.812865328 |
SED9008 | 0:ad88907cf227 | 11 | //Number of samples to average. |
SED9008 | 0:ad88907cf227 | 12 | #define SAMPLES 4 |
SED9008 | 0:ad88907cf227 | 13 | //Number of samples to be averaged for a null bias calculation |
SED9008 | 0:ad88907cf227 | 14 | //during calibration. |
SED9008 | 0:ad88907cf227 | 15 | #define CALIBRATION_SAMPLES 128 |
SED9008 | 0:ad88907cf227 | 16 | //Convert from radians to degrees. |
SED9008 | 0:ad88907cf227 | 17 | #define toDegrees(x) (x * 57.2957795) |
SED9008 | 0:ad88907cf227 | 18 | //Convert from degrees to radians. |
SED9008 | 0:ad88907cf227 | 19 | #define toRadians(x) (x * 0.01745329252) |
SED9008 | 0:ad88907cf227 | 20 | //ITG-3200 sensitivity is 14.375 LSB/(degrees/sec). |
SED9008 | 0:ad88907cf227 | 21 | #define GYROSCOPE_GAIN (1 / 14.375) |
SED9008 | 0:ad88907cf227 | 22 | //Full scale resolution on the ADXL345 is 4mg/LSB. |
SED9008 | 0:ad88907cf227 | 23 | #define ACCELEROMETER_GAIN (0.004 * g0) |
SED9008 | 0:ad88907cf227 | 24 | //Sampling gyroscope at 200Hz. |
SED9008 | 0:ad88907cf227 | 25 | #define GYRO_RATE 0.005 |
SED9008 | 0:ad88907cf227 | 26 | //Sampling accelerometer at 200Hz. |
SED9008 | 0:ad88907cf227 | 27 | #define ACC_RATE 0.005 |
SED9008 | 0:ad88907cf227 | 28 | //Updating filter at 40Hz. |
SED9008 | 0:ad88907cf227 | 29 | #define FILTER_RATE 0.1 |
SED9008 | 0:ad88907cf227 | 30 | |
SED9008 | 0:ad88907cf227 | 31 | //At rest the gyroscope is centred around 0 and goes between about |
SED9008 | 0:ad88907cf227 | 32 | //-5 and 5 counts. As 1 degrees/sec is ~15 LSB, error is roughly |
SED9008 | 0:ad88907cf227 | 33 | //5/15 = 0.3 degrees/sec. |
SED9008 | 0:ad88907cf227 | 34 | IMUfilter imuFilter(FILTER_RATE, 0.3); |
SED9008 | 0:ad88907cf227 | 35 | ADXL345_I2C accelerometer(p9, p10); |
SED9008 | 0:ad88907cf227 | 36 | L3G4200D gyroscope(p9, p10); |
SED9008 | 0:ad88907cf227 | 37 | |
SED9008 | 0:ad88907cf227 | 38 | PwmOut m1(p21); |
SED9008 | 0:ad88907cf227 | 39 | PwmOut m2(p22); |
SED9008 | 0:ad88907cf227 | 40 | PwmOut m3(p23); |
SED9008 | 0:ad88907cf227 | 41 | PwmOut m4(p24); |
SED9008 | 0:ad88907cf227 | 42 | |
SED9008 | 0:ad88907cf227 | 43 | Ticker accelerometerTicker; |
SED9008 | 0:ad88907cf227 | 44 | Ticker gyroscopeTicker; |
SED9008 | 0:ad88907cf227 | 45 | Ticker filterTicker; |
SED9008 | 0:ad88907cf227 | 46 | |
SED9008 | 0:ad88907cf227 | 47 | |
SED9008 | 0:ad88907cf227 | 48 | int connected = 0, |
SED9008 | 0:ad88907cf227 | 49 | calibrated = 0, |
SED9008 | 0:ad88907cf227 | 50 | led1 = 0; |
SED9008 | 0:ad88907cf227 | 51 | //Offsets for the gyroscope. |
SED9008 | 0:ad88907cf227 | 52 | //The readings we take when the gyroscope is stationary won't be 0, so we'll |
SED9008 | 0:ad88907cf227 | 53 | //average a set of readings we do get when the gyroscope is stationary and |
SED9008 | 0:ad88907cf227 | 54 | //take those away from subsequent readings to ensure the gyroscope is offset |
SED9008 | 0:ad88907cf227 | 55 | //or "biased" to 0. |
SED9008 | 0:ad88907cf227 | 56 | double w_xBias; |
SED9008 | 0:ad88907cf227 | 57 | double w_yBias; |
SED9008 | 0:ad88907cf227 | 58 | double w_zBias; |
SED9008 | 0:ad88907cf227 | 59 | |
SED9008 | 0:ad88907cf227 | 60 | //Offsets for the accelerometer. |
SED9008 | 0:ad88907cf227 | 61 | //Same as with the gyroscope. |
SED9008 | 0:ad88907cf227 | 62 | double a_xBias; |
SED9008 | 0:ad88907cf227 | 63 | double a_yBias; |
SED9008 | 0:ad88907cf227 | 64 | double a_zBias; |
SED9008 | 0:ad88907cf227 | 65 | |
SED9008 | 0:ad88907cf227 | 66 | //Accumulators used for oversampling and then averaging. |
SED9008 | 0:ad88907cf227 | 67 | volatile double a_xAccumulator = 0; |
SED9008 | 0:ad88907cf227 | 68 | volatile double a_yAccumulator = 0; |
SED9008 | 0:ad88907cf227 | 69 | volatile double a_zAccumulator = 0; |
SED9008 | 0:ad88907cf227 | 70 | volatile double w_xAccumulator = 0; |
SED9008 | 0:ad88907cf227 | 71 | volatile double w_yAccumulator = 0; |
SED9008 | 0:ad88907cf227 | 72 | volatile double w_zAccumulator = 0; |
SED9008 | 0:ad88907cf227 | 73 | |
SED9008 | 0:ad88907cf227 | 74 | //Accelerometer and gyroscope readings for x, y, z axes. |
SED9008 | 0:ad88907cf227 | 75 | volatile double a_x; |
SED9008 | 0:ad88907cf227 | 76 | volatile double a_y; |
SED9008 | 0:ad88907cf227 | 77 | volatile double a_z; |
SED9008 | 0:ad88907cf227 | 78 | volatile double w_x; |
SED9008 | 0:ad88907cf227 | 79 | volatile double w_y; |
SED9008 | 0:ad88907cf227 | 80 | volatile double w_z; |
SED9008 | 0:ad88907cf227 | 81 | |
SED9008 | 0:ad88907cf227 | 82 | //Buffer for accelerometer readings. |
SED9008 | 0:ad88907cf227 | 83 | int readings[3]; |
SED9008 | 0:ad88907cf227 | 84 | //Number of accelerometer samples we're on. |
SED9008 | 0:ad88907cf227 | 85 | int accelerometerSamples = 0; |
SED9008 | 0:ad88907cf227 | 86 | //Number of gyroscope samples we're on. |
SED9008 | 0:ad88907cf227 | 87 | int gyroscopeSamples = 0; |
SED9008 | 0:ad88907cf227 | 88 | |
SED9008 | 0:ad88907cf227 | 89 | /** |
SED9008 | 0:ad88907cf227 | 90 | * Prototypes |
SED9008 | 0:ad88907cf227 | 91 | */ |
SED9008 | 0:ad88907cf227 | 92 | //Set up the ADXL345 appropriately. |
SED9008 | 0:ad88907cf227 | 93 | void initializeAccelerometer(void); |
SED9008 | 0:ad88907cf227 | 94 | //Calculate the null bias. |
SED9008 | 0:ad88907cf227 | 95 | void calibrateAccelerometer(void); |
SED9008 | 0:ad88907cf227 | 96 | //Take a set of samples and average them. |
SED9008 | 0:ad88907cf227 | 97 | void sampleAccelerometer(void); |
SED9008 | 0:ad88907cf227 | 98 | //Calculate the null bias. |
SED9008 | 0:ad88907cf227 | 99 | void calibrateGyroscope(void); |
SED9008 | 0:ad88907cf227 | 100 | //Take a set of samples and average them. |
SED9008 | 0:ad88907cf227 | 101 | void sampleGyroscope(void); |
SED9008 | 0:ad88907cf227 | 102 | //Update the filter and calculate the Euler angles. |
SED9008 | 0:ad88907cf227 | 103 | void filter(void); |
SED9008 | 0:ad88907cf227 | 104 | void tcp_send(const char*); |
SED9008 | 0:ad88907cf227 | 105 | void onConnectedTCPSocketEvent(TCPSocketEvent e); |
SED9008 | 0:ad88907cf227 | 106 | void onListeningTCPSocketEvent(TCPSocketEvent e); |
SED9008 | 0:ad88907cf227 | 107 | |
SED9008 | 0:ad88907cf227 | 108 | // EthernetNetIf eth; |
SED9008 | 0:ad88907cf227 | 109 | EthernetNetIf eth( |
SED9008 | 0:ad88907cf227 | 110 | IpAddr(192,168,0,16), //IP Address |
SED9008 | 0:ad88907cf227 | 111 | IpAddr(255,255,255,0), //Network Mask |
SED9008 | 0:ad88907cf227 | 112 | IpAddr(192,168,0,1), //Gateway |
SED9008 | 0:ad88907cf227 | 113 | IpAddr(192,168,0,1) //DNS |
SED9008 | 0:ad88907cf227 | 114 | ); |
SED9008 | 0:ad88907cf227 | 115 | |
SED9008 | 0:ad88907cf227 | 116 | TCPSocket ListeningSock; |
SED9008 | 0:ad88907cf227 | 117 | TCPSocket* pConnectedSock; // for ConnectedSock |
SED9008 | 0:ad88907cf227 | 118 | Host client; |
SED9008 | 0:ad88907cf227 | 119 | TCPSocketErr err; |
SED9008 | 0:ad88907cf227 | 120 | |
SED9008 | 0:ad88907cf227 | 121 | void sampleAccelerometer(void) { |
SED9008 | 0:ad88907cf227 | 122 | |
SED9008 | 0:ad88907cf227 | 123 | //Have we taken enough samples? |
SED9008 | 0:ad88907cf227 | 124 | if (accelerometerSamples == SAMPLES) { |
SED9008 | 0:ad88907cf227 | 125 | |
SED9008 | 0:ad88907cf227 | 126 | //Average the samples, remove the bias, and calculate the acceleration |
SED9008 | 0:ad88907cf227 | 127 | //in m/s/s. |
SED9008 | 0:ad88907cf227 | 128 | a_x = ((a_xAccumulator / SAMPLES) - a_xBias) * ACCELEROMETER_GAIN; |
SED9008 | 0:ad88907cf227 | 129 | a_y = ((a_yAccumulator / SAMPLES) - a_yBias) * ACCELEROMETER_GAIN; |
SED9008 | 0:ad88907cf227 | 130 | a_z = ((a_zAccumulator / SAMPLES) - a_zBias) * ACCELEROMETER_GAIN; |
SED9008 | 0:ad88907cf227 | 131 | |
SED9008 | 0:ad88907cf227 | 132 | a_xAccumulator = 0; |
SED9008 | 0:ad88907cf227 | 133 | a_yAccumulator = 0; |
SED9008 | 0:ad88907cf227 | 134 | a_zAccumulator = 0; |
SED9008 | 0:ad88907cf227 | 135 | accelerometerSamples = 0; |
SED9008 | 0:ad88907cf227 | 136 | |
SED9008 | 0:ad88907cf227 | 137 | } else { |
SED9008 | 0:ad88907cf227 | 138 | //Take another sample. |
SED9008 | 0:ad88907cf227 | 139 | accelerometer.getOutput(readings); |
SED9008 | 0:ad88907cf227 | 140 | |
SED9008 | 0:ad88907cf227 | 141 | a_xAccumulator += (int16_t) readings[0]; |
SED9008 | 0:ad88907cf227 | 142 | a_yAccumulator += (int16_t) readings[1]; |
SED9008 | 0:ad88907cf227 | 143 | a_zAccumulator += (int16_t) readings[2]; |
SED9008 | 0:ad88907cf227 | 144 | |
SED9008 | 0:ad88907cf227 | 145 | accelerometerSamples++; |
SED9008 | 0:ad88907cf227 | 146 | |
SED9008 | 0:ad88907cf227 | 147 | } |
SED9008 | 0:ad88907cf227 | 148 | |
SED9008 | 0:ad88907cf227 | 149 | } |
SED9008 | 0:ad88907cf227 | 150 | |
SED9008 | 0:ad88907cf227 | 151 | void sampleGyroscope(void) { |
SED9008 | 0:ad88907cf227 | 152 | |
SED9008 | 0:ad88907cf227 | 153 | //Have we taken enough samples? |
SED9008 | 0:ad88907cf227 | 154 | if (gyroscopeSamples == SAMPLES) { |
SED9008 | 0:ad88907cf227 | 155 | |
SED9008 | 0:ad88907cf227 | 156 | //Average the samples, remove the bias, and calculate the angular |
SED9008 | 0:ad88907cf227 | 157 | //velocity in rad/s. |
SED9008 | 0:ad88907cf227 | 158 | w_x = toRadians(((w_xAccumulator / SAMPLES) - w_xBias) * GYROSCOPE_GAIN); |
SED9008 | 0:ad88907cf227 | 159 | w_y = toRadians(((w_yAccumulator / SAMPLES) - w_yBias) * GYROSCOPE_GAIN); |
SED9008 | 0:ad88907cf227 | 160 | w_z = toRadians(((w_zAccumulator / SAMPLES) - w_zBias) * GYROSCOPE_GAIN); |
SED9008 | 0:ad88907cf227 | 161 | |
SED9008 | 0:ad88907cf227 | 162 | w_xAccumulator = 0; |
SED9008 | 0:ad88907cf227 | 163 | w_yAccumulator = 0; |
SED9008 | 0:ad88907cf227 | 164 | w_zAccumulator = 0; |
SED9008 | 0:ad88907cf227 | 165 | gyroscopeSamples = 0; |
SED9008 | 0:ad88907cf227 | 166 | |
SED9008 | 0:ad88907cf227 | 167 | } else { |
SED9008 | 0:ad88907cf227 | 168 | //Take another sample. |
SED9008 | 0:ad88907cf227 | 169 | int g[3]; |
SED9008 | 0:ad88907cf227 | 170 | gyroscope.read(g); |
SED9008 | 0:ad88907cf227 | 171 | w_xAccumulator += g[0]; |
SED9008 | 0:ad88907cf227 | 172 | w_yAccumulator += g[1]; |
SED9008 | 0:ad88907cf227 | 173 | w_zAccumulator += g[2]; |
SED9008 | 0:ad88907cf227 | 174 | |
SED9008 | 0:ad88907cf227 | 175 | gyroscopeSamples++; |
SED9008 | 0:ad88907cf227 | 176 | |
SED9008 | 0:ad88907cf227 | 177 | } |
SED9008 | 0:ad88907cf227 | 178 | |
SED9008 | 0:ad88907cf227 | 179 | } |
SED9008 | 0:ad88907cf227 | 180 | |
SED9008 | 0:ad88907cf227 | 181 | void filter(void) { |
SED9008 | 0:ad88907cf227 | 182 | |
SED9008 | 0:ad88907cf227 | 183 | //Update the filter variables. |
SED9008 | 0:ad88907cf227 | 184 | imuFilter.updateFilter(w_y, w_x, w_z, a_y, a_x, a_z); |
SED9008 | 0:ad88907cf227 | 185 | //Calculate the new Euler angles. |
SED9008 | 0:ad88907cf227 | 186 | imuFilter.computeEuler(); |
SED9008 | 0:ad88907cf227 | 187 | |
SED9008 | 0:ad88907cf227 | 188 | } |
SED9008 | 0:ad88907cf227 | 189 | |
SED9008 | 0:ad88907cf227 | 190 | |
SED9008 | 0:ad88907cf227 | 191 | |
SED9008 | 0:ad88907cf227 | 192 | int main() { |
SED9008 | 0:ad88907cf227 | 193 | |
SED9008 | 0:ad88907cf227 | 194 | EthernetErr ethErr = eth.setup(); |
SED9008 | 0:ad88907cf227 | 195 | if(ethErr) { return -1;} |
SED9008 | 0:ad88907cf227 | 196 | IpAddr ip = eth.getIp(); |
SED9008 | 0:ad88907cf227 | 197 | // Set the callbacks for Listening |
SED9008 | 0:ad88907cf227 | 198 | ListeningSock.setOnEvent(&onListeningTCPSocketEvent); |
SED9008 | 0:ad88907cf227 | 199 | // bind and listen on TCP |
SED9008 | 0:ad88907cf227 | 200 | err=ListeningSock.bind(Host(IpAddr(), TCP_LISTENING_PORT)); |
SED9008 | 0:ad88907cf227 | 201 | //Deal with that error... |
SED9008 | 0:ad88907cf227 | 202 | if(err){printf("Binding Error\n");} |
SED9008 | 0:ad88907cf227 | 203 | err=ListeningSock.listen(); // Starts listening |
SED9008 | 0:ad88907cf227 | 204 | if(err){printf("Listening Error\r\n");} |
SED9008 | 0:ad88907cf227 | 205 | |
SED9008 | 0:ad88907cf227 | 206 | //Initialize inertial sensors. |
SED9008 | 0:ad88907cf227 | 207 | initializeAccelerometer(); |
SED9008 | 0:ad88907cf227 | 208 | calibrateAccelerometer(); |
SED9008 | 0:ad88907cf227 | 209 | calibrateGyroscope(); |
SED9008 | 0:ad88907cf227 | 210 | |
SED9008 | 0:ad88907cf227 | 211 | //Set up timers. |
SED9008 | 0:ad88907cf227 | 212 | //Accelerometer data rate is 200Hz, so we'll sample at this speed. |
SED9008 | 0:ad88907cf227 | 213 | accelerometerTicker.attach(&sampleAccelerometer, 0.005); |
SED9008 | 0:ad88907cf227 | 214 | //Gyroscope data rate is 200Hz, so we'll sample at this speed. |
SED9008 | 0:ad88907cf227 | 215 | gyroscopeTicker.attach(&sampleGyroscope, 0.005); |
SED9008 | 0:ad88907cf227 | 216 | //Update the filter variables at the correct rate. |
SED9008 | 0:ad88907cf227 | 217 | filterTicker.attach(&filter, FILTER_RATE); |
SED9008 | 0:ad88907cf227 | 218 | |
SED9008 | 0:ad88907cf227 | 219 | Timer tmr; |
SED9008 | 0:ad88907cf227 | 220 | tmr.start(); |
SED9008 | 0:ad88907cf227 | 221 | |
SED9008 | 0:ad88907cf227 | 222 | while(true) |
SED9008 | 0:ad88907cf227 | 223 | { |
SED9008 | 0:ad88907cf227 | 224 | wait(FILTER_RATE); |
SED9008 | 0:ad88907cf227 | 225 | |
SED9008 | 0:ad88907cf227 | 226 | Net::poll(); |
SED9008 | 0:ad88907cf227 | 227 | if(tmr.read() > 0.2){ |
SED9008 | 0:ad88907cf227 | 228 | // led4=!led4; //Show that we are alive |
SED9008 | 0:ad88907cf227 | 229 | tmr.reset(); |
SED9008 | 0:ad88907cf227 | 230 | } |
SED9008 | 0:ad88907cf227 | 231 | if(connected & led1 == 0){ |
SED9008 | 0:ad88907cf227 | 232 | tcp_send("Connected\r\n"); |
SED9008 | 0:ad88907cf227 | 233 | led1 = 1; |
SED9008 | 0:ad88907cf227 | 234 | calibrated = 1; |
SED9008 | 0:ad88907cf227 | 235 | |
SED9008 | 0:ad88907cf227 | 236 | //Set up timers. |
SED9008 | 0:ad88907cf227 | 237 | //Accelerometer data rate is 200Hz, so we'll sample at this speed. |
SED9008 | 0:ad88907cf227 | 238 | accelerometerTicker.attach(&sampleAccelerometer, 0.005); |
SED9008 | 0:ad88907cf227 | 239 | //Gyroscope data rate is 200Hz, so we'll sample at this speed. |
SED9008 | 0:ad88907cf227 | 240 | gyroscopeTicker.attach(&sampleGyroscope, 0.005); |
SED9008 | 0:ad88907cf227 | 241 | //Update the filter variables at the correct rate. |
SED9008 | 0:ad88907cf227 | 242 | filterTicker.attach(&filter, FILTER_RATE); |
SED9008 | 0:ad88907cf227 | 243 | |
SED9008 | 0:ad88907cf227 | 244 | tcp_send("Done initializing\r\n"); |
SED9008 | 0:ad88907cf227 | 245 | |
SED9008 | 0:ad88907cf227 | 246 | } |
SED9008 | 0:ad88907cf227 | 247 | |
SED9008 | 0:ad88907cf227 | 248 | if(calibrated){ |
SED9008 | 0:ad88907cf227 | 249 | char buffer [128]; |
SED9008 | 0:ad88907cf227 | 250 | sprintf (buffer, "x:%f - y:%f - z:%f \r\n",toDegrees(imuFilter.getRoll()), |
SED9008 | 0:ad88907cf227 | 251 | toDegrees(imuFilter.getPitch()), |
SED9008 | 0:ad88907cf227 | 252 | toDegrees(imuFilter.getYaw())); |
SED9008 | 0:ad88907cf227 | 253 | tcp_send(buffer); |
SED9008 | 0:ad88907cf227 | 254 | } |
SED9008 | 0:ad88907cf227 | 255 | } |
SED9008 | 0:ad88907cf227 | 256 | } |
SED9008 | 0:ad88907cf227 | 257 | |
SED9008 | 0:ad88907cf227 | 258 | void initializeAccelerometer(void) { |
SED9008 | 0:ad88907cf227 | 259 | |
SED9008 | 0:ad88907cf227 | 260 | //Go into standby mode to configure the device. |
SED9008 | 0:ad88907cf227 | 261 | accelerometer.setPowerControl(0x00); |
SED9008 | 0:ad88907cf227 | 262 | //Full resolution, +/-16g, 4mg/LSB. |
SED9008 | 0:ad88907cf227 | 263 | accelerometer.setDataFormatControl(0x0B); |
SED9008 | 0:ad88907cf227 | 264 | //200Hz data rate. |
SED9008 | 0:ad88907cf227 | 265 | accelerometer.setDataRate(ADXL345_200HZ); |
SED9008 | 0:ad88907cf227 | 266 | //Measurement mode. |
SED9008 | 0:ad88907cf227 | 267 | accelerometer.setPowerControl(0x08); |
SED9008 | 0:ad88907cf227 | 268 | //See http://www.analog.com/static/imported-files/application_notes/AN-1077.pdf |
SED9008 | 0:ad88907cf227 | 269 | wait_ms(22); |
SED9008 | 0:ad88907cf227 | 270 | |
SED9008 | 0:ad88907cf227 | 271 | } |
SED9008 | 0:ad88907cf227 | 272 | |
SED9008 | 0:ad88907cf227 | 273 | void calibrateAccelerometer(void) { |
SED9008 | 0:ad88907cf227 | 274 | |
SED9008 | 0:ad88907cf227 | 275 | a_xAccumulator = 0; |
SED9008 | 0:ad88907cf227 | 276 | a_yAccumulator = 0; |
SED9008 | 0:ad88907cf227 | 277 | a_zAccumulator = 0; |
SED9008 | 0:ad88907cf227 | 278 | |
SED9008 | 0:ad88907cf227 | 279 | //Take a number of readings and average them |
SED9008 | 0:ad88907cf227 | 280 | //to calculate the zero g offset. |
SED9008 | 0:ad88907cf227 | 281 | for (int i = 0; i < CALIBRATION_SAMPLES; i++) { |
SED9008 | 0:ad88907cf227 | 282 | |
SED9008 | 0:ad88907cf227 | 283 | accelerometer.getOutput(readings); |
SED9008 | 0:ad88907cf227 | 284 | |
SED9008 | 0:ad88907cf227 | 285 | a_xAccumulator += (int16_t) readings[0]; |
SED9008 | 0:ad88907cf227 | 286 | a_yAccumulator += (int16_t) readings[1]; |
SED9008 | 0:ad88907cf227 | 287 | a_zAccumulator += (int16_t) readings[2]; |
SED9008 | 0:ad88907cf227 | 288 | |
SED9008 | 0:ad88907cf227 | 289 | wait(ACC_RATE); |
SED9008 | 0:ad88907cf227 | 290 | |
SED9008 | 0:ad88907cf227 | 291 | } |
SED9008 | 0:ad88907cf227 | 292 | |
SED9008 | 0:ad88907cf227 | 293 | a_xAccumulator /= CALIBRATION_SAMPLES; |
SED9008 | 0:ad88907cf227 | 294 | a_yAccumulator /= CALIBRATION_SAMPLES; |
SED9008 | 0:ad88907cf227 | 295 | a_zAccumulator /= CALIBRATION_SAMPLES; |
SED9008 | 0:ad88907cf227 | 296 | |
SED9008 | 0:ad88907cf227 | 297 | //At 4mg/LSB, 250 LSBs is 1g. |
SED9008 | 0:ad88907cf227 | 298 | a_xBias = a_xAccumulator; |
SED9008 | 0:ad88907cf227 | 299 | a_yBias = a_yAccumulator; |
SED9008 | 0:ad88907cf227 | 300 | a_zBias = (a_zAccumulator - 250); |
SED9008 | 0:ad88907cf227 | 301 | |
SED9008 | 0:ad88907cf227 | 302 | a_xAccumulator = 0; |
SED9008 | 0:ad88907cf227 | 303 | a_yAccumulator = 0; |
SED9008 | 0:ad88907cf227 | 304 | a_zAccumulator = 0; |
SED9008 | 0:ad88907cf227 | 305 | |
SED9008 | 0:ad88907cf227 | 306 | } |
SED9008 | 0:ad88907cf227 | 307 | |
SED9008 | 0:ad88907cf227 | 308 | void calibrateGyroscope(void) { |
SED9008 | 0:ad88907cf227 | 309 | |
SED9008 | 0:ad88907cf227 | 310 | w_xAccumulator = 0; |
SED9008 | 0:ad88907cf227 | 311 | w_yAccumulator = 0; |
SED9008 | 0:ad88907cf227 | 312 | w_zAccumulator = 0; |
SED9008 | 0:ad88907cf227 | 313 | |
SED9008 | 0:ad88907cf227 | 314 | //Take a number of readings and average them |
SED9008 | 0:ad88907cf227 | 315 | //to calculate the gyroscope bias offset. |
SED9008 | 0:ad88907cf227 | 316 | for (int i = 0; i < CALIBRATION_SAMPLES; i++) { |
SED9008 | 0:ad88907cf227 | 317 | int g[3]; |
SED9008 | 0:ad88907cf227 | 318 | gyroscope.read(g); |
SED9008 | 0:ad88907cf227 | 319 | w_xAccumulator += g[0]; |
SED9008 | 0:ad88907cf227 | 320 | w_yAccumulator += g[1]; |
SED9008 | 0:ad88907cf227 | 321 | w_zAccumulator += g[2]; |
SED9008 | 0:ad88907cf227 | 322 | wait(GYRO_RATE); |
SED9008 | 0:ad88907cf227 | 323 | |
SED9008 | 0:ad88907cf227 | 324 | } |
SED9008 | 0:ad88907cf227 | 325 | |
SED9008 | 0:ad88907cf227 | 326 | //Average the samples. |
SED9008 | 0:ad88907cf227 | 327 | w_xAccumulator /= CALIBRATION_SAMPLES; |
SED9008 | 0:ad88907cf227 | 328 | w_yAccumulator /= CALIBRATION_SAMPLES; |
SED9008 | 0:ad88907cf227 | 329 | w_zAccumulator /= CALIBRATION_SAMPLES; |
SED9008 | 0:ad88907cf227 | 330 | |
SED9008 | 0:ad88907cf227 | 331 | w_xBias = w_xAccumulator; |
SED9008 | 0:ad88907cf227 | 332 | w_yBias = w_yAccumulator; |
SED9008 | 0:ad88907cf227 | 333 | w_zBias = w_zAccumulator; |
SED9008 | 0:ad88907cf227 | 334 | |
SED9008 | 0:ad88907cf227 | 335 | w_xAccumulator = 0; |
SED9008 | 0:ad88907cf227 | 336 | w_yAccumulator = 0; |
SED9008 | 0:ad88907cf227 | 337 | w_zAccumulator = 0; |
SED9008 | 0:ad88907cf227 | 338 | |
SED9008 | 0:ad88907cf227 | 339 | } |
SED9008 | 0:ad88907cf227 | 340 | |
SED9008 | 0:ad88907cf227 | 341 | |
SED9008 | 0:ad88907cf227 | 342 | |
SED9008 | 0:ad88907cf227 | 343 | void tcp_send( const char* data ){ |
SED9008 | 0:ad88907cf227 | 344 | int len = strlen(data); |
SED9008 | 0:ad88907cf227 | 345 | pConnectedSock->send(data, len); |
SED9008 | 0:ad88907cf227 | 346 | } |
SED9008 | 0:ad88907cf227 | 347 | |
SED9008 | 0:ad88907cf227 | 348 | void onConnectedTCPSocketEvent(TCPSocketEvent e) |
SED9008 | 0:ad88907cf227 | 349 | { |
SED9008 | 0:ad88907cf227 | 350 | switch(e) |
SED9008 | 0:ad88907cf227 | 351 | { |
SED9008 | 0:ad88907cf227 | 352 | case TCPSOCKET_CONNECTED: |
SED9008 | 0:ad88907cf227 | 353 | printf("TCP Socket Connected\r\n"); |
SED9008 | 0:ad88907cf227 | 354 | break; |
SED9008 | 0:ad88907cf227 | 355 | case TCPSOCKET_WRITEABLE: |
SED9008 | 0:ad88907cf227 | 356 | //Can now write some data... |
SED9008 | 0:ad88907cf227 | 357 | printf("TCP Socket Writable\r\n"); |
SED9008 | 0:ad88907cf227 | 358 | break; |
SED9008 | 0:ad88907cf227 | 359 | case TCPSOCKET_READABLE: |
SED9008 | 0:ad88907cf227 | 360 | //Can now read dome data... |
SED9008 | 0:ad88907cf227 | 361 | printf("TCP Socket Readable\r\n"); |
SED9008 | 0:ad88907cf227 | 362 | // Read in any available data into the buffer |
SED9008 | 0:ad88907cf227 | 363 | char buff[128]; |
SED9008 | 0:ad88907cf227 | 364 | while ( int len = pConnectedSock->recv(buff, 128) ) { |
SED9008 | 0:ad88907cf227 | 365 | // And send straight back out again |
SED9008 | 0:ad88907cf227 | 366 | // pConnectedSock->send(buff, len); |
SED9008 | 0:ad88907cf227 | 367 | int test = buff[0]; |
SED9008 | 0:ad88907cf227 | 368 | char buffer[128]; |
SED9008 | 0:ad88907cf227 | 369 | sprintf(buffer, "|%i|\r\n", test); |
SED9008 | 0:ad88907cf227 | 370 | tcp_send(buffer); |
SED9008 | 0:ad88907cf227 | 371 | if(test == 115) {connected = 1;} |
SED9008 | 0:ad88907cf227 | 372 | /* if(test == 49) {m1_set += 0.00001;} |
SED9008 | 0:ad88907cf227 | 373 | if(test == 50) {m2_set += 0.00001;} |
SED9008 | 0:ad88907cf227 | 374 | if(test == 51) {m3_set += 0.00001;} |
SED9008 | 0:ad88907cf227 | 375 | if(test == 52) {m4_set += 0.00001;} |
SED9008 | 0:ad88907cf227 | 376 | if(test == 113) {m1_set -= 0.00001;} |
SED9008 | 0:ad88907cf227 | 377 | if(test == 119) {m2_set -= 0.00001;} |
SED9008 | 0:ad88907cf227 | 378 | if(test == 101) {m3_set -= 0.00001;} |
SED9008 | 0:ad88907cf227 | 379 | if(test == 114) {m4_set -= 0.00001;} |
SED9008 | 0:ad88907cf227 | 380 | if(test == 107) { |
SED9008 | 0:ad88907cf227 | 381 | m1_set = 0.0011; |
SED9008 | 0:ad88907cf227 | 382 | m2_set = 0.0011; |
SED9008 | 0:ad88907cf227 | 383 | m3_set = 0.0011; |
SED9008 | 0:ad88907cf227 | 384 | m4_set = 0.0011;}*/ |
SED9008 | 0:ad88907cf227 | 385 | |
SED9008 | 0:ad88907cf227 | 386 | |
SED9008 | 0:ad88907cf227 | 387 | buff[len]=0; // make terminater |
SED9008 | 0:ad88907cf227 | 388 | printf("Received&Wrote:%s\r\n",buff); |
SED9008 | 0:ad88907cf227 | 389 | } |
SED9008 | 0:ad88907cf227 | 390 | break; |
SED9008 | 0:ad88907cf227 | 391 | case TCPSOCKET_CONTIMEOUT: |
SED9008 | 0:ad88907cf227 | 392 | printf("TCP Socket Timeout\r\n"); |
SED9008 | 0:ad88907cf227 | 393 | break; |
SED9008 | 0:ad88907cf227 | 394 | case TCPSOCKET_CONRST: |
SED9008 | 0:ad88907cf227 | 395 | printf("TCP Socket CONRST\r\n"); |
SED9008 | 0:ad88907cf227 | 396 | break; |
SED9008 | 0:ad88907cf227 | 397 | case TCPSOCKET_CONABRT: |
SED9008 | 0:ad88907cf227 | 398 | printf("TCP Socket CONABRT\r\n"); |
SED9008 | 0:ad88907cf227 | 399 | break; |
SED9008 | 0:ad88907cf227 | 400 | case TCPSOCKET_ERROR: |
SED9008 | 0:ad88907cf227 | 401 | printf("TCP Socket Error\r\n"); |
SED9008 | 0:ad88907cf227 | 402 | break; |
SED9008 | 0:ad88907cf227 | 403 | case TCPSOCKET_DISCONNECTED: |
SED9008 | 0:ad88907cf227 | 404 | //Close socket... |
SED9008 | 0:ad88907cf227 | 405 | printf("TCP Socket Disconnected\r\n"); |
SED9008 | 0:ad88907cf227 | 406 | pConnectedSock->close(); |
SED9008 | 0:ad88907cf227 | 407 | break; |
SED9008 | 0:ad88907cf227 | 408 | default: |
SED9008 | 0:ad88907cf227 | 409 | printf("DEFAULT\r\n"); |
SED9008 | 0:ad88907cf227 | 410 | } |
SED9008 | 0:ad88907cf227 | 411 | } |
SED9008 | 0:ad88907cf227 | 412 | |
SED9008 | 0:ad88907cf227 | 413 | |
SED9008 | 0:ad88907cf227 | 414 | void onListeningTCPSocketEvent(TCPSocketEvent e) |
SED9008 | 0:ad88907cf227 | 415 | { |
SED9008 | 0:ad88907cf227 | 416 | switch(e) |
SED9008 | 0:ad88907cf227 | 417 | { |
SED9008 | 0:ad88907cf227 | 418 | case TCPSOCKET_ACCEPT: |
SED9008 | 0:ad88907cf227 | 419 | printf("Listening: TCP Socket Accepted\r\n"); |
SED9008 | 0:ad88907cf227 | 420 | // Accepts connection from client and gets connected socket. |
SED9008 | 0:ad88907cf227 | 421 | err=ListeningSock.accept(&client, &pConnectedSock); |
SED9008 | 0:ad88907cf227 | 422 | if (err) { |
SED9008 | 0:ad88907cf227 | 423 | printf("onListeningTcpSocketEvent : Could not accept connection.\r\n"); |
SED9008 | 0:ad88907cf227 | 424 | return; //Error in accept, discard connection |
SED9008 | 0:ad88907cf227 | 425 | } |
SED9008 | 0:ad88907cf227 | 426 | // Setup the new socket events |
SED9008 | 0:ad88907cf227 | 427 | pConnectedSock->setOnEvent(&onConnectedTCPSocketEvent); |
SED9008 | 0:ad88907cf227 | 428 | // We can find out from where the connection is coming by looking at the |
SED9008 | 0:ad88907cf227 | 429 | // Host parameter of the accept() method |
SED9008 | 0:ad88907cf227 | 430 | IpAddr clientIp = client.getIp(); |
SED9008 | 0:ad88907cf227 | 431 | printf("Listening: Incoming TCP connection from %d.%d.%d.%d\r\n", |
SED9008 | 0:ad88907cf227 | 432 | clientIp[0], clientIp[1], clientIp[2], clientIp[3]); |
SED9008 | 0:ad88907cf227 | 433 | break; |
SED9008 | 0:ad88907cf227 | 434 | // the following cases will not happen |
SED9008 | 0:ad88907cf227 | 435 | case TCPSOCKET_CONNECTED: |
SED9008 | 0:ad88907cf227 | 436 | printf("Listening: TCP Socket Connected\r\n"); |
SED9008 | 0:ad88907cf227 | 437 | break; |
SED9008 | 0:ad88907cf227 | 438 | case TCPSOCKET_WRITEABLE: |
SED9008 | 0:ad88907cf227 | 439 | printf("Listening: TCP Socket Writable\r\n"); |
SED9008 | 0:ad88907cf227 | 440 | break; |
SED9008 | 0:ad88907cf227 | 441 | case TCPSOCKET_READABLE: |
SED9008 | 0:ad88907cf227 | 442 | printf("Listening: TCP Socket Readable\r\n"); |
SED9008 | 0:ad88907cf227 | 443 | break; |
SED9008 | 0:ad88907cf227 | 444 | case TCPSOCKET_CONTIMEOUT: |
SED9008 | 0:ad88907cf227 | 445 | printf("Listening: TCP Socket Timeout\r\n"); |
SED9008 | 0:ad88907cf227 | 446 | break; |
SED9008 | 0:ad88907cf227 | 447 | case TCPSOCKET_CONRST: |
SED9008 | 0:ad88907cf227 | 448 | printf("Listening: TCP Socket CONRST\r\n"); |
SED9008 | 0:ad88907cf227 | 449 | break; |
SED9008 | 0:ad88907cf227 | 450 | case TCPSOCKET_CONABRT: |
SED9008 | 0:ad88907cf227 | 451 | printf("Listening: TCP Socket CONABRT\r\n"); |
SED9008 | 0:ad88907cf227 | 452 | break; |
SED9008 | 0:ad88907cf227 | 453 | case TCPSOCKET_ERROR: |
SED9008 | 0:ad88907cf227 | 454 | printf("Listening: TCP Socket Error\r\n"); |
SED9008 | 0:ad88907cf227 | 455 | break; |
SED9008 | 0:ad88907cf227 | 456 | case TCPSOCKET_DISCONNECTED: |
SED9008 | 0:ad88907cf227 | 457 | //Close socket... |
SED9008 | 0:ad88907cf227 | 458 | printf("Listening: TCP Socket Disconnected\r\n"); |
SED9008 | 0:ad88907cf227 | 459 | ListeningSock.close(); |
SED9008 | 0:ad88907cf227 | 460 | break; |
SED9008 | 0:ad88907cf227 | 461 | default: |
SED9008 | 0:ad88907cf227 | 462 | printf("DEFAULT\r\n"); |
SED9008 | 0:ad88907cf227 | 463 | }; |
SED9008 | 0:ad88907cf227 | 464 | } |