USB HID y dispositivo de juegos

oscaroae:

Queria hacerte ( mas bien hacerles) una consulta, como modifico el descriptor para realizar un "gamepad o joystick" que sólo posea botones y no aparezcan los ejes x,y por ejemplo.
Mi idea es hacer un control con solo 32 botones y despues otro control con solo dos ó 4 ejes.

Otra cosa que no entedí es que es y para que sirve el #define USB_NUM_HID_INTERFACES 2 que mencionaste.

Les comento que arme un joystick y funcionó bien, y para los que no podian modificarle el nombre del dispositivo les cuento que busquen en la REGISTRY del Windows el string del dispositivo, lo borran y luego al enchufar nuevamente el joystick les tomará el nombre nuevo, es que el windows recuerda el id del dispositivo viejo y entonces no actualiza el nombre, aprovecho a preguntar como cambio el ID y que valores les puedo poner.

Slds.

Hola dashtronic. Primero mis disculpas, se suponía que tenía suscrito este post, pero nunca me llegó email de nada. :confused: Segundo, no sé si a estas alturas ya solucionaste, en todo caso yo probaría quitar todas las colecciones que hacen referencia a las palancas. Es decir el descriptor quedaría:

0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x09, 0x05, // USAGE (Game Pad)
0xa1, 0x01, // COLLECTION (Application)

0x05, 0x09, // USAGE_PAGE (Button)
0x19, 0x01, // USAGE_MINIMUM (Button 1) ---- 'Botones'
0x29, 0x08, // USAGE_MAXIMUM (Button 8)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x95, 0x08, // REPORT_COUNT (8)
0x75, 0x01, // REPORT_SIZE (1)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x05, 0x09, // USAGE_PAGE (Button)
0x19, 0x09, // USAGE_MINIMUM (Button 9) 'MAS botones'
0x29, 0x10, // USAGE_MAXIMUM (Button 16)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x95, 0x08, // REPORT_COUNT (8)
0x75, 0x01, // REPORT_SIZE (1)
0x81, 0x02, // INPUT (Data,Var,Abs)
0xc0 // END_COLLECTION


Yo intenté meter 16 botones en un solo Usage Page Button, pero no me sirvió. Por lo que hice fueron paquetes de a 8, (2 en este caso) Tu tendrías que hacer otros 2, recuerda que los valores están en Hexadecimal (por lo que 0x10 es = 16 o boton 16).

Respecto a los ID... creo que si no vas a vender el dispositivo, puedes usar cualquiera, de lo contrario tienes que registrar tu ID con usb.org (creo).

Por ultimo #define USB_NUM_HID_INTERFACES 2... encontré q debía definirse de esta forma, aunque no estoy seguro para que o con que fin. Creo, pero no estoy seguro porque no he tenido otro pic para probar, es para conectar 2 dispositivos con el mismo ID. Bueno, espero haber ayudado a alguien

Saludos! :)

Hola a todos,

Tengo un hardware trabajando con el PIC18F2550 y una aplicacion en vb net 2008 express, pero aun no entiendo muy bien como debo configurar este report para que trabaje segun los datos que utilizo.

Este es parte de mi main donde debo recibir una cantidad desconocida de numeros, y el pic responde ok a cada recepcion de datos. El problema esta en que el pic solamente recibe bien los 2 primeros datos [0] y [1], el resto me recibe basura.

Código:
case 170: 
                        if  ( responder_ok() == true )
                        {
                           if (llego_dato_USB() == true )
                           {
                              usb_get_packet(1, inp_data, sizeof(inp_data));
                              total_telef = inp_data[0];
                              //write_eeprom (10,total_telef);
                              if  ( responder_ok() == true )
                              {
                                 puntero = 11;
                                 salir = false;

                                    if (llego_dato_USB() == true )
                                    {
                                       usb_get_packet(1, inp_data, sizeof(inp_data));
                                       total_digitos = inp_data[0];
                                       if  ( responder_ok() == true )
                                       {
                                          if (llego_dato_USB() == true )
                                          {
                                             i = 0;
                                             usb_get_packet(1, inp_data, sizeof(inp_data));  // total_digitos
                                             //for (pos = puntero ; pos <= (puntero + total_digitos) ; pos++)
                                             //{                                                
                                                //escribir_eeprom (pos,inp_data[i]);                                                
                                                                                                
                                                num_telf[0]=inp_data[0];
                                                num_telf[1]=inp_data[1];
                                                num_telf[2]=inp_data[2];
                                                num_telf[3]=inp_data[3];
                                                num_telf[4]=inp_data[4];
                                                num_telf[5]=inp_data[5];
                                                num_telf[6]=inp_data[6];
                                                num_telf[7]=inp_data[7];
                                                num_telf[8]=inp_data[8];
                                                num_telf[9]=inp_data[9];
                                                //i++;
                                             //}
                                             num_telf[10] = total_digitos;
                                             num_telf[11] = total_telef;
                                             
                                             //escribir_eeprom(pos,'%');
                                             puntero = pos++;
                                             responder_ok();

                                          }

                                       }

                                    }
   
                                 }
                                
                              }
                           }
                        break;


