Elektronisenkompassin HM55B data kulmaksi?

Seuraa 
Viestejä45973
Liittynyt3.9.2015

Eli olen nyt miettinyt, miten muuttaa elektronisenkompassin HM55B antama data suuntatiedoksi. Tuo kompassi tuottaa X ja Y-akselin dataa 10-bittisenä binaarilukuna. Joista tuo suuntatieto pitäisi pystyä laskemaan. Eli tässä sen manuaali:
http://www.parallax.com/dl/docs/prod/co ... odDocs.pdf

Kyseisen kompassin manuaalissa on ohje jossa kulman voi laskea kaavalla: angle θ = arctan(-y/x) . Mutta sitten samassa manuaalissa on myös kaava ohjelmointikielellä:

angle = x ATN -y ' Convert x and y to brads
angle = angle */ 360 ' Convert brads to degrees

Nyt minua vaivaa tuo ATN tuossa ohjelmointiesimerkissä. Mitä se tekee? Olen yrittänyt kaivella tietoa netistä huonoin tuloksin. Mutta olettaisin, että ATN muuntaa binaariluvut jotenkin Binary Angular Measurement System (BAMS) sopivaksi. Josta sitten osaan jo itsekin muuntaa kulmaksi binaariluvun. Tai siis se jo onnistuu hyvin.

Hauskinta tässä on se, että homma pitäisi saada tehtyä asemblykielellä eli koneohjelmointi kielellä. Eli mitä tuo ATN oikein tarkoittaa. Oli kyllä hieno tietää miten tuo temppu onnistuisi.

Sivut

Kommentit (29)

Devil
Seuraa 
Viestejä1328
Liittynyt16.3.2005

No ohjelmoinnista ja matematiikasta en mitään kyllä ymmärrä, mut kuukkeli heitteli tämmösiä

Derived Math Functions
http://www.csidata.com/custserv/onlineh ... vbs228.htm

Inverse trigonometric functions
http://en.wikipedia.org/wiki/Inverse_cosine

How do you put the inverse secant into the calculator?
http://answers.yahoo.com/question/index ... 427AAWvDUN

World English Dictionary
ATN
— abbreviation for
1. arc tangent
2. augmented transition network

X

Nupo
Seuraa 
Viestejä208
Liittynyt20.1.2010

RTFM: "To resolve θ into a clockwise angle from north, use arctan(-y/x),
which in PBASIC 2.5 is x ATN -y. The ATN command returns the angle in binary radians. To convert to degrees with PBASIC, just apply */ 360 to the variable storing the binary radian measurement."

PBASICista en osaa sanoa mitään.

Vierailija

Juu siis tuosta elektronisesta kompassista saan binaarisi lukemat ulos. Ja niitä sitten jakamalla takulaskimella ja ottamalla siittä arvosta noita tangentin käänteisarvoja vai miksi niitä nyt sanotaan. Kun ensin jaetaan vastainen kateetti viereisellä. Sitten otetaan siittä tan-1 . Niin saadaan kulma.

Mutta nyt se kulma pitäisi saada mahdollisimman helposti otettua.

Oikeastaan voisin kysyä miten taskulaskin laskee kulman, kun ensin on jakanut vastaisen kateetin viereisellä kateetilla ja saa siittä lukema, joka on yleensä 0-57 välissä. Niin sitten kun painaa taskulaskimen tan-1 nappulaa se laskee kulman automaattisesti. Mutta miten sen kulman laskeminen tapahtuu. Sen jos tietäisin. Niin saattaisin kyetä tekemään saman tempun konekielellä. Jos se temppu ei ole kovin monimutkainen matemaattisesti. Yksikköympyrääkin olen ihmetellyt. Ja siittä en saanut mitään ideaa tehdä hommaa.

Haluisin vaan mahdollisimman "helposti" tuon kulman X ja Y arvosta. Josta tulee sitten kompassisuunta.

Vierailija
Sädetin
Eli olen nyt miettinyt, miten muuttaa elektronisenkompassin HM55B antama data suuntatiedoksi.

Kyseisen kompassin manuaalissa on ohje jossa kulman voi laskea kaavalla: angle θ = arctan(-y/x) . Mutta sitten samassa manuaalissa on myös kaava ohjelmointikielellä:

angle = x ATN -y ' Convert x and y to brads
angle = angle */ 360 ' Convert brads to degrees

Eli mitä tuo ATN oikein tarkoittaa.




"ATN" taitaa olla sama kuin "arctan". Kai ?

Nupo
Seuraa 
Viestejä208
Liittynyt20.1.2010

Tuolla Devilin linkkaamassa wikipedia-artikkelissa on selvitetty arctanin laskeminen:

