Simulación de vuelo. Indicador DME casero.


Bien, este es el primer artículo sobre esto. Cuando empecé, escogí el indicador DME como primera creación por su simplicidad. Consiste en dos displays de tres cifras cada uno, y un interruptor. Este es el pantallazo del Microsoft Flight Simulator X (A partir de ahora FSX):

DMEBien, como vemos tiene varios interruptores y un dial giratorio, sin embargo el FSX sólo nos deja configurar uno de los interruptores, el que itnercambia entre R1 y R2, y el resto está de decoración, así que en mi modelo sólo hice el interruptor que funciona. Como ya dije en un artículo anterior, este DME no será el que use al final. En el final sí incorporaré todos los diales porque tengo claro que en algún momento me pasaré del FSX al X-Plane, que a diferencia del primero continua en producción, y este último si incorpora el resto de cosas.

Bueno, describo un poco el cacharro. En un avión por lo general tenemos cuatro canales de radio. Dos de ellos están dedicados a comunicaciones (COM1 y COM2), y los otros dos a navegación (NAV1 y NAV2). Estos dos últimos los podemos sintonizar a unas estaciones llamadas estaciones VOR (VHF Omnidirectional Radio range, o Radiofaro Omnidirección VHF), que entre otras cosas nos permite conocer nuestra posición relativa con respecto a radiales que salgan de la estación. Pues bien, este indicador DME (Distance Measurement Equipment), nos da la distancia a la que estamos de lo que tengamos sintonizado en las NAV#, y la velocidad relativa con respecto a ellas. El interruptor nos permite cambiar entre los canales NAV1 y NAV2.

La construcción es de la siguiente manera: Tenemos 6 displays de siete segmentos de ánodo común, son en concreto estos: http://dx.com/es/p/fj5101bh-10-pin-7-segments-red-led-display-common-anode-10-pcs-151060

Estos displays tienen 10 pines, dos de ellos son el ánodo común de los 8 LEDs, y los otros 8 pines son uno para cada LED. Para iluminar cada uno hay que poner voltaje alto en el ánodo y tierra en el pin correspondiente al segmento. Como son 6 displays, tenemos 6·9=54 pines, y la placa arduino no tiene tantos. Podríamos usar registros electrónicos para disminuir el número de pines necesarios, pero en este caso yo lo hice de otra manera: multiplexing.

Esto consiste en lo siguiente. Conectamos todos los pines correspondientes al primer segmento juntos, todos los correpondientes al segundo segmento juntos, y así con todos, de manera que tenemos los ánodos de cada display suelto, y el resto de pines unidos entre si, de la siguiente manera:

Esta foto la he sacado de por ahí, y lo hacen con cuatro, pero lo puedes hacer con los que quieras, el resutado final es que los ánodos están conectados cada uno de ellos a un pin que podemos controlar, y luego los pines correspondientes a cada segmento, todos juntos, a otro pin. En este caso el número de pines a usar es 8+6=14. Y eso sí lo tenemos. Por cierto, que yo no uso transistores porque la placa da corriente suficiente, lo hice más simple. Seguramente en el proyecto final lo haga como en la foto.

Si queremos mostrar un número en los tres primeros dígitos, por ejemplo el 123, lo que hacemos es lo siguiente:

Ponemos voltaje alto al primer dígito y voltaje bajo el resto, de este modo sólo se enciende el primer dígito, y el resto permanecen apagados. Ahora usamos los pines de los segmentos para mostrar el número 1. Como el único ánodo con voltaje alto es el primero, sólo se mostrará el número 1 en el primero de ellos. Ahora esperamos una cantidad de tiempo. A continuación apagamos el primer dígito y encendemos el segundo, y mostramos el número 2. Esperamos la misma cantidad de tiempo. Apagamos el segundo dígito, encendemos el tercero y mostramos el número 3, y esperamos la misma cantidad de tiempo.

Tendremos la siguiente secuencia:

multiplexing

