Go Down

Topic: Control de matriz led a travez del monitor serie (Read 2603 times) previous topic - next topic

SPR-69

Apr 25, 2017, 06:17 am Last Edit: Apr 25, 2017, 08:30 am by SPR-69
Hola a todo el mundo.
Soy muy nuevo en este mundo de la programación con arduino y por el momento me encuentro realizando un pequeño proyecto de control de matrices led de 8x8 a través del monitor serie de Arduino. En concreto quiero controlar el encendido y/o apagado de cada uno de los leds individualmente a través del puerto serie del arduieno, es decir, pedir el número correspondiente de fila y después el de columna o viceversa, de este medo si se tecleara fila "4" y columna "6" se encienda únicamente el led que se encuentre en esa posición y al termino de ese ciclo vuelva a pedir otros datos y encienda otro led sin que el anterior se apague  aunque no eh tenido éxito alguno con ello ya que solo puedo controlar la matriz pero modificando el código con digitalWrite cada vez. El proyecto va más allá de todo esto pero no puedo pasar de aquí; si alguien pudiera ayudarme se lo agradecería muchísimo.

Anexo el código que hasta ahora llevo:

Code: [Select]

int fil[]={10,7,12,6,2,13,15,5};
int col[]={17,16,3,11,4,9,8,14};
int crda1;
int crda2;
void setup() {
  Serial.begin(9600);
  delay(500);
for(int i=0;i<=7;i++){
  pinMode(fil[i], OUTPUT);
  pinMode(col[i], OUTPUT);
}
for(int i=0;i<=7;i++){
  digitalWrite(fil[i], HIGH);
  digitalWrite(col[i], LOW);
}
Serial.println("Introdusca coordenadas (0~7): ");
Serial.print("Fila ");
Serial.println("Columna ");
}
void loop() {
  if(Serial.available()>0){
    crda1=Serial.read();
    Serial.write(crda1);
    delay(500);
     if(0<crda1<=7){
  digitalWrite(fil[crda1], LOW);
  }else if(crda1>7){
    Serial.print("    Valor no permitido");
  }
  
  }
     if(Serial.available()>0){
    crda2=Serial.read();
    Serial.write(crda2);
    if(0<crda2<=7){
  digitalWrite(col[crda2], HIGH);
  }else if(crda2>7){
    Serial.print("Valor no permitido");
  }
  }
  crda1="";
  crda2="";
}




Danicap

Hola SPR-69,

Cuando leer por el puerto serie tomas valores ASCII del carácter que insertas. De este modo cuando tu tecleas un 2 no le estas mandando un 2 al arduíno si no un 50 (ASCII del 2). Por lo tanto cuando haces la comparación :

Code: [Select]
if(0<crda1<=7)

no te va a funcionar.

Yo suelo operar de la siguiente forma:

Code: [Select]
if('0'<=crda1<='7')

De esta forma comparas el valor ASCII.

Un saludo!



surbyte

En principio te felicito por el intento, pero hay librerías para el control de matrices LED que te facilitarían las cosas enormemente.
Si lo consideras me avisas o lo buscas en google : Arduino LED MATRIX Library y buscas la que se ajuste

Por lo que veo estas en etapa inicial asi que sería bueno saber a donde apuntas con tu proyecto a ver si vale la pena ayudarte acá o enfocar el esfuerzo a tu siguiente paso.

Si usas la librería solo le diras el número que quieres presentar en la matriz, número o letra.

Ahora solo enciendes leds por fila/columna, lo que a mi gusto requiere de una secuencia mas fina a la que usas hoy porque no es posible discernir cuando digitas en que lectura de puerto serie caerá tu control
Si le agregars algo como F1C2 y eso se interpretara como Fila 1 Columna 2 entonces si.

Espero tu respuesta.

SPR-69

#3
Apr 25, 2017, 11:09 pm Last Edit: Apr 25, 2017, 11:22 pm by SPR-69
Danicap:
Primero que nada te agradezco la ayuda, te comento, cambie la parte del código que me sugeriste pero aun así, sigo sin conseguir encender los leds.

