Hi,
i'm trying to interface stellarium and an Arduino based telescope motor
through the Telescope plugin using the meade lx200 protocol as described here-
->http://www.meade.com/support/LX200CommandSet.pdf.
I have successfully answered to the getRA command but the getDEC command gives
me problems:
in fact in the protocol documentation it says that i have to send back the
value of the Declination as
sDD*MM#
i think s is the sign(+ or -) and i give random numbers on D and M (eg.
+45*00#
. this is what i send back through Serial.
But in the log message it says:
That is the standard protocol for the LX200 but you may be having a speed
problem where the arduino control is being converted to meade format.. I
imagine you have written a program into the PIC (I think that is what is
used).
Speed of conversion was a problem we experienced with the ETX70 mounts and a
slower version of the Stellarium control was developed and called ETX70
Try this version and see if it works
Barry
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Just tried it, nothing changed... :(
the only thing i can send wrong is how the string with the DEC is formatted,
maybe i do something wrong in how the + sign should be written;
The better would be if somebody with that mount(lx200 compatible) could
connect it to stellarium configure it and post the log files in
AppData/Roaming/Stellarium, that would be really appreciate.
Thanks anyway Barry for the try
Francesco
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
I just connected to an LX200 and the telescope protocol worked fine.
There is no information in the log file other than
Creating telescope "New Telescope 1:TelescopeServerLx200:J2000:COM1:500000" ;
name/type/equinox/params: "New Telescope 1" "TelescopeServerLx200" J2000
"COM1:500000"
TelescopeClientDirectLx200 paramaters: port, time_delay: "COM1" 500000
What version of stellarium are you using
Stellarium no longer users the old telescope control that had to be initiated
separately and gave that log reading.
I don't think I still have the programs unless they are still in the wiki
Barry
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Unfortunately it doesn't work, in fact from your log file it seems the
telescope has sent back "+08ß52:11#" through the serial port but if i use the
ß character it doesnt work, it receives "Ã?", now i think there is only one
chance more, to try connecting the telescope to arduino IDE and through the
serial monitor send #:GD# and see exactly what it gets.
Thanks alot anyway for the help
Francesco
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
That should be a do nothing character and not be interpreted. It is the
position that is later occupied by a degree sign. It could be a problem with
the language of you operating system. You should be able to program your
arduino to return some other character (*) at this point.
Barry
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
I solved the problem two weeks ago, but want to share what the problem was;
the problem consisted in how i send the DEC back to stellarium, in fact i used
the
Serial.println()
so it received the RA and after the string it added a
\n
which stellarium after appends to the DEC string and tries to analize it
instead of the "+" or "-", i solved simply by using
Serial.print()
which doesn't append anything to what i send back.
Thanks anyway to barry for the help
Francesco
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
I have taken up exactly the same as a project and it'll be fair to call me a
newbie.
Could you please tell me how exactly do I need to program the arduino so that
stellarium recognizes it as a "compatible Lx200" ? The LX200Command code in
stellarium lists only 5-6 of the commands listed in the pdf. Will programming
it only for those be sufficient? Also, do I need to make any changes in
Stellarium's TelescopeControl code?
Those are a lot of questions but even the slightest help will be appreciated.
Thanks.
Yamini
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Stellarium talks to the meade telescopes using the Lx 200 Communication Protocol through COM port, so any device connected to the COM port specified in Stellarium, which answers in the right way to the "protocol compliant questions" is recognized by stellarium as a Meade lx200 telescope and should work without problems;
2.Stellarium is the first to send a question through the COM port, there is no
verification process. It starts immediatly by asking the actual DEC and the RA
the telescope points to.
3.It goes on asking while the telescope is set on CONNECTED, so the telescope
(Arduino in this case) has no need to say "i've changed position", the
telescope just answers the Stellarium's questions.
4.All the questions stellarium could do and how you have to structure the
answers are described in the pdf i linked, so you can program an answer for
quite all the situation (but to save space it is better to analyse which
situations are possible to happen).
5.Quite the most important, if you don't give stellarium an answer or give the
wrong answer he just forget it and restart asking where are you pointed to,
this is very useful if you didn't think something could happen but it
happened, the program won't freeze.
Now to the practice:
The directory where you can find the log file is in AppData/Roaming/Stellarium
, the log file is the one named log_TelescopeServer(n°) the one called simply
"log" is unuseful.
As you can see when stellarium connect to arduino it:
1. sends via Serial the request for the current RA of the telescope with the command "#:GR#"
2. i programmed the arduino in a way if the string received is equal to "#:GR#" it sends back his RA position structured as HH:MM:SS
3. Stellarium accepted the position and set this as the telescope plugin position
4,5,6 as before, only it is for DEC and not for RA so i send back DEC
structured as (+ or -)DegDeg:MM:SS
ONLY when he received also the declination and accepted it as valid it'll
display the yellow circle in the sky map, if RA or DEC are not accepted it
will restart and display the circle at the precedent RA, DEC values, if it was
the first request then it will not display anything.
IMPORTANT: make sure you send data via Serial with the command Serial.print
and NOT Serial.println because the second one adds a \n which Stellarium
doesn't accept.
I wrote you only about the first connection, but you can experiment, just in
stellarium do what you want your telescope to do(e.g. slew the telescope to
somewhere), in the log file you see what it sends to arduino (Writenonblocking
line) and search the protocol file to know how to answer that specific
command, step by step you will write a program capable of interfacing itself
with Stellarium.
Hope this can help you,
Greetings
Francesco Servida
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
I programed the arduino to accept the #:GR# and #:GD# command. The problem is
that in Stellarium it shows the connection status as "Stopped". I checked the
serial data coming to the arduino and it turns out it isn't receiving any data
at all. (I used the serial monitor) Do I need to make any changes to the code
of Stellarium? Which version of Stellarium are you working with?
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
you can't use the monitor and Stellarium at the same time on the port... that
is why you dont see anything.
youll need a program like serial sniffer to act as a men in the middle to see
the communication between the two
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Basically, if it shows stopped after you press connect it means you set in
stellarium the false COM port,
For the problem with the monitor, lion is right, only one program at a time
can access the COM port, however you don't need a program like serial sniffer
because all that is sent throug serial is registered in the log file, that you
can open anytime you want.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
ok guys, over the day i was able to write a code that communicates perfectly
with stellarium.
i am posting here the fuction that sends RA/DEC from degree format to RA in
HH:MM:SS and DEC in sDD:MM:SS
it is still bugged i think in the ra and dec calculations.
String proccesCommand(String currCommand)//, double dec, double ra)
{
az = (map(analogRead(A8),0,1023,0,359));//*(M_PI/180);
alt = (map(analogRead(A15),0,1023,0,90));//*(M_PI/180));
dec = calcDec(az, alt);
ra= calcRa(az, alt, dec);
double mod;
int intPart;
//attempt to stabilize
if(dec > preDec + 50 || dec < preDec - 50){
dec = preDec;
}
if(ra > preRa +50 || ra < preRa- 50){
ra= preRa;
}
preDec = dec;
preRa = ra;
if(currCommand == "#:GR#"){
currCommand = "";
mod = fmod(ra/15, 1);
intPart = (int)ra/15;
if(intPart < 10){////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Serial.print("0");
currCommand +="0";
}
//Serial.println(intPart);
currCommand +=intPart;
currCommand +=":";
// next times the MOD1 of degrees by 60 so we can find the integer part for minutes.
// get the MOD1 of the new coord to find the numbers after the decimal point.
ra = mod * 60;
mod = fmod(ra,1);
intPart = (int)ra;
//Serial.print("MM ");//////////////////////////////////////////////////
if(intPart < 10){///////////////////////////////////////////////////////////////////////////////
//Serial.print("0");//////////////////////////////////////////////////////////////////
currCommand +="0";
}
//Serial.println(intPart);//////////////////////////////////////////////////////
currCommand +=intPart;
currCommand +=":";
ra = mod * 60;
intPart = (int)ra;
if(intPart < 10){/////////////////////////////////////////////////////////////////////////////
currCommand +="0";
}
currCommand +=intPart;
currCommand +="#";
return(currCommand);
}
if(currCommand == "#:GD#"){
currCommand = "";
if(dec > 0){
currCommand +="+";
//currCommand += "+";
}
else{
currCommand +="-";
//currCommand +="-";
dec *= -1;
}
mod = fmod(dec,1);
intPart = (int)dec;
if(intPart < 10){////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
currCommand +="0";
}
currCommand +=intPart;
currCommand +=":";
dec = mod * 60;
mod = fmod(dec,1);
intPart = (int)dec;
if(intPart < 10){///////////////////////////////////////////////////////////////////////////////
currCommand +="0";
}
currCommand +=intPart;
currCommand +=":";
//do the same again for minutes
//e.g. coord = 0.68336 * 60 == 40.0016
//e.g. intPart = 40
dec = mod * 60;
intPart = (int)dec;
if(intPart < 10){/////////////////////////////////////////////////////////////////////////////
currCommand +="0";
}
currCommand +=intPart;
currCommand +="#";
return(currCommand);
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
At any given instant the positions of the astronomical objects which are
measured in the equatorial plane (RA and DE) can be equated in the horizon
plane (altitude and Azimuth) provided that the precise position in latitude
and longitude, a function of hour angle and time) of the observing site, is
known. This is calculated from the formula:-
COS(P)=(SIN(Y) - (SIN(GP) x SIN(Q))) / (COS(GP) x COS(Q))
SIN(Q)=(SIN(Y) - SIN(GP) + (COS(Y) x COS(GP) x COS(X))
Where
P= hour angle or azimuth
Q= declination or altitude
When given
X= azimuth or hour angle
Y= altitude or declination
GP= geographical latitude
The formulae are symetrical; i.e. conversion can be either way. Hour angle is
a direct relationship between the current sidereal time and geographical
longitude and is also quite easily calculated either way. The difficult
calculation is calculating GP from the above formulae when all the other
parameters are known.
Barry
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
You will need to write an interface in your Arduino language using the above
information to convert the alt/azm data into RA/Dec and add a
date/time/location device. It would be far cheaper to buy an Argo Navis with
encoders and use this on your telescope and forget about the Arduino interface
until you learn more about astronomical calculations.
Barry
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
I think I got a PM from you for info on alt/azm-RA/Dec conversion but I was
unable to answer it as such.
I use the formula written in BASIC/QBASIC extracted fro peter Duffet Smith's
book Astronomical calculations with a PC.
This zip can be downloaded it has a program to convert alt/azm to RA/Dec or
vice versa written in GWbasic and compiled with QB64 as a stand alone program.
The source code is provided but you may need to read the original article from
the reference to understand how it works. It takes the time from the computer
clock and the location from an ASCII file containing your location.
See if this is any help.
Barry
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
This link was very helpful for me in writing arduino codes for my home made eqmount.
I am facing the same similar problem to the @Francesco's post.
RA is getting accepted but DC gets error: degree sign expected.
here is the part sending :GD# data,
if (stringOne =="#:GR#"){
hh -= previous;
mm -= previous;
ss -= previous;
Serial.print (hh);
Serial.print (':');
Serial.print (mm);
Serial.print (':');
Serial.print (ss);
Serial.print ('#');
stringOne ="";
Hi,
i'm trying to interface stellarium and an Arduino based telescope motor
through the Telescope plugin using the meade lx200 protocol as described here-
->http://www.meade.com/support/LX200CommandSet.pdf.
I have successfully answered to the getRA command but the getDEC command gives
me problems:
in fact in the protocol documentation it says that i have to send back the
value of the Declination as
i think s is the sign(+ or -) and i give random numbers on D and M (eg.
. this is what i send back through Serial.
But in the log message it says:
I don't know how to solve the
Thanks in advance for any help
Francesco
That is the standard protocol for the LX200 but you may be having a speed
problem where the arduino control is being converted to meade format.. I
imagine you have written a program into the PIC (I think that is what is
used).
Speed of conversion was a problem we experienced with the ETX70 mounts and a
slower version of the Stellarium control was developed and called ETX70
Try this version and see if it works
Barry
Just tried it, nothing changed... :(
the only thing i can send wrong is how the string with the DEC is formatted,
maybe i do something wrong in how the + sign should be written;
The better would be if somebody with that mount(lx200 compatible) could
connect it to stellarium configure it and post the log files in
AppData/Roaming/Stellarium, that would be really appreciate.
Thanks anyway Barry for the try
Francesco
I just connected to an LX200 and the telescope protocol worked fine.
There is no information in the log file other than
Creating telescope "New Telescope 1:TelescopeServerLx200:J2000:COM1:500000" ;
name/type/equinox/params: "New Telescope 1" "TelescopeServerLx200" J2000
"COM1:500000"
TelescopeClientDirectLx200 paramaters: port, time_delay: "COM1" 500000
What version of stellarium are you using
Stellarium no longer users the old telescope control that had to be initiated
separately and gave that log reading.
I don't think I still have the programs unless they are still in the wiki
Barry
OK
I found the older server program and ran it on my LX200
Here is a portion of the log file I generated from it
C:>TelescopeServerLx200.exe 10000 COM1:
This is TelescopeServerLx200.exe, built on Sep 10 2006, 23:52:38
15446,23:02:08.515625: Lx200Connection::sendCommand(Lx200CommandGetRa)
15446,23:02:08.515625:
Lx200Connection::writeFrontCommandToBuffer(Lx200CommandGetRa): queued
15446,23:02:08.515625: Lx200Connection::sendCommand(Lx200CommandGetDec)
15446,23:02:08.531250: listening on port 10000
15446,23:02:08.531250: Connection::performWriting: writeNonblocking(5)
returned 5; #:GR#
15446,23:02:08.562500: Connection::performReading: readNonblocking returned 9;
19:50:47#
15446,23:02:08.562500: Lx200CommandGetRa::readAnswerFromBuffer: ra = 19:50:47
15446,23:02:08.562500: ServerLx200::raReceived: 3551649634
15446,23:02:08.562500:
Lx200Connection::writeFrontCommandToBuffer(Lx200CommandGetDec): queued
15446,23:02:08.578125: Connection::performWriting: writeNonblocking(5)
returned 5; #:GD#
15446,23:02:08.593750: Connection::performReading: readNonblocking returned 7;
+08ß52:
15446,23:02:08.609375: Connection::performReading: readNonblocking returned 3;
11#
15446,23:02:08.609375: Lx200CommandGetDec::readAnswerFromBuffer: dec =
+08:52:11
15446,23:02:08.609375: ServerLx200::decReceived: 105819907
15446,23:02:09.015625: Lx200Connection::sendCommand(Lx200CommandGetRa)
15446,23:02:09.015625:
Lx200Connection::writeFrontCommandToBuffer(Lx200CommandGetRa): queued
15446,23:02:09.015625: Lx200Connection::sendCommand(Lx200CommandGetDec)
15446,23:02:09.015625: Connection::performWriting: writeNonblocking(5)
returned 5; #:GR#
15446,23:02:09.031250: Connection::performReading: readNonblocking returned 6;
19:50:
15446,23:02:09.046875: Connection::performReading: readNonblocking returned 3;
47#
15446,23:02:09.046875: Lx200CommandGetRa::readAnswerFromBuffer: ra = 19:50:47
15446,23:02:09.046875: ServerLx200::raReceived: 3551649634
Barry
Unfortunately it doesn't work, in fact from your log file it seems the
telescope has sent back "+08ß52:11#" through the serial port but if i use the
ß character it doesnt work, it receives "Ã?", now i think there is only one
chance more, to try connecting the telescope to arduino IDE and through the
serial monitor send #:GD# and see exactly what it gets.
Thanks alot anyway for the help
Francesco
Hi Francesco
That should be a do nothing character and not be interpreted. It is the
position that is later occupied by a degree sign. It could be a problem with
the language of you operating system. You should be able to program your
arduino to return some other character (*) at this point.
Barry
I solved the problem two weeks ago, but want to share what the problem was;
the problem consisted in how i send the DEC back to stellarium, in fact i used
the
so it received the RA and after the string it added a
which stellarium after appends to the DEC string and tries to analize it
instead of the "+" or "-", i solved simply by using
which doesn't append anything to what i send back.
Thanks anyway to barry for the help
Francesco
Hi!
I have taken up exactly the same as a project and it'll be fair to call me a
newbie.
Could you please tell me how exactly do I need to program the arduino so that
stellarium recognizes it as a "compatible Lx200" ? The LX200Command code in
stellarium lists only 5-6 of the commands listed in the pdf. Will programming
it only for those be sufficient? Also, do I need to make any changes in
Stellarium's TelescopeControl code?
Those are a lot of questions but even the slightest help will be appreciated.
Thanks.
Yamini
So,
first of all a bit of theory:
2.Stellarium is the first to send a question through the COM port, there is no
verification process. It starts immediatly by asking the actual DEC and the RA
the telescope points to.
3.It goes on asking while the telescope is set on CONNECTED, so the telescope
(Arduino in this case) has no need to say "i've changed position", the
telescope just answers the Stellarium's questions.
4.All the questions stellarium could do and how you have to structure the
answers are described in the pdf i linked, so you can program an answer for
quite all the situation (but to save space it is better to analyse which
situations are possible to happen).
5.Quite the most important, if you don't give stellarium an answer or give the
wrong answer he just forget it and restart asking where are you pointed to,
this is very useful if you didn't think something could happen but it
happened, the program won't freeze.
Now to the practice:
The directory where you can find the log file is in AppData/Roaming/Stellarium
, the log file is the one named log_TelescopeServer(n°) the one called simply
"log" is unuseful.
As you can see when stellarium connect to arduino it:
1. sends via Serial the request for the current RA of the telescope with the command "#:GR#"
2. i programmed the arduino in a way if the string received is equal to "#:GR#" it sends back his RA position structured as HH:MM:SS
3. Stellarium accepted the position and set this as the telescope plugin position
4,5,6 as before, only it is for DEC and not for RA so i send back DEC
structured as (+ or -)DegDeg:MM:SS
ONLY when he received also the declination and accepted it as valid it'll
display the yellow circle in the sky map, if RA or DEC are not accepted it
will restart and display the circle at the precedent RA, DEC values, if it was
the first request then it will not display anything.
IMPORTANT: make sure you send data via Serial with the command Serial.print
and NOT Serial.println because the second one adds a \n which Stellarium
doesn't accept.
I wrote you only about the first connection, but you can experiment, just in
stellarium do what you want your telescope to do(e.g. slew the telescope to
somewhere), in the log file you see what it sends to arduino (Writenonblocking
line) and search the protocol file to know how to answer that specific
command, step by step you will write a program capable of interfacing itself
with Stellarium.
Hope this can help you,
Greetings
Francesco Servida
the second image is wrong it should have been:
Hi!
Thanks a lot for taking the time to respond.
I programed the arduino to accept the #:GR# and #:GD# command. The problem is
that in Stellarium it shows the connection status as "Stopped". I checked the
serial data coming to the arduino and it turns out it isn't receiving any data
at all. (I used the serial monitor) Do I need to make any changes to the code
of Stellarium? Which version of Stellarium are you working with?
you can't use the monitor and Stellarium at the same time on the port... that
is why you dont see anything.
youll need a program like serial sniffer to act as a men in the middle to see
the communication between the two
Basically, if it shows stopped after you press connect it means you set in
stellarium the false COM port,
For the problem with the monitor, lion is right, only one program at a time
can access the COM port, however you don't need a program like serial sniffer
because all that is sent throug serial is registered in the log file, that you
can open anytime you want.
ok guys, over the day i was able to write a code that communicates perfectly
with stellarium.
i am posting here the fuction that sends RA/DEC from degree format to RA in
HH:MM:SS and DEC in sDD:MM:SS
it is still bugged i think in the ra and dec calculations.
i will be really glad if someone knows the way to properly convert AZ/EL to
RA/DEC
At any given instant the positions of the astronomical objects which are
measured in the equatorial plane (RA and DE) can be equated in the horizon
plane (altitude and Azimuth) provided that the precise position in latitude
and longitude, a function of hour angle and time) of the observing site, is
known. This is calculated from the formula:-
COS(P)=(SIN(Y) - (SIN(GP) x SIN(Q))) / (COS(GP) x COS(Q))
SIN(Q)=(SIN(Y) - SIN(GP) + (COS(Y) x COS(GP) x COS(X))
Where
P= hour angle or azimuth
Q= declination or altitude
When given
X= azimuth or hour angle
Y= altitude or declination
GP= geographical latitude
The formulae are symetrical; i.e. conversion can be either way. Hour angle is
a direct relationship between the current sidereal time and geographical
longitude and is also quite easily calculated either way. The difficult
calculation is calculating GP from the above formulae when all the other
parameters are known.
Barry
my sensors tell me the angle in which my telescope is directed at, how can i
convert from that to what i need to send to stellarium?
You will need to write an interface in your Arduino language using the above
information to convert the alt/azm data into RA/Dec and add a
date/time/location device. It would be far cheaper to buy an Argo Navis with
encoders and use this on your telescope and forget about the Arduino interface
until you learn more about astronomical calculations.
Barry
i already have date/time/location device and code for arduino, just stuck with
the calculations
Hi Leon
I think I got a PM from you for info on alt/azm-RA/Dec conversion but I was
unable to answer it as such.
I use the formula written in BASIC/QBASIC extracted fro peter Duffet Smith's
book Astronomical calculations with a PC.
http://barry.sarcasmogerdes.com/qb64/HALTAZ.zip
This zip can be downloaded it has a program to convert alt/azm to RA/Dec or
vice versa written in GWbasic and compiled with QB64 as a stand alone program.
The source code is provided but you may need to read the original article from
the reference to understand how it works. It takes the time from the computer
clock and the location from an ASCII file containing your location.
See if this is any help.
Barry
Hey all!
Well i got a fully working code and will release it very soon!
Meanwhile a short demo:
http://www.youtube.com/watch?v=xuICq-ZMWm0
Hi Leon.
Have you released it yet?
Brgds
my code is based on the work of simon box:
http://simonbox.info/index.php/astronomy
Hi
This link was very helpful for me in writing arduino codes for my home made eqmount.
I am facing the same similar problem to the @Francesco's post.
RA is getting accepted but DC gets error: degree sign expected.
here is the part sending :GD# data,
}
though i get the error: degree sign expected. scope is getting detected and i am able to see the scope in stellarium.
please suggest.
Thank you,
Madan