miércoles, 25 de enero de 2012

OpenRadioSim & Arduino: Transpondedor para X-Plane

El fruto y objetivo de mi anterior post, comunicar Arduino con SIOC, es entre otras cosas para hacerme un panel de radios, empezando por el Transpondedor, que resulte economico.

Si la jugada me sale bien lo llamare OpenRadioSim, y sera GPL

Pronto pondre los diseños de la PCB y el programa de arduino completo, asi como el diseño de la caratula y lista de materiales, para todo aquel que quiera copiarlo.

Pero tengo que retocar algunas cosillas que aun no hace, como responder a la tension de la avionica (para que se apage al quitar el interruptor) o que el retroiluminado se apaque en la posicion off.

Pero mientras he colgado un video donde se ve su funcionamiento actual aprobechando unas teclas que tenia por ahi tiradas.

martes, 24 de enero de 2012

Arduino e IOCP, the easyway.

Arduino es un invento, de eso no cabe duda, y al estar tan extendido es ademas una plataforma muy barata y flexible de programar microcontroladores.
Aunque hay bastante gente que ha conectado su arduino al simulador, hasta ahora lo mas flexible que encontre era el link2fs_inout de Jim. y no es precisame muy flexible o portable, pues parece programado en visual basic y para flight simulator.

No me gustaba, yo queria algo que hablase con sioc, para asi poder utilizarlo indistintamente con x-plane o con FsX

Asi que aplique un poco de filosofia unix, el KISS (keep it simple, stupid).

Mi idea es en el futuro que arduino, con una shield ethernet se comunicase directamente con un servidor IOCP, bien el programa sioc, bien el pluging para xplane, etc,etc...

La cuestion esta en como hacia para que mi actual arduino que se conecta por USB, hablase tambien con sioc.

Estaba claro que la solucion pasaba por un programa que hiciese de traductor entre la conexion TCP que espera IOCP, y la conexion serie que da arduino, que es lo mismo que hace la tarjeta LCD de opencockpits.

Empece programando el Arduino, por dos motivos, ya tengo una protocolo de comunicaciones, el SIOC, es sencillo de entender, y si el dia de mañana adquiero la shield ethernet tengo menos que modificar.

Luego tenia que programar la pasarela, como estoy en windows (por el sioc), y no tengo ni idea, la solucion paso por hacer una warreria en python.

Y voila!!! Funciona, puedo enviar y recibir datos entre arduino y SIOC, es bonito y es flexible.

Por hacer:
Hay algunas cosillas que aun no he terminado:
  • El programa no responde a la orden Arn.Vive
  • Tengo una latencia importante en las comunicaciones, sirve para un piloto automatico, un panel de alarmas, pero no para una plataforma movil, o instrumentos de aguja.He reducido la latencia, aunque no lo he probado con indicadores de aguja u otros indicadores "sensibles"
  • Hay que configurar y compilar algunas cosas a pelo, y hay que isntalar python.

Aqui esta la informacion util:

El programa pasarela.

Hay que instalar python, y luego la libreria pyserial, modificar las primeras lineas del programa para que se ajusten a tu configuracion:
 #!/usr/bin/python            # This is client.py file
# Distributed under GPL V3 License
# (C) Alvaro Alea Fdz 2012
import socket,serial,select # Import socket module

# la configuracion lo primero

host = "127.0.0.1" # socket.gethostname() Get local machine name
port = 8092 # Reserve a port for your service.
serialport=2 # com3

# Conectamos al servidor.
ne = socket.socket() # Create a socket object
print ("Conectando a servidor\n")
ne.connect((host, port))
ne.setblocking(0)
print ("Conectado a s. IOCP\n")
# Abrimos el puerto serie N 9 9600 por defecto
se = serial.Serial(serialport)
se.timeout=0
print ("Abierto puerto serie")
# El loop
#ne.send(bytes("Arn.Inicio:999:\r\n",'UTF-8'))
while 1:

d=0
while d==0:
b= se.read(1)
if b :
ne.send(b)
print (">")
else:
d=1

d=0
while d==0:
ready = select.select([ne],[],[],0.1)
if ready[0]:
a = ne.recv(1)
se.write(a)
print ("<")
else:
d=1
# salida normal del programa.
ne.close() # Close the socket when done
se.close()

