Sign in to follow this  
Jack_Aubrey

EL arduino joy ....

Recommended Posts

Hola Sres:

Hace bastante tiempo que vengo dando vueltas con el tema del Arduino, estoy leyendo algunas cosas, pero como recién empiezo me resultan un poco complicadas.

Lo que no se todavía es con que tipo de Arduino empezar en este mundo, y como las cosas que he leído son muy sueltas, me gustaría saber de alguna página en español para comenzar de una manera mas organizada.

En principio lo que me gustaría es hacer funcionar potenciómetros y botones :game: (cosa que no creo que sea muy fácil :whistling: ) ya que me gusta mucho el IL-2.

Muuchas gracias!

Share this post


Link to post
Share on other sites

Bueno, por lo que he leído para usar el Arduino como un joystick hay que hacer una modificación en el firmware de la placa, ¿o estoy equivocado?

Todos estos días estuve buscando información sobre esto, pero la que encuentro la mayoría está en Ingles, y la poca en Español, solo te explica la mitad.

En teoría hay que bajar una especie de controladores con el código para "convertir" la placa (Arduino) en un joystick usb.

Esto es correcto?

Alguno de uds. lo ha hecho?

Gracias!!

Share this post


Link to post
Share on other sites

Chimango.... hace bastante tiempo que no estoy explorando esta opcion (Trabajo fin de grado de por medio), en principio existen firmware para convertir la arduino (yo uso una Arduino UNO y se puede hacer con cualquier otra que utilice el mismo chip para comunicarse con el pc), los pasos para el cambio de firmware los encontre en el foro oficial de la arduino; el firmware en sí lo modifique de esta otra pagina.

 

Por otro lado necesitaras, antes de cambiar el firmware, crear un programa para la arduino que te gestione todos los botones y ejes que le pongas.

 

Sobre que Arduino te conviene.... ufff yo me compre la "UNO" pq era la mas moderna de su momento, a dia de hoy ya no lo es. Esta placa solo tiene 20 pines ("puertos de entrada/salida") de los cuales solo 6 sirven para leer señales analogicas... esto implica que debes multiplexar entradas si quieres leer mas de 6 ejes y 14 botones (vamos lo normal es que no necesitaras mas... pero en mi caso no es así :xd:), La Leonardo tambien tiene el mismo numero de pines y sale mas economica. Existen otras placas que tienen muchos mas pines pero que a su vez son sensiblemente mas caras.

 

Bueno creo que esto hace un resumen de todo lo que yo investigue. Tal vez en algun dia no muy lejano retome este proyecto... pero cuando no lo se.

Share this post


Link to post
Share on other sites

Chimango.... hace bastante tiempo que no estoy explorando esta opcion (Trabajo fin de grado de por medio), en principio existen firmware para convertir la arduino (yo uso una Arduino UNO y se puede hacer con cualquier otra que utilice el mismo chip para comunicarse con el pc), los pasos para el cambio de firmware los encontre en el foro oficial de la arduino; el firmware en sí lo modifique de esta otra pagina.

 

Por otro lado necesitaras, antes de cambiar el firmware, crear un programa para la arduino que te gestione todos los botones y ejes que le pongas.

 

Sobre que Arduino te conviene.... ufff yo me compre la "UNO" pq era la mas moderna de su momento, a dia de hoy ya no lo es. Esta placa solo tiene 20 pines ("puertos de entrada/salida") de los cuales solo 6 sirven para leer señales analogicas... esto implica que debes multiplexar entradas si quieres leer mas de 6 ejes y 14 botones (vamos lo normal es que no necesitaras mas... pero en mi caso no es así :xd:), La Leonardo tambien tiene el mismo numero de pines y sale mas economica. Existen otras placas que tienen muchos mas pines pero que a su vez son sensiblemente mas caras.

 

Bueno creo que esto hace un resumen de todo lo que yo investigue. Tal vez en algun dia no muy lejano retome este proyecto... pero cuando no lo se.

Muchas gracias Jack, voy a seguir investigando al respecto, las paginas que me recomendas ya las había leído, pero gracias igual.

Saludos, y suerte.

Share this post


Link to post
Share on other sites

