Hola a todos,
ojalá alguien me pueda ayudar a resolver esta duda, porqué me esta impidiendo terminar definitivamente el proyecto.
El proyecto trata de lo siguiente:
- hay 8 controladores, iguales entre ellos, es decir los botones operan igual, pero excluyen al resto de los controladores
- cada controlador de los 8 tiene 4 botones con cuatro funciones diferentes
- El boton 1 de cada controlador es para pedir turno, el que lo aprieta antes toma el control del arduino
- El boton 4 sirve para ejecutar las ordenes indicadas con los otros dos restantes, una vez ejecutadas las ordenes se libera el control otra vez para que todos los controladores puedan intentar acceder a este con su boton 1.
- Las ordenes se ejecutan en el momento, no se guarda el orden de ejecuciones en memoria
- Asi que el bucle principal esta esperando todo el rato a que alguien apriete su boton 1
HARDWARE:
El sketch principal , que creo que no es lo importante, escanea el 64 buttons shield de spiekenzelabs:
[list/SpikenzieLabs/Button64Shield.html[/url]
Los 8 botones de la fila 1 de la matriz de 64 son los boton 1 de cada controlador, segun quien aprieta se pasa el numero a la variable de entrada de un SWITCH con 8 casos, evidentemente cada caso es igual solo cambia quien controla.
Hasta aquí bien.
Cada controlador lleva asociado un display dual de dos digitos de 7 segmentos.
Los 8 displays estan incrustados de la siguiente forma:
Los segmentos de los 8 displays estan interconectados en paralelo.
Los anodos comunes (2 por display) estan multiplexados con transistores PNP (los segmentos de los dos digitos estan conectados entre si).
Aqui es donde viene la liada:
Como un arduino uno carece de bastante salidas, le he enchufado un MUX SHIELD II:
Para evitar usar todos los pines, como dice en su guia del usuario, le he hecho un hardwire para que actue solo como shift register,
es decir, todos los pines son salidas digitales, ya que solo lo necesito para poder manejar los displays.
- La fila I/O 1 no tiene nada conectado, la quiero liberar por liberar el pin que la maneja(pin2) que lo necesito para otra leer los 64 buttons por interrupcion (Lo cual es claramente el primer conflicto)
- La fila I/O 2 tiene conectados las bases de los 16 transistores necesarios para activar los displays, asi para el display 1, usaria el 1 pin 1 y el pin 2, para el display 2 el pin 3 y el 4 y asi sucesivamente
- La fila I/O 3 es la que maneja los segmentos de todos los displays, por eso, solo uso los pines del uno al siete, ya que los DP de cada display no son necesarios porqué no hay decimales
En ningun caso va a haber más de un display en marcha simultaneamente, por eso puedo lanzar siempre los valores a los segmentos de todos los displays, pero solo funcionara el que esté activo mediante los pines del MUX SHIELD II I/O2.
Para escribir los numeros de los displays, uso una libreria que se llama sevseg.h la cual la podeis encontrar aquí:
http://playground.arduino.cc/Main/SevenSegmentLibrary
concretamente en el link:
https://docs.google.com/file/d/0Bwrp4uluZCpNdE9oWTY0M3BncTA/edit?usp=sharing
Y aquí viene el maldito problema, cada vez que un usuario tiene el control, está en un case del switch, en el cual se ejecuta una funcion en bucle hasta que el boton 4 de ejecutar es usado y se libera (haciendo un break para salir del switch).
Aquí esta mi función a medias:
int trackSelection (int fwdSong, int revSong, int plAY, int numSong, muxrow, muxD1, muxD0){ //vars butskip+, butskip-,butplay, number of song)//mux mapped for sev segm
numSong=0; //return var
short trackRef=0;
SevSeg sevseg;
sevseg.Begin(1,2,3,[b]muxD[/b]1,[b]muxD2[/b],6,7,8,9,10,11,12,13); //free pins 2,3 and
sevseg.Brightness(90);
while(Button!=plAY){ // while play button is not pressed selection is allowed.
if(Button > 128){ // Example of how to decode the button press
Button = Button - 128; // A pressd button is the button number + 128
if((Button== plAY)&&(0<trackRef<100)){ // condition1:Play button pressed + condition2:song must be from 1 to 100) both conditions are obligated.
numSong=trackRef; // if button pressed was this, play selected song
delay(10);;
break; // of course get out the loop
}
else if(Button== fwdSong){
trackRef++;
Serial.print(trackRef);
delay(50);
sevseg.PrintOutput();
}
else if(Button== revSong){ // if button pressed was that, skip- (select song number)
trackRef--;
Serial.print(trackRef);
delay(50);
sevseg.PrintOutput();
}
else{
sevseg.PrintOutput();
delay(10);
}
sevseg.PrintOutput();
}
else{
Button=(Button, DEC); // A released button is from 1 to 64
if((Button== plAY)&&(0<trackRef<100)){ // condition1:Play button pressed + condition2:song must be from 1 to 100) both conditions are obligated.
numSong=trackRef; // if button pressed was this, play selected song
delay(10);;
break; // of course get out the loop
}
else if(Button== fwdSong){
trackRef++;
Serial.print(trackRef);
delay(50);
sevseg.PrintOutput();
}
else if(Button== revSong){ // if button pressed was that, skip- (select song number)
trackRef--;
Serial.print(trackRef);
delay(50);
sevseg.PrintOutput();
}
else{
sevseg.PrintOutput();
delay(10);
}
}
sevseg.PrintOutput();
}
trackRef=0;
return numSong;
}
A mi parecer, una vez dentro de esta función gobernada por un bucle while, es cuando deberia crear la instancia del SevSeg, y entonces pasarle los pines en los que tiene que actuar, sabiendo que, todos ellos son del MUX SHIELD. Lo que me bloquea, es que he mirado la libreria del MUX shield, y esta bien explicado como leer y escribir en los pines. Pero lo que me bloquea es que no se como pasar los pines del MUX Shield a la funcion Sev:
//I am using a common anode display, with the digit pins connected
//from 2-5 and the segment pins connected from 6-13
sevseg.Begin(1,2,3,4,5,6,7,8,9,10,11,12,13);
El problema reside basicamente en que me estoy liando con la recursividad....
Alguien me puede decir como puedo insertarle los parametros de los pines del MUX shield a sevseg.Begin(); para que los interprete bien y sepa donde va a tener que escribir luego los LOW y HIGH de cada segmento y del digito adecuado?
Solo necesito romper esta barrera psicologica para terminar de incrustar las operaciones y poder hacer los primeros tests.....
....estoy desesperado......