lunes, 23 de diciembre de 2013

Jeppesen FS-200 - Descripcion Exterior

El panel

 El panel es completamente metalico, tiene unas medidas de 28.5x19.5x21.5cm, cuatro patas de goma en la parte de abajo, y un unico cable asomando por la parte de atras.
En el frontal estan los mandos, no tiene ninguna luz o indicacion, y unicamente, se ve casi de casualidad, en la ranura que queda entre el mando de las ruedas y el panel, un led de color rojo que indica que la alimentacion esta conectada. (en la foto junto al texto de UP)

Tiene un total de 5 mandos rotativos simples, y un mando doble, todos a encoders (giran sin fin).
Tiene 3 potenciometros deslizantes para las funciones de Gas, Paso y Mezcla de combustible.
Tiene una palanca de 2 posiciones para las Ruedas, y una de 3 posiciones (normal, despeguar, aterrizar) para los Flaps.
Tiene 2 pulsadores dobles (interruptores tipo rocket momentaneos) uno para el trim y otro para la altura del piloto automatico.
El resto se divide entre pulsadores (momentaneos) y pulsadores de interruptor(2 posiciones) en estos ultimos la diferencia es de apenas unos mm. entre cuando estan activados y cuando no.

El cable

 En el diseño del panel han optado por una solucion limpia pero poco practica para mi gusto, en lugar de tener conectores para el puerto serie, el del joke (y pedales) y la fuente de alimentacion, tiene un solo cable, bastante largo (aprox. 3m) que hacia la mitad se divide en tres, el cable serie de 9 pines, el cable para la conexion del Joke y pedales, y la hembra mini-din para la fuente de alimentacion.

La fuente de alimentacion

La fuente de alimentacion que me vino no era la original, al menos no era igual a la otra que vi por internet (traia el logo de MDM) supongo que es por que la mia es de 220V 50Hz.

Tiene un conector mini-din de tres patillas, positivo, negativo y tierra, como mi trafo tiene enchufe europeo sin tierra, esta ultima esta sin conectar, asi como la carcasa del conector.
La fuente de alimentacion es de 9V DC, sin regular (en vacio da 12V) y de 0,2A (0,1 en la version americana) un valor pequeño, ya que el panel apenas tiene grandes consumidores mas alla del led escondido.
Cumpliendo con los requisitos de FCC cerca del transformador hay dos ferritas dentro de un tubo termoretractil, curiosamente no cumple lo de que el cable tienen que ser apantallado.

Jeppesen FS-200 - Haciendo de arqueologo por internet

En internet hay realmente poca informacion acerca de este panel, hay que tener en cuenta que en la epoca que se vendian, internet estaba empezando.
Hay un documento escrito por un piloto y formador profesional acerca de la falta de soporte por parte de jeppesen, el documento original esta perdido, pero en las webs recopilatorias de pdfs esta disponible,   de este documento se sacan dos cosas, un esquema del conexionado, y la pegatina del transformador, donde se indica el patillaje, y que contiene el logo "MDM"
Hay un par de foros, donde la gente modifica ampliamente el panel para usarlo con el flight simulator, ahora solo encuentro una:
- http://www.flightsim.com/vbfs/showthread.php?181630-Making-an-old-Jeppesen-FS-200-Panel-usable-for-FS2004
Como hay disponible una copia de casi toda internet en cualquier fecha pasada, es posible ver la web de jeppesen en el año 96, donde vemos que la venden por 700$
https://web.archive.org/web/20010418040537/http://www.jeppesen.com/prodserv/flitepro/equipment.phtml
En este pdf, vemos un anuncio donde es un poco mas caro:
http://ww1.jeppesen.com/download/aopa/sep-aopa.pdf

 
y desde alli podemos bajarnos el manual de instrucciones de Flite Pro, donde entre otras cosas describen las conexiones del panel:
 https://web.archive.org/web/20010418040109/http://www.jeppesen.com/prodserv/flitepro/download.phtml
 https://web.archive.org/web/20010418040109/http://www.jeppesen.com/download/fliteprohelp.pdf


En las FAQ, informan ademas de que pulsando las teclas de ACT<->STBY del NAV1 y ADF es posible resetear el panel.

