domingo, 7 de abril de 2013

TRANSLATIONAL HAND CONTROLLER FOR ORBITER SPACE FLIGHT SIMULATOR



Mi primer proyecto para el Orbiter Space Flight Simulator consiste en un instrumento real para el guiado  traslacional de las naves espaciales.
La idea fue hacer un control real como los que usan en las naves espaciales y conseguir que el manejo fuera lo más intuitivo y real posible.


Control traslacional del módulo lunar.

Control traslacional del transbordador espacial.


Control traslacional del transbordador espacial en la parte trasera de la cabina.

Control traslacional del módulo lunar.



El Control traslacional (THC) es un dispositivo de control que permite realizar en la nave espacial movimientos rectilineos a lo largo de los ejes coordenados x,y,z.






Para conseguir el movimiento en los tres ejes he utilizado un joystick normal de cuatro interruptores al que he añadido guías con el fin de proporcionar la tercera dimensión.

Joystick de arcade.



 
Joystick con las guías.



Al comienzo y final de las guías he colocado dos interruptores de final de carrera que sumados a los del joystick dan un total de seis que utilizo para detectar los movimientos de traslación: arriba, abajo, izquierda, derecha, adelante y atrás.



Interruptor final de carrera.


Joystick con las guías e interruptores


Para introducir los movimientos al simulador que realizo con el THC utilizo el circuito de un teclado desarmado. Las teclas involucradas en el movimiento de la nave son los números del keypad: 6 y 8 para adelante y atrás, 1 y 3 para izquierda y derecha, 2 y 8 para arriba y abajo y el slash '/ ' para el cambio de traslación a rotación y viceversa.

Al desarmar el teclado he identificado en la matriz formada por dos láminas de plástico transparente los contactos de las teclas del keypad que van al circuito y he señalado en éste las pistas correspondientes, luego he soldado cables de colores a las pistas señaladas.



Cables soldados a las pistas.



El funcionamiento del THC es muy sencillo y consiste en accionar las teclas del keypad mediante los interruptores del joystick y final de carrera de las guías.



Esquema del THC sencillo.


Control traslacional terminado.

Una característica añadida al THC es la posibilidad de cambiar de punto de referencia dependiendo de dónde se encuentra el puerto de atraque (dock) en la nave.
Los movimientos de traslación del Orbiter están referenciados al punto de vista de la posición del piloto (commander position).



Con estas palabras quiero decir que si impulsamos la nave hacia delante, lo va hacer en la dirección que apunta la ventanilla delantera de la nave o visión frontal del piloto, como en el caso del Deltaglider o Csm del Apollo, etc.
Cuando queremos atracar en un puerto, en algunas naves tenemos problemas de referencia, en e caso del Deltaglider o csm no hay ninguno porque el puerto de atraque está en la punta o cono frontal, pero ¿y si queremos atracar con el Space Shuttle, el Lm del Apollo o los landers de la Deepstar?, en estos casos la visión del comandante no es útil debido a que los puertos de atraque están en otra posición y el MFD de docking hace referencia a estos puertos.



Lander de la Deepstar.


Para solucionarlo he diseñado con un conjunto de conmutadores la capacidad del THC de cambiar de punto de referencia dependiendo de dónde se encuentra el puerto de atraque, así que he implantado tres tipos: Commander, Lm y Shuttle.

-Commander:
 Hace referencia a la visión frontal del piloto, muy útil si el puerto está en la punta delantera de la nave como en el Csm del Apollo o Deltaglider.

Csm del Apollo.



-Lm:
 Hace referencia al puerto que está en la cabeza de la nave, como en el lander de la Deepstar o el módulo lunar Lm.

Lm.


-Shuttle:
Hace referencia al puerto de atraque que está en la bahía de carga del transbordador espacial. La maniobra para atracar la vemos a través de las ventanillas que están en la cabecera de la cabina.

 
Ventanillas superiores del shuttle, se ve la Iss.




