martes, 24 de diciembre de 2013

Jeppesen FS-200 - Descripcion Interior

Continuamos la descripcion del panel, esta vez mirando entre las tripas:
Si abrimos el panel, nos encontramos que esta vacio al 99%, unicamente tiene una placa de circuito impreso sobre la que van montados todos los elementos, y una conexion de la pantalla del cable a la tierra del panel.

Sorprende que no hayan incorporado la fuente de alimentacion en el interior del panel.

Una vez desmontados los enbellecedores de los encoders y potenciometros, quitamos el conector del cable, y los 5 tornillos que sujetan la PCB al frontal y nos encontramos:
En la parte de abajo del PCB se puede observar el logo de MDM, las fechas 1991-1993 y el texto "MADE IN USA" (en la caja pone Made in Mexico) lo que me sugiere que es la misma placa que el FS-100 sin apenas modificacion.

El cableado 

El unico cable del equipo acaba en un conector en el borde de la placa de circuito impreso, las conexiones que tiene son:
 1- Violeta, no utilizado (en la PCB esta conectado a la tierra)
 2- Naranja, al DB9 patilla 2 - Envio de datos a RX en el ordenador
 3- Rojo, al DB9 patilla 3 - Recepcion de datos de TX desde el ordenador
 4- Rosa, al DB15 patilla 11 - Eje X del 2º Joystick (habitualmente el Rudder o pedales)
 5- Amarillo, al DB15 patilla 3 - Eje X del 1º Joystick (para el joke, profundidad)
 6- Verde, al DB15 patilla 6 - Eje Y del 1º Joystick (para el joke, alabeo)
 7- Azul, al DB9 patilla 5, y al DB15, patillas 1,4,5 y 9, en la PCB se une a la patilla 8, es masa o 0V
 8- Marron, al mini-din 3, patilla de 0V (-RTN en la pegatina)
 9- No conectado
10- Gris, al mini-din 3, patilla de +9V
11- Blanco, al DB15 patilla 2 - Boton 1 del 1º Joystick
12- Negro, al DB15 patilla 7 - Boton 2 del 1º Joystick

En el conector de alimentacion, la patilla central, que deberia ser tierra, no esta conectada a nada, en cambio, lo que si estan son las tres carcasas metalicas de los tres conectores, que van conectados a la pantalla del cable, y llevados por medio de un tornillo a la tierra de la caja, curiosamente el mismo sitio al que la PCB conecta el cable violeta que no se utiliza.

La conexion al puerto serie es la tipica de 2 hilos mas masa.

En el conector de joystick, vemos que hace una cosa rara, pues cortocircuita las patillas de 5V (la 1 y la 9) con las de 0V (la 4 y la 5) aunque esto no deberia suponer ningun problema o incompatibilidad.
Ademas solo tiene 3 ejes analogicos cableados y solo 2 botones.
Eso significa que esta pensado para utilizar con los pedales de thurstmaster, que no tenian frenos diferenciales, y con la version sencilla del CH virtual pilot, que no tenia mando de gases, y solo dos botones.
Los 2 ejes adicionales del CH Virtual Pilot dejan de funcionar, y lo mismo si intentamos montar cualquier otro tipo de pedales que tenga frenos diferenciales, o jokes con mas botones, o joysticks POV.
Una decision de diseño realmente sorprendente, pues como otro dia explicare, era perfectamente posible haber llevado los 4 ejes y los 4 botones (o 16 o 8 + 2 POV) sin ninguna modificion hardware.

El porque de estas limitaciones, junto a la falta de otros elementos basicos para un panel que permitirian hacer un vuelo completo sin tocar el teclado, supongo que viene dada por la funcion del aparato, que es entrenamiento para IFR exclusivamente, cosas como el taxi o el arrancar el avion, la gestion del combustible, no importan, al fin y al cabo son las mismas que para VFR.

Los componentes electronicos

El corazon de este panel es un microcontrolador de la familia Motorola, un MC68HC705C8A al que han puesto poco interes en borrar las marcas (pero lo han intentado) este integrado tiene 8Kb de EPROM (OTP por que no tiene ventana para borrar) 300bytes de RAM, y la posibilidad de utilizar hasta 24 patillas como Entradas o salidas y 7 mas como salidas, asi como un modulo de comunicaciones serie, asumo que el codigo interno esta protegido. Tiene un cristal de cuarzo de 4Mhz.