y

Código:
const char USB_CLASS_SPECIFIC_DESC[] = {
      6, 0, 255,    // Usage Page = Vendor Defined
      9, 1,            // Usage = IO device
      0xa1, 1,       // Collection = Application
      0x19, 1,        // Usage minimum
      0x29, 8,        // Usage maximum

      0x15, 0x80,        // Logical minimum (-128)
      0x25, 0x7F,        // Logical maximum (127)

      0x75, 8,        // Report size = 8 (bits)
      0x95, 2,        // Report count = 16 bits (2 bytes)
      0x81, 2,        // Input (Data, Var, Abs)
      0x19, 1,        // Usage minimum
      0x29, 8,        // Usage maximum
      0x75, 8,        // Report size = 8 (bits)
      0x95, 2,        // Report count = 16 bits (2 bytes)
      0x91, 2,        // Output (Data, Var, Abs)
      0xc0            // End Collection
   };

Me podrian decir en lo que me estoy equivocando aca. Gracias ;)

Bueno, no sé como estás enviando los datos (en que formato), pero si dices que te funcionan los dos primeros entonces vas bien. En tu descriptor veo que defines el Conteo del Reporte con 2 bytes. Pero tu estás manejando 10 bytes. Es decir en las ultimas lineas del descriptor,

Código:
      0x95, 2,        // Report count = 16 bits (2 bytes)

Debería ser:

Código:
      0x95, 10,        // Report count (10 bytes)

Pero como le decía a dashtronic, esto tiene como la mala costumbre de manejar paquetes de a 8, sean bits, o bytes. Por lo pronto intenta probarlo de esta forma y nos cuentas.

Saludos! :)
 
Última edición:
hola gente, soy nuevo en el foro y acabo de encontrarme con este hilo y veo que le puedo traer un poco de luz en ciertos aspectos, ya que tengo un poco de experiencia en esto de los HID, al menos con Joysticks.

Yo me armé un joystick para un simulador de automoviles, especificamente juegos como rFactor o GTR2, pero en si puede usarse para simuladores de vuelo, ya que como decimos el HID lo reconoce directamente Windows y puede usarse en cualquier programa que lo necesite.