Conmutadores para elegir modo.

Cableado de los conmutadores.

El THC completo.


El Orbiter con el control rotacional y traslacional.





-ESQUEMAS:

Esquema 1/2

Esquema 2/2









Espero que con el THC combinado con un joystick para el movimiento rotacional, los usuarios del Orbiter disfruten de un manejo un poco más realista de una nave espacial y se sientan un poquito más astronautas.
También espero que se use para la construcción de cabinas reales porque permite ser empotrado en un panel de mandos.

viernes, 6 de enero de 2012

RGB la combinación perfecta




Con esta entrada expongo un circuito típico con el Arduino que es la combinación de los tres colores rojo, verde y azul para formar cualquier color.
Coloqué en tres salidas analógicas (PWM) los leds de alto brillo con luz difusa, el control del brillo de cada uno lo realizo mediante un programa en el computador hecho en Robotbasic con tres controles tipo "slider".
El Arduino está conectado al computador vía puerto serie y recibe los tres datos que van desde 0 hasta 255 y los procesa para generar PWM y conseguir el brillo de cada led.
Este proyecto tiene dos dificultades, la primera es el uso del puerto serie en el Robotbasic y la forma de hacerlo es así:

puerto = 1
setcommport puerto,br9600,8,pNone,sbOne,fcNone //configuración puerto serie
serout salida //envía de datos al puerto
br9600, pNone, sbOne y fcNone son constantes definidas en el Robotbasic.

La segunda dificultad es que el puerto serie envía caracteres y el Arduino tiene que transformarlos en números para poder usarlos en la generación de PWM de cada color, esto lo consigo mediante el siguiente código:

void loop() {
char ch = Serial.read();
switch(ch) {
case '0'...'9':
dato = dato * 10 + ch - '0';
break;
}
}

Si se envía en serie los caracteres 2 y 3 el Arduino recibe cada uno y lo introduce en la variable ch y lo transforma en número almacenándolo en la variable dato dando como resultado el número 23.




La generación de PWM es muy sencilla y se hace eligiendo un pin de los seis que tiene el Arduino para este fin y el código a usar es:

analogWrite(6,dato); // salida de PWM por el pin 6, El dato puede variar de 0 a 255.

Para ajustar los colores uso tres resistencias variables y la forma de hacerlo es poner una hoja en blanco como pantalla y los leds deben iluminar esta, con el programa en robotbasic poner los tres colores a 255 que corresponde al blanco, ajustar las resistencias hasta conseguir el color blanco.






Un añadido al proyecto es el uso de un display LCD 16x2 conectado al Arduino y el código usado es el siguiente:

#include < LiquidCrystal.h >
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
lcd.begin(16, 2);
lcd.print("Verde: Azul: Rojo:");

El proyecto tiene en total dos programas uno para el Arduino y otro para el computador en Robotbasic.

Para el Arduino es el siguiente:

//Sergio Curci 2012
#include < LiquidCrystal.h > //librería del LCD

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int dato;
void setup() {
Serial.begin(9600); //Configuración del puerto serie
lcd.begin(16, 2);

lcd.print("Verde: Azul: Rojo:");
}
void imprimir(int valor,int posicion){ //Rutina para el LCD
if (valor < 10){
lcd.setCursor(posicion, 1);
lcd.print(valor);
lcd.setCursor(posicion-1, 1);
lcd.print(0);
lcd.setCursor(posicion-2, 1);
lcd.print(0);

}
if ((valor >=10 ) & (valor < 99)){
lcd.setCursor(posicion-1, 1);
lcd.print(valor);
lcd.setCursor(posicion-2, 1);
lcd.print(0);
}
if ((valor >=99 ) & (valor < 256)){
lcd.setCursor(posicion-2, 1);
lcd.print(valor);
}
}