Junto a el hay un chip ICL7660 que es un regulador de tension negativa, supongo que se utilizara para los -12V del puerto serie.

Despues nos encontramos con un convertidor A/D de 8 canales y con una resolucion de hasta 10bits, CDP68HC68A2E que se utilizara sin duda para los 3 canales analogicos del conector de joystick y los 3 internos de los 3 potenciomentros. (luego quedan 2 libres que se podian haber utilizado, p.e. para el 4º canal del joystick).
Encontramos tambien 2 chips KA324A con un total de 8 amplificadores operacionales, que seran usados tambien por la parte analogica.

Un integrado 74HTC138 que actua como decodificador de 3a8, junto con 6 integrados tipo 74HTC373, buffer triestados, serviran, para utilizando solo 12 patillas del microcontrolador, leer los 7 encoder y hasta un total de 48 pulsadores. (asumiento que los encoders. rockets y flaps utilizan 2, 20 patillas, mas 22 pulsadores, el mando de gear, los dos botones del joystick, salen 45, quedando libres 3 entradas, que podian haber utilizado para los 2 botones adicionales del joystick)
Todos los pulsadores tienen una patilla a masa, y la otra a una resistencia pullup (encapsuladas en grupos de 8 resistencias con un lado comun).
Este sistema, mas complicado pero que evita los efectos de ghosting tipicos de los teclados y otros elementos que utilizan matrices para su conexion.
Para completar estos integrados 8 resistencias en un encapsulado SIL, se encargan de hacer de Pull-up de cada entrada.
Otras dos encapsulados de resistencias estan asociados a la parte analogica, probablemente a los amplificadores operacionales.

Los encoder son de tipo cuadratura, utilizan 2 bits de los buffer triestados, y tienen unos condensadores puestos entre sus 2 patillas y masa, para reducir los rebotes del encoder.
Ademas, 4 chips tipo 4013 (MC14013B, con 2 basculas tipo D) estan asociados a los encoder, supongo que con algun tipo de sistema de interrupciones para realizar correctamente la deteccion del giro.
Cabe suponer que para los botones no se utilizan interrupciones y el microcontrolador esta realizando pooling constantemente a estas entradas.

Para la adaptacion de los niveles TTL del controlador a los niveles del puerto RS232 se utilizan una serie de resistencias, diodos y transistores de los que mas adelante sacare su esquema electrico.

Existen ademas varios chips de los que aun no he determinado su utilidad, entre ellos un CD4068BE
Tampoco esta claro de donde se consiguen los +5V estabilizados para los chips TTL, etc...

Los componentes electromecanicos

Los pulsadores se distinguen de los interruptores en que el eje que soporta el boton es de color blanco en los pulsadores y azul en los de 2 posiciones.
Estos parecen ser los del fabricante C&K, de la serie PVA, teniendo las referencias:
PVA1-OA-H?-?.?N-NONE-V2 para el pulsador
PVA1-EE-H?-?.?N-NONE-V2 para los interruptores
PE-WH para los embellecedores de plastico de los botones
Aunque estos pulsadores cuentan con 2 circuitos, solo se utiliza uno, quedando las otras dos patillas libres para cualquier uso.

En los pulsadores viene marcado el nº de lote, y el año de fabricacion, asi que mi panel es o del año 96 o posterior.

Los interruptores, son tambien de la marca C&K, probablemente de la serie 7000, algun modelo Vxx, pues tienen un chapita para soldar al PCB y dar mayor resistencia mecanica, con el acesorio J90/J91 en el caso de los flaps y gear, y J3/J37 en el caso de los trim y piloto automatico.
 
Los encoders son de la marca Bourns, probablemente de la familia ECW1J
Lo unico destacable es el sistema utilizado para el encoder doble, que mediante 2 engranajes iguales, separa cada mando a un encoder diferente.
En mi panel, el mando "gordo" no funcionaba, resulta que el engranaje va pegado al eje de giro con pegamento epoxico, y en mi caso se habia despegado, un poco de loctite y arreglado.

En una proxima entrega empezaremos intentaremos sacar el esquema electrico y tener mas detalles sobre su funcionamiento.

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.