Jump to content

EL arduino joy ....


Recommended Posts

  • Replies 53
  • Created
  • Last Reply

Top Posters In This Topic

Bueno, despues de unas cuantas lecturas y mejoras del sketch, aqui el nuevo y mejorado sketch:

 

 

 

 

/*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
uint8_t lectura; //aqui almacenare la lectura del puerto C
uint8_t prereport; //aqui organizare el valor del reporte
byte pinana[6]={A0,A1,A2,A3,A4,A5}; //con este array seleccionare los pines analaogicos

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

for (uint16_t ind=0; ind<sizeof(joyReport.ejes); ind++) { //pongo a cero los ejes
joyReport.ejes[ind] = 0;
}

for (uint8_t ind=0; ind<sizeof(joyReport.botones); ind++) { //pongo a cero los botones
joyReport.botones[ind] = 0;
}
for (int ind=2; ind<14; ind++){ //pongo los pines 3 a 14 como input pullup, de tal manera que no
pinMode(ind,INPUT_PULLUP); //descarguen los pines analogicos e inhibo el4051
}
for (int ind=0; ind<5; ind++){ //pongo los pines analogicos como input con resistencia pullup, de
pinMode(pinana[ind],INPUT_PULLUP); //tal forma que si los leo obtendria HIGH cuando no tuviera botones pulsados
//y LOW cuando los tenga.
}
pinMode(A5,INPUT); //preparo al A5 para realizar las lecturas de los ejes
}

// Manda un reporte HID a la interface USB; no tocar ya que esto no es mio y por tanto deberia funcionar....
void sendJoyReport(struct joyReport_t *report)
{
Serial.write((uint8_t *)report, sizeof(joyReport_t));
}

//lee los ejes, sera lo primero que haga, ya que te piden que dejes un tiempo entre que el pin lee analogico o digital, aprovechando el tiempo que se toma arduino para relanzar el loop
void leeejes()
{
byte Selector [8] = {B00000000,B00001000,B00010000,B00011000,B00100000,B00101000,B00110000,B00111000}; //Nos ayuda a seleccionar los pines 3 a 5 del puerto D ademas desinhibe el 4051
int16_t leejes = 0; //porque me parecia interesante leer los ejes y despues pasarselos al reporte
DDRD=B00111010; //sin machar el Rx y el Tx preparo los pines del 2 al 5 para la tarea actual
for (int ind = 0; ind<sizeof(joyReport.ejes); ind++){ //lectura secuencial de los ejes a traves del hcf4051
PORTD = Selector [ind]; //selecciono el canal que voy a leer del 4051, me he cansado de tanto hcf...
leejes = analogRead(A5); //leo el canal
joyReport.ejes[ind]=leejes; //almaceno la lectura en su sitio
}
pinMode (A5, INPUT_PULLUP); //preparo el pin A5 para volver a leerlo como parte del puerto C
for(int ind=2; ind<8; ind++){
pinMode (ind,INPUT_PULLUP);// vuelvo a dejar el puerto D como estaba
}
}
//organiza, compara y almacena en el reporte los estados de los toggles
void leetoggles (int ind)
{
switch (ind)
{
case 5:
prereport = lectura;
break;
case 6:
prereport += (lectura>>6);
estadotoggle[(ind-6)]=(estadotoggle[(ind-6)]^prereport); //comparo y conservo el estado de los toggles
joyReport.botones [(ind-6)] = estadotoggle[(ind-6)]; //almaceno en el reporte el estado actual
prereport = (lectura<<2);
break;
case 7:
prereport += (lectura>>4);
estadotoggle[(ind-6)]=(estadotoggle[(ind-6)]^prereport); // comparo y conservo el estado de los toggles
joyReport.botones [(ind-6)]=estadotoggle[(ind-6)]; //almaceno en el reporte el estado actual
break;
}
}

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

void loop()
{
int i;
leeejes();
for(i=5; i<14; i++){
pinMode(i , INPUT);
lectura = ~(PINC<<2);
if (i<8){
leetoggles(i);
}
else if (i>7){
leebotones(i);
}
pinMode(i, INPUT_PULLUP);
}
pinMode(A5,INPUT); //preparo al A5 para realizar las lecturas de los ejes
sendJoyReport(&joyReport);
}

 

 

 

Edited by Jack_Aubrey
Link to comment
Share on other sites

Bueno, me parece que tal vez el problema este en dos cositas de nada....

 

1ª cosita: Se recomienda que para la lectura de los analogicos se les de algo de tiempo (tambien he leido que para el resto de lecturas, entre que se estabiliza la señal y pitos y flautas similares ...). Con esto tengo en mente meterle algunos delays cortitos antes de las lecturas e incluso realizarlas dos veces .... no es mas que un "debounce" primitivisimo pero espero que funcional.

 

2ª El descriptor del USB Hid, voy a revisarlo de arriba a abajo e incluso mejorar algunas partes; todo con vistas a dejarlo KISS (Keep It Simple Stupid). Esto es debido a que revisando algunas cosillas me he percatado que alguien ya penso en los interruptores de palanca estables e incluyo una opcion para ellos en los buttons del USB.... así que si me lo estudio un poquito deberia simplificar el codigo en la lectura de los botones y probablemente dejarlos como solo una funcion en la cual los primeros "n" funcionen como estables y los demas como momentaneos....

Edited by Jack_Aubrey
Link to comment
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.


×
×
  • Create New...

Important Information

Some pretty cookies are used in this website