Luis Rodil-Fernandez
3 years ago
commit
d0baf9d0e3
4 changed files with 571 additions and 0 deletions
-
3README.md
-
280m5__wave-sampler-gps-imu/GPSAnalyse.cpp
-
117m5__wave-sampler-gps-imu/GPSAnalyse.h
-
171m5__wave-sampler-gps-imu/m5__wave-sampler-gps-imu.ino
@ -0,0 +1,3 @@ |
|||
## Seacamp experiments |
|||
|
|||
|
@ -0,0 +1,280 @@ |
|||
#include "GPSAnalyse.h"
|
|||
|
|||
GPSAnalyse::GPSAnalyse() |
|||
{ |
|||
_GPS_Str.clear(); |
|||
} |
|||
|
|||
|
|||
void GPSAnalyse::setSerialPtr(HardwareSerial &serial) |
|||
{ |
|||
_serial = &serial; |
|||
_xSemaphore = xSemaphoreCreateMutex(); |
|||
} |
|||
|
|||
GPSAnalyse::~GPSAnalyse() |
|||
{ |
|||
|
|||
} |
|||
|
|||
void GPSAnalyse::run(void *data) |
|||
{ |
|||
GPSReadBuff = (char*)calloc(1024,sizeof(char)); |
|||
Serial.println("GPS Task"); |
|||
while (1) |
|||
{ |
|||
if (_serial->available()) |
|||
{ |
|||
|
|||
memset(GPSReadBuff, 1024, sizeof(char)); |
|||
_serial->readBytes(GPSReadBuff, _serial->available()); |
|||
_GPS_Str.concat(GPSReadBuff); |
|||
xSemaphoreTake(_xSemaphore, portMAX_DELAY); |
|||
Analyse(); |
|||
xSemaphoreGive(_xSemaphore); |
|||
delay(1); |
|||
} |
|||
else |
|||
{ |
|||
delay(5); |
|||
} |
|||
} |
|||
} |
|||
|
|||
void GPSAnalyse::upDate() |
|||
{ |
|||
xSemaphoreTake(_xSemaphore, portMAX_DELAY); |
|||
memcpy(&s_GNRMC,&_s_GNRMC,sizeof(GNRMC_t)); |
|||
memcpy(&s_GNGAS,&_s_GNGAS,sizeof(GNGSA_t)); |
|||
memcpy(&s_GPGSV,&_s_GPGSV,sizeof(GPGSV_t)); |
|||
xSemaphoreGive(_xSemaphore); |
|||
} |
|||
|
|||
void GPSAnalyse::AnaGPRMC(String str) |
|||
{ |
|||
str = str.substring(str.indexOf("GNRMC"), str.length()); |
|||
if (str.indexOf('*') != -1) |
|||
{ |
|||
int indexsub = str.indexOf('*'); |
|||
String sumstr = str.substring(indexsub + 1, str.length()); |
|||
str = str.substring(0, indexsub); |
|||
//Serial.println(sumstr);
|
|||
} |
|||
|
|||
int index = 0, last_index = 0, pamindex = 1; |
|||
|
|||
while (str.indexOf(',', index) != -1) |
|||
{ |
|||
index = str.indexOf(',', index + 1); |
|||
last_index = str.indexOf(',', index + 1); |
|||
//Serial.printf("index:%d,%d\n", index, last_index);
|
|||
if (index != -1) |
|||
{ |
|||
last_index = (last_index == -1) ? str.length() : last_index; |
|||
if ((last_index - index) > 1) |
|||
{ |
|||
String pamstr = str.substring(index + 1, last_index); |
|||
#ifdef DEBUG_GPS
|
|||
Serial.printf("%d:", pamindex); |
|||
Serial.println(pamstr); |
|||
#endif
|
|||
_s_GNRMC.pamstr[pamindex] = pamstr; |
|||
} |
|||
else |
|||
{ |
|||
_s_GNRMC.pamstr[pamindex].clear(); |
|||
} |
|||
|
|||
pamindex++; |
|||
} |
|||
} |
|||
|
|||
_s_GNRMC.Utc = _s_GNRMC.pamstr[1]; |
|||
if (_s_GNRMC.pamstr[2].length() != 0) |
|||
{ |
|||
_s_GNRMC.State = _s_GNRMC.pamstr[2].charAt(0); |
|||
} |
|||
|
|||
{ |
|||
_s_GNRMC.Latitude = _s_GNRMC.pamstr[3].substring(0, 2).toDouble() + _s_GNRMC.pamstr[3].substring(2, 4).toDouble() / 60 + _s_GNRMC.pamstr[3].substring(5, 9).toDouble() / 600000; |
|||
} |
|||
//_s_GNRMC.Latitude = _s_GNRMC.pamstr[3].toDouble();
|
|||
_s_GNRMC.LatitudeMark = _s_GNRMC.pamstr[4].charAt(0); |
|||
{ |
|||
_s_GNRMC.Longitude = _s_GNRMC.pamstr[5].substring(0, 3).toDouble() + _s_GNRMC.pamstr[5].substring(3, 5).toDouble() / 60 + _s_GNRMC.pamstr[5].substring(6, 10).toDouble() / 600000; |
|||
} |
|||
//_s_GNRMC.Longitude = _s_GNRMC.pamstr[5].toDouble();
|
|||
_s_GNRMC.LongitudeMark = _s_GNRMC.pamstr[6].charAt(0); |
|||
_s_GNRMC.TrackSpeed = _s_GNRMC.pamstr[7].toFloat(); |
|||
_s_GNRMC.TrackAngle = _s_GNRMC.pamstr[8].toFloat(); |
|||
_s_GNRMC.Date = _s_GNRMC.pamstr[9]; |
|||
_s_GNRMC.Magnetic = _s_GNRMC.pamstr[10].toFloat(); |
|||
_s_GNRMC.Declination = _s_GNRMC.pamstr[11].charAt(0); |
|||
_s_GNRMC.mode = _s_GNRMC.pamstr[12].charAt(0); |
|||
} |
|||
|
|||
void GPSAnalyse::AnaGNGAS(String str) |
|||
{ |
|||
str = str.substring(str.indexOf("GNGSA"), str.length()); |
|||
|
|||
if (str.indexOf('*') != -1) |
|||
{ |
|||
int indexsub = str.indexOf('*'); |
|||
String sumstr = str.substring(indexsub + 1, str.length()); |
|||
str = str.substring(0, indexsub); |
|||
//Serial.println(sumstr);
|
|||
} |
|||
|
|||
int index = 0, last_index = 0, pamindex = 1; |
|||
while (str.indexOf(',', index) != -1) |
|||
{ |
|||
index = str.indexOf(',', index + 1); |
|||
last_index = str.indexOf(',', index + 1); |
|||
if (index != -1) |
|||
{ |
|||
last_index = (last_index == -1) ? str.length() : last_index; |
|||
if ((last_index - index) > 1) |
|||
{ |
|||
String pamstr = str.substring(index + 1, last_index); |
|||
#ifdef DEBUG_GPS
|
|||
Serial.printf("%d:", pamindex); |
|||
Serial.println(pamstr); |
|||
#endif
|
|||
_s_GNGAS.pamstr[pamindex] = pamstr; |
|||
} |
|||
else |
|||
{ |
|||
_s_GNGAS.pamstr[pamindex].clear(); |
|||
} |
|||
pamindex++; |
|||
} |
|||
} |
|||
|
|||
_s_GNGAS.mode2 = _s_GNGAS.pamstr[1].charAt(0); |
|||
_s_GNGAS.mode1 = _s_GNGAS.pamstr[2].toInt(); |
|||
for (size_t i = 0; i < 12; i++) |
|||
{ |
|||
_s_GNGAS.PINMap[i] = _s_GNGAS.pamstr[3 + i].toInt(); |
|||
} |
|||
_s_GNGAS.PDOP = _s_GNGAS.pamstr[15].toFloat(); |
|||
_s_GNGAS.HDOP = _s_GNGAS.pamstr[16].toFloat(); |
|||
_s_GNGAS.VDOP = _s_GNGAS.pamstr[17].toFloat(); |
|||
} |
|||
|
|||
void GPSAnalyse::AnaGPGSV(String str) |
|||
{ |
|||
//Serial.println(str);
|
|||
str = str.substring(str.indexOf("GPGSV"), str.length()); |
|||
|
|||
if (str.indexOf('*') != -1) |
|||
{ |
|||
int indexsub = str.indexOf('*'); |
|||
String sumstr = str.substring(indexsub + 1, str.length()); |
|||
str = str.substring(0, indexsub); |
|||
//Serial.println(sumstr);
|
|||
} |
|||
|
|||
int index = 0, last_index = 0, pamindex = 1; |
|||
while (str.indexOf(',', index) != -1) |
|||
{ |
|||
index = str.indexOf(',', index + 1); |
|||
last_index = str.indexOf(',', index + 1); |
|||
if (index != -1) |
|||
{ |
|||
last_index = (last_index == -1) ? str.length() : last_index; |
|||
if ((last_index - index) > 1) |
|||
{ |
|||
String pamstr = str.substring(index + 1, last_index); |
|||
#ifdef DEBUG_GPS
|
|||
Serial.printf("%d:", pamindex); |
|||
Serial.println(pamstr); |
|||
#endif
|
|||
_s_GPGSV.pamstr[pamindex] = pamstr; |
|||
} |
|||
else |
|||
{ |
|||
_s_GPGSV.pamstr[pamindex].clear(); |
|||
} |
|||
pamindex++; |
|||
} |
|||
} |
|||
int SatelliteSize = (pamindex - 4) / 4; |
|||
//Serial.printf("Number%d\n", SatelliteSize);
|
|||
|
|||
_s_GPGSV.size = _s_GPGSV.pamstr[1].toInt(); |
|||
_s_GPGSV.Number = _s_GPGSV.pamstr[2].toInt(); |
|||
_s_GPGSV.SatelliteSize = _s_GPGSV.pamstr[3].toInt(); |
|||
|
|||
if (_s_GPGSV.Number == 1) |
|||
{ |
|||
for (size_t i = 0; i < 32; i++) |
|||
{ |
|||
_s_GPGSV.Satellite[i].flag = false; |
|||
} |
|||
} |
|||
for (size_t i = 0; i < SatelliteSize; i++) |
|||
{ |
|||
int id = _s_GPGSV.pamstr[4 + (i * 4) + 0].toInt(); |
|||
if( id >= 32 ) continue; |
|||
if(( 7 + (i * 4)) > 50 ) |
|||
{ |
|||
break; |
|||
} |
|||
_s_GPGSV.Satellite[id].elevation = _s_GPGSV.pamstr[4 + (i * 4) + 1].toInt(); |
|||
_s_GPGSV.Satellite[id].Azimuth = _s_GPGSV.pamstr[4 + (i * 4) + 2].toInt(); |
|||
_s_GPGSV.Satellite[id].SNR = (_s_GPGSV.pamstr[4 + (i * 4) + 3].length() == 0) ? -1 : _s_GPGSV.pamstr[4 + (i * 4) + 3].toInt(); |
|||
_s_GPGSV.Satellite[id].flag = true; |
|||
} |
|||
|
|||
if (_s_GPGSV.Number == _s_GPGSV.size) |
|||
{ |
|||
for (size_t i = 0; i < 32; i++) |
|||
{ |
|||
if (_s_GPGSV.Satellite[i].flag == true) |
|||
{ |
|||
#ifdef DEBUG_GPS
|
|||
Serial.printf("ID %d:%d,%d,%d\n", i, _s_GPGSV.Satellite[i].elevation, _s_GPGSV.Satellite[i].Azimuth, _s_GPGSV.Satellite[i].SNR); |
|||
#endif
|
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
void GPSAnalyse::Analyse() |
|||
{ |
|||
while (_GPS_Str.indexOf('\r') != -1) |
|||
{ |
|||
int index = _GPS_Str.indexOf('\r'); |
|||
String str = _GPS_Str.substring(0, index); |
|||
_GPS_Str = _GPS_Str.substring(index + 3, _GPS_Str.length()); |
|||
|
|||
str.trim(); |
|||
|
|||
//Serial.println(str);
|
|||
|
|||
if (str.indexOf("GNRMC") != -1) |
|||
{ |
|||
AnaGPRMC(str); |
|||
} |
|||
else if (str.indexOf("GPVTG") != -1) |
|||
{ |
|||
} |
|||
else if (str.indexOf("GPGGA") != -1) |
|||
{ |
|||
|
|||
} |
|||
else if (str.indexOf("GNGSA") != -1) |
|||
{ |
|||
//Serial.print("GNGSA:");
|
|||
//AnaGNGAS(str);
|
|||
} |
|||
else if (str.indexOf("GPGSV") != -1) |
|||
{ |
|||
//Serial.print("GPGSV:");
|
|||
AnaGPGSV(str); |
|||
} |
|||
else if (str.indexOf("GPGLL") != -1) |
|||
{ |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,117 @@ |
|||
#ifndef _GPSANALYSE_H_ |
|||
#define _GPSANALYSE_H_ |
|||
|
|||
#include <Arduino.h> |
|||
#include "utility/Task.h" |
|||
#include <freertos/FreeRTOS.h> |
|||
#include <freertos/task.h> |
|||
|
|||
//#define DEBUG_GPS |
|||
|
|||
typedef struct GNRMC |
|||
{ |
|||
String pamstr[13]; |
|||
String Utc; //1 |
|||
char State; //2 |
|||
double Latitude; //3 |
|||
char LatitudeMark; //4 |
|||
double Longitude; //5 |
|||
char LongitudeMark; //6 |
|||
float TrackSpeed; //7 |
|||
float TrackAngle; //8 |
|||
String Date; //9 |
|||
float Magnetic; //10 |
|||
char Declination; //11 |
|||
int mode; //12 |
|||
String Sum; |
|||
}GNRMC_t; |
|||
|
|||
|
|||
typedef struct GNGSA |
|||
{ |
|||
String pamstr[50]; |
|||
char mode2; |
|||
int mode1; |
|||
int PINMap[12]; |
|||
float PDOP; |
|||
float HDOP; |
|||
float VDOP; |
|||
String Sum; |
|||
|
|||
}GNGSA_t; |
|||
|
|||
typedef struct GPSSatellite |
|||
{ |
|||
bool flag; |
|||
int id; |
|||
int elevation; |
|||
int Azimuth; |
|||
int SNR; |
|||
}GPSSatellite_t; |
|||
|
|||
typedef struct GPGSV |
|||
{ |
|||
String pamstr[128]; |
|||
int size; |
|||
int Number; |
|||
int SatelliteSize; |
|||
GPSSatellite_t Satellite[32]; |
|||
String sum; |
|||
}GPGSV_t; |
|||
|
|||
/* |
|||
typedef struct GPGGA |
|||
{ |
|||
}GPGGA_t; |
|||
|
|||
typedef struct GPGGA |
|||
{ |
|||
}GPGGA_t; |
|||
|
|||
|
|||
typedef struct GPGLL |
|||
{ |
|||
|
|||
}GPGLL_t; |
|||
*/ |
|||
|
|||
class GPSAnalyse : public Task |
|||
{ |
|||
private: |
|||
|
|||
/* data */ |
|||
String _GPS_Str; |
|||
HardwareSerial *_serial; |
|||
SemaphoreHandle_t _xSemaphore = NULL; |
|||
char *GPSReadBuff; |
|||
|
|||
void Analyse(); |
|||
|
|||
void AnaGPRMC(String str); |
|||
void AnaGNGAS(String str); |
|||
void AnaGPGSV(String str); |
|||
|
|||
void run(void *data); |
|||
|
|||
GNRMC_t _s_GNRMC; |
|||
GNGSA_t _s_GNGAS; |
|||
GPGSV_t _s_GPGSV; |
|||
|
|||
public: |
|||
GPSAnalyse(); |
|||
~GPSAnalyse(); |
|||
void setSerialPtr(HardwareSerial &serial); |
|||
void upDate(); |
|||
|
|||
|
|||
GNRMC_t s_GNRMC; |
|||
GNGSA_t s_GNGAS; |
|||
GPGSV_t s_GPGSV; |
|||
}; |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
#endif |
@ -0,0 +1,171 @@ |
|||
#undef DEBUG_GPS
|
|||
|
|||
#include "M5Atom.h"
|
|||
#include "GPSAnalyse.h"
|
|||
#include <SPI.h>
|
|||
#include "FS.h"
|
|||
#include <SD.h>
|
|||
#include <Metro.h>
|
|||
|
|||
GPSAnalyse GPS; |
|||
Metro banggps(2000); |
|||
Metro bangimu(20); |
|||
Metro banglog(1000); |
|||
|
|||
const char outfilename[] = "/wave-sample.csv"; |
|||
File of; |
|||
|
|||
typedef struct sGps { |
|||
float lat; |
|||
float lon; |
|||
String utc; |
|||
} tGps; |
|||
|
|||
typedef struct sImu { |
|||
// accelerometer
|
|||
float aX = 0.0f; |
|||
float aY = 0.0f; |
|||
float aZ = 0.0f; |
|||
|
|||
// gyroscope
|
|||
float gX = 0.0f; |
|||
float gY = 0.0f; |
|||
float gZ = 0.0f; |
|||
|
|||
// angles
|
|||
float pitch = 0.0f; |
|||
float roll = 0.0f; |
|||
float yaw = 0.0f; |
|||
|
|||
float temp = 0.0f; |
|||
} tImu; |
|||
|
|||
unsigned long mselapsed; |
|||
tGps gpssample; |
|||
tImu imusample; |
|||
|
|||
bool writeSample(String filename) { |
|||
of = SD.open(filename, FILE_APPEND); |
|||
if(of) { |
|||
of.print( mselapsed ); |
|||
of.print(", "); |
|||
of.print(gpssample.lat); |
|||
of.print(", "); |
|||
of.print(gpssample.lon); |
|||
of.print(", "); |
|||
of.print(gpssample.utc); |
|||
of.print(", "); |
|||
of.print(imusample.aX); |
|||
of.print(", "); |
|||
of.print(imusample.aY); |
|||
of.print(", "); |
|||
of.print(imusample.aZ); |
|||
of.print(", "); |
|||
of.print(imusample.gX); |
|||
of.print(", "); |
|||
of.print(imusample.gY); |
|||
of.print(", "); |
|||
of.print(imusample.gZ); |
|||
of.print(", "); |
|||
of.print(imusample.pitch); |
|||
of.print(", "); |
|||
of.print(imusample.roll); |
|||
of.print(", "); |
|||
of.print(imusample.yaw); |
|||
of.print(", "); |
|||
of.print(imusample.temp); |
|||
of.println(); // EOL
|
|||
of.close(); |
|||
} else { |
|||
return false; |
|||
} |
|||
return true; |
|||
} |
|||
|
|||
void setup(){ |
|||
M5.begin(true, false, true); |
|||
|
|||
M5.IMU.Init(); |
|||
|
|||
SPI.begin(23,33,19,-1); |
|||
if(!SD.begin(-1, SPI, 40000000)){ |
|||
Serial.println("initialization failed!"); |
|||
} |
|||
sdcard_type_t Type = SD.cardType(); |
|||
|
|||
Serial.printf("SDCard Type = %d \r\n",Type); |
|||
Serial.printf("SDCard Size = %d \r\n" , (int)(SD.cardSize()/1024/1024)); |
|||
|
|||
Serial1.begin(9600,SERIAL_8N1,22,-1); |
|||
GPS.setTaskName("GPS"); |
|||
GPS.setTaskPriority(2); |
|||
GPS.setSerialPtr(Serial1); |
|||
GPS.start(); |
|||
|
|||
M5.dis.fillpix(0x000000); |
|||
} |
|||
|
|||
void gps_loop() { |
|||
GPS.upDate(); |
|||
gpssample.lat = GPS.s_GNRMC.Latitude; |
|||
gpssample.lon = GPS.s_GNRMC.Longitude; |
|||
gpssample.utc = GPS.s_GNRMC.Utc; |
|||
} |
|||
|
|||
void imu_loop() { |
|||
//Stores the triaxial gyroscope data of the inertial sensor to the relevant variable
|
|||
M5.IMU.getGyroData(&imusample.gX,&imusample.gY,&imusample.gZ); |
|||
M5.IMU.getAccelData(&imusample.aX,&imusample.aY,&imusample.aZ); // accelero
|
|||
M5.IMU.getAhrsData(&imusample.pitch,&imusample.roll,&imusample.yaw); // attitude
|
|||
M5.IMU.getTempData(&imusample.temp); // temperature
|
|||
} |
|||
|
|||
void debugSample() { |
|||
Serial.print( mselapsed ); |
|||
Serial.print(", "); |
|||
Serial.print(gpssample.lat); |
|||
Serial.print(", "); |
|||
Serial.print(gpssample.lon); |
|||
Serial.print(", "); |
|||
Serial.print(gpssample.utc); |
|||
Serial.print(", "); |
|||
Serial.print(imusample.aX); |
|||
Serial.print(", "); |
|||
Serial.print(imusample.aY); |
|||
Serial.print(", "); |
|||
Serial.print(imusample.aZ); |
|||
Serial.print(", "); |
|||
Serial.print(imusample.gX); |
|||
Serial.print(", "); |
|||
Serial.print(imusample.gY); |
|||
Serial.print(", "); |
|||
Serial.print(imusample.gZ); |
|||
Serial.print(", "); |
|||
Serial.print(imusample.pitch); |
|||
Serial.print(", "); |
|||
Serial.print(imusample.roll); |
|||
Serial.print(", "); |
|||
Serial.print(imusample.yaw); |
|||
Serial.print(", "); |
|||
Serial.print(imusample.temp); |
|||
Serial.println(); // EOL
|
|||
} |
|||
|
|||
void loop() { |
|||
M5.dis.fillpix(0x000000); |
|||
|
|||
if(banggps.check()) { |
|||
gps_loop(); |
|||
} |
|||
|
|||
if(bangimu.check()) { |
|||
imu_loop(); |
|||
// writeSample( outfilename );
|
|||
} |
|||
|
|||
if(banglog.check()) { |
|||
debugSample(); |
|||
} |
|||
|
|||
mselapsed = millis(); |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue