Comunicaciones con Arduino (USB-Serial)

 

En esta entrada implementaremos las comunicaciones básicas entre el PC y Arduino, que servirán de introducción para el control del dispositivo láser mencionado en este otro post. Por ir completando un poco el proyecto, aprovecharemos la implementación de la conversión de coordenadas en Arduino para diseñar un programa que reciba las coordenadas ecuatoriales y devuelva las acimutales correspondientes (equivalentes a coordenadas locales u horizontales).

 

Estas coordenadas las podemos obtener, por el momento, de forma manual con Stellarium. Con estos datos, implementaremos un script en Python que se comunicará con Arduino para establecer los objetos de referencia, y posteriormente calcular las coordenadas acimutales  (Az/Alt en Stellarium) a partir de las ecuatoriales de un objeto cualquiera. Será una especie de “co-procesador USB” para la conversión de coordenadas basado en Arduino.. aunque como co-procesador será tan inútil como curioso, creo :).

En otras publicaciones usaremos esta información para mover motores paso-a-paso y dirigir así el puntero láser hacia las coordenadas locales de los objetos celestes, en lugar de simplemente devolver los resultados al PC.

Las comunicaciones se harán a través del puerto serie provisto por la biblioteca Serial de Arduino, y se basarán principalmente en la recepción en el microcontrolador de distintos comandos con parámetros, que devolverán resultados al script en el lado del PC. Estos comandos tendrán una estructura prefijada, un tamaño fijo de cuatro caracteres, y un número variable de parámetros y resultados. En principio nos bastará con los siguientes:

 

  • time‘ (float t) -> () Establece el tiempo inicial de observación.
  • set1‘ (float ar, float dec, float t, float ac, float alt) -> () Establece el objeto de referencia 1
  • set2‘ (float ar, float dec, float t, float ac, float alt) -> () Establece el objeto de referencia 2
  • goto‘ (float ar, float dec, float t) -> (float ac, float alt) Calcula y devuelve las coordenadas locales (acimutales en este caso) obtenidas a partir de las ecuatoriales.

 

Comenzaremos por la implementación en Arduino. En primer lugar, para recibir un comando bastaría con un código como el siguiente:

 

 

Para la recepción de los parámetros usaremos una función que recibirá los caracteres desde el puerto serie y devolverá el valor como float, listo para ser usado en las operaciones:

 

 

Debemos tener en cuenta que en las coordenadas acimutales el ángulo horizontal (ac) se mide en el sentido de las agujas del reloj, al contrario que en las coordenadas ecuatoriales. Corregiremos este valor en la recepción y la devolución del parámetro, de forma que sea totalmente transparente para el script en el lado del PC.

Con estas “piezas” y el código para la conversión de coordenadas (CoordsLib.h y CoordsLib.cpp) podemos completar el software para la recepción y ejecución de los comandos. Para programar Arduino deberemos poner estos dos archivos y el siguiente sketch en el mismo directorio:

 

 

Ahora nos queda el lado del PC, para lo que usaremos una clase que en su momento me fue muy útil para la depuración del programa en Arduino. Llamaremos a esta clase Testing, y contendrá los métodos necesarios para enviar fácilmente los comandos con sus parámetros desde, por ejemplo, una consola de Python (para lo cual recomiendo iPython: en Ubuntu, apt-get install ipython). El código de esta clase sería como sigue:

 

 

Ahora, con ayuda de Stellarium apuntaremos las coordenadas de unos cuantos objetos, dos de referencia y algunos más, para hacer algunas pruebas. En la siguiente tabla se muestran el nombre, las coordenadas ecuatoriales, la hora de la medida y las coordenadas acimutales de una serie de objetos celestes. Hemos escogido la estrella Polar y Vega como referencias, fácilmente identificables. Del resto usaremos sus coordenadas ecuatoriales para calcular las acimutales (locales), y ver si coinciden con las mostradas en Stellarium.

 