Las configuraciones que he hecho son:
6 ejes a 10 bits, 32 botones y hat switch de 8 posiciones (el hat switch se usa para control de mira y esas cosas.
4 ejes a 10 bits, 64 botones
81 botones

Si bien la limitacion de windows es a 32 botones, y para usar mas se debe utilizar un mapeador de botones a teclas, el SVMapper anda muy bien.

Con respecto a lo del force feedback estoy en algo de eso tambien, aunque por ahora no uso el PID, sino que le he dado funcionalidad de salidas a mi joystick y lo manejo con un programita hecho en C.

Luego llego a casa y le copio el descriptor que uso y les explico un poquito algunos detalles. Al menos lo de los botones que no es necesario hacer tantas lineas del descriptor.

Saludos, y cualquier preguntilla trataré de aportar algo.
 
hola gente, soy nuevo en el foro y acabo de encontrarme con este hilo y veo que le puedo traer un poco de luz en ciertos aspectos, ya que tengo un poco de experiencia en esto de los HID, al menos con Joysticks.

Yo me armé un joystick para un simulador de automoviles, especificamente juegos como rFactor o GTR2, pero en si puede usarse para simuladores de vuelo, ya que como decimos el HID lo reconoce directamente Windows y puede usarse en cualquier programa que lo necesite.

Las configuraciones que he hecho son:
6 ejes a 10 bits, 32 botones y hat switch de 8 posiciones (el hat switch se usa para control de mira y esas cosas.
4 ejes a 10 bits, 64 botones
81 botones

Si bien la limitacion de windows es a 32 botones, y para usar mas se debe utilizar un mapeador de botones a teclas, el SVMapper anda muy bien.

Con respecto a lo del force feedback estoy en algo de eso tambien, aunque por ahora no uso el PID, sino que le he dado funcionalidad de salidas a mi joystick y lo manejo con un programita hecho en C.

Luego llego a casa y le copio el descriptor que uso y les explico un poquito algunos detalles. Al menos lo de los botones que no es necesario hacer tantas lineas del descriptor.

Saludos, y cualquier preguntilla trataré de aportar algo.

Excelente! Esperaré con ansias el código. Quisiera aclarar algo, para los que han seguido mis mensajes. Cuando declaré el descriptor de la parte de los botones, al conectarlo, si me salían todos botones (16), pero no me funcionaban bien (creo que algunos, la verdad no lo recuerdo, ya fue hace tiempo, pero si salían los botones declarados), en todas partes, se declara es una sola colección de botones con todos los botones, y a todo el mundo le funciona!

No sé si algo tiene que ver que tenga Win7 a 64 bits (no tengo otro equipo a la mano con XP para probar, e igual... este es mi equipo!). Lo que he posteado es de mis pruebas y experiencia, de como ha funcionado para mi por lo menos en windows 7 a 64 bits. He bajado codigos estandar de multiples botones y tenian el mismo problema, aparecían pero no funcionaban como debían. Por eso armé grupos de varias colecciones, pues así me funcionó. :)

Esperaré igual tu código Willynovi, para probarlo, de pronto si existe una forma más resumida de hacer el descriptor para win7 - 64 bits. :apreton: Gracias!

Saludos, (y)
 
vamos por partes, ante todo aviso que trabajo con C18 y puede que algunas cosillas alla que adaptarlas al compilador CCS.

Con respecto al descriptor, no lo he probado en W7 porque no lo tengo asi que estoy en las mismas que tu oscar.

Este es el descriptor que uso y en base a ese hago las modificaciones para adaptarlo a otras soluciones.
Código:
	0x05, 0x01, 		//	Usage Page (Generic Desktop)
	0x09, 0x04, 		//	Usage (Joy)
	0xA1, 0x00, 		//	Collection (Physical)
	0x09, 0x30, 		//	  Usage (X)
	0x09, 0x31, 		//	  Usage (Y)
	0x15, 0x00, 		//	  Log Min (0)
	0x26, 0xFF, 0x03,	//	  Log Max (1023)
	0x75, 0x10, 		//	  Report Size (16)
	0x95, 0x02, 		//	  Report Count (2)
	0x81, 0x02, 		//	  Input (Data, Variable, Absolute)
	0x09, 0x32, 		//	  Usage (Z)
	0x15, 0x00, 		//	  Log Min (0)
	0x26, 0xFF, 0x03,	//	  Log Max (1023)
	0x75, 0x10, 		//	  Report Size (16)
	0x95, 0x01, 		//	  Report Count (1)
	0x81, 0x02, 		//	  Input (Data, Variable, Absolute)
	0x09, 0x33, 		//	  Usage (Rx)
	0x15, 0x00, 		//	  Log Min (0)
	0x26, 0xFF, 0x03,	//	  Log Max (1023)
	0x75, 0x10, 		//	  Report Size (16)
	0x95, 0x01, 		//	  Report Count (1)
	0x81, 0x02, 		//	  Input (Data, Variable, Absolute)
	0x09, 0x34, 		//	  Usage (Ry)
	0x15, 0x00, 		//	  Log Min (0)
	0x26, 0xFF, 0x03,	//	  Log Max (1023)
	0x75, 0x10, 		//	  Report Size (16)
	0x95, 0x01, 		//	  Report Count (1)
	0x81, 0x02, 		//	  Input (Data, Variable, Absolute)
	0x09, 0x35, 		//	  Usage (Rz)
	0x15, 0x00, 		//	  Log Min (0)
	0x26, 0xFF, 0x03,	//	  Log Max (1023)
	0x75, 0x10, 		//	  Report Size (16)
	0x95, 0x01, 		//	  Report Count (1)
	0x81, 0x02, 		//	  Input (Data, Variable, Absolute)

	0x09, 0x39,			//    Usage (Hat Sw)
	0x15, 0x00, 		//	  Log Min (0)
	0x25, 0x07,			//	  Log Max (7)
	0x35, 0x00,			//    Phy Min (0)
	0x46, 0x3B, 0x01,	//    Phy Max (315)
	0x65, 0x12,			//    Unit (SI Rot : Ang Pos)
	0x75, 0x08, 		//	  Report Size (8)
	0x95, 0x01, 		//	  Report Count (1)
	0x81, 0x02, 		//	  Input (Data, Variable, Absolute)

	0x05, 0x09,			//    Usage Page (Button)
	0x19, 0x01,			//    Usage Min (1)
	0x29, 0x20,			//    Usage Max (32)
	0x15, 0x00, 		//	  Log Min (0)
	0x25, 0x01,			//	  Log Max (1)
	0x75, 0x01, 		//	  Report Size (1)
	0x95, 0x20, 		//	  Report Count (32)
	0x81, 0x02, 		//	  Input (Data, Variable, Absolute)
	0xC0};				//	End Collection