Lamentablemente no he podido conseguir el archivo con la demo del FLITE 6.0, que seguramente me hubiera permitido comprobar el correcto funcionamiento del panel.
Si investigamos en la web de FCC acerca de su codigo de homologacion, encontramos poca informacion,  principalmente que es un acesorio de ordenador, y que esta fabricada por una empresa llamada MDM.

https://apps.fcc.gov/eas/GetEas731Report.do?applicationId=79336&fcc_id=JWJM2JDBM1C
Su certificado FCC:
https://apps.fcc.gov/oetcf/eas/reports/Eas731GrantForm.cfm?mode=COPY&RequestTimeout=500&application_id=79336&fcc_id=JWJM2JDBM1C
Buscando informacion de esta empresa, aqui:
http://www.trademarkia.com/mdm-74175438.html
Vemos que el logotipo que tenian es el mismo que aparece en la fuente de alimentacion.
Investigando la relacion entre Jeppesen y MDM, resulta que en esas fechas, Jeppesen compro a una pequeña empresa llamada MDM que se dedicaba a la realizacion de paneles de simulador
http://www.aopa.org/News-and-Video/All-News/1995/September/1/Pilot-Briefing-%283%29.aspx
, y buscando informacion sobre MDM, lo unico que encontramos es que fabricaba un panel llamado FS-100, que es virtualmente identico al FS-200 en los mandos, aunque montado en una caja de madera.
Hasta tal punto es el mismo, que su codigo de aprobacion FCC es el mismo.

Aqui una pequeña descripcion:
http://www.aopa.org/News-and-Video/All-News/1993/November/1/Computers-in-Aviation
En este documento:
http://www.gpo.gov/fdsys/pkg/GAOREPORTS-RCED-99-143/html/GAOREPORTS-RCED-99-143.htm
Discuten acerca de este informe:
http://www.aviation.illinois.edu/avimain/papers/research/pub_pdfs/techreports/99-06.pdf
Que describe las ventajas de utilizar un PC ( con un panel FS-100) para el entrenamiento de pilotos
Y esta es toda la informacion que he podido encontrar en internet sobre este panel.

domingo, 22 de diciembre de 2013

Ya (casi) tengo un simulador Aprobado FAA - el Panel Jeppesen FS-200

Desde hace mucho tiempo llevo siguiendo este panel, en internet hay muy poca informacion sobre el, pero me parecio interesante, asi que tras casi un año de estar atento a ebay, por fin encontre uno a un precio asequible (45€ con envio a españa).
Cuando me llego, ¡Sorpresa!, es pequeño, no, es enano, mi idea era integrarlo con el simulador de C-172 que estoy haciendo, y no sabia si seria demasiado grande, pero que va, si lo pienso un poco, todas las fotos que vi eran de cuando los monitores eran de 14", y claro frente al de 21" que tengo ahora, parece un juguete.

La segunda sorpresa fue, que no tiene certificacion FAA, tras investigar un poco, resulta que solo el panel FS-200AC junto a los pedales de PFC y el Yoke de PFC puede tener certificacion FAA, pero el FS-200 que el el "Basic Panel" no la tiene.
El par de menciones que hay en internet sobre el, se dedican a "canibalizarlo" y convertirlo en un mero teclado o joystick usb, mi idea es investigar un poco en como esta construido, y crear algo que permita usarlo con FS X y con X-Plane, Pero quiero hacer algo "no-destructivo", mi primera opcion es un programa en python que lea los datos serie y los pase al servidor IOCP, como hice con el arduino, otra opcion es instalar un arduino dentro del panel.
Con el tiempo, pretendo escribir una serie de articulos describiendo mis investigaciones con este peculiar aparato.

viernes, 15 de marzo de 2013

Seguimos con los Coches.

Aparentemente esta entrada es casi identica a la anterior, pero por dentro tiene mucha mas miga.

Existe un software para simuladores (aviones o coches) disponible en www.x-sim.de y mientras lo investigaba para un futuro simulador con movimiento, descubri que tambien permite realizar paneles de instrumentos, sobre todo orientado a los simuladores de coches, asi que decidi actualizar el display.

Este software tiene varias ventajas, por un lado puede utilizarse con varios simuladores, simplemente configurando el perfil adecuado, por otro, tiene un modulo de comunicacion serie, por lo que eliminamos varias capas intermedias, recordemos que antes teniamos:
simulador->servidor iocp->SIOC->script en python->arduino 
y ahora se reduce a:
simulador->software x-sim->arduino