hola, he llegado a este foro buscando informacion de como hacer una botonera casera y he visto que aqui sabeis de arduino.

Supongo que sabreis que hay un proyecto llamado arduino joy para hacer una botonera con un arduino uno y mega

es esta pagina: https://code.google.com/p/unojoy/

Resulta que quiero hacer con la placa arduino mega ya que tiene mas botones y de esta pagina:http://fredgolden.com/Recipe_for_a_cheap_joystick_encoder.pdf

esta lo necesario en lo que ha software se refiere, pero mi problema es que no se como saber que pines se puede usar ni como conectarlos.

Seria de gran ayuda que me dijeseis como conectarlo o donde puedo saber como conectarlos por que estoy pez en el tema

muchas gracias.

Share this post


Link to post
Share on other sites

Bueno despues de un paron obligado de cosa de un año y pico

(el post original murio ante el impetuoso primer y gran ¡¡¡¡apocaleches!!!! :anim8lc3:

 

 

Amos a ver aunque fui apuntando los avances en un cuaderno tal como se debe hacer.... pues ahora lo miro el me mira y no hay ninguna química; esto me lleva a empezar desde casi cero.....

 

La idea mia es muy basica: hacerme una botonera (USB HID tipo joystick) con ejes para volar il 2 como cuatrimotor y sin joderme la "jugabilidad" para demas artefactos voladores :xd:

 

Esto me lleva a plantearme un programa de necesidades, por un lado el tipo de "botones" y ejes necesarios para ello y por otro el saber como maneja estas funciones el il2. Pues bueno lo primero es ver lo del il 2 y despues adaptarnos al simulador.

 

El il2 maneja los botones de dos maneras: "una pulsacion = una sola vez ese comando" y "una pulsacion= uno o mas veces ese comando, dependiendo de la duracion de la pulsacion". El caso más genérico es el de por ejemplo subir (o bajar) manualmente el tren de aterrizaje en el que debes pulsar repetidas veces la tecla para que surta efecto; en otras palabras si lo mantenemos pulsado no se re-ejucta el comando, hay que soltar y volver a pulsar. La excepcion es cuando usamos el comando de +/- lo que sea de la mira de bombardeo, si mantenemos pulsada la tecla el comando sigue ejecutandose y añadiendo o disminuyendo el valor de lo que sea en la mira.

 

Ahora hay que seleccionar que tipo de dispositivos electricos usaremos para nuestra (jeje ya la comparto y aun ni funciona :xd:); existen en el mercado y a nuestro alcance gran variedad de ellos, que si interruptores de palanca, giratorios o pulsadores, que si rotary encoder y para los ejes.... es mas sencillo el clasico potenciometro (pero ¿lineal o giratorio?) o el más moderno (y algo quisquilloso) sensor hall..... bueno eso es algo que yo ya me he respondido (es de las pocas cosas que entiendo de mis apuntes) y ademas pos las he cambiado un poco.

 

Me explico, anteriormente habia decidido que iba a tener 6 ejes con sensor hall y ahora viene el lio :xd: 8 interruptores de palanca de dos posiciones estables (ademas de ser DPDT, es decir que manipulan dos circuitos... malditos leds :xd:), 10 interruptores de palanca de dos posiciones y una de ellas inestable (o momentaneas), 1 interruptor giratorio de 12 posiciones y dos polos (mas leds si, me gustan y la idea es de puta madre), 1 interruptor de 12 posiciones y un polo (este no lleva leds :xd:) y para terminar 7 rotary encoder (o codificador giratorio en cristiano :xd:). Todo esto ha cambiado, pq lo unico que me quedo claro es que los encoder los programe en masa otro, yo no :xd:. Ahora llevare los 6 ejes con sensor hall (que ya vere como los encapsulo para usarlos...), los mismos 8 interruptores de palanca de dos posiciones estables, 20 interruptores de palanca de dos posiciones y una de ellas inestable (o momentaneas), el mismo 1 interruptor giratorio de 12 posiciones y dos polos y 8 interruptores de palanca de 3 posiciones, dos de ellas inestables...... ahora sus pongo una imagen para aclarar a que comandos del sim le he asignado que cosa (esta en el spoiler... para no alargarme demasidado :xd:)

g74s.jpg

 

 

Ahora lo que me falta es rehacer el descriptor del USB HID para cambiar el firmware del chip de comunicaciones de la arduino (suena a arameo antiguo... pero al final es la parte mas sencillita y tiene buena informacion... o eso creo yo :whistling:) y montar el programa que ejecutara el arduino.... por ahora lo que tengo seguro es que debo realizar una multiplexacion sencillita y tener moito cuidado con los ejes en la parte de la electronica....

 

Bueno eso es por ahora.... que me ha salido algo de lectura suave :xd:

Edited by Jack_Aubrey

Share this post


Link to post
Share on other sites

Hola Jack, en este momento estoy haciendo un curso de arduino para profesores de 20 horas y tengo que hacer un proyecto para el curso y como hace tiempo que sigo tu hilo me he decidido a tirarme a la piscina y hacer algo. Estamos usando la Leonardo pero creo que la gente usa la Uno y la Mega que tienen más salidas. Creo que podría trastear con una caja para trimado en plan simple para abrir boca, el problema es que no tengo claro que la programación para comunicarse con el IL-2 sea compatible con la leonardo. Supongo que usaras algún tipo de shield para conectar todas las salidas y entradas al arduino, si es así ¿cual?. ¿Que sensores hal estas utilizando? Mi profesora es un pelin geek y cuando se lo comente se le cambio la cara para bien, y parece que controla así que por ese lado es posible contar con información de programación y tal. Un saludo.

Share this post


Link to post
Share on other sites

La verdad es que no uso ningun shield, lo que estoy es usando los pocos pines de la arduino UNO para realizar una matriz y de esta forma obtener hasta 72 input. Por otro lado cambio el firmware del chip de comunicacion usb que trae para que el ordenador vea un HID joystick.

 

Como hacer esto en una Leonardo.... no sabria decirte, supongo que deberas realizar un sketch con tu programa para leer que lea los pines, los asigne como botones y ejes, y posteriormente los mande como un reporte USB HID joystick; ademas del sketch deberas crear un descriptor HID USB para que el ordenador sepa que esperar de tu Leonardo. Tanto la pagina de darran como la de LUFA tendran mejor info sobre esto, ademas si preguntas en el foro de arduino en español lo mas probable es que alguien te pueda ayudar mejor con lo del firmware, haz tu pregunta lo mas simple posible (algo asi a "¿como cambio el firmware de la leonardo?")

 

Los sensores hall que yo estoy usando los compre en Mouser.com; los sensores hall necesitan de imanes dispuestos con cuidado para funcionar ya que se basan en una propiedad de el electromagnetismo para funcionar. Yo te recomiendo que solo los compres si la botonera necesitas que dure forever (o casi) pero aun así te recomiendo que uses potenciometros giratorios (y si es para trim la gente recomienda que sean multivuelta) por que son mas baratos y duros (es mas dificil estropearlos por una mala soldadura) para la primera vez (cosa que yo hare en cuanto termine con la programacion).

Share this post


Link to post
Share on other sites

Este es una pequeña imagen parcial de lo que creo obtendre como resultado:

 

vnd5.jpg

Es cierto que le faltan componentes ... pero es por tratar de mantener algo de claridad que no obtendria si dispusiera de los 50 interruptores y los seis ejes.

Share this post


Link to post
Share on other sites

Muchas gracias por tu rápida respuesta, creo que me voy a hacer con una placa UNO para evitar tener que pegarme con las librerias y todo el rollo ya que por lo que he investigado es el standard de facto junto con la MEGA 256. Los HAl de momento descartados, como dicen los Yankees KISS, keep it sinple and stupid.

Share this post


Link to post
Share on other sites

Aqui sus pego el sketch que me ha salido... tal vez trate de mejorarlo ....

 

 

/*Arduino USB Joystick HISD
Autor: Jorge Lozano Gómez AKA E69 Jack_Aubrey
Basado en los ejemplos de Darran ( http://hunt.net.nz/users/darran/ )
y en el stack USB LUFA ( http://www.fourwalledcubicle.com/LUFA.php )

El autor no se hace cargo de ningun tipo de responsabilidad por el
empleo de este sketch y de los archivos asociados a el*/

/* el programa da por hecho que se realiza una matriz de
interruptores y de ejes; con diodos, solo para los botones.
Actualmente se utiliza el pin 2 para los ejes y los pines
del 5 al 13 para los interruptores; en los pines del 5 al
7 se usaran para mander señal solo si cambian de estado*/

#define NUM_BOTONES 50 // si quieres aumentar el nº de botones
//cambialo aqui
#define NUM_EJES 6 //lo mismo pero con los ejes

//paso a definir la estructura que usare en el reporte del USB

typedef struct joyReport_t {
int16_t ejes [NUM_EJES]; //10 bits de resolucion
uint8_t botones[(NUM_BOTONES+7)/8]; // 8 botones por byte
} joyReport_t;

joyReport_t joyReport;

uint8_t estado_toggle[2] ={0,0}; // aqui almacenare el estado de los toggle
int i;
uint8_t lectura;
uint8_t prereport;

void setup()
{
Serial.begin(115200);
delay(200);

for (uint8_t ind=0; ind<8; ind++) {
joyReport.ejes[ind] = ind*1000;
}

for (uint8_t ind=0; ind<sizeof(joyReport.botones); ind++) {
joyReport.botones[ind] = 0;
}

pinMode(2, OUTPUT);
}

// Manda un reporte HID a la interface USB
void sendJoyReport(struct joyReport_t *report)
{
Serial.write((uint8_t *)report, sizeof(joyReport_t));
}
//lee los ejes
void leeejes(struct joyReport_t *report)
{
PORTC = B00000000; //todo el puerto C a low
digitalWrite(2, HIGH); // activo el pin 2
for(i=0; i<5; i++)
{
joyReport.ejes = analogRead(i);
}
}

void loop()
{
while(1)
{
DDRC = B00000000;
PORTC = B00111111; //acabo de poner A0,...,A5 como INPUT_PULLUP
for(i=5; i<14; i++)
{
pinMode(i , INPUT);
lectura = PINC;
switch (i)
{
case 5:
prereport = lectura;
break;
case 6:
prereport= prereport | (lectura<<6);
joyReport.botones [0] = estado_toggle[0]^prereport;
estado_toggle [0] = prereport;
prereport = (lectura>>2);
break;
case 7:
prereport = prereport | lectura;
joyReport.botones [1]= estado_toggle[1]^prereport;
estado_toggle [1] = prereport;
break;
case 8:
prereport = lectura;
break;
case 9:
joyReport.botones [2] = prereport | (lectura<<6);
prereport = (lectura>>2);
break;
case 10:
prereport = prereport | (lectura<<4);
joyReport.botones [3] = prereport;
prereport = (lectura>>4);
break;
case 11:
prereport = (prereport<<6) | lectura;
joyReport.botones [4] = prereport;
break;
case 12:
prereport = lectura;
break;
case 13:
joyReport.botones [5] = prereport | (lectura<<6);
joyReport.botones [6] = (lectura>>2);
break;
}
pinMode(i, OUTPUT);
}
leeejes(&joyReport);

sendJoyReport(&joyReport);
}
}

 


Proximament el header...

Share this post


Link to post
Share on other sites

Bueno.... tengo mas o menos la idea hecha, debo cambiar el skecth que he publicado por varios motivos (pretendo hacerlo mas legible... pero la portabilidad sigue sin ser buena, es decir es para la arduino UNO y con las demas habria que cambiar alguna cosa que otra).

 

Al final me he dado cuenta que Kyle_Katarn tiene mas razon que un santo, para leer los botones y los toggles usare los pines A0-A5 como inputs (hasta aqui siempre coincidiamos) pero con las resistencias internas activas, es decir con pull-up; de esta forma si hay un boton pulsado pondra a tierra uno de los inputs y se leera como 0 ... despues la lectura del puerto C (puerto de los pines analogicos para la UNO) simplemente la tendre que invertir.

 

Ademas voy a multiplexar a traves de un hcf4051BE que activare/desactivare con el cd 4025 ya que usare los mismos pines para usar el 4051 que el 4025 y de esta forma solo cuando esos pines tengan corriente se activara el 4051.... problema que perdere uno de los ocho ejes que me daria el 4051.

Edited by Jack_Aubrey

Share this post


Link to post
Share on other sites

Aqui esta un grafico con la locura de los ejes, con su 4051 para multiplexarlos y con el 4025 para gobernar al 4051 e incluso los 7 ejes (vale ahi esta un 4052 pero es que el programa de marras no tenia ningun 4025...., eso si los cables estan puestos como si los pines 8 y 9 del 4052 no existieran... es decir que van en la posiciones del 4025... espero que esto se entienda :xd:).... a lo mejor seria interesante hacer que de alguna manera el 4025 siguiera activo unos milis para asi poder leer un octavo eje :locob1:

 

8oiw.jpg

Edited by Jack_Aubrey

Share this post


Link to post
Share on other sites

Jejeje... creo que acabo de dar con la tecla para tener 8 ejes.... en vez de usar el cd 4025 para inhibir el 4051.... usare el pin 2 para inhibirlo y para leerlo usare los pines 3,4 y 5; debere tener algo de cuidado con la circuiteria pero si no me equivoco al poner los diodos para no producir ninguna pulsación fantasma (no dejan pasar la corriente) no deberia tener problemas....

Share this post


Link to post
Share on other sites

Bueno, despues de un fin de semana movidito, acabo de terminar el codigo para la botonera y como siempre lo pongo aqui en spoiler:

 

 

 

/*Arduino USB Joystick HISD
Autor: Jorge Lozano Gómez AKA E69 Jack_Aubrey
Basado en los ejemplos de Darran ( http://hunt.net.nz/users/darran/ )
y en el stack USB LUFA ( http://www.fourwalledcubicle.com/LUFA.php )

Se recuerda que el codigo hace uso de la manipulacion de puertos
directa, lo que implica que solo es valido para la Arduino UNO.

El autor no se hace cargo de ningun tipo de responsabilidad
por el empleo de este sketch y de los archivos asociados a el*/

/* el programa da por hecho que se realiza una matriz de
interruptores y de ejes; con diodos, solo para los botones.
Actualmente se utiliza el pin 3,4,5 para seleccionar los ejes,
el pin A5 para leerlos y el pin 2 para inhibir el hcf4051BE y
los pines del 5 al 13 para los interruptores; en los pines
del 5 al 7 se usaran para mander señal solo si cambian de
estado*/

#define NUM_BOTONES 50 // si quieres aumentar el nº de botones
//cambialo aqui
#define NUM_EJES 8 //lo mismo pero con los ejes

//paso a definir la estructura que usare en el reporte del USB

typedef struct joyReport_t {
int16_t ejes [NUM_EJES]; //10 bits de resolucion
uint8_t botones[(NUM_BOTONES+7)/8]; // 8 botones por byte
} joyReport_t;

joyReport_t joyReport;

uint8_t estadotoggle[2] ={0,0}; // aqui almacenare el estado de los toggle
int i;
uint8_t lectura;
uint8_t prereport;

void setup()
{
Serial.begin(115200);
delay(200);

for (uint8_t ind=0; ind<8; ind++) {
joyReport.ejes[ind] = ind*1000;
}

for (uint8_t ind=0; ind<sizeof(joyReport.botones); ind++) {
joyReport.botones[ind] = 0;
}

pinMode(2, OUTPUT);
digitalWrite(2, HIGH);
}

// Manda un reporte HID a la interface USB
void sendJoyReport(struct joyReport_t *report)
{
Serial.write((uint8_t *)report, sizeof(joyReport_t));
}

//lee los ejes
void leeejes()
{
digitalWrite(2, LOW); // activo el pin 2
for(i=0; i<5; i++)
{
switch (i)
{
case 0:
PORTD = B00000000;
prereport = analogRead(A5);
joyReport.ejes =prereport;
break;
case 1:
PORTD = B00001000;
prereport = analogRead(A5);
joyReport.ejes =prereport;
break;
case 2:
PORTD = B00010000;
prereport = analogRead(A5);
joyReport.ejes =prereport;
break;
case 3:
PORTD = B00011000;
prereport = analogRead(A5);
joyReport.ejes =prereport;
break;
case 4:
PORTD = B00100000;
prereport = analogRead(A5);
joyReport.ejes =prereport;
break;
case 5:
PORTD = B00101000;
prereport = analogRead(A5);
joyReport.ejes =prereport;
break;
case 6:
PORTD = B00110000;
prereport = analogRead(A5);
joyReport.ejes =prereport;
break;
case 7:
PORTD = B00111000;
prereport = analogRead(A5);
joyReport.ejes =prereport;
break;
}
joyReport.ejes = analogRead(i);
}
PORTD = B00000000;
}
//organiza, compara y almacena en el reporte los estados de los toggles
void leetoggles ()
{
switch (i)
{
case 5:
prereport = lectura;
break;
case 6:
prereport += (lectura>>6);
joyReport.botones [(i-6)]=(estadotoggle[(i-6)]^prereport);
prereport = (lectura<<2);
break;
case 7:
prereport += (lectura>>4);
joyReport.botones [(i-6)] =(estadotoggle[(i-6)]^prereport);
break;
}
}

//lee los botones
void leebotones ()
{
switch (i)
{
case 8:
joyReport.botones [(i-6)] = lectura;
break;
case 9:
prereport = lectura;
break;
case 10:
prereport += (lectura>>6);
joyReport.botones [(i-7)] = prereport;
prereport = (lectura<<2);
case 11:
prereport += (lectura>>4);
joyReport.botones [(i-7)] = prereport;
prereport = (lectura<<4);
break;
case 12:
prereport = (lectura>>2);
joyReport.botones [(i-7)];
break;
case 13:
joyReport.botones[(i-7)]=lectura;
break;
}
}

void loop()
{

DDRC = B00000000;
PORTC = B00111111; //acabo de poner A0,...,A5 como INPUT_PULLUP

while(1)
{
for(i=5; i<14; i++)
{
pinMode(i , INPUT);
lectura = ~(PINC<<2);
if (i<8)
{
leetoggles();
}
else if (i>7)
{
leebotones();
}
pinMode(i, OUTPUT);
}

digitalWrite(A5,LOW); // le quito al pin A5 le desactivo la resistencia pull up
leeejes();
digitalWrite(A5,HIGH); //le activo de nuevo la resistencia pull up
sendJoyReport(&joyReport);
}
}

 

 

Proximamente publicare las definiciones para el firmware del atmega 16U2

Edited by Jack_Aubrey

Share this post


Link to post
Share on other sites

Si haces un array con los valores de portd, en el primer for/switch simplificas el codigo una barbaridad y ganas eficiencia.

Sigo lellendo :p

 

No utilices una variable global como indice fors en diferentes funciones, mejor defines los indices de los for ejtro de cada funcion y le pasas una variable con el valor de inicio que debe considerar el for

Share this post


Link to post
Share on other sites

Lo de los for ... tampoco me gusta a mi, la verda es que no habia caido en esa manera de hacerlo, ¿solamente deberia incluir en la definicion de la funcion que le paso un int y ya ta???? (ademas de cambiarlo dentro de la funcion)...

 

Lo del array con el PORTD lo pense, ¿lo podria poner en base decimal??... por otro lado es que el puñetero codigo me queda muy explicito para cada caso....

 

 

Working on progress

Share this post


Link to post
Share on other sites

claro, le pasas a cada funcion desde donde debe empezar el for fuera.

 

Los valores del portD yo me los dejaba en binario, solo por el echo de que con mirarlos ves que pin es el que quieres activar

 

¿Esto "lectura = ~(PINC<<2);" hace un shift a la izquierda de dos bits?

¿No tienes que ponerlos otra vez en su sitio?

Share this post


Link to post
Share on other sites

no se, hay cosas que las veo raras, pero sin poder probar el codigo no te puedo depurar la cosa mucho :p

 

¿Los toogles son momentaneos o se quedan fijos en la posicion?

 

Si son momentaneos nada, pero si son fijos deberas desactivar la pulsacion tu a la fuerza, guardando el estado del boton y al cabo de x ciclos, si el boton sigue en el estado on lo pasas tu a off a la fuerza descartando la entrada que recibes.

Despues cuando fisicamente se coloque el boton a off vuelves a aceptar entradas del toogle y asi te preparas para la siguiente pulsacion.

 

Me sigues?

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this