La parte de los ejes es muy repetitiva, y puede simplificarse segun he leido en algunas documentaciones aunque no lo he probado, es decir, las cosas que son comunes a los 6 ejes con ponerlas una sola ves bastaria.

Un punto importante es el tema de indicar la longitud o tamaño del descriptor y la cantidad de bytes que se estan transmitiendo. Eso deberan ver en parte del código, pero si esos valores no coindicen tendran problemas al comunicarse con el host.

Con respecto a asignarle un nombre al dispositivo, para el que trabaje con el C18 puede buscar parte del codigo que sea similar a esto.
Código:
rom struct{byte bLength;byte bDscType;word string[22];}sd001={
sizeof(sd001),DSC_STR,
'W','i','l','l','y','N','o','v','i',' ',
'R','a','c','i','n','g',' ','T','e','a','m','.'};

rom struct{byte bLength;byte bDscType;word string[12];}sd002={
sizeof(sd002),DSC_STR,
'J','o','y','s','t','i','c','k',' ','0','.','1'};

El decriptor para trabjar con salidas es este:
Código:
	0x05, 0x01, 		//	Usage Page (Generic Desktop)
	0x09, 0x04, 		//	Usage (Joy)
	0xA1, 0x00, 		//	Collection (Physical)
	0x09, 0x30, 		//	  Usage (X)
	0x09, 0x31, 		//	  Usage (Y)
	0x15, 0x00, 		//	  Log Min (0)
	0x26, 0xFF, 0xFF,	//	  Log Max (1023)
	0x75, 0x10, 		//	  Report Size (16)
	0x95, 0x02, 		//	  Report Count (2)
	0x81, 0x02, 		//	  Input (Data, Variable, Absolute)

    0x06, 0x00, 0xFF,       // Usage Page = 0xFF00 (Vendor Defined Page 1)
	// The Output report
    0x09, 0x04,     	// Usage ID - vendor defined
    0x15, 0x00,     	// Logical Minimum (0)
    0x26, 0xFF, 0x00,   // Logical Maximum (255)
    0x75, 0x08,     	// Report Size (8 bits)
    0x95, 0x04,     	// Report Count (4 fields)
    0x91, 0x02,      	// Output (Data, Variable, Absolute)  
	0xC0

Por lo de la comunicacion con el host luego preparo un programita simple en C para que lo tengan de guia, es que la aplicacion que tnego hecha es un quilombete y por ahi se marean:D
 
Hola a todos, y saludos por el desarrollo del joystick usb con PIC.
A mi me gustan los simuladores de vuelo, y hace un tiempo compré dos gamepad de playstation 2 Dual shock y gracias a internet los pude conectar al puerto paralelo de la PC.

http://www.emulatronia.com/reportajes/directpad/psx/imprimir.htm

Lo que me gustó mucho fue que habilitando el force feedback, logré que en el Flight Simulator de Microsoft, el avión al despegar y al aterrizar todo el gamepad vibra... El efecto es impresionante, aunque para jugar son muy incómodos, por el pequeño tamaño de los joysticks del gamepad. Además tienen mucha zona muerta cerca del centro. Esto lo probé pegando una lapicera bic al joystick para hacerlo mas parecido a un joystick normal.

Me gustó mucho lo de la vibración, pero seria posible tomar la señal que acciona los motores y através de una etapa de potencia controlar un motor mas grande para ponerlo debajo de la silla ?

Luego mirando páginas de cabinas de avión caseras encontré esto sobre el force feedback, resulta que en los aviones reales al aumentar la velocidad del aire se requiere cada vez mas fuerza para controlar el joystick. Hay algunos joysticks comerciales que permiten emular este funcionamiento agregando internamente unos motores y unos cables o tensores. En particular en esta pagina desarmaban un Logitech Strike Force 3D...