Desde aqui podeis bajaros el programa para arduino:
https://www.dropbox.com/s/nwc9pek3ynyj2qw/xsim_rpm5.ino

Esta ampliamente inspirado en el que aparece en este post: http://www.x-sim.de/forum/viewtopic.php?f=40&t=155

Tiene dos mejoras, por un lado la gestion de las RPM maximas y minimas, y por otro lado tiene una conexion serie mas fiable, que soporta sin problemas interrupciones y desconexiones del puerto serie.

Funcionamiento:

En el display numerico aparecen:
Indicador de Bandera (no funciona, deberia aparecer cuando hay bandera amarilla, pero el xsim no lo exporta).
La marcha actual.
La velocidad en km/h.

Los led se encienden progresivamente y se ponen todos rojos con brillo al alcanzar las maximas rpm, el valor de minimas rpm (cuando se enciende el primer led) y maximas (cuando se ponen en rojo) es configurable con los botones, este es su funcionamiento:
  • Boton 1 - Establece el modo F1, rpm minimas = 5000, rpm maximas = 18500
  • Boton 2 - Establece el modo GT, rpm minimas = 0, rpm maximas = 9000
  • Boton 3 - Recupera de la eeprom los valores de rpm personalizados (modo CU).
  • Boton 4 - Guarda en la eeprom los valores de rpm personalizados, al arrancar el arduino lee esto valores y los utiliza, asi para que siempre arranque en modo F1 pulsamos el boton 1, luego el 4 y confirmamos que queremos guardarlos pulsando otra vez el 1.
  • Boton 5 - decrementa el valor de rpm minimas
  • Boton 6 - incrementa el valor de rpm minimas
  • Boton 7 - decrementa el valor de rpm maximas
  • Boton 8 - incrementa el valor de rpm maximas

 Ademas de la parte visible del programa, las salidas 5 y 6 estan configuradas como servos de modelismo, de cara a experimentar con la simulacion de movimiento de 2DOF.

Configuracion de x-sim.de

El archivo de configuracion se puede bajar de aqui:
https://www.dropbox.com/s/ldc191rbhn2glzn/display.rn2

Basicamente el truco esta en configurar adecuadamente la parte matematica, asi como para el valor de velocidad y rpm utilizamos 16bits y un valor siempre positivo, hay que poner el valor maximo de esa señal en 65535, y ajustar el offset a la izquierda del todo.
Para las marchas, utilizamos 8bits, y el valor puede ser negativo, asi que ajustamos a un valor maximo de 128, simetrico, y el offset lo dejamos a 0.

La cadena que envia, usando el modulo SIO, cada 20ms, (puede ser menos), seria:
R~01~~04~S~02~G~03~~05~~06~~07~
Siendo 01 las RPM, 02 la velocidad, 03 la marcha, 04 la bandera, 05 reservado para un futuro force feedback del pedal de freno (8bits), y 06 y 07 (8bits) las posiciones de los 2 servos para la simulacion de movimiento de la cabina.

Como veis, tiene alguna cosa añadida que no esta un implementada, pero para tener un display delante del volante esta perfecto

EDITADO: Nueva version del software, los led funcionan diferente segun sea F1 o GT. Aqui: https://www.dropbox.com/s/uwkqgulp2bohj7a/xsim_rpm6.ino



viernes, 27 de abril de 2012

Need for Speed

Bueno, despues de un tiempo vuelvo a la carga, por un lado con un modulo TM1638 que me quema en las manos, y por otro con la pregunta que me hicieron de si era posible aumentar la velocidad de comunicacion entre el arduino y el script en python.
Empezemos por lo segundo, si, se puede, solo hay que en arduino modificar la primera linea de la funcion setupserial() y cambiar el 9600 por 115200, por ejemplo, y despues en el script en python cambiar la linea:
se = serial.Serial(11)
por
se = serial.Serial(11,115200)
(11 es por que a mi el arduino me aparece como COM12 y es una menos)


El TM1638 es un modulo que venden entre otros sitios en dealextreme, lo hay con los numeros en verde y en rojo, ademas de eso tiene 8 led bicolores (rojo+verde y en teoria tambien naranja, aunque a mi el naranja no se me ve muy naranja) control de brillo y 8 pulsadores, y se pueden conectar en cadena hasta 6, funciona a 5 voltios, utiliza 2 lineas de I/O + una por modulo, y existe una libreria para controlarlo con arduino.

