Date: Mon, 14 Dec 87 10:29:53 est From: allegra!ulysses!sfmag!sfsup!sfmin!martyf@EDDIE.MIT.EDU Subject: Satellite Tracking Program Submission Enclosed is a basic program that calculates the azimuth and elevation for satellite tracking systems. The source of this program is unknown, however it appears to do the job. Marty Fleming attunix!martyf 201 522 5001 -------------cut here---------------- 0 GOTO 10'geosynch 1 CHAIN "ENTRY":RETURN 10 ON KEY(1) GOSUB 1 20 ' ** GEOSYNCH ** 30 ' ********************** 50 CLEAR :SCREEN 2:CLS:KEY OFF 90 OPTION BASE 1 100 DIM AZIMUTH(360),ELEVATION(360) 110 DIM VLINE(39) 120 ' 130 ' Create vertical line for use later 140 LINE (0,0)-(0,150) 150 GET (0,0)-(0,150),VLINE 160 ' 170 ' Define radian and degree conversion functions 180 DEGREESPERRADIAN = 57.29578 190 DEF FNRAD(DEGREES) = DEGREES/DEGREESPERRADIAN 200 DEF FNDEG(RADIANS) = RADIANS*DEGREESPERRADIAN 210 ' 220 ' Define ARC COS function 230 DEF FNACS(X) = 1.570796-ATN(X/SQR(1-X*X)) 240 ' 250 ' Get antenna latitude and longitude from user 260 ' Also ask for output guidance (printer or not) 270 CLS 280 LOCATE 3,15 290 PRINT "* * * GEOSYNCHRONOUS SATELLITE ANTENNA AIM * * *" 300 LOCATE 8,1 310 PRINT "Latitude (-90 to 90) is positive in the northern hemisphere ... 320 LOCATE 10,1 330 INPUT "Enter the latitude of the antenna location ";LATITUDE 340 LOCATE 13,1 350 PRINT "Longitude (-180 to 180) is positive in the western hemisphere ..." 360 LOCATE 15,1 370 INPUT "Enter the longitude of the antenna location ";LONGITUDE 380 LOCATE 18,9 390 PRINT "1. Screen chart only. 400 LOCATE 19,9 410 PRINT "2. Printed table also. (Must have printer ready). 420 LOCATE 22,1 430 PRINT "Press the appropriate number key, '1' or '2' ... 440 K$ = INKEY$ 450 IF K$ <> "1" AND K$ <> "2" THEN 440 460 IF K$ = "2" THEN TABLEFLAG = 1 ELSE TABLEFLAG = 0 470 ' 480 ' Build screen chart 490 CLS 500 LOCATE 1,10 510 PRINT "* * * GEOSYNCHRONOUS SATELLITE ANTENNA AIM * * * (Esc to exit)" 520 LOCATE 6,60 530 PRINT "Antenna Location"; 540 LOCATE 8,60 550 PRINT USING "Latitude ###.##";LATITUDE; 560 LOCATE 9,60 570 PRINT USING "longitude ###.##";LONGITUDE; 580 LOCATE 13,60 590 PRINT "Satellite"; 600 LOCATE 14,60 610 PRINT "longitude"; 620 LOCATE 18,60 630 PRINT "Antenna aim"; 640 LOCATE 20,60 650 PRINT "Azimuth"; 660 LOCATE 21,60 670 PRINT "Elevation"; 680 LINE (100,190)-(461,40),,B 690 LOCATE 25,14 700 PRINT "Satellite equatorial longitude (-180 to +180)"; 710 ' 720 ' Loop to put 12 words vertically on left 730 FOR I = 1 TO 12 740 LOCATE 5+I,1 750 READ A$ 760 PRINT A$; 770 NEXT I 780 DATA Antenna,aiming,curves,"","","","" 790 DATA Azimuth,-90 to +90,"" 800 DATA Elevation,0 to 90 810 ' 820 ' Some of the math can be done just once to save time 830 EARTH = 6367 840 ORBIT = 42200! 850 EARTH2 = EARTH * EARTH 860 ORBIT2 = ORBIT * ORBIT 870 FACTOR = 2 * ORBIT * EARTH * COS(FNRAD(LATITUDE)) 880 SINLAT = SIN(FNRAD(LATITUDE)) 890 ' 900 ' Compute antenna aim for 360 satellite locations 910 FOR SATLONG = 1 TO 360 920 PUT (SATLONG+101,40),VLINE,XOR 930 LONGDIFF = FNRAD(SATLONG - LONGITUDE - 180) 940 TERM1 = SQR(EARTH2 + ORBIT2 - FACTOR * COS(LONGDIFF)) 950 TERM2 = TERM1 * TERM1 960 TERM3 = (TERM2 + EARTH2 - ORBIT2) / (2 * TERM1 * EARTH) 970 TERM4 = TAN(LONGDIFF) / SINLAT 980 AZIMUTH(SATLONG) = FNDEG(ATN(TAN(LONGDIFF)/SINLAT)) 990 ELEVATION(SATLONG) = FNDEG(FNACS(TERM3)) - 90 1000 GOSUB 1590 1010 IF ELEVATION(SATLONG) < 0 THEN 1080 1020 '(Else plot the points on the chart) 1030 XP = SATLONG + 100 1040 YA = -15 * AZIMUTH(SATLONG) / 18 + 115 1050 YE = -15 * ELEVATION(SATLONG) / 9 + 190 1060 PSET (XP,YA) 1070 PSET (XP,YE) 1080 PUT (SATLONG+101,40),VLINE,XOR 'Erases line but not background 1090 NEXT SATLONG 1100 ' 1110 ' Put line at peak elevation point on chart 1120 LOCATE 2,34 1130 PRINT SPACE$(11); 1140 SATLONG = CVI(MKI$(LONGITUDE + 180)) 1150 GOSUB 1590 1160 PUT (SATLONG+100,40),VLINE,XOR 1170 IF TABLEFLAG = 0 THEN 1380 1180 ' 1190 ' Output table to printer 1200 LPRINT TAB(15)"* * * GEOSYNCHRONOUS SATELLITE ANTENNA AIM * * *" 1210 LPRINT STRING$(2,10) 1220 LPRINT USING "Antenna latitude ###.##";LATITUDE 1230 LPRINT USING "Antenna longitude ###.##";LONGITUDE 1240 LPRINT STRING$(3,10) 1250 LPRINT TAB(9)"Satellite"TAB(27)"Antenna"TAB(36)"Antenna" 1260 LPRINT TAB(9)"Longitude"TAB(27)"Azimuth"TAB(36)"Elevation" 1270 LPRINT STRING$(80,"-"); 1280 FORMAT$ = SPACE$(10) + "######" + SPACE$(11) 1290 FORMAT$ = FORMAT$ + "###.## ###.##" 1300 FOR LLONG = 1 TO 360 1310 IF ELEVATION(LLONG) <= 0 THEN 1330 1320 LPRINT USING FORMAT$;LLONG-180,AZIMUTH(LLONG),ELEVATION(LLONG) 1330 NEXT LLONG 1340 LPRINT CHR$(12); 1350 TABLEFLAG = 0 1360 ' 1370 ' Manual scroll through screen chart 1380 LOCATE 4,17 1390 PRINT "Use '+' or '-' to scroll through chart" 1400 ' 1410 K$ = INKEY$ 1415 IF K$=CHR$(27) THEN CLS:END 1420 IF K$ <> "" THEN 1460 ELSE GOSUB 1590 1430 GOTO 1410 1440 ' 1450 ' Move line left one notch 1460 IF K$ <> "-" THEN 1530 1470 PUT (SATLONG+100,40),VLINE,XOR 1480 SATLONG = SATLONG - 1 1490 IF SATLONG < 1 THEN SATLONG = 360 1500 GOTO 1160 1510 ' 1520 ' Move line right one notch 1530 IF K$ <> "+" THEN 1410 1540 PUT (SATLONG+100,40),VLINE,XOR 1550 SATLONG = SATLONG MOD 360 + 1 1560 GOTO 1160 1570 ' 1580 ' Subroutine to update numbers on screen 1590 LOCATE 14,72 1600 PRINT USING "####";SATLONG - 180 1610 LOCATE 20,70 1620 IF ELEVATION(SATLONG) >= 0 THEN PRINT USING "###.##";AZIMUTH(SATLONG); 1630 IF ELEVATION(SATLONG) < 0 THEN PRINT "------"; 1640 LOCATE 21,70 1650 IF ELEVATION(SATLONG) >= 0 THEN PRINT USING "###.##";ELEVATION(SATLONG); 1660 IF ELEVATION(SATLONG) < 0 THEN PRINT "------"; 1670 RETURN