# Compass radians to direction calculation

#### camerart

##### Active Member
Hi,
I'm using a PIC to control a compass module, that gives X Z and Y coordinates in RADIANS.

Here is a calculation from an Arduino project: '[angle = atan2((double) y,(double) x) * (180 / 3.14159265)+ 180 'angle in degrees]

My results give e,g, X = 123.

Camerart.

#### jjw

##### Member
You calculate angle in radians from x, y coordinates.
Angle in degrees = radians × 180 / Pi
Oshonsoft has arctan function for y / x < 1
You have to calculate in eight octants ( 45 degrees )
Octants can be found from signs of x and y and from
value of y / x if it is less or greater than one.

For example, if North is 0 degrees and clockwise direction:
0 - 45 degrees x / y < 1 and x > 0, y > 0
angle = arctan( x / y ) × 57.3

45 - 90 degrees x/y > 1 x >0 y>0
angle = 90 - arctan( y / x ) × 57.3
etc ...

Angle, x and y are floating point variables

#### camerart

##### Active Member
If you don't need to know the quadrant you can use Arctan ( the 180 / pi ) converts to degrees..
Hi I,
Thanks, I hope it will give 0 to 360°
C.

#### camerart

##### Active Member
You calculate angle in radians from x, y coordinates.
Angle in degrees = radians × 180 / Pi
Oshonsoft has arctan function for y / x < 1
You have to calculate in eight octants ( 45 degrees )
Octants can be found from signs of x and y and from
value of y / x if it is less or greater than one.

For example, if North is 0 degrees and clockwise direction:
0 - 45 degrees x / y < 1 and x > 0, y > 0
angle = arctan( x / y ) × 57.3

45 - 90 degrees x/y > 1 x >0 y>0
angle = 90 - arctan( y / x ) × 57.3
etc ...

Angle, x and y are floating point variables
Hi J,
Lots of information there, thanks.

What does the '> and <' do in your explanation?

In your 0-45 example is: 0 - 45 degrees x / y < 1 and x > 0, y > 0, the explanation
and: angle = arctan( x / y ) × 57.3, the calculation?
Or are they both the in calculation?

What is the Z for?
C.

#### Pommie

##### Well-Known Member
Hi,
I'm using a PIC to control a compass module, that gives X Z and Y coordinates in RADIANS.
I have never come across a compass that gives Radians.
I'm guessing you have three quantities in the X,Y and Z directions.

To convert two of these quantities to an angle can be done in various ways. I like Roman Blacks method. If you take the time to understand the maths then you will be much wiser.

Mike.
P.S. how can 0-360 ever represent anything in 3 dimensions?

#### jjw

##### Member
< 1 means less than 1
> 0 means greater than 0 or positive
etc.
angle = ... is the calculation
Z can be used to calculate if compass is tilted ??

#### camerart

##### Active Member
I have never come across a compass that gives Radians.
I'm guessing you have three quantities in the X,Y and Z directions.

To convert two of these quantities to an angle can be done in various ways. I like Roman Blacks method. If you take the time to understand the maths then you will be much wiser.

Mike.
P.S. how can 0-360 ever represent anything in 3 dimensions?
Hi M,

I like RBs method, but it's lost on me I'm afraid as a 'C' none speaker.

EDIT: 0 to 359
C.

Last edited:

#### camerart

##### Active Member
Hi,
This is mighty complicated, but I get a sense of déjà vu, as I've been through this before, and almost forgotten it.
Thanks for the information. Between that and the attached file, I'll try to work through it all, for Oshonsoft calculation.
C.

#### Attachments

• 16.9 KB Views: 8

#### Pommie

##### Well-Known Member
Here is RBs code modified slightly to calculate an angle of 0-255 from two signed words x & y - I needed this for another project - I think it's almost useable in basic. Although it looks long it's very fast.

Mike.
Code:
sx=sign(x)
ux=abs(x)
sy=sign(y)
uy=abs(y)
if ux>uy then
degrees=uy*32/ux
oct=1
else
degrees=ux*32/uy
oct=0
endif
bodge=0
if degrees>16
if degrees<32
bodge=bodge+1
endif
if degrees<28
bodge=bodge+1
endif
if degrees<24
bodge=bodge+1
endif
else
if degrees>0
bodge=bodge+1
endif
if degrees>3
bodge=bodge+1
endif
if degrees>8
bodge=bodge+1
endif
endif
degrees=degrees+bodge
if oct>0
degrees=64-degrees
endif
if sy>0
if sx>0
degrees=128+degrees
else
degrees=128-degrees
endif
else
if sx>0
degrees=-degrees
endif
endif

#### camerart

##### Active Member
Abs function is simple to program.
With floating point x:

If x < 0 then
abs = -1*x
Else
abs = x
Endif
Hi J,
Thanks, but as mentioned ABS isn't supported in Oshonsoft
C.

#### jjw

##### Member
Hi J,
Thanks, but as mentioned ABS isn't supported in Oshonsoft
C.
That's why I wrote the message #12
It was an example, how to get absolute value of a variable.
You can make your own ABS function which is missing in Oshonsoft.

Function ABS ( arg as single ) as single
If arg < 0 then
ABS = -1 * arg
Else
ABS = arg
End function

And now can call it:

X1 = ABS ( X )

Last edited:

#### Pommie

##### Well-Known Member
You can also do something like,
Code:
sx=x.15
if sx=1 then
ux=65536-x
else
ux=x
end if
to get sx and ux which are the sign of x, plus or minus and ux the unsigned value of x.

Mike.

#### camerart

##### Active Member
That's why I wrote the message #12
It was an example, how to get absolute value of a variable.
You can make your own ABS function which is missing in Oshonsoft.

Function ABS ( arg as single ) as single
If arg < 0 then
ABS = -1 * arg
Else
ABS = arg
End function

And now can call it:

X1 = ABS ( X )
Hi J,
For me this is really complicated!
This and the #12 reply, use the word ABS. If I type ABS into an Oshonsoft program, then it is rejected, so as I understand it, another way must be used.
C.

#### camerart

##### Active Member
You can also do something like,
Code:
sx=x.15
if sx=1 then
ux=65536-x
else
ux=x
end if
to get sx and ux which are the sign of x, plus or minus and ux the unsigned value of x.

Mike.
Hi M,
Is this correct: Where 'x' is the number being worked on. Use 'sx' and 'ux' as a tempory substitute. If the result 'sx' is a negative, then 'x' [now called either 'sx' or 'ux'] needs this calculation for the result?
P.S. I can hardly understand my explanation. I'll try this method, and post it, thanks.
C.

#### jjw

##### Member
Hi J,
For me this is really complicated!
This and the #12 reply, use the word ABS. If I type ABS into an Oshonsoft program, then it is rejected, so as I understand it, another way must be used.
C.
First write a function ABS exactly as in msg #14 and then use it.

#### camerart

##### Active Member
Hi,
Following the above advice, I came across a puzzle.

Here's a section from my program:
x_raw.HB = b(0)
x_raw.LB = b(1)
z_raw.HB = b(2)
z_raw.LB = b(3)
y_raw.HB = b(4)
y_raw.LB = b(5)
sttus_raw = b(5)

If x_raw > 32767 Then
x_raw = 65535 - x_raw
x_raw = x_raw + 1
Endif

X_raw is the result so far. I now think that this can't be negative. Is this correct?
C.

#### camerart

##### Active Member
First write a function ABS exactly as in msg #14 and then use it.
Hi J,