Jack_Aubrey Posted February 3, 2014 Author Report Share Posted February 3, 2014 si, me he dado cuenta mientras ponia los indices que habia alguna cosa rara con los toggles y lo he estado toqueteando un poco.... amos que como para darme un premio a la desprogramacion Quote Link to comment Share on other sites More sharing options...
Jack_Aubrey Posted February 4, 2014 Author Report Share Posted February 4, 2014 Bueno, me parece que debo ir probando las cosas de una en una, pq de sopeton me lio y la lio parda.... decir que la arduino es dura dura ... pq a mi me esta aguantando mucha burrez .... Quote Link to comment Share on other sites More sharing options...
Jack_Aubrey Posted February 4, 2014 Author Report Share Posted February 4, 2014 (edited) 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 USBtypedef 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 toggleuint8_t lectura; //aqui almacenare la lectura del puerto C uint8_t prereport; //aqui organizare el valor del reportebyte pinana[6]={A0,A1,A2,A3,A4,A5}; //con este array seleccionare los pines analaogicosvoid 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 February 4, 2014 by Jack_Aubrey Quote Link to comment Share on other sites More sharing options...
Jack_Aubrey Posted February 8, 2014 Author Report Share Posted February 8, 2014 (edited) 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 February 8, 2014 by Jack_Aubrey Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.