Matteproblem

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
danei
EF Sponsor
Inlägg: 26423
Blev medlem: 2 juni 2003, 14:21:34
Ort: Östergötland
Kontakt:

Inlägg av danei »

Det är klart att det går. Hur nogrant behöver det vara och hur stort område behöver den klara?
Användarvisningsbild
Frippe
Inlägg: 248
Blev medlem: 5 augusti 2004, 11:17:52
Skype: Fred_nord
Ort: Landvetter
Kontakt:

Inlägg av Frippe »

hehe. jodå jag kom också på att det går. (efter ett par koppar kaffe, man skall inte syssla med sånt här på morgonen :D )
Det är ju inte så stora områden det handlar om.
Jag satt o provräknade lite.
Om vi har en pos som den här: N57°31,2´ så blir ju det 6391622,4 meter från ekvatorn och det är ju inga problem att räkna tillbaka, plus Xändring = Hastighet * COS( (Vinkel * PI) / 180) till pos. (Tack matseng)
Men är jag helt ute o cycklar om jag tänker så här:
1 knop/h förflyttar mig ju 1852m/h dvs. 1 sjömil och varje grad är ju 60 gradminuter dvs. 60 sjömil. Då måste det ju vara lättare och räkna utan att omvandla till meter samt m/s och sedan tillbaka.
Bara som en liten fundering så innan man har vaknat helt.
// Fredrik
danei
EF Sponsor
Inlägg: 26423
Blev medlem: 2 juni 2003, 14:21:34
Ort: Östergötland
Kontakt:

Inlägg av danei »

Som du tänker nu funkar det bara på ekvatorn. En grad är kortare här. Iafa i öst-västlig riktning. I nord-sydlig riktning funkar det. Men i öst -väst behöfer du en kompenserings konstant. Beroende på hur långt norr ut du är. Det borde inte vara så svårt att låta programet räkna ut konstantn så får du ett program som funkar på hela jorden. Kanske inte helt matematiskt korekt. Men tillräckligt bra för ändamålet.
Användarvisningsbild
Frippe
Inlägg: 248
Blev medlem: 5 augusti 2004, 11:17:52
Skype: Fred_nord
Ort: Landvetter
Kontakt:

Inlägg av Frippe »

Jo men just nu under testperioden skall vi bara navigera lite på Vänern.
Så då borde det ju inte bli så stora skillnader.
danei
EF Sponsor
Inlägg: 26423
Blev medlem: 2 juni 2003, 14:21:34
Ort: Östergötland
Kontakt:

Inlägg av danei »

Nä då är det inga problem.
Användarvisningsbild
Frippe
Inlägg: 248
Blev medlem: 5 augusti 2004, 11:17:52
Skype: Fred_nord
Ort: Landvetter
Kontakt:

Inlägg av Frippe »