Y por otro lado esta rfactor, un simulador de carreras para windows que... bueno.... es perfecto, o casi.

En opencockpits hay un plugins, que permite que rfactor sea un cliente IOCP, asi que basta con ejecutar SIOC, y ya tenemos el enlace rfactor->arduino.

Y algunas lineas de codigo mas tarde tenemos algunas vueltas al circuito de almeria, por si un dia de estos me doy unas vueltas en un porsche. jeje

La parte tecnica:

Con esto he llegado al limite de comunicaciones con el arduino, he tenido que reducir muchisimo el trasvase de datos dividiendo por  10000 las rpm.
No se si esto es culpa del arduino o es culpa del plugin de rfactor, pero es algo a tener en cuenta, si necesitamos datos a mucha velocidad.
En el codigo hay algunas cosas que sobra de pruebas, pero al menos funciona:

El script de python es el de siempre (salvo por la velocidad del puerto), no lo voy a poner.

Estas son las lineas que descomente en el archivo rf_IOPC.ini de configuracion del plugin:
var=0101,RPM ; Rev x Min x100
var=0102,SPEED ; Speed  x100
var=0105,GEAR ; Gear -1=reverse, 0=neutral, 1+=forward gears
var=0110,LAP_START; time this lap was started x1000

Este es el programa que ejecuto en SIOC:
Var 0001, name rpm, Value 0
Var 0002, name speed, Value 0
Var 0003, name gearn, Value 0
Var 0004, name lapt, Value 0

Var 0101, name rf_rpm
{
  &rpm = &rf_rpm / 10000
}

Var 0102, name rf_speed
{
  &speed = &rf_speed / 100
}
Var 0110, name rf_lap_time
{
  &lapt = &rf_lap_time / 100
}

Var 0105, name rf_gear
{
  IF &rf_gear = -1      
  {
    &gearn = 1
  }
  ELSE
  {
    &gearn = 0
  }
}

Y por ultimo este es el programa que ejecuto en el arduino:


#include <TM1638.h>
// Variables IOCP a utilizar:
#define RF_rpm 1
#define RF_speed 2
#define RF_gearn 3
#define RF_lap_start 4
#define RF_gear 105
// variables globales necesarias para la decodificacion.
int p=0; // el paso en la decodificacion.
int dat,valor;

TM1638 module(8, 9, 10);
int rpm,spd,gea,gean,lapt;
int mode=0;

#define v0 1

#define v1 13
#define v2 26
#define v3 39
#define v4 52

#define v5 60
#define v6 68
#define v7 76

#define v8 84

#define rpm_step 10.5
void updaterpm(){
  if (rpm >= v8) {
    module.setupDisplay(true,7);
  } else {
    module.setupDisplay(true,2);
  }
  // Los verdes
  if (rpm < v0) {
    module.setLEDs(0x0000); 
  }
  else if ( rpm < v1 ) {
    module.setLEDs(0x0100); 
  }
  else if ( rpm < v2 ) {
    module.setLEDs(0x0300); 
  }
  else if ( rpm < v3 ) {
    module.setLEDs(0x0700); 
  }
  else if ( rpm < v4 ) {
    module.setLEDs(0x0F00); 
  }
  else if ( rpm < v5 ) {
    module.setLEDs(0x1F00); 
    // Los naranjas
  }
  else if ( rpm < v6 ) {
    module.setLEDs(0x3F20); 
  }
  else if ( rpm < v7 ) {
    module.setLEDs(0x7F60); 
  }
  else if ( rpm < v8 ) {
    module.setLEDs(0xFFE0); 
    // Todos rojos
  }
  else {
    module.setLEDs(0x00FF); 
  }
}
void updatespeed(){
  module.setDisplayToDecNumber(spd,0);
}
void updategear(){
  if (gean == 1 ) {
    module.setDisplayToString("r",0,0);
  }
  else if (gea == 0) {
    module.setDisplayToString("n",0,0);
  }
  else{
    module.setDisplayDigit(gea,0,0);
  }
}
void updatetime(){
  module.setDisplayToDecNumber(lapt,0);
}


