Hola gente!!
Buenas soy un aerotrastornado que esta tratando de montar un panel auxiliar de botones y ejes para usar con su simulador favorito… la verdad es que estoy algo atascado porque no se si falla el sketch con el que leo a traves de la arduino uno o el .hex del atmega 16u2 que se habla con el ordenador y atmega328…
Bueno si alguien me pudiera ayudar revisando el siguiente sketch me haria un gran favor:
/*Arduino USB Joystick HISD
Autor: ***** ****** ***** 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);
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
leejes = (leejes<<6)>>6; //limpio los 6 bits que no se con que estan llenos, la UNO tiene 10 bits de resolucion y
//estoy guardando en una variable de 16 bits
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);
}