Efter lite pulande fick jag i gång A/D - omvandlaren på 16F877A( jag använder a/d'n till två vridpottar för kurs och fart) så jag kunne få in lite data o räkna med. Men sen stötte jag på patrull, Sin och Cos uträkningar funkar tydligen inget vidare på 14-bitars Picar, så jag hittade en liten PIC18F452, men jag fattar ju inte det här med config i picbasic där man då skall kunna ställa xtal m.m.
Feleta jag får just nu när jag bytte PIC är att displayen inte är stabil längre. Det blir bara massa skräptecken, och tydligen är det mycket mer att "ställa in" på en 18-series PIC.
Någon som har några ideer?
// Fredrik
edit:
Nu har jag fått igång den, problemet med displayen var att man fick ju inte skicka data för snabbt till den, men vart skall jag lägga rutinen för display uppdateringen. Lägger jag den i timer rutinen för uppräkning av sekunder så uppdateras den ju varje sekund, men det slöar ju ner räkningen så på 20 sek visar den 15 sek.
Isoz
Inlägg: 37
Blev medlem: 22 september 2004, 18:45:54

Kan man inte utgå ifrån någon "lokal" 0-punkt?

Inlägg av Isoz »

Har du lyckats med att lösa matten?
annars har jag ett förslag
Misstänker att inte det är så många sjökort som du skall täcka med din simulator, borde du inte kunna kolla hur långt en distans är i östvästlig-led (detta mäts tex mitt imellan den nordliga och sydliga gräns som du sätter för simulatorn)
När du vet att en distans i östvästlig led är ex 1700m så kan du rätt enkelt räkna ut hur mycket ett fartyg har rört sig om det färdas med en viss fart
ex fartyget har en på 10knop och rör sig i riktning 045
vad är dess nya position efter 2sek?
10*1852/3600 = 5.14m/s =antalet meter fartyget rör sig per sekund
5.14*2 = 10.28 = antalet meter som fartyget har hunnit röra sig
ny x pos = gammal x pos +(10.28*sin(45))/antalet meter per distans i xled
ny y pos = gammal x pos +(10.28*cos(45))/1852

Sin och Cos kan du lösa genom en tabell med 90 värden i (sin x = cos (90-x)
Användarvisningsbild
Frippe
Inlägg: 248
Blev medlem: 5 augusti 2004, 11:17:52
Skype: Fred_nord
Ort: Landvetter
Kontakt:

Inlägg av Frippe »

Jo det är en möjlighet, men jag skall provköra morgon, under förutsättning att jag får igång tidsräkningen. Det verkar som de tidigare uträkningarna fungerar. Mitt största problem just nu är att jag kan få en interupt driven clocka att gå och visa tiden som förlutit och samtidigt göra beräkningarna, men så fort jag skall visa något mer på displayen så räknarden helt fel dvs. den räknar upp en sekund var 20 sekund ungefär.
Sen skall man inte hänga upp sig på det med att räkna ut possitionen varannan sekund, det är att AIS protokollet säger att ett fartyg som gör en kraftig gir skall skicka data varje eller varannan sekund, medan ett fartyg som ligger för ankar skall skicka data ca. var 30 sekund.

Jag skall sätta mig o kolla på detta idag om jag får tid över. (Jag måste lära mig interupt hantering :( )
// Fredrik

Edit: lägger med lite kod. just nu räknar jag inte ut den nya positionen utan bara räknar ut ändringen i sjömil. (blir lättare att kolla mot ett sjökort).

Edit 2: oj vad lång den blev, Tyvärr har jag inte min webserver uppe så jag kunde ladda upp den dit, så jag fick klista in den här. hoppas det inte gör nåt.

Kod: Markera allt

device 18f452
define xtal 4
adin_res = 10 				   						' 10-bit result required 
adin_tad = frc 			  	   	 			        ' rc osc chosen 
adin_delay = 50										' allow 50us sample time 
keypad_port = portb
intcon2.7 = 0										' Enable internal pullups on PORTB
trisa = %00000011 			   	 	   			    ' configure an0 (porta.0) and an1 (porta.1)as an input 
adcon1 = %11000000 									' set analogue input on porta.0
declare lcd_type 0
declare lcd_dtpin portd.4
declare lcd_enpin portd.3 
declare lcd_rspin portd.2 
declare lcd_interface 4
declare lcd_lines 4
portb_pullups = on 
dim gie as intcon.7 		   					    ' alias 
dim timer1reg as tmr1l.word    					   	' make the timer var into a word
dim outheading as dword
dim outspeed as dword
dim rawheading as word
dim rawspeed as word
dim calcheading as float
dim calcspeed as float
dim speeds as float
dim changelat as float
dim lathead as float
dim latpi as float
dim latcos as float
dim changelong as float
dim longhead as float
dim longpi as float
dim longsin as float
dim id[20]	   		   								' declare all the vars as bytes
dim startlat[10]
dim startlong[10]
dim newlat[10]
dim newlong[10]
dim scankey
dim key 
dim _100ths   	 	   	  	   	 	   			    
dim secs
dim mins
dim hours
dim days
dim temp_100ths
dim temp_secs
dim temp_mins
dim temp_hours
dim temp_days  
dim activateprint as bit

symbol fudge_factor = 7 	   					   	' fiddle with to improve accuracy
symbol tmr1_val =((65536)-(xtal*2500))+fudge_factor ' calculate osc offset values for 100hz interrupt
symbol pi = 3.14
symbol no_key = 255

str id = "Stena Nautica"

on_interrupt timer			   						' where to go on an interrupt

goto main
 	 				   						' jump the interrupt code
' INTRERUPT TIMER 
timer:
clear t1con.0 	  		  					  ' stop tmr1
timer1reg = timer1reg + tmr1_val 			  ' load tmr1
set t1con.0 		  						  ' start tmr1
inc _100ths
if _100ths = 100 then 						  ' up 100ts
        clear _100ths
        inc secs 	 	 					  ' up seconds
		if secs = 60 then
                clear secs
                inc mins  	 	 			  ' up mins
                if mins = 60 then
                        clear mins
                        inc hours
                endif
        endif
endif
clear pir1.0 	 							  ' clear tmr1 interrupt flag
context restore 							  ' end interrupt routine

' MAIN 
main:
clear 
t1con = %00000000 		  	   						' set up tmr1 to have 1:1 prescaler and act as a timer
pir1.0 = 0 					   						' clear tmr1 interrupt flag
intcon = %11000000 			   						' global and peripheral interrupts on
pie1.0 = 1 					   						' enable tmr1 as peripheral interrupt source
t1con.0 = 1 				   						' set timer1 running

while 1 = 1 				   						' make an endless loop
gie = 0   					   						' turn off global interrupts 
while gie = 1 : gie = 0 : wend 						' and make sure they are off 
	  	  		  	  	   						    ' make a copy of the vars
temp_secs = secs
temp_mins = mins
temp_hours = hours
temp_days = days
gosub printsub
gie = 1   		  			   						' turn the interrupts back on 

gosub calcsub

wend 						   						' round and round we go
stop

' SUBSUBS 
calcsub:
gosub ad
gosub calcaddata
gosub calcpos
return

printsub:
gosub printpos
gosub printaddata
gosub printtime
return

' CALCULATING SUBS 
ad:
rawspeed = adin 0
rawheading = adin 1
return

calcaddata:
calcspeed = 0.04101 * rawspeed
outspeed = calcspeed
calcheading = 0.3522 * rawheading
outheading = calcheading
return

calcpos:
str startlat = "N57 11,3"
str startlong = "E11 34,3"
speeds = calcspeed * 0.00026666
latpi = outheading * pi
lathead = latpi / 180
latcos = cos lathead
changelat = speeds * latcos
longpi = outheading * pi
longhead = longpi / 180
longsin = sin longhead
changelong = speeds * longsin
return

' PRINT SUBS 
printpos:
print at 1, 1, "LAT:", @changelat :'print at 1, 8, %11011111
print at 2, 1 ,"LONG:", @changelong :'print at 2, 9, %11011111
return

printaddata:
print at 3, 1, "COG:", dec outheading,%11011111,$13, " SOG:",dec outspeed,"kn",$13
return

printtime:
print at 4,1,"time:",dec2 temp_hours,"h",dec2 temp_mins,"m",dec2 temp_secs,"s"
return
danei
EF Sponsor
Inlägg: 26423
Blev medlem: 2 juni 2003, 14:21:34
Ort: Östergötland
Kontakt:

Inlägg av danei »

Isoz: Det var ju så jag sa att man skulle göra.
Isoz
Inlägg: 37
Blev medlem: 22 september 2004, 18:45:54

Så sant så sant

Inlägg av Isoz »

fast jag får väl modifiera ett citat från den store(?) poeten(?) Arne Anka
"att tänka innan man skriver är som att torka sig i röven innan man skiter"
danei
EF Sponsor
Inlägg: 26423
Blev medlem: 2 juni 2003, 14:21:34
Ort: Östergötland
Kontakt:

Inlägg av danei »

:) visst, ville bara vara bäst :vissla:
Användarvisningsbild
Frippe
Inlägg: 248
Blev medlem: 5 augusti 2004, 11:17:52
Skype: Fred_nord
Ort: Landvetter
Kontakt:

Inlägg av Frippe »

Nu har jag provkört lite, men får det inte att funka med Matseng formel:
Xändring = Hastighet * COS( (Vinkel * PI) / 180)
Yändring = Hastighet * SIN( (Vinkel * PI) / 180)

Det verkar som latituden blir rätt, men inte longituden.
Det borde ju hänga ihop med att latituden inte är mer än 90 grader åt varje håll (N,S) samt longituden är 180 grader år varje håll (E,W).eller är jag som vanligt ute o cyklar. :?:
Annars verkar det flyta på (bara jag kommer lite länge kommer jag lägga upp lite mer info under Projekt)

// Fredrik
danei
EF Sponsor
Inlägg: 26423
Blev medlem: 2 juni 2003, 14:21:34
Ort: Östergötland
Kontakt:

Inlägg av danei »

De där formlerna stämmer på ekvatorn. Att latiduden har 90° och longituden 180° har inte med saken att göra. Läs resten av tråden så förstår du nog.
Användarvisningsbild
Frippe
Inlägg: 248
Blev medlem: 5 augusti 2004, 11:17:52
Skype: Fred_nord
Ort: Landvetter
Kontakt:

Inlägg av Frippe »

Jo jag kollade det där i kväll igen mot ett sjökort. :cry:
danei
EF Sponsor
Inlägg: 26423
Blev medlem: 2 juni 2003, 14:21:34
Ort: Östergötland
Kontakt:

Inlägg av danei »

Vad är problemet?
Skriv svar