void loop() { //Programa principal
if ( Serial.available()) {
char ch = Serial.read(); //Leo el puerto serie

switch(ch) {
case '0'...'9':
dato = dato * 10 + ch - '0'; //Transformo a número
break;
case 'v':
// Si se recibe el caracter v envio al pin 9 que corresponde al verde
imprimir(dato,2);
analogWrite(9,dato);
dato = 0;
break;
case 'r': // Si se recibe el caracter r envio al pin 10 que corresponde al rojo
imprimir(dato,17);
analogWrite(10,dato);
dato = 0;
break;
case 'a':
// Si se recibe el caracter a envio al pin 6 que corresponde al azul
imprimir(dato,10);
analogWrite(6,dato);
dato = 0;
break;

}
}

}



Para el Robotbasic:

//Sergio Curci 2012
Setup:
ScrSetMetrics 4,4,555,400,0 //Configuración ventana del programa
clearscr (7)
xyText 5,5,"RGB control","comics",35,fs_Bold,,7
rectangleWH 420,240,100,100,0,7
setcommport 9,br9600,8,pNone,sbOne,fcNone //Configuración puerto serie (com9 en mi caso)
dim colorcaracter[3]
addslider "Verde",100,100,300,0,255 //Configuración sliders
addslider "Rojo",100,150,300,0,255
addslider "Azul",100,200,300,0,255
addedit "salidaverde",420,100,100,35 //Configuración salida
addedit "salidarojo",420,150,100,35
addedit "salidaazul",420,200,100,35
xyText 30,110,"Verde","Time New Roman",10,fs_Bold,,7
xyText 30,160,"Rojo","Time New Roman",10,fs_Bold,,7
xyText 30,210,"Azul","Time New Roman",10,fs_Bold,,7
Main:

while true
valor_verde = GetSliderPos("Verde") //Obtengo del slider el valor para el verde
valor_rojo = Getsliderpos("Rojo")
//Obtengo del slider el valor para el rojo
valor_azul = getsliderpos("Azul") //Obtengo del slider el valor para el azul
total = RGB(valor_rojo,valor_verde,valor_azul) //El color para el rectángulo
gosub salidatext
colorcaracter[0] = ToString(valor_verde)+"v" //le pongo al final de la cadena la v
colorcaracter[1] = tostring(valor_rojo)+"r"
//le pongo al final de la cadena la r
colorcaracter[2] = tostring(valor_azul)+"a" //le pongo al final de la cadena la a
gosub salidaserie

wend
end

salidaserie: //Envío por el puerto serie los tres datos rojo, verde y azul
for i=0 to 2
serout colorcaracter[i]
next i
return

salidatext:
rectangleWH 420,240,100,100,0,total //Pinto rectangulo con el color generado
setedit "salidaverde",valor_verde //Salida de los tres datos
setedit "salidarojo",valor_rojo
setedit "salidaazul",valor_azul
return



El esquema:


El max 232 con sus condensadores.


El puerto serie.


















domingo, 1 de enero de 2012

Mi intención

Sí. Ya se que estáis pensando; hay muchas páginas y blogs dedicados a la electrónica y robótica en general. No os quito la razón , pero mi intención con este blog es exponer con ejemplos básicos y sencillos mis trabajos con el Arduino, la electrónica, programación y proyectos para el Orbiter Space Flight Simulator. El blog será orientado a personas que no poseen conocimientos avanzados en electrónica y programación como en mi caso.
Un punto que he observado en otros sitios es que la información está muy dispersa, no muy bien explicada o complicada y no se centra en explicar simples conceptos con una programación sencilla.
Pienso utilizar como herramienta adicional Robotbasic y usarlo para realizar comunicaciones con el Arduino y crear proyectos curiosos y simples.
Espero que os guste y sea útil a todos aquellos entusiastas en la robótica y el Orbiter y poder agarrar con ganas el camino de introducirse en este mundo apasionante y se preguntan ¿Cómo hacerlo?.