41VTRDTJ7YL._SS400_.jpg


Y agregando una etapa de potencia le cambiaban los motores por otros mas grandes.

http://www.simprojects.nl/diy_force_feedback.htm

Años mas tarde lo encontré de casualidad en MercadoLibre y no dudé en comprarlo.

http://img105.imageshack.us/img105/3937/im002594vu5.jpg

Como veran siempre fue modificar o hackear algun joystick comercial, pero seria posible desarrollar un Joystick con un PIC que tuviera estas características ? Que hace falta saber ?

Por el momento me compré la versión impresa del libro "USB Complete" de Jan Axelson. El que quiera la ultima versión digital la tiene en:



ya tengo un programador Pickit3 nuevito y un PIC4550, y encontré una utilidad que sirve para desarrollar dispositivos USB con este pic que se llama "HIDmaker FS".

Lo que hace es generar el código fuente para el firmware del pic y para el host de la pc. Es la versión 1.0, la ultima es la 1.5, pero lamentablemente sale 600 dolares...!

http://www.4shared.com/file/136909658/3e7980d/HIDMakerFS.html

Funciona de la siguiente manera, se selecciona el tipo de dispositivo que se va a desarrollar, si es normal, compuesto, soft-detouch o complejo. Luego se selecciona la configuracion y las interfaces y los tipos de datos que se intercambiaran. Todo esto se hace de forma gráfica. Para finalizar te permite seleccionar el lenguaje para el pic: PicBasic Pro, Assembler, Microchip C18, y Hitech-C. Y para la pc host se puede seleccionar: Visual Basic 6, Delphi y C++ Builder. Al finalizar te genera código que funciona...! Está muy bueno. Hace poco lo conseguí y espero les guste tanto como a mi.

También buscando encontré ejemplos de programación de un driver para joystick en el Windows Development Kit.

http://download.microsoft.com/downl...E-4182-B6A9-AE6850409A78/GRMWDK_EN_7600_1.ISO

Y también encontré ejemplos de programación del lado de la PC para probar el force feedback en el Software Development Kit de DirectX.

http://download.microsoft.com/download/A/E/7/AE743F1F-632B-4809-87A9-AA1BB3458E31/DXSDK_Jun10.exe

Bueno, espero que algo se pueda hacer de todo esto. La verdad que los felicito y perdón por la longitud del post.

Claudio J. Pérez
Jujuy-Argentina
 
Última edición:
Hola Claudio, estas perdonado! Pero vuelvelo a hacer! :D Muy completo tu post. Me suena tu proyecto, porque quieres básicamente, palabras más palabras menos, construirte un simulador de vuelo completo (salvo por los accidentes).

La vibración de la silla no debería ser dificil. Los motores que hacen que vibren los mandos o gamepads no son tan grandes, por lo que uno o varios motores DC de impresora podrían servir.

Respecto a la resistencia del timón. Sería bueno, aunque es más práctico con motores, implementar un sistema hidráulico dada su resistencia... que puedas jalar y sientas como la fuerza restante. Pero creo que sería más práctico con motores. Voy a investigar a ver que encuentro.

En otras palabras, I'm in.


Saludos,



Oscar Escobar
Bucaramanga - Colombia
 
Los diseños que vi usan una goma elástica o resorte que se fija de un lado al joystick y del otro se tensionan girando un motor paso a paso o un servo con un motor DC, porque tienen mas torque. Pero igual, vamos por partes, primero voy a intentar agregarle un led a modo de señal para el motor y hacer que encienda y apague con la api del force feedback. Con eso ya me conformo.

Claudio J. Pérez
Jujuy-Argentina
 
Última edición:
hola Claudio, muy interesante tu mensaje.
Yo ando en algo parecido pero para un simulador de autos, estoy en la parte de incorporar el FFB.

Si quieres datos del FFB porque el simulador te los entrega lo que debes hacer es ir por el lado del DirectX, y ademas que tu dispositivo sea PID, es decir, Physical Interface Device, así recivirá los datos directamente del DirectX sin necesidad de un driver especifico.
He visto algunos hilos donde intentaron hacer un descriptor para PID pero con pocos buenos resultados, lo mejor es tomar prestado el de algun dispositivo y trabajar en base a ese. Para esto puedes usar alguna herramienta de sniffing del USB que te permite conocer que datos estan pasando o el contenido del descriptor.