El programa de arduino
Es solo el esqueleto de la aplicacion, el resto depende de lo que querais hacer, pronto pondre algun ejemplo completo:
// Distributed under GPL V3 License
// (C) Alvaro Alea Fdz 2012
// Algunas definiciones usadas por claridad.
#define XPDR_CODE 999
int dat,valor;
// llama a esta rutina al principio para iniciar el puerto serie y
// para indicar a sioc que variables monitorizar EDITALO
void setupserial(void){
Serial.begin(9600);
Serial.print("Arn.Inicio:");
Serial.print(XPDR_CODE);
Serial.println(":");
}
// funcion interna, ¿el nº en ascii es una numero?
int isnum(int n){
if ((n>47) && (n<58)) return 1;
else return 0;
}
// llama a esta funcion cuando quieras cambiar algo en sioc UTILIZALA
void enviapares(int dat, int valor){
Serial.print("Arn.Resp:");
Serial.print(dat);
Serial.print("=");
Serial.print(valor);
Serial.println(":");
}
// En esta funcion se reciben todos los cambios de sioc EDITALA
void procesapares(int dat, int valor){
int t1;
if (dat==XPDR_CODE){
}
}
// el meollo de la cuestion, NO TOCAR, FUNCIONA
void serialstuff(void) {
int c=0,pr;
pr=0;
if (Serial.available()==0) return;
c=Serial.read();
do {
switch (p){
case 0:
if (c=='A'){
p=1;
}
pr=1;
break;
case 1:
if (c=='r') {
p=2; pr=1;
} else { p=0;
}
break;
case 2:
if (c=='n') {
p=3; pr=1;
} else { p=0;
}
break;
case 3:
if (c=='.') {
p=4; pr=1;
} else { p=0;
}
break;
case 4:
switch (c) {
case 'R':
p=5; pr=1;
break;
default:
p=0;
break;
}
break;
case 5:
if (c=='e') {
p=6; pr=1;
} else {p=0;
}
break;
case 6:
if (c=='s') {
p=7; pr=1;
} else { p=0;
}
break;
case 7:
if (c=='p') {
p=8; pr=1;
} else { p=0;
}
break;
case 8:
if (c==':'){
p=9; pr=1; dat=0;
} else { p=0; }
break;
case 9:
switch (c){
case 13:
p=20; pr=1;
break;
case '=':
if (dat==0) {
p=0;
} else {
p=10; pr=1;
}
break;
default:
if (isnum(c)) {
dat = 10*dat + (c-48);
pr=1;
} else { p=0; }
break;
}
break;
case 10:
if (isnum(c)){
valor = (c-48); p=11; pr=1;
} else { p=0; }
break;
case 11:
switch (c) {
case ':':
procesapares(dat,valor);
p=8;
break;
default:
if (isnum(c)){
valor = 10*valor + (c-48); pr=1;
} else { p=0; }
break;
}
break;
case 20:
if (c==10) pr=1;
p=0;
break;
default:
p=0; pr=1;
break;
}
} while (pr==0);
}
// Al comenzar el programa inicializa el puerto serie.
void setup(){
setupserial();
}
// El bucle principal.
void loop(){
// Es necesario llamar a esta funciona cada poco para recibir datos.
serialstuff();
}

2012/01/27 - Corregido BUG: Cambiando un writeln por write en la funcion enviapares

viernes, 13 de enero de 2012

¿Merece la pena comprar el panel de radios Saitek?

Los paneles de Saitek estan muy bien (dejando de lado alguna decision de diseño que podriamos discutir.), y son practicamente la unica alternativa comercial, Plug&Play que hay para el simulador de vuelo.
Si tu eres como yo de los que te gusta construirte las cosas, es posible que, como yo, hayas pensado que son carisimos, y que podias hacerte uno por la mitad de precio.
Pues vamos a echar unas cuentas y descubri que, en realidad son regalados de precio, y que hacerte tu algo igual te costaria el doble.
Por supuesto el hacertelo tu tiene la ventaje de poder personalizarlo a gusto o hacerlos mas realistas, o mas comodos de manejar.
Empecemos:
  • 46.25€ incluyendo el descuento de facebook, es lo que te costaria la caratula en policarbonato, cortada en laser, pintada y serigrafiada en hispapanels.
  • 20.00€ Una placa de arduino para controlarlo todo.
  • 42,64€ Dos encoder rotativos de doble eje.
  • 35,18€ Dos mandos concentricos para los encoder
  • 58,95€ Los 4 chips y 20 displays Led de 7 Segmentos rojos de 0.6" de altura
  • 18,67€ En una placa de C.I. botones y algun componente mas.