Tarpeelliseen tarkkuuteen pääsemiseksi tuskin tarvitsee sarjaa kovin pitkälle laskea.

Heksu
Seuraa 
Viestejä5463
Liittynyt16.3.2005

Ainakin näin ohjelmoitsijan logiikalla homma selviää helposti kokeilemalla, koodaa testisovellus laskemaan arctan(-y/x) ja katso antaako se järkeviä tuloksia. Äkkiseltään tuntuu aika oudolta, jos ATN tarkoittaisi jotain ihan muuta kuin arkustangenttia.

Stratonovich
Seuraa 
Viestejä358
Liittynyt14.6.2009
Sädetin
Hauskinta tässä on se, että homma pitäisi saada tehtyä asemblykielellä eli koneohjelmointi kielellä. Eli mitä tuo ATN oikein tarkoittaa. Oli kyllä hieno tietää miten tuo temppu onnistuisi.

Niin kuin jo moni kommentoikin, ATN = ArcusTaNgent. Ilmeisesti tuossa ohjelmointikielessä arkustangenttia merkitään binäärioperaattorilla x ATN y eikä funktiomuodolla ATN(x,y), mutta eipä siitä kannata hämääntyä. Arkustangentin arctan(y/x) laskeminen assemblyllä on kyllä ihan oma juttunsa, mutta joskus muinoin sitä tehtiin näin:

1. Muunnetaan x ja y sopivaan ympyrän neljännekseen (+-x/y tai +-y/x) niin, että se arctanin argumentti on välillä 0-1.
2. Katsotaan taulukosta mikä sen arkustangentti on.
3. Muunnetaan se kulma takaisin oikeaan ympyrän neljännekseen.

Taulukon voi laskea etukäteen jollain muulla työkalulla kuin assemblyllä.

Vierailija
Stratonovich
Sädetin
Hauskinta tässä on se, että homma pitäisi saada tehtyä asemblykielellä eli koneohjelmointi kielellä. Eli mitä tuo ATN oikein tarkoittaa. Oli kyllä hieno tietää miten tuo temppu onnistuisi.

Niin kuin jo moni kommentoikin, ATN = ArcusTaNgent. Ilmeisesti tuossa ohjelmointikielessä arkustangenttia merkitään binäärioperaattorilla x ATN y eikä funktiomuodolla ATN(x,y), mutta eipä siitä kannata hämääntyä. Arkustangentin arctan(y/x) laskeminen assemblyllä on kyllä ihan oma juttunsa, mutta joskus muinoin sitä tehtiin näin:

1. Muunnetaan x ja y sopivaan ympyrän neljännekseen (+-x/y tai +-y/x) niin, että se arctanin argumentti on välillä 0-1.
2. Katsotaan taulukosta mikä sen arkustangentti on.
3. Muunnetaan se kulma takaisin oikeaan ympyrän neljännekseen.

Taulukon voi laskea etukäteen jollain muulla työkalulla kuin assemblyllä.




Tämä oli minunkin alkuperäinen idea. Mutta sitten ajattelin, että pitää saada vielä hienommin tehtyä. Palaan takaisin samaan ideaan. Jakolasku kun onnistuu helposti konekielelläkin.

Mutta nyt tuli selväksi, että hankalaksi menee jos yrittää vaan konekielellä tehdä koodin millä laskea nuo kulmat tangentilla suoraan.

Stratonovich
Seuraa 
Viestejä358
Liittynyt14.6.2009
Sädetin
Mutta nyt tuli selväksi, että hankalaksi menee jos yrittää vaan konekielellä tehdä koodin millä laskea nuo kulmat tangentilla suoraan.

Akateeminen veikkaus on, että taskulaskin tekee asian juuri näin, mutta lisäksi mukana on ovela interpolaatio taulukon arvojen välillä. Eikä taulukko ole välttämättä tasavälinen.

Neutroni
Seuraa 
Viestejä26898
Liittynyt16.3.2005

Arvaan, että käytät mikrokontrolleria. Tee niin, että ensin otat kynän ja paperia. Jaat koordinaatiston kahdeksaan osaan käyttäen koordinaattiakseleita ja 45 asteen kulmassa olevia suoria. Päättele x:n ja y:n etumerkeistä ensin mihin neljännekseen kulma kuuluu. Seuraavaksi päättelet x:n ja y:n itseisarvojen suuruusjärjestyksestä oikean kahdeksasosan. Jaa suurempi itseisarvo pienemmän itseisarvolla (sopivasti skaalaten) ja lue vastaava kulma muistiin talletetusta lookup-taulukosta. Sen lasket helposti tietokoneella käyttäen mitä tahansa ohjelmointikieltä. Nyt päättelet kahdeksasosan mukaan, paljonko saatuun kulmaan on lisättävä ja myös sen, mihin suuntaan tuo isteisarvojen osamäärä kyseisessä kahdeksannessa kasvaa (siinä paperille piirretty kuva on kullnaarvoinen apu). Ja kas, meillä on kulma nopeasti ja tehokkaasti.

Jos käytössäsi on arkustangenttifunktio (esim. atan(), ATN), laske atan(y/x), mutta joudut siltikin tsekkaamaan oikean neljänneksen etumerkeistä ja miettimään x:n nollakohtia. Joissain ohjelmointikielissä oleva atan2(y,x) -funktio antaa kulman aina oikein.

PS. Startonovich olikin näköjään jo kertonut oleellisesti saman asian. Mutta kertaus olkoon opintojen äiti.

Vanha jäärä
Seuraa 
Viestejä1557
Liittynyt12.4.2005
Neutroni

Jos käytössäsi on arkustangenttifunktio (esim. atan(), ATN), laske atan(y/x), mutta joudut siltikin tsekkaamaan oikean neljänneksen etumerkeistä ja miettimään x:n nollakohtia. Joissain ohjelmointikielissä oleva atan2(y,x) -funktio antaa kulman aina oikein.

Olen kärsinyt arkusfunktioiden palauttamista vääristä neljänneksistä sekä oman että muiden ohjelmoinnin tuloksena niin runsaasti, että ohjelmissa arkusfunktioiden laskeminen muulla tavalla kuin atan2-funktiolla pitäisi lailla – tai ainakin koodausohjeilla – kokonaan kieltää.

Vanha jäärä

myl
Seuraa 
Viestejä224
Liittynyt18.11.2010

Mikrokontrollerissa tuskin on trigonometrisiä funktioita valmiina.
Taylorin sarja ei yleensä ole kovin tehokas approksimaatio muualla kuin kehityskeskuksen ympäristössä. Paras ratkaisu on edellä esitetty funktion taulukointi ja interpolointi taulukkopisteiden välillä.

Toinen keino on käyttää approksimointipolynomia atan(x)=P(x) jossa 9. asteen polynomin P(x)= ax^9+bx^8+.... kertoimet ovat
-4.7586e-002 1.8599e-001 -2.4648e-001 3.0999e-002 1.9576e-001 -9.0847e-005 -3.3323e-001 -1.1097e-005 1.0000e+000 -2.2841e-009

Ensimmäinen on siis termin x^9 kerroin a ja viimeinen vakiotermi.
Polynomiapproksimaatio on voimassa välillä 0

-myl

Neutroni
Seuraa 
Viestejä26898
Liittynyt16.3.2005
myl
Toinen keino on käyttää approksimointipolynomia atan(x)=P(x) jossa 9. asteen polynomin P(x)= ax^9+bx^8+.... kertoimet ovat
-4.7586e-002 1.8599e-001 -2.4648e-001 3.0999e-002 1.9576e-001 -9.0847e-005 -3.3323e-001 -1.1097e-005 1.0000e+000 -2.2841e-009

Ensimmäinen on siis termin x^9 kerroin a ja viimeinen vakiotermi.
Polynomiapproksimaatio on voimassa välillä 0




mikropiirin datalehti

Good for 6-bit (64-direction) resolution measurements after software calibration



Onkohan tuossa nyt aavistus overkilliä.

Vanha Jäärä
Olen kärsinyt arkusfunktioiden palauttamista vääristä neljänneksistä sekä oman että muiden ohjelmoinnin tuloksena niin runsaasti, että ohjelmissa arkusfunktioiden laskeminen muulla tavalla kuin atan2-funktiolla pitäisi lailla – tai ainakin koodausohjeilla – kokonaan kieltää.



Ei kai kukaan hullu jätä käyttämättä atan2:sta, jos sellainen on käytettävissä. Mutta jos tuo laki toteutetaan, velvoitettakoon sitten kaiken maailman mikrokontrolleritehtaat implemetoimaan tekeleisiinsä atan2 -käsky.

myl
Seuraa 
Viestejä224
Liittynyt18.11.2010
Onkohan tuossa nyt aavistus overkilliä.



No on. Mielessäni oli lähinnä arcustangenttifunktio kääntäjiä varten.

Tuota kontrollerisovellusta varten riittää 3. asteen polynomi, jonka kertoimet ovat
-0.123705159485747
-0.125463394901297
1.022443565076724
-0.000836635368375

ja suurin virhe 0.001

-myl

Sivut

Uusimmat

Suosituimmat