La otra opcion es que por ejemplo el Flight Simulator te entrega los datos de las físicas del avión y en base a eso hagas tus calculos de la fuerza en los timones. Es algo mas fácil a mi entender y yo por el momento estoy trabajando en esto. Para esto no necesitas que tu dispositivo sea PID, sino HID con salidas. Y si necesitas un driver especifico.

Por si te interesa te recomiendo que te des una vuelta por la página de X-Sim DIY Motion Simulator Builders, que tienen un soft libre para controlar un simulador, y ya tienen varias cosas solucionadas.

Sigue adelante con tu proyecto, que lo voy a seguir de cerca para ver si puedo aportar algo.

Saludos, Willy
 
Hola willy, si estuve mirando algo acá del foro de Microchip, pero creo que no llegaron:

http://www.microchip.com/forums/m320225.aspx

Por otro lado, en este documento en particular explican las opciones para hacer una cabina de vuelo casera (Está llena de links):

http://download.microsoft.com/downl...-9F75-9F801A28AEAE/BuildYourOwnSimCockpit.pdf

Con el flight simulator ya lo solucioné con el FSUIPC que te deja sacar los datos, pero la idea es que sea universal y para cualquier juego... para eso hay que ir si o si por el lado del force feedback. Lo primero seria hacer que lo enumere y detecte como dispositivo force feedback...

Te agradesco lo del PID, no sabia que significaba el acronimo. Ahora me bajo el criptico PID.pdf a ver si entiendo algo.

http://www.usb.org/developers/devclass_docs/pid1_01.pdf

Te comento que estoy leyendo a full el "USB Complete" para familiarizarme con los términos. Estoy muy motivado y dispongo de suficiente tiempo, recursos y obstinación.. ja ja... a veces esto ultimo es lo mas importante... podria hacer un poco de sniffing en la comunicación del joystick con force feedback Logitech... pero no se si servirá de algo... Saludos y estaremos en contacto.... Voy a revisar la pagina que me recomiendas, creo que alguna vez vi una silla con cilindros neumáticos desarrollada en esta página...

Claudio J. Pérez
Jujuy-Argentina
 
Última edición:
Claudio, si creo que he seguido un tiempo ese hilo del foro de microchip.

Claro como te decia, con el FSUIPC es facil, pero pierdes la universalidad de tu mando, salvo que te hagas un driver para cada simulador.

Si tienes la posibilidad de tener un mando con FFB como dices, y tienes el Logitech Strike Force 3D que mejor que empezar por ahi, viendo como trabaja ese joystick.
Mediante el sniffing puedes ver el descriptor, asi puedes comprender mejor como es el tema del PID.

Yo en estos días estoy terminando con algo y me pondré nuevamente con mi proyecto de volante, que la parte mecánica ya la tengo lista con motor montado y he construido un simple puente H con un L298, cuando lo tenga funcionando con efectos simples desde el PIC luego me pondré a ver el tema del PID, actualmente estoy trabajando a base del HID como te decia.

Si tienes por ahí fotos de lo que comentabas, de los internos de algunos joystick de vuelo con el mecanismo del FFB, por favor podrías compartirlas que tengo unos amigotes que andan con eso de los simuladores de vuelo y podría sorprenderlos si les digo que pueden tener algo así.

Saludos, Willy
 
Hola Willy, por las proximas dos semanas estoy en el sur lejos del joystick, pero luego vuelvo y descanso por otras dos semanas. Ahi voy a subir fotos... Saludos, sigo leyendo el "USB Complete".

Claudio J. Pérez
 
Hola muchachos, muy buenos los posts. Por mi parte tambien estoy haciendo un cockpit (cabina de vuelo) con movimiento. Tambien he visitado X-Sim que tienen un soft libre para las "Motion Platforms" aunque todavia no lo he utilizado. En un principio empece haciendo el soft para leer y enviar datos al Flight Simulator por medio de SimConnect el cual te da la posibilidad de extraer todos los datos que se imaginen y viene en el SDK de la version Deluxe del FSX.

http://msdn.microsoft.com/en-us/library/cc526983.aspx

En una primera instancia controle el throttle, AP, AT, Flaps, el baston y los cuernos, luces etc. enviando por USB con HID al soft de la PC hecho en C# (tengo en VB 2008 y VB6, pero es mejor C#) el cual envia por medio de SimConnect al FSX los datos necesarios de la posicion de la palanca de cada acelerador por ejemplo y el estado de los switchs. Para los aceleradores, cuernos, baston, flaps, spoilers use un potenciometro acoplado a cada palanca.