El secreto para que se muestren los 3 al mismo tiempo está en el tiempo que esperamos entre que mostramos un número y el siguiente. Si este tiempo es lo suficientemente pequeño, por ejemplo 5 mili segundos funciona muy bien con 3 dígitos. Entonces el cambio se produce tan rápido que no somos capaces de percibirlo y da la impresión de que se muestran los 3 números al mismo tiempo.

En el DME eso es lo que hacemos. La circuitería no tiene ningún misterio. Hacerlo en una placa perforada fue un verdadero coñazo y me asombra que no me equivocase al soldar ninguna de las conexiones, pero de milagro, funciona. El interruptor es un circuito simple de interruptor, aquí lo tenéis hecho en 5 segundos con el Paint:

interruptor

No recuerdo exactamente si conecté el interruptor al pin A0, pero vamos, que cualquiera vale. Aquí tenéis todo el circuito en una breadboard, la tercera lo muestra conectado al simulador y funcionando:

20130602_00220130602_00120130602_004

Aquí dejo más fotos del montaje donde se puede ver el multiplexing soldado en las dos placas por separado, y conectado para probarlo al simulador:

20130603_00220130606_001 20130606_002 20130612_005

20130612_006 20130616_004 20130623_001 20130623_002

Vale, ahora sólo queda el código. Hay dos programas de los que depende el funcionamiento de todo lo que hagamos. Uno de ellos es el que use la placa Arduino, y el otro es el que se ejecuta en el ordenador y funciona como mensajero entre el simulador y la placa.

Como en el proyecto final habrá muchos cacharros y el procesador de la placa es muy lento (16 MHz, contra los más de 3GHz de mi portátil), intentaremos liberar todo el trabajo que podamos de la placa y haremos que todos los cálculos se realicen en el ordenador. Eso significa que la placa lo único que hará será recibir datos, leerlos e imprimirlos. En este caso no habrá mucha diferencia, pero en otros sí, y la diferencia será mayor cuando queramos poner en marcha todo a la vez. El código de la placa Arduino es el siguiente:

http://pastebin.com/C3qDaaik

Siento no haberlo comentado pero lo explico un poco por aquí: La comunicación entre placa y ordenador es una comunicación Serial por usb. Lo que hace el programa del ordenador es mandar cadenas de caracteres ASCII. Como la placa recibe dos tipos de datos (velocidad y distancia) usaremos delimitadores para poder distinguirlos. En este caso, por ser un proyecto reciclado de por ahí, los delimitadores son ‘<‘ y ‘>’ para la distancia, y ‘S’ y ‘s’ para la velocidad. La placa recibirá cadenas del tipo: “<056>S100s”. La función processInput(), junto con processNumber() y processSpeed() realizan ese trabajo en las dos primeras lineas del bucle principal loop().

La variable “negative” se usa para diferenciar de cuando hay señal DME, y de cuando no. En este último caso se deben mostrar tres guiones en cada display. Eso es lo que hace el resto de la función loop(): Si la variable negative es falsa, entonces procede al multiplexing, si es verdadera, muestra los guiones.

El código del ordenador lo publicaré en un artículo distinto como una guía más general orientada a usar las APIs del FSX.

Hasta otra.

Anuncios
Esta entrada fue publicada en Noticias. Guarda el enlace permanente.

2 respuestas a Simulación de vuelo. Indicador DME casero.

  1. Lupita dijo:

    Wow C+FSX ya tenia experiencia en simuladores de vuelo de hecho exactamente me acabo de instalar el FS2004 ya que no me corre el FSX por el momento y me encuentro con tu articulo muy muy interesante…

    Ya veremos como manejan esas APIS el FXS soludos muy interesante post…

  2. julianrodes dijo:

    Hola y un post de lo mas sugerente , me gustaría saber si vas a publicar mas circuitos de los diferentes elementos de navegación , si son tuyos o si no de donde se puede sacar, creo que como dices con bastante menos inversión podemos construirnos los elementos mas esenciales para poder volar. Un saludo y animo

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s