u-blox UBX library for I2C
Dependencies: Vector3
It will not work
Revision 0:6256752abece, committed 2021-09-12
- Comitter:
- cocorlow
- Date:
- Sun Sep 12 16:38:51 2021 +0000
- Commit message:
- TIMEUTC test
Changed in this revision
diff -r 000000000000 -r 6256752abece DataStructure.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DataStructure.hpp Sun Sep 12 16:38:51 2021 +0000 @@ -0,0 +1,53 @@ +#ifndef OBSVDSTRUCT +#define OBSVDSTRUCT + +//全ての観測データを収納する型 +typedef struct obsvdData{ + + int Tim; + + int Lon; + int Lat; + int GHeight; //GPS高度 + + int VelN; + int VelE; + int VelD; + + int Acc[3]; + int Gyr[3]; + int Mag[3]; + + int PHeight; //気圧 + + +}obsvdData; + +typedef struct timData{ + int Year; + int Month; + int Day; + int Hour; + int Min; + int Sec; +}tim; + +typedef enum state{ + WAIT, + MANUAL, + AUTO, + READ, + STREAM, + CONFIG +}state; + +//ログの状態を表す +typedef enum logstate{ + STOP, + STBY, + RUNTIME, + FIN +}logstate; + + +#endif \ No newline at end of file
diff -r 000000000000 -r 6256752abece GPSUBX.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/GPSUBX.cpp Sun Sep 12 16:38:51 2021 +0000 @@ -0,0 +1,104 @@ +#include "GPSUBX.hpp" +#include "mbed.h" + +GPSUBX::GPSUBX(PinName sda, PinName scl, char address = GPS_ADDRESS, int timedifference = 9, int hz = 100000) + :i2c(sda, scl), Address(address), TimeDifference(timedifference) +{ + i2c.frequency(hz); +} + +void GPSUBX::Checksum(char payload[], int n, char* ck_a, char* ck_b) +{ + int ca = 0; + int cb = 0; + for (int i = 0; i < n+4; i++) + { + ca += (unsigned char)payload[i+2]; + cb += ca; + } + *ck_a = (char)(ca & 0xff); + *ck_b = (char)(cb & 0xff); +} + +int GPSUBX::GetGPSData(GPSData* pdata) +{ + POSLLH posllh; + char command[8] = {0xb5, 0x62, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00}; + Checksum(command, 0, &command[6], &command[7]); + + i2c.write(Address << 1, command, 8); + i2c.read(Address << 1 | 1, posllh.byte_data, POSLLH_LEN+8); + + for (int i = 0; i < POSLLH_LEN+8; i++) + { + pc.printf("%x ", posllh.byte_data[i]); + } + pc.printf("\r\n"); + if (posllh.data.sync == UBX_SYNC && posllh.data.m_class == 0x01 && posllh.data.m_id == 0x02 && posllh.data.pay_len == POSLLH_LEN) + { + char ca, cb; + Checksum(posllh.byte_data, POSLLH_LEN, &ca, &cb); + if (posllh.data.check_a == ca && posllh.data.check_b == cb) + { + pdata->Longitude = (float)posllh.data.lon * 1e-7f; + pdata->Latitude = (float)posllh.data.lat * 1e-7f; + pdata->Height = (float)posllh.data.height / 1000.0f; + pc.printf("%f, %f, %f\r\n", pdata->Longitude, pdata->Latitude, pdata->Height); + } + else + { + pc.printf("#1\r\n"); + return 0; + } + pc.printf("#2\r\n"); + return 1; + } + else + { + pc.printf("#3\r\n"); + return 0; + } +} + +int GPSUBX::GetTimeData(GPSData* pdata) +{ + TIMEUTC timeutc; + char command[8] = {0xb5, 0x62, 0x01, 0x21, 0x00, 0x00, 0x00, 0x00}; + Checksum(command, 0, &command[6], &command[7]); + + i2c.write(Address << 1, command, 8); + i2c.read(Address << 1 | 1, timeutc.byte_data, TIMEUTC_LEN+8); + + for (int i = 0; i < TIMEUTC_LEN+8; i++) + { + pc.printf("%x ", timeutc.byte_data[i]); + } + pc.printf("\r\n"); + if (timeutc.data.sync == UBX_SYNC && timeutc.data.m_class == 0x01 && timeutc.data.m_id == 0x21 && timeutc.data.pay_len == TIMEUTC_LEN) + { + char ca, cb; + Checksum(timeutc.byte_data, TIMEUTC_LEN, &ca, &cb); + if (timeutc.data.check_a == ca && timeutc.data.check_b == cb) + { + pdata->Year = timeutc.data.year; + pdata->Month = timeutc.data.month; + pdata->Day = timeutc.data.day; + pdata->Hours = timeutc.data.hour; + pdata->Minutes = timeutc.data.min; + pdata->Seconds = timeutc.data.sec; + pc.printf("%4d/%2d/%2d %2d:%2d %2d\r\n", pdata->Year, pdata->Month, pdata->Day, pdata->Hours, pdata->Minutes, pdata->Seconds); + } + else + { + pc.printf("#4\r\n"); + return 0; + } + pc.printf("#5\r\n"); + return 1; + } + else + { + pc.printf("#6\r\n"); + return 0; + } +} \ No newline at end of file
diff -r 000000000000 -r 6256752abece GPSUBX.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/GPSUBX.hpp Sun Sep 12 16:38:51 2021 +0000 @@ -0,0 +1,182 @@ +#ifndef __GPSUBX_HPP__ +#define __GPSUBX_HPP__ + +#include "mbed.h" +#include "Vector3.hpp" + +#define GPS_ADDRESS 0x23 + +#define POSECEF_LEN 20 +#define POSLLH_LEN 28 +#define TIMEUTC_LEN 20 +#define VELECEF_LEN 20 +#define VELNED_LEN 36 + + +#define UBX_SYNC 0x62 << 8 | 0xb5 + +extern Serial pc; + +struct GPSData +{ + int Year; + int Month; + int Day; + int Hours; + int Minutes; + int Seconds; + int iTOW; + float Longitude; + float Latitude; + float Height; + float Pressure; + Vector3 VelocityNED; + Vector3 PositionNED; + Vector3 PositionECEF; +}; + +enum GPSState +{ + WAIT, + MANUAL, + AUTO, + READ, + STREAM, + CONFIG +}; + +enum LogState +{ + STOP, + STBY, + RUNTIME, + FIN +}; + +// 0x01 0x01 +union POSECEF +{ + char byte_data[POSECEF_LEN+8]; + struct + { + unsigned short sync; + char m_class; + char m_id; + unsigned short pay_len; + unsigned int iTOW; + int ecefX; + int ecefY; + int ecefZ; + unsigned int pAcc; + char check_a; + char check_b; + } data; +}; + +// 0x01 0x02 +union POSLLH +{ + char byte_data[POSLLH_LEN+8]; + struct + { + unsigned short sync; + char m_class; + char m_id; + unsigned short pay_len; + unsigned int iTOW; + int lon; + int lat; + int height; + int hMSL; + unsigned int hAcc; + unsigned int vAcc; + char check_a; + char check_b; + } data; +}; + +// 0x01 0x21 +union TIMEUTC +{ + char byte_data[TIMEUTC_LEN+8]; + struct + { + unsigned short sync; + char m_class; + char m_id; + unsigned short pay_len; + unsigned int iTOW; + unsigned int tAcc; + int nano; + unsigned short year; + unsigned char month; + unsigned char day; + unsigned char hour; + unsigned char min; + unsigned char sec; + unsigned char valid; + char check_a; + char check_b; + } data; +}; + +// 0x01 0x11 +union VELECEF +{ + char byte_data[VELECEF_LEN+8]; + struct + { + unsigned short sync; + char m_class; + char m_id; + unsigned short pay_len; + unsigned int iTOW; + int ecefVX; + int ecefVY; + int ecefVZ; + unsigned int sAcc; + char check_a; + char check_b; + } data; +}; + +// 0x01 0x12 +union VELNED +{ + char byte_data[VELNED_LEN+8]; + struct + { + unsigned short sync; + char m_class; + char m_id; + unsigned short pay_len; + unsigned int iTOW; + int velN; + int velE; + int velD; + unsigned int speed; + unsigned int gSpeed; + signed int heading; + unsigned int sAcc; + unsigned int cAcc; + char check_a; + char check_b; + } data; +}; + +class GPSUBX +{ +private: + I2C i2c; + char Address; +public: + int TimeDifference; + + GPSUBX(PinName sda, PinName scl, char address, int timedifference, int hz); + int GetGPSData(GPSData* pdata); + int GetTimeData(GPSData* pdata); + + static void Checksum(char payload[], int n, char* ck_a, char* ck_b); +}; + +#endif \ No newline at end of file
diff -r 000000000000 -r 6256752abece Vector3.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Vector3.lib Sun Sep 12 16:38:51 2021 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/Gaku0606/code/Vector3/#d68f06f4d554