Total:
  • 221,7€
Es decir justo el doble que en amazon(aunque hay que admitir que no tienen muy claro lo que venden) Y a esto hay que añadirle la programacion del arduino y el programa del Ordenador, y que no tienes soportes, tornillos guapos, ni caja trasera y el tiempo que has tardado en hacerlo.

Para estos calculos he utilizado los precios de la tienda de componentes online Mouser, que esta bastante bien de precio. si alguien esta interesado le puedo pasar el "carrito de la compra" donde desgloso los precios de cada cosa.

Si alguien piensa que los calculos estan mal, y que saitek no puede hacerlo tan barato, hay que tener en cuenta que 90€ se van en "plasticos" y eso a saitek le sale por unos centimos.

Asi que en resumen, esta claro que merecen la pena, son una buena inversion, y ya si te salen como a mi, de segunda mano por 65€ no digamos, Je Je.

Ahora bien, si el frontal te lo hace tu a mano, con metracrilato, sierra y una impresora.
Si en lugar de displays de 7 Segmentos Led utilizas una pantalla retroiluminada de 20x2
Y en lugar de los encoder dobles, utilizas encoders sencillos con interruptor
La cosa cambia mucho, y teniendo la misma funcionalidad y un aspecto muy similar, rondariamos los 50€

miércoles, 11 de enero de 2012

Primer intento de simular el Garmin GNS530

Actualmente las soluciones que hay para incorporar un GPS en la cabina de simulacion, pasan por utilizar un gauge de pago solo para FSX y un pequeño dispositivo que no es mas que un 2º monitor que se conecta a una de las escasas salidas de video del equipo.
Ah!, y cuesta un ojo de la cara y parte del otro.
La alternativa que estoy pensando es mucho mas economica (calculo que no llegue a 100€) y no utiliza salidas de video, de echo se conecta por ethernet. el pero esta en que utiliza mucho micro.
He puesto en youtube un video con las primeras pruebas:

martes, 3 de enero de 2012

La llave de los magnetos.

Uno de mis objetivos es tener el equivalente a todos los controles de saitek, pero solucionando sus deficiencias, y una de ellas es que el mando de los magnetos y el arranque es un mando rotativo, no tiene llave.
Asi que tras algun tiempo pensando como hacerlo, llegue al estado actual, que sin ser perfecto, esta mucho mejor que la opcion de saitek, y aqui describo como lo hice:

Lo que se ve por fuera es una simple cerradura de taquilla, que puedes encontrar en cualquier ferreteria, el primer resultado de google nos muestra varios modelos.

El unico detalle a tener en cuenta es que al final de la llave, tenga un tornillo que sujete la pieza metalica que hace el cierre.

La parte electrica es un simple conmutador rotativo de 1 circuito, 12 posiciones, al que se ha limitado sus movimientos a 5 posiciones.

Si miramos por dentro vemos que he doblado la pieza metalica para que no tropieze con nada, y he cambiado el tornillo que la sujeta por un trozo de varilla roscada con una tuerca, que sujeta igualmente la cerradura, y se prolonga hacia atras.

En un trozo de tubo he roscado cuatro tornillos que sujetan por un lado el palo del conmutador y por otro el trozo de varilla roscada, de manera que cuando giramos la llave, giramos el conmutador. con una borna electrica grande hubiesemos conseguido el mismo resultado, pero no la tenia a mano.

Solo hay que tener cuidado de ajustar para que la posicion en la que la llave se puede meter y sacar coincida con la posicion OFF del conmutador.


Unos trozos de madera y metracrilato se encargan de sujetar el cuerpo del conmutador e impedir que este gire cuando lo hace la llave.

Entre las mejoras posibles esta en idear algo que haga que el conmutador no se mantenga en start y vuelva a la posicion both solo, como en el arranque de los coches, pero hay que mejorar las piezas que soportan el conmutador y hacer ese mas suave, pues las pruebas que hice, estaba demasiado duro y no obtenia un buen resultado.

lunes, 2 de enero de 2012

Video de las Agujas en Funcionamiento

Estaba yo aburrido y me decidi a grabar con el movil un video cutre de como estan funcionandome los instrumentos de vuelo, asi que aqui esta: