Satellite tracking for the mbed platform(s). Note: This software is beerware.

Dependencies:   GPS mbed

Satellite Tracking with mbed!

This is a quick example of tracking satellites with the mbed platform. Ensure you have the latest TLE information and map it correctly. I have commented in the original TLEs used for the example to help you do this.

This code is not restricted to geostationary/geosynchronous satellites, you can track any satellite for which you can get a TLE. (Which is almost all non military satellites).

See http://www.celestrak.com/NORAD/elements/ http://en.wikipedia.org/wiki/Two-line_element_set

If you use this code, please send me a beer (see main.cpp header). Enjoy!

Committer:
SamClarke
Date:
Mon Jan 20 21:25:27 2014 +0000
Revision:
5:8af1b8452986
Parent:
4:e16c4e5b9dbc
tidy

Who changed what in which revision?

UserRevisionLine numberNew contents of line
SamClarke 4:e16c4e5b9dbc 1 // Note!!!! This software is under a beerware license,
SamClarke 4:e16c4e5b9dbc 2 // please send a beer to clarke.sam1@gmail.com
SamClarke 4:e16c4e5b9dbc 3 // via paypal if you find this code useful.
SamClarke 0:78d4704bd4e7 4
SamClarke 0:78d4704bd4e7 5
SamClarke 0:78d4704bd4e7 6 #include "Plan13.h"
SamClarke 0:78d4704bd4e7 7 #include "GPS.h"
SamClarke 0:78d4704bd4e7 8 #include "mbed.h"
SamClarke 0:78d4704bd4e7 9
SamClarke 0:78d4704bd4e7 10 #define ONEPPM 1.0e-6
SamClarke 0:78d4704bd4e7 11 #define ONEPPTM 1.0e-7
SamClarke 0:78d4704bd4e7 12
SamClarke 1:ab43ae956815 13 struct Target{
SamClarke 0:78d4704bd4e7 14 int YEAR;
SamClarke 0:78d4704bd4e7 15 float EPOCH;
SamClarke 0:78d4704bd4e7 16 float INCLINATION;
SamClarke 0:78d4704bd4e7 17 float RAAN;
SamClarke 0:78d4704bd4e7 18 float ECCENTRICITY;
SamClarke 0:78d4704bd4e7 19 float ARGUMENT_PEDIGREE;
SamClarke 0:78d4704bd4e7 20 float MEAN_ANOMALY;
SamClarke 0:78d4704bd4e7 21 float MEAN_MOTION;
SamClarke 0:78d4704bd4e7 22 float TIME_MOTION_D;
SamClarke 0:78d4704bd4e7 23 float EPOCH_ORBIT;
SamClarke 0:78d4704bd4e7 24 float azimuth;
SamClarke 0:78d4704bd4e7 25 float elevation;
SamClarke 0:78d4704bd4e7 26 };
SamClarke 0:78d4704bd4e7 27
SamClarke 5:8af1b8452986 28 char *astra2f_tle =
SamClarke 5:8af1b8452986 29 "ASTRA 2F"
SamClarke 5:8af1b8452986 30 "1 38778U 12051A 14010.00000000 .00000143 00000-0 00000+0 0 2381"
SamClarke 5:8af1b8452986 31 "2 38778 000.0670 267.2510 0004011 341.2500 249.1500 01.00276604 4755";
SamClarke 5:8af1b8452986 32
SamClarke 5:8af1b8452986 33 void target_tle(int year, char *tle, struct Target *t);
SamClarke 5:8af1b8452986 34
SamClarke 5:8af1b8452986 35 void calculate(Plan13& p, GPS& g, struct Target *t);
SamClarke 5:8af1b8452986 36
SamClarke 5:8af1b8452986 37 void target_data(int yr, float epoch, float inc, float raan,
SamClarke 5:8af1b8452986 38 float ecc, float arg, float anom, float mmotion,
SamClarke 5:8af1b8452986 39 float tmotion, float epoch_orbit, struct Target *t);
SamClarke 5:8af1b8452986 40
SamClarke 2:735bdcc06386 41 Plan13 p;
SamClarke 2:735bdcc06386 42 GPS gps(p9,p10);
SamClarke 0:78d4704bd4e7 43 Serial pc(USBTX, USBRX);
SamClarke 0:78d4704bd4e7 44
SamClarke 0:78d4704bd4e7 45 int main()
SamClarke 0:78d4704bd4e7 46 {
SamClarke 2:735bdcc06386 47 struct Target ASTRA2F; // Create a target object for ASTRA2F
SamClarke 2:735bdcc06386 48 target_tle(2014, astra2f_tle, &ASTRA2F); // Parse a string TLE into the object, or set the object manually (below)
SamClarke 2:735bdcc06386 49
SamClarke 0:78d4704bd4e7 50 // NOAA 19
SamClarke 0:78d4704bd4e7 51 //1 33591U 09005A 14018.50690348 .00000100 00000-0 79451-4 0 929
SamClarke 0:78d4704bd4e7 52 //2 33591 098.9294 324.1290 0014157 178.0460 233.2637 14.11623746254876
SamClarke 1:ab43ae956815 53 struct Target NOAA19;
SamClarke 2:735bdcc06386 54 target_data(2014, 18.50690348, 98.9294, 324.1290, 79451,
SamClarke 2:735bdcc06386 55 178.0460, 233.2637, 14.1162376, 0.00000100, 25487, &NOAA19);
SamClarke 2:735bdcc06386 56
SamClarke 0:78d4704bd4e7 57 gps.Init();
SamClarke 0:78d4704bd4e7 58 pc.baud(115200);
SamClarke 0:78d4704bd4e7 59 while (1)
SamClarke 0:78d4704bd4e7 60 {
SamClarke 0:78d4704bd4e7 61 wait(1);
SamClarke 0:78d4704bd4e7 62 if(gps.parseData()) {
SamClarke 0:78d4704bd4e7 63 calculate(p, gps, &ASTRA2F);
SamClarke 2:735bdcc06386 64 pc.printf("GPS Position--------[ %f, %f ]\n\n", gps.latitude, gps.longitude);
SamClarke 2:735bdcc06386 65 pc.printf("ASTRA2F Azimuth-----[ %f ]\n", ASTRA2F.azimuth);
SamClarke 2:735bdcc06386 66 pc.printf("ASTRA2F Elevation---[ %f ]\n\n", ASTRA2F.elevation);
SamClarke 0:78d4704bd4e7 67 calculate(p, gps, &NOAA19);
SamClarke 2:735bdcc06386 68 pc.printf("NOAA19 Azimuth -----[ %f ]\n", NOAA19.azimuth);
SamClarke 2:735bdcc06386 69 pc.printf("NOAA19 Elevation----[ %f ]\n\n", NOAA19.elevation);
SamClarke 0:78d4704bd4e7 70 }else {
SamClarke 0:78d4704bd4e7 71 pc.printf("Aquiring Satellites...\n");
SamClarke 0:78d4704bd4e7 72 }
SamClarke 0:78d4704bd4e7 73 }
SamClarke 0:78d4704bd4e7 74
SamClarke 0:78d4704bd4e7 75 }
SamClarke 0:78d4704bd4e7 76
SamClarke 1:ab43ae956815 77 void calculate(Plan13& p, GPS& g, struct Target *t )
SamClarke 0:78d4704bd4e7 78 {
SamClarke 0:78d4704bd4e7 79 p.setTime(g.year,g.month,g.day,g.hours, g.minutes, g.seconds); //YMDHMS
SamClarke 0:78d4704bd4e7 80 p.setElements(t->YEAR,
SamClarke 0:78d4704bd4e7 81 t->EPOCH,
SamClarke 0:78d4704bd4e7 82 t->INCLINATION,
SamClarke 0:78d4704bd4e7 83 t->RAAN,
SamClarke 0:78d4704bd4e7 84 t->ECCENTRICITY*ONEPPTM,
SamClarke 0:78d4704bd4e7 85 t->ARGUMENT_PEDIGREE,
SamClarke 0:78d4704bd4e7 86 t->MEAN_ANOMALY,
SamClarke 0:78d4704bd4e7 87 t->MEAN_MOTION,
SamClarke 0:78d4704bd4e7 88 t->TIME_MOTION_D,
SamClarke 0:78d4704bd4e7 89 t->EPOCH_ORBIT+ONEPPM,
SamClarke 0:78d4704bd4e7 90 0);
SamClarke 3:e7cebcde3db7 91 p.setLocation(g.longitude,g.latitude,g.altitude);
SamClarke 0:78d4704bd4e7 92 p.calculate();
SamClarke 0:78d4704bd4e7 93 t->azimuth = p.AZ;
SamClarke 0:78d4704bd4e7 94 t->elevation = p.EL;
SamClarke 0:78d4704bd4e7 95 }
SamClarke 0:78d4704bd4e7 96
SamClarke 2:735bdcc06386 97 void target_data(int yr, float epoch, float inc, float raan,
SamClarke 3:e7cebcde3db7 98 float ecc, float arg, float anom, float mmotion,
SamClarke 3:e7cebcde3db7 99 float tmotion, float epoch_orbit, struct Target *t)
SamClarke 0:78d4704bd4e7 100 {
SamClarke 0:78d4704bd4e7 101 t->YEAR = yr;
SamClarke 0:78d4704bd4e7 102 t->EPOCH = epoch;
SamClarke 0:78d4704bd4e7 103 t->INCLINATION = inc;
SamClarke 0:78d4704bd4e7 104 t->RAAN = raan;
SamClarke 0:78d4704bd4e7 105 t->ECCENTRICITY = ecc;
SamClarke 0:78d4704bd4e7 106 t->ARGUMENT_PEDIGREE = arg;
SamClarke 0:78d4704bd4e7 107 t->MEAN_ANOMALY = anom;
SamClarke 0:78d4704bd4e7 108 t->MEAN_MOTION = mmotion;
SamClarke 0:78d4704bd4e7 109 t->TIME_MOTION_D = tmotion;
SamClarke 0:78d4704bd4e7 110 t->EPOCH_ORBIT = epoch_orbit;
SamClarke 3:e7cebcde3db7 111 }
SamClarke 3:e7cebcde3db7 112
SamClarke 3:e7cebcde3db7 113 void target_tle(int year, char *tle, struct Target *t){
SamClarke 3:e7cebcde3db7 114 t->YEAR = year;
SamClarke 3:e7cebcde3db7 115 sscanf(tle,
SamClarke 3:e7cebcde3db7 116 "%*s %*s %*s %*s %*c%*c%*c%f %f %*s %f%*c%*c %*c %*s %*s %f %f "
SamClarke 3:e7cebcde3db7 117 "%*s %f %f %f%*c%f",
SamClarke 3:e7cebcde3db7 118 &t->EPOCH, &t->TIME_MOTION_D, &t->ECCENTRICITY, &t->INCLINATION, &t->RAAN,
SamClarke 3:e7cebcde3db7 119 &t->ARGUMENT_PEDIGREE, &t->MEAN_ANOMALY, &t->MEAN_MOTION, &t->EPOCH_ORBIT);
SamClarke 0:78d4704bd4e7 120 }