Viendo este post y leyendo un poco mas sobre USB HID me parece mas facil implementarlo de esta manera al menos los que se refiere a los comandos y switchs, pero para los "gauges" o relojes y el movimiento me parece mas facil hacerlo con el soft en la pc y SimConnect. Nunca use FSUIPC.

Todo lo tengo montado sobre una entrenadora por el momento con un PIC18F4550.

Mi idea es hacer un verdadero simulador de vuelo (X-Plane) y no un entrenador terrestre con FSX, con X-Plane se puede conseguir una certificacion de la FAA cosa que con FSX no. En estos dias me llega el X-Plane y empezare a investigar, por el momento de su web se puede descargar tambien un SDK gratuito.

Ahora mis preguntas...:unsure:

Cual es el orden, algoritmo, etc. para crear el descriptor correctamente?.

Uso Hid Descriptor Tool para crear el descriptor que necesito pero siempre lo hice con los ejemplos de las tablas de USB.org.

No entiendo bien cual es el orden, que hay que declarar si o si para cada cosa ya que todos los descriptores que vi lo unico que tienen en comun es que comienzan con USAGE_PAGE, USAGE....LOGICAL_MINIMUM...PHYSICAL_MAXIMUM pero todos entre medio tienen otros datos. Yo hice uno propio y pero al conectar el PIC a la PC dice que el hardware puede que no funcione correctamente, lo cual tiene razon porque no funciona :LOL:.

Espero me puedan aclarar esta gran duda.

Saludos!:D
 
Hola chapin, para empezar con HID y PBP te recomiendo usar MicroCode Studio que viene con EasyHID para generar automaticamente el codigo en PBP para el PIC y VB5, Delphi o C para el PC.

Tambien tenes que descargar la version 8.15a del MPLAB desde esa misma pagina. Ojo, el compilador PBP debe estar en C:\PBP. En MicroCode Studio tenes que ir a View -> Compile and Program Options... e indicarle en donde esta el PBP (C:\PBP) y en donde esta el MPLAB (C:\Archivos de programa\Microchip\MPASM Suite).

Yo uso PBP 2.46 y funciona bien.

Para comenzar con el USB te recomiendo leer este hilo:

https://www.forosdeelectronica.com/f24/control-dispositivos-traves-modulo-usb-pic18f2550-17458/


Saludos!:D
 
Última edición:
hola yeyyo, si es mas simple trabajar con el HID, pero el PID da la posibilidad de que sea universal para cualquier simulador o juego que soporte FFB.

Por lo del descriptor, lo he hecho todo a mano, casi no uso el HID Descriptor Tool, me guio por la documentación de HID de USB.org http://www.usb.org/developers/devclass_docs/HID1_11.pdf

Lo que si te recomiendo es que vallas modificando de a poco, partiendo de un descriptor funcional ir haciendo modificaciones menores y probar que funciones, así le tomaras la mano.

Fijate que hace unas 3 semanas atras publiqué los descriptores que uso yo.
Te pueden servir de ayuda.
Se que tienen información de mas, pero no me he puesto a sacarsela :D
 
Gracias Willy!, en que post los publicaste?. Es verdad, yo modifique algunos y me funcionaron pero con informacion demas o a veces (no se por que) nisiquiera reconocia el dispositivo.
Ahora estoy haciendo unas pruebas creando desde 0 un descriptor con todos los PDF's abiertos y leyendo un poco de cada para ir entendiendo.

En un rato lo pruebo y comento los resultados.

Ahh, tambien voy a investigar el PID en cuanto termine con este.

See you.
 
El mensaje es el #85 seguramente. No entiendo una cosa en el descriptor, en los ejes declaras 10 bits (0-1023) y lo envias como un byte?. No lo probe, pero me quedo esa duda.

Recien arme este descriptor para dos ejes (X e Y) y 8 botones, aclaro que el que esta en este post mas arriba no me funciono y no se por que ya que parece no tener errores.

