GPS and IMU reading works

Dependencies:   mbed Servo SDFileSystem

/media/uploads/taoqiuyang/img_2352.jpg

Committer:
taoqiuyang
Date:
Fri Aug 28 07:23:00 2015 +0000
Revision:
17:0b89c374f2f7
Parent:
16:0ea992d9a390
Child:
18:9a30764847d2
Added Servo

Who changed what in which revision?

UserRevisionLine numberNew contents of line
taoqiuyang 0:f4d390c06705 1 #include "mbed.h"
taoqiuyang 3:ab9f94d112c0 2 #include <string>
dem123456789 9:bf5939466e86 3 #include <sstream>
dem123456789 9:bf5939466e86 4 #include <vector>
dem123456789 14:92bacb5af01b 5 #include "Get.h"
taoqiuyang 17:0b89c374f2f7 6 #include "Servo.h"
dem123456789 11:1caacb994236 7 using namespace std;
dem123456789 11:1caacb994236 8
dem123456789 11:1caacb994236 9 #define MAX_IMU_SIZE 29
taoqiuyang 3:ab9f94d112c0 10
taoqiuyang 17:0b89c374f2f7 11 //Indicator LEDs
taoqiuyang 2:afb333543af5 12 DigitalOut led1(LED1);
taoqiuyang 2:afb333543af5 13 DigitalOut led2(LED2);
taoqiuyang 5:451b8203ef99 14 DigitalOut led3(LED3);
dem123456789 8:1f5a44bade4d 15 DigitalOut led4(LED4);
taoqiuyang 17:0b89c374f2f7 16
taoqiuyang 17:0b89c374f2f7 17 //Hardware connections
taoqiuyang 2:afb333543af5 18 Serial pc(USBTX, USBRX);
taoqiuyang 2:afb333543af5 19 Serial IMU(p28, p27); // tx, rx
taoqiuyang 5:451b8203ef99 20 Serial GPS(p13, p14); // tx, rx
taoqiuyang 17:0b89c374f2f7 21 Servo rudderServo(p25);
taoqiuyang 17:0b89c374f2f7 22 Servo wingServo(p26);
taoqiuyang 17:0b89c374f2f7 23 //rudderservo = 0.5;
taoqiuyang 2:afb333543af5 24
taoqiuyang 2:afb333543af5 25 char IMU_message[256];
taoqiuyang 3:ab9f94d112c0 26 int IMU_message_counter=0;
taoqiuyang 5:451b8203ef99 27 char GPS_message[256];
taoqiuyang 5:451b8203ef99 28 int GPS_message_counter=0;
dem123456789 14:92bacb5af01b 29 char PC_message[256];
dem123456789 14:92bacb5af01b 30 int PC_message_counter=0;
dem123456789 11:1caacb994236 31
dem123456789 11:1caacb994236 32 string IMU_Y="N/A";
dem123456789 11:1caacb994236 33 string IMU_P="N/A";
dem123456789 11:1caacb994236 34 string IMU_R="N/A";
dem123456789 14:92bacb5af01b 35 string GPS_Quality="N/A";
dem123456789 11:1caacb994236 36 string GPS_UTC="N/A";
dem123456789 11:1caacb994236 37 string GPS_Latitude="N/A";
dem123456789 11:1caacb994236 38 string GPS_Longtitude="N/A";
dem123456789 11:1caacb994236 39 string GPS_Altitude="N/A";
dem123456789 11:1caacb994236 40 string GPS_Num_Satellite="N/A";
dem123456789 11:1caacb994236 41 string GPS_HDOP="N/A";
dem123456789 12:8644abfa86da 42 string GPS_VDOP="N/A";
dem123456789 12:8644abfa86da 43 string GPS_PDOP="N/A";
dem123456789 14:92bacb5af01b 44 string GPS_Date="N/A";
dem123456789 14:92bacb5af01b 45 string GPS_VelocityKnot="N/A";
dem123456789 14:92bacb5af01b 46 string GPS_VelocityKph="N/A";
dem123456789 14:92bacb5af01b 47
dem123456789 12:8644abfa86da 48 int asterisk_idx;
dem123456789 9:bf5939466e86 49
dem123456789 9:bf5939466e86 50 vector<string> split(const string &s, char delim) {
dem123456789 9:bf5939466e86 51 stringstream ss(s);
dem123456789 9:bf5939466e86 52 string item;
dem123456789 9:bf5939466e86 53 vector<string> tokens;
dem123456789 9:bf5939466e86 54 while (getline(ss, item, delim)) {
dem123456789 15:dbf20c1209ae 55 if (item.empty()) {
dem123456789 15:dbf20c1209ae 56 item == "N/A";
dem123456789 15:dbf20c1209ae 57 }
dem123456789 9:bf5939466e86 58 tokens.push_back(item);
dem123456789 9:bf5939466e86 59 }
dem123456789 9:bf5939466e86 60 return tokens;
dem123456789 9:bf5939466e86 61 }
dem123456789 9:bf5939466e86 62
dem123456789 9:bf5939466e86 63 void updateIMU(string IMU_data) {
dem123456789 9:bf5939466e86 64 string IMU_data_string(IMU_data);
dem123456789 9:bf5939466e86 65 if (IMU_data_string.substr(0,4) == "#YPR" and IMU_data_string.size() <= MAX_IMU_SIZE) {
dem123456789 9:bf5939466e86 66 IMU_data_string = IMU_data_string.substr(5);
dem123456789 9:bf5939466e86 67 vector<string> result = split(IMU_data_string, ',');
dem123456789 9:bf5939466e86 68 IMU_Y = result.at(0);
dem123456789 9:bf5939466e86 69 IMU_P = result.at(1);
dem123456789 15:dbf20c1209ae 70 IMU_R = result.at(2).substr(0, result.at(2).size()-1);
dem123456789 9:bf5939466e86 71 }
dem123456789 9:bf5939466e86 72 }
dem123456789 9:bf5939466e86 73
dem123456789 10:12ba6ed2d6f0 74 void updateGPS(string GPS_data) {
dem123456789 10:12ba6ed2d6f0 75 string GPS_data_string(GPS_data);
dem123456789 11:1caacb994236 76 if (GPS_data_string.substr(0,6) == "$GPGGA") {
dem123456789 11:1caacb994236 77 GPS_data_string = GPS_data_string.substr(7);
dem123456789 10:12ba6ed2d6f0 78 vector<string> result = split(GPS_data_string, ',');
dem123456789 14:92bacb5af01b 79 GPS_Quality = result.at(5);
dem123456789 14:92bacb5af01b 80 if(GPS_Quality != "0" and GPS_Quality != "6") {
dem123456789 11:1caacb994236 81 GPS_UTC = result.at(0);
dem123456789 11:1caacb994236 82 GPS_Latitude = result.at(2) + result.at(1);
dem123456789 11:1caacb994236 83 GPS_Longtitude = result.at(4) + result.at(3);
dem123456789 11:1caacb994236 84 GPS_Num_Satellite = result.at(6);
dem123456789 11:1caacb994236 85 GPS_HDOP = result.at(7);
dem123456789 11:1caacb994236 86 GPS_Altitude = result.at(8) + result.at(9);
dem123456789 11:1caacb994236 87 }
dem123456789 14:92bacb5af01b 88 } else if (GPS_data_string.substr(0,6) == "$GPGSA" and GPS_Quality != "0" and GPS_Quality != "6") {
dem123456789 12:8644abfa86da 89 GPS_data_string = GPS_data_string.substr(7);
dem123456789 12:8644abfa86da 90 vector<string> result = split(GPS_data_string, ',');
dem123456789 12:8644abfa86da 91 GPS_PDOP = result.at(14);
dem123456789 12:8644abfa86da 92 asterisk_idx = result.at(16).find('*');
dem123456789 12:8644abfa86da 93 GPS_VDOP = result.at(16).substr(0, asterisk_idx);
dem123456789 14:92bacb5af01b 94 } else if (GPS_data_string.substr(0,6) == "$GPRMC" and GPS_Quality != "0" and GPS_Quality != "6") {
dem123456789 12:8644abfa86da 95 GPS_data_string = GPS_data_string.substr(7);
dem123456789 12:8644abfa86da 96 vector<string> result = split(GPS_data_string, ',');
dem123456789 14:92bacb5af01b 97 GPS_Date = result.at(8);
dem123456789 14:92bacb5af01b 98 } else if (GPS_data_string.substr(0,6) == "$GPVTG" and GPS_Quality != "0" and GPS_Quality != "6") {
dem123456789 12:8644abfa86da 99 GPS_data_string = GPS_data_string.substr(7);
dem123456789 12:8644abfa86da 100 vector<string> result = split(GPS_data_string, ',');
dem123456789 14:92bacb5af01b 101 GPS_VelocityKnot = result.at(4) + result.at(5);
dem123456789 12:8644abfa86da 102 asterisk_idx = result.at(7).find('*');
dem123456789 14:92bacb5af01b 103 GPS_VelocityKph = result.at(6) + result.at(7).substr(0, asterisk_idx);
dem123456789 10:12ba6ed2d6f0 104 }
dem123456789 12:8644abfa86da 105
dem123456789 10:12ba6ed2d6f0 106 }
dem123456789 16:0ea992d9a390 107 /* Get data from SailBoat
dem123456789 16:0ea992d9a390 108 @GET=parameter
dem123456789 16:0ea992d9a390 109 Ex: @GET=GPS_Quality
dem123456789 16:0ea992d9a390 110 Supported parameter: GPS_Quality, GPS_UTC, GPS_Latitude, GPS_Longtitude, GPS_Altitude,
dem123456789 16:0ea992d9a390 111 GPS_Num_Satellite, GPS_HDOP, GPS_VDOP, GPS_PDOP, GPS_Date, GPS_VelocityKnot, GPS_VelocityKph
dem123456789 16:0ea992d9a390 112 Set path to SailBoat
dem123456789 16:0ea992d9a390 113 @SET=Latitude, Longtitude, Task index
dem123456789 16:0ea992d9a390 114 @SET=33.776318, -84.407590, 3
dem123456789 16:0ea992d9a390 115 */
dem123456789 15:dbf20c1209ae 116 void decodePC(string PC_data) {
dem123456789 15:dbf20c1209ae 117 string PC_data_string(PC_data);
dem123456789 15:dbf20c1209ae 118 if (PC_data_string.substr(0,4) == "@GET") {
dem123456789 15:dbf20c1209ae 119 pc.printf("%s", PC_data_string.c_str());
dem123456789 15:dbf20c1209ae 120 PC_data_string = PC_data_string.substr(5, PC_data_string.size()-6);
dem123456789 15:dbf20c1209ae 121 pc.printf("%s\n", decodeCommand(PC_data_string).c_str());
dem123456789 16:0ea992d9a390 122 } else if (PC_data_string.substr(0,4) == "@SET") {
dem123456789 16:0ea992d9a390 123 }
dem123456789 15:dbf20c1209ae 124 }
dem123456789 15:dbf20c1209ae 125
dem123456789 15:dbf20c1209ae 126
dem123456789 11:1caacb994236 127 void printStateIMU() {
dem123456789 11:1caacb994236 128 pc.printf("IMU_Y: %s, IMU_P: %s, IMU_R: %s\n",IMU_Y.c_str(), IMU_P.c_str(), IMU_R.c_str());
dem123456789 11:1caacb994236 129 }
dem123456789 11:1caacb994236 130
dem123456789 12:8644abfa86da 131 void printStateGPS() {
dem123456789 14:92bacb5af01b 132 pc.printf("GPS_Quality: %s, GPS_UTC: %s, GPS_Latitude: %s, GPS_Longtitude: %s, GPS_Altitude: %s, "
dem123456789 14:92bacb5af01b 133 "GPS_Num_Satellite: %s, GPS_HDOP: %s, GPS_VDOP: %s, GPS_PDOP: %s, GPS_Date: %s, GPS_VelocityKnot: %s, GPS_VelocityKph: %s\n",
dem123456789 14:92bacb5af01b 134 GPS_Quality.c_str(), GPS_UTC.c_str(), GPS_Latitude.c_str(), GPS_Longtitude.c_str(), GPS_Altitude.c_str(), GPS_Num_Satellite.c_str(),
dem123456789 14:92bacb5af01b 135 GPS_HDOP.c_str(), GPS_VDOP.c_str(), GPS_PDOP.c_str(), GPS_Date.c_str(), GPS_VelocityKnot.c_str(), GPS_VelocityKph.c_str());
dem123456789 12:8644abfa86da 136 }
dem123456789 14:92bacb5af01b 137
dem123456789 11:1caacb994236 138 //#YPR=-183.74,-134.27,-114.39
taoqiuyang 4:37d118f2348c 139 void IMU_serial_ISR() {
taoqiuyang 3:ab9f94d112c0 140 char buf;
taoqiuyang 3:ab9f94d112c0 141
taoqiuyang 3:ab9f94d112c0 142 while (IMU.readable()) {
taoqiuyang 3:ab9f94d112c0 143 buf = IMU.getc();
taoqiuyang 3:ab9f94d112c0 144
dem123456789 14:92bacb5af01b 145 //pc.putc(buf);
taoqiuyang 3:ab9f94d112c0 146 IMU_message[IMU_message_counter]=buf;
dem123456789 9:bf5939466e86 147 IMU_message_counter+=1;
taoqiuyang 3:ab9f94d112c0 148
taoqiuyang 3:ab9f94d112c0 149 if (buf=='\n'){
dem123456789 9:bf5939466e86 150 string IMU_copy(IMU_message, IMU_message_counter);
dem123456789 11:1caacb994236 151 //pc.printf("%s", IMU_copy.c_str());
dem123456789 9:bf5939466e86 152 updateIMU(IMU_copy);
dem123456789 9:bf5939466e86 153 IMU_message_counter=0;
dem123456789 9:bf5939466e86 154 IMU_copy[0] = '\0';
dem123456789 9:bf5939466e86 155 }
dem123456789 9:bf5939466e86 156
taoqiuyang 3:ab9f94d112c0 157 }
taoqiuyang 2:afb333543af5 158 led2 = !led2;
taoqiuyang 2:afb333543af5 159 }
dem123456789 9:bf5939466e86 160
dem123456789 9:bf5939466e86 161
dem123456789 8:1f5a44bade4d 162
taoqiuyang 5:451b8203ef99 163 void GPS_serial_ISR() {
taoqiuyang 5:451b8203ef99 164 char buf;
taoqiuyang 5:451b8203ef99 165
taoqiuyang 5:451b8203ef99 166 while (GPS.readable()) {
taoqiuyang 5:451b8203ef99 167 buf = GPS.getc();
dem123456789 14:92bacb5af01b 168
dem123456789 14:92bacb5af01b 169 //pc.putc(buf);
dem123456789 10:12ba6ed2d6f0 170 GPS_message[GPS_message_counter]=buf;
dem123456789 10:12ba6ed2d6f0 171 GPS_message_counter+=1;
dem123456789 10:12ba6ed2d6f0 172
dem123456789 10:12ba6ed2d6f0 173 if (buf=='\n'){
dem123456789 10:12ba6ed2d6f0 174 string GPS_copy(GPS_message, GPS_message_counter);
dem123456789 11:1caacb994236 175 //pc.printf("%s", GPS_copy.c_str());
dem123456789 10:12ba6ed2d6f0 176 updateGPS(GPS_copy);
dem123456789 10:12ba6ed2d6f0 177 GPS_message_counter=0;
dem123456789 10:12ba6ed2d6f0 178 GPS_copy[0] = '\0';
dem123456789 10:12ba6ed2d6f0 179 }
taoqiuyang 5:451b8203ef99 180 }
taoqiuyang 5:451b8203ef99 181
taoqiuyang 5:451b8203ef99 182 led3 = !led3;
taoqiuyang 5:451b8203ef99 183 }
taoqiuyang 3:ab9f94d112c0 184
dem123456789 8:1f5a44bade4d 185 void PC_serial_ISR() {
dem123456789 8:1f5a44bade4d 186 char buf;
dem123456789 8:1f5a44bade4d 187
dem123456789 8:1f5a44bade4d 188 while (pc.readable()) {
dem123456789 8:1f5a44bade4d 189 buf = pc.getc();
dem123456789 14:92bacb5af01b 190
dem123456789 14:92bacb5af01b 191 //pc.putc(buf);
dem123456789 14:92bacb5af01b 192 PC_message[PC_message_counter]=buf;
dem123456789 14:92bacb5af01b 193 PC_message_counter+=1;
dem123456789 14:92bacb5af01b 194
dem123456789 14:92bacb5af01b 195 if (buf=='\n'){
dem123456789 14:92bacb5af01b 196 string PC_copy(PC_message, PC_message_counter);
dem123456789 14:92bacb5af01b 197 //pc.printf("%s", PC_copy.c_str());
dem123456789 14:92bacb5af01b 198 decodePC(PC_copy);
dem123456789 14:92bacb5af01b 199 PC_message_counter=0;
dem123456789 14:92bacb5af01b 200 PC_copy[0] = '\0';
dem123456789 14:92bacb5af01b 201 }
dem123456789 8:1f5a44bade4d 202 }
dem123456789 8:1f5a44bade4d 203
dem123456789 8:1f5a44bade4d 204 led4= !led4;
dem123456789 8:1f5a44bade4d 205 }
taoqiuyang 3:ab9f94d112c0 206
taoqiuyang 0:f4d390c06705 207 int main() {
taoqiuyang 2:afb333543af5 208 IMU.baud(57600);
taoqiuyang 4:37d118f2348c 209 IMU.attach(&IMU_serial_ISR);
taoqiuyang 5:451b8203ef99 210 GPS.baud(38400);
taoqiuyang 5:451b8203ef99 211 GPS.attach(&GPS_serial_ISR);
dem123456789 8:1f5a44bade4d 212 pc.baud(115200);
dem123456789 8:1f5a44bade4d 213 pc.attach(&PC_serial_ISR);
taoqiuyang 1:e7245ffb4820 214
taoqiuyang 2:afb333543af5 215 while (1) {
taoqiuyang 2:afb333543af5 216 led1 = !led1;
dem123456789 15:dbf20c1209ae 217 wait(0.4);
dem123456789 15:dbf20c1209ae 218 //printStateIMU();
dem123456789 15:dbf20c1209ae 219 //printStateGPS();
taoqiuyang 0:f4d390c06705 220 }
taoqiuyang 0:f4d390c06705 221 }