surbyte:
De igual forma te agradezco tu ayuda, lo que me comentas de las librerías, ya lo eh realizado anteriormente la visualización de letreros y caracteres con scroll, empleando también el MAX7219 (gracias a diversos tutoriales en internet), pero el control que yo quiero realizar sobre la matriz es algo más arcaico o primitivo por llamarlo de algún modo, pretendo con eso que la persona que utilice el programa encienda leds a gusto y cree sus propios diseños, claro por ahora solo me concentro en esta parte, el proyecto en si es que el usuario tenga este control pero no a través del monitor serie, sino agregar un módulo bluetooth y que se creen los diseños a través de una aplicación para teléfono móvil.
De igual forma eh buscado en distintos sitios de internet en inglés y español y no eh encontrada nada al respecto solo la parte de los letreros que me comentaste y es por eso que me anime a pedir ayuda en este foro.
Espero haber sido más claro con esto ¡un saludo a  los dos!

surbyte

#4
Apr 26, 2017, 01:39 am Last Edit: Apr 26, 2017, 01:40 am by surbyte
Prueba esto con la variante que crda1 y crda2 son char y no int

Code: [Select]
// globales
char crda1;
char crda2;


void loop() {
  // filas Fx donde F es Fila y x es un número de fila
  if (Serial.available()>0){
      crda1 = Serial.read();
      if (crda1 == 'F') { // obtengo número de fila
          crda1 = Serial.read()-48; // leo número
          if (0 <crda1 && crda1 <=7) {
              digitalWrite(fil[crda1], LOW);
          } else {
              Serial.print("Valor no permitido");
      }
      if (crda1 == 'C') {
          crda2 = Serial.read()-48;  // obtengo número de columna
          if (0 <crda2 && crda2<=7){
              digitalWrite(col[crda2], HIGH);
          } else {
              Serial.print("Valor no permitido");
          }
      }
      crda1 = 0;
      crda2 = 0;
  }
}


Debes introducir F1 enter
C2 enter para que se encienda fila 1 columna 2 el led
Si quieres que funcione asi F1C2 enter, hay que modificar.


SPR-69

Hola de nuevo.

Ya intente aplicando el codigo que me proporcionaste y aun asi no logro encender ningun led.
Despues realice una variacion algo parecida y logre encender un led pero enclavando una coordenada a un valor de la matriz como lo muestro acontinuacion:



Code: [Select]
if(Serial.available()>0){
    crda=Serial.read();
    Serial.print(crda);
    
      if(crda = 'a1'){
  digitalWrite(fil[0], LOW);
  digitalWrite(col[0], HIGH);

 
 
Con esto eh logrado endender el primer led de toda la matriz, el detalle esta que al agregar otros leds no logro que se enciendan los dos, es decir si aplico esto:


Code: [Select]
void loop() {
  if(Serial.available()>0){
    crda=Serial.read();
    Serial.print(crda);
    
      if(crda = 'a1'){
  digitalWrite(fil[0], LOW);
  digitalWrite(col[0], HIGH);
 
  }if(crda = 'c3'){
  digitalWrite(fil[2], LOW);
  digitalWrite(col[2], HIGH);
    
  }
  }
 
  
  crda=0;
  
}



Se encienden 4 leds, los correspondientes a F1C1, F1C3, F3C1 y F3C3. Intente aplicando la multiplexacion, es decir, apagandolos y encendiendolos a una velocidad muy rapida para hacer imposible de visualizar el parpadeo pero aunque le coloque un delay muy pequeño se visualiza perfectamente el parpadeo y despues de eso se vuelven a apagar los leds.
Por cierto el valor "a1" corresponde a F1C1, en este caso sequi tu consejo pero con la variante de que las colunas las manejo con letras de la A a la H y las filas con numero del 1 al 8, de igual forma el consejo de cambiar el int crda; por char sirvio de mucho GRACIAS.

surbyte

Tienes un esquema que puedas mostrar para entender como son las conexiones? Claro que puedo deducirlo de tu código pero es mas fácil viendolo.

Si lo haces recuerda usar etiquetas de imagen para que se vea directamente en el post. Mira otros hilos para entender de que hablo.

SPR-69

#7
Apr 26, 2017, 08:40 pm Last Edit: Apr 26, 2017, 08:52 pm by SPR-69
Antes que todo una disculpa por la calidad de la foto, pues no cuento con una buena camara, espero sirva de algo, de igual manera anexo una tabla con la correspondencia de conexion de los pines.




surbyte

que tal este conexionado.

Acá la página de donde lo saqué Beating Heart animation on 8x8 LED Matrix + Arduino Uno

Es llevar al limite las salidas al no usar resistencias limitadores en tu conexionado.


Go Up