Código:
    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
    0x09, 0x04,                    // USAGE (Joystick)
    0xa1, 0x01,                    // COLLECTION (Application)
    0x09, 0x30,                    //   USAGE (X)
    0x15, 0x81,                    //   LOGICAL_MINIMUM (-127)
    0x26, 0x80, 0x00,              //   LOGICAL_MAXIMUM (128)
    0x75, 0x08,                    //   REPORT_SIZE (8)
    0x95, 0x01,                    //   REPORT_COUNT (1)
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)
    0x09, 0x31,                    //   USAGE (Y)
    0x15, 0x81,                    //   LOGICAL_MINIMUM (-127)
    0x26, 0x80, 0x00,              //   LOGICAL_MAXIMUM (128)
    0x75, 0x08,                    //   REPORT_SIZE (8)
    0x95, 0x01,                    //   REPORT_COUNT (1)
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)
    0x05, 0x09,                    //   USAGE_PAGE (Button)
    0x19, 0x01,                    //   USAGE_MINIMUM (Button 1)
    0x29, 0x08,                    //   USAGE_MAXIMUM (Button 8)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
    0x75, 0x08,                    //   REPORT_SIZE (8)
    0x95, 0x01,                    //   REPORT_COUNT (1)
    0xc0                           //     END_COLLECTION



Asi quedaria el codigo de este descriptor para insertar en el ASM que genera el easyHID:

Código:
RETLW 0x05  
RETLW 0x01                     ; USAGE_PAGE (Generic Desktop) 
RETLW 0x09  
RETLW 0x04                     ; USAGE (Joystick) 
RETLW 0xa1  
RETLW 0x01                     ; COLLECTION (Application) 
RETLW 0x09  
RETLW 0x30                     ;   USAGE (X) 
RETLW 0x15  
RETLW 0x81                     ;   LOGICAL_MINIMUM (-127) 
RETLW 0x26  
RETLW 0x80  
RETLW 0x00                     ;   LOGICAL_MAXIMUM (128) 
RETLW 0x75  
RETLW 0x08                     ;   REPORT_SIZE (8) 
RETLW 0x95  
RETLW 0x01                     ;   REPORT_COUNT (1) 
RETLW 0x81  
RETLW 0x02                     ;   INPUT (Data Var Abs) 
RETLW 0x09  
RETLW 0x31                     ;   USAGE (Y) 
RETLW 0x15  
RETLW 0x81                     ;   LOGICAL_MINIMUM (-127) 
RETLW 0x26  
RETLW 0x80  
RETLW 0x00                     ;   LOGICAL_MAXIMUM (128) 
RETLW 0x75  
RETLW 0x08                     ;   REPORT_SIZE (8) 
RETLW 0x95  
RETLW 0x01                     ;   REPORT_COUNT (1) 
RETLW 0x81  
RETLW 0x02                     ;   INPUT (Data Var Abs) 
RETLW 0x05  
RETLW 0x09                     ;   USAGE_PAGE (Button) 
RETLW 0x19  
RETLW 0x01                     ;   USAGE_MINIMUM (Button 1) 
RETLW 0x29  
RETLW 0x08                     ;   USAGE_MAXIMUM (Button 8) 
RETLW 0x15  
RETLW 0x00                     ;   LOGICAL_MINIMUM (0) 
RETLW 0x25  
RETLW 0x01                     ;   LOGICAL_MAXIMUM (1) 
RETLW 0x75  
RETLW 0x08                     ;   REPORT_SIZE (8) 
RETLW 0x95  
RETLW 0x01                     ;   REPORT_COUNT (1) 
RETLW 0xc0                     ; END_COLLECTION

Ahora lo pruebo y les cuento.
 
Última edición:
si el mensaje es el #85, quice ponerte un poco de dificultad, jejej

Código:
	0x09, 0x32, 		//	  Usage (Z)
	0x15, 0x00, 		//	  Log Min (0)
	0x26, 0xFF, 0x03,	//	  Log Max (1023)
	0x75, 0x10, 		//	  Report Size (16)
	0x95, 0x01, 		//	  Report Count (1)
	0x81, 0x02, 		//	  Input (Data, Variable, Absolute)

si te das cuenta, si es un eje de 10bits, entonces tienes que pasar el valor con 2 bytes para no perder nada.
Report Size (16) = 2 x 8 bits = 2 bytes
Report Count (1) = 1 x 16 bits = 2 bytes

Lo que yo tengo armado es con el C18 y uso el stack USB de microchip, nunca trabaje con el easyHID, así que no se como es el código que te genera.

Recuerda que debes modificar en alguna parte de tu programa el tamaño del descriptor e indicar la cantidad de bytes que pasaras por el endpoint. Puede ser por eso que no te ande.

Saludos, Willy
 
Atrás
Arriba