Satellite tracking for the mbed platform(s). Note: This software is beerware.
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!
main.cpp@5:8af1b8452986, 2014-01-20 (annotated)
- Committer:
- SamClarke
- Date:
- Mon Jan 20 21:25:27 2014 +0000
- Revision:
- 5:8af1b8452986
- Parent:
- 4:e16c4e5b9dbc
tidy
Who changed what in which revision?
User | Revision | Line number | New 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 | } |