Tiempo inicial y fecha: 22:02 - Jueves 9 de Agosto de 2012
Latitud:	N 37° 24' 0.01"
Longitud:	W 5° 58' 48.00"

__Obj__		__AR/DEC (J2000)__	__T__		__Az/Alt__

Polaris		2h31m49s/81º15'51''	22h04m20s 	0º27'09''/36º49'17''
Vega		18h36m56s/38º47'03''	22h05m07s	78º10'04''/70º05'19''

Altair		19h50m47s/8º52'07''	22h06m11s	114º36'45''/41º30'22''
Lagoon Nebula	18h03m48s/-24º23'00''	22h06m52s	163º02'47''/26º15'16''
Marte		13h17m55s/-8º29'04''	22h07m51s	240º18'46''/21º04'41''

 

Con estos valores, y teniendo en cuenta los métodos de la clase Testing, podemos montar la siguiente secuencia de instrucciones:

 

 

Si ejecutamos en una consola de ipython estas instrucciones obtendremos los siguientes resultados:

 

In [1]: from testing import *

In [2]: t = Testing()

In [3]: t.init()

In [4]: t.setTime("22h02m0s")

In [5]: t.setRef(1 , "2h31m49s", "89º15'51''", "22h04m20s", "0º27'09''", "36º49'17''")
SEND:	+0.662425/+1.557954 - +5.778494 - +0.007898/+0.642654

In [6]: t.setRef(2 , "18h36m56s", "38º47'03''", "22h05m07s", "78º10'04''", "70º05'19''")
SEND:	+4.873541/+0.676911 - +5.781912 - +1.364285/+1.223277

In [7]: t.goto("19h50m47s", "8º52'07''", "22h06m11s")
SEND:	+5.195772/+0.154786 - +5.786566
RECV:	2.000384/0.724421	(114º36'49'' / 41º30'23'')

In [8]: t.goto("18h03m48s", "-24º23'00''", "22h06m52s")
SEND:	+4.728970/-0.425569 - +5.789548
RECV:	2.845698/0.458214	(163º2'47'' / 26º15'13'')

In [9]: t.goto("13h17m55s", "-8º29'04''", "22h07m51s")
SEND:	+3.481568/-0.148081 - +5.793839
RECV:	-2.088903/0.367851	(240º18'53'' / 21º4'35'')

 

Se puede observar que los valores obtenidos para Altair, la nebulosa de la laguna y Marte  (por cierto, al momento de escribir este post, hace tres días que el rover Curiosity acaba de posarse en este planeta!! 🙂), se aproximan bastante a los medidos en Stellarium.

 

Así que bueno, ya tenemos ese “co-procesador USB” ( 😉 ) basado en Arduino para transformar coordenadas ecuatoriales en locales, y viceversa.

El siguiente paso sería la construcción de un mecanismo que nos proporcione las coordenadas locales, ya que las ecuatoriales las podemos obtener automáticamente de Stellarium, aunque esto lo dejaré para otros posts.. creo que por hoy ya está bien 🙂

Salud! y saludos!

 
Tagged . Bookmark the permalink.

2 Responses to Comunicaciones con Arduino (USB-Serial)

  1. Sandra says:

    Hi,

    could you please send the cad file for 3d Printing to me.

    We started a school Project and it would be nice if we could use the CAD Files.

    On grabcad there is only the Assembled File but most singls parts are missing.

    Thanks a lot

    Sandra

  2. JuanRa says:

    Hi Sandra,

    I would really like to have the cad file for 3d printing. But I’m afraid that this was a hand-made device that I cannot reproduce easily.

    My expertise field is more on the software side. Learning 3D design is a pending task for me.

    Perhaps these images can help you to figure out some device parts: https://github.com/juanrmn/Arduino-Telescope-Control/blob/master/images/photo_2.jpg

    Nonetheless, if you finally build a 3D desing, I’d really appreciate if you share it with me 🙂

    Good luck with your project.

Leave a Reply to Sandra Cancel reply

Your email address will not be published. Required fields are marked *