void setupserial(void){
  Serial.begin(115200);
  Serial.print("Arn.Inicio:");
  Serial.print(RF_rpm);
  Serial.print(":");
  Serial.print(RF_speed);
  Serial.print(":");
  Serial.print(RF_gear);
  Serial.print(":");
  Serial.print(RF_gearn);
  Serial.print(":");
  Serial.print(RF_lap_start);
  Serial.println(":");
}


int isnum(int n){
  if ((n>47) && (n<58)) return 1;
  else return 0;
}

void enviapares(int dat, int valor){
  Serial.print("Arn.Resp:");
  Serial.print(dat);
  Serial.print("=");
  Serial.print(valor);
  Serial.println(":");
}

// Proceso de las comunicaciones serie
void procesapares(int dat, int valor){
  if (dat == RF_rpm){
    rpm=valor;
    if (mode == 0){
      updaterpm();
    }
  }
  if (dat == RF_speed){
    spd=valor;
    if (mode == 0){
      updatespeed();
    }
  }
  if (dat == RF_gear){
    gea=valor;
    if (mode == 0){
      updategear();
    }
  }
  if (dat == RF_gearn){
    gean=valor;
    if (mode == 0){
      updategear();
    }
  }
  if (dat == RF_lap_start){
    lapt=valor;
    if (mode == 1){
      updatetime();
    }
  }
}

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:  // VALOR ESPECIAL : primera Bifurcacion de respuesta
      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);
}


void setup(){
  setupserial();
  module.setupDisplay(true,7);
  module.setDisplayToString("Init");
  delay(1000);
  module.setupDisplay(true,2);
  module.setDisplayToString("done");
  delay(1000);
  module.clearDisplay();
}


void loop(){  // aqui solo miramos si cambio una tecla y actualizamos el lcd.
  if ((mode != 0) && (module.getButtons() == 0b00000001)) {
    module.setDisplayToString("        ");
    updategear();
    updatespeed();
    mode = 0 ;
  }
  if ((mode !=1) && (module.getButtons() == 0b10000000)) {
    module.setDisplayToString("        ");
    updatetime();
    mode = 1 ; 
  }
  // La parte de comunicaciones
  serialstuff();
}







martes, 6 de marzo de 2012

Get Serious.

Aprobechando que estoy casi acabando la maquina de CNC, y que ya me llego el X-Plane 10, he decidido dejar de hacer pruebas de concepto y empezar a ponerme serio con esto de la cabina.

Asi que manos a la masa y esto es lo que tengo ahora encima de la mesa:

Esta basado en un Cessna 172 "moderno", tendra alguna pequeña diferencia, p.e. el indicador de revoluciones esta en el lugar del ADF, pero es que si no chocaba con el Yoke de Saitek, esta por ver si alargo el eje del mismo que es algo corto, o lo dejo asi, depende de si golpeo mucho con los dedos en el panel al bajar :-)

La idea es muy sencilla, un marco de madera con la forma del panel:

Y varias piezas de madera pintadas y lijadas, mas o menos con la forma del original:

Lo siguiente que voy a hacer es encargar las piezas que me faltan y los marcos para sustituir las pegatinas de la columna de radio por unos que funcionen :-)
Luego el relog, que por fin consegui una mecanica pequeña.
Y despues con la maquina de CNC a crear como loco instrumentos de aguja.

domingo, 26 de febrero de 2012

Indicador de DME: Otro instrumento con Arduino/python/iocp

Tenia por casa un circuito impreso con un panel LCD controlado por un chip Holtek HT1621B, y unos botones.

Me puse a investigar y aqui: http://code.google.com/p/wirejungle/source/browse/trunk/?r=17#trunk%2Flibraries%2FHT1621 que pertenece a http://wirejungle.wordpress.com/about/ encontre cierto codigo que me permitira controlar dicho chip.

Se que en la foto no parece mucho, pero con un poco de imaginacion y la caratula adecuada....

Asi que tras varios cambios para adaptar su codigo a mi placa, un buen rato investigando como estaba cableado el chip al LCD, y aprobechando el sitema explicado en anteriores post de comunicar arduino con X-Plane, me cree un pequeño pero funcional indicador de DME del NAV1, 2 y ADF1.

No es que tenga mucha utilidad para el resto de la gente, pero si tiene algun LCD con el HT1621B, o tienes la pantalla de un analizador de redes SACI como el que yo desguaze,
he dejado en dropbox un zip con el codigo de arduino y demas.