Conversión código de matriz led

Para el que lea esto, tomar en cuenta de que estoy luchando contra el tiempo y cualquier sugerencia será bienvenida.

Debo hacer un proyecto del juego de snake con un arduino mega, que se comunique con la pc (mando) y el arduino, para que este último proyecte el juego en una matriz led de 8x8. El problema está en que encontré un código el cual se asemejaba mucho a mis necesidades, lo único que tenía que hacer era modificarlo pues en el se utilizaba una matriz de 16x16 y era de ánodo común, la mía es de cátodo común (y de 8x8), y que en el código utilizaban un joystick y los pines del arduino como mando y yo debo enviarle señales desde el teclado de la pc utilizando el puerto serial (aunque sea poco práctico).

a la hora de montarlo me topé con ciertos problemas…

  1. los led’s de la matriz encienden atenuados (no como en otros proyectos, la diferencia es notable)
  2. el área de juego que es de 8x8 igual que la matriz, está corrida, es decir hay dos columnas físicas que no son parte del juego (la serpiente se sale como si ese fuera su límite) y hay dos columnas y dos filas que no se ven, es decir, la serpiente en el código se mueve atraves de esas filas y columnas imaginarias, pero sobrepasan los límites de la matriz.

les adjunto mi proyecto.
fisicamente tengo conectadas mis columnas en los pines que van del 2 al 9 y las filas del pin 22 al 29
de antemano, muchas gracias.

PD: como se puede observar, cambié los valores de HIGH y LOW para el cambio de ánodo común y cátodo común, pero no se si se debe cambiar algo mas que solo eso.

int col[]={2,3,4,5,6,7,8,9};
int fila[]={22,23,24,25,26,27,28,29};
char aux;
//Varible que recoge la posición del alimento
byte alimento[1][2];
//Variable que recoge la posición de la serpiente
byte posicion[100][2];
//Variable que recoge la longitud de la serpiente
byte longitud;
//Varables de lectura de los ejes de los comandos

//Variable que recoge la dirección del desplazamiento
byte direccion;
//Variable auxiliar para el control del tiempo
long time;
//Función para inicialidar el valor inicial de las variables

void setup(){
for(byte i=0; i<=7; i++){
  pinMode(col[i], OUTPUT);
  digitalWrite(col[i], LOW);  //Al ser de anodo común ponemos los cátodos en 1 para que no esten encendidos. //aquí hice el cambio de high por low contrario a la indicacion de arriba.
}

for(byte i=0; i<=7; i++){
  pinMode(fila[i], OUTPUT);
  digitalWrite(fila[i], HIGH);    
}
direccion=0;
posicion[0][0]=0;
posicion[0][1]=0;
longitud=1;
time=0;
randomSeed(analogRead(A2));
alimento[0][0]= random(3, 7);
alimento[0][1]= random(3, 7);
 Serial.begin(9600);

}
void loop(){

//Dibuja en la matriz el cuerpo y alimento
Escribir_matriz();
//ejecuta el siguiente bloque de funciones cada 150 milisegundos
if(millis() >= time+150){  
  time=millis();
  //Lee lo valores del joysticks
  Leer_serial();
  //Cambia la dirección del desplazamiento
  Cambio_direccion();
  //Cambia la posición de la serpiente
  Cambio_posicion();
  //Comprueba que la cabeza no entre en contacto con el cuerpo 
  Control_muerte();
  //Comprueba que la cabeza este enla posición del alimento
  Comprobar_alimento();
  //Comprueba que no se reseten los valores
}
}
void Leer_serial(){
if(Serial.available()>0){//comprobamos si en el buffer hay datos
aux = Serial.read();}
}

void Escribir_matriz(){
for(int i=longitud; i>=0; i--){
  digitalWrite( posicion[i-1][0]+22, LOW);
  digitalWrite( posicion[i-1][1], HIGH);
  digitalWrite( posicion[i-1][1], LOW);
  digitalWrite( posicion[i-1][0]+22, HIGH);

}
digitalWrite( alimento[0][0]+22, LOW);
digitalWrite( alimento[0][1], HIGH);
digitalWrite( alimento[0][0]+22, HIGH);
digitalWrite( alimento[0][1], LOW);
} 
void Cambio_direccion(){
if( direccion==0 || direccion==1 ){
  if(aux == 'w'){
    direccion=2;
    return ;
  }
  if(aux == 's'){
    direccion=3;
    return ;
  }
}

if( direccion==3 || direccion==2 ){
  if(aux == 'd'){
    direccion=0;
    return ;
  }
  if(aux == 'a'){
    direccion=1;
    return ;
  }
}

}
void Cambio_posicion(){
for(byte i=longitud; i>1; i--){
  posicion[i-1][0]=posicion[i-2][0];
  posicion[i-1][1]=posicion[i-2][1];  
}

if(direccion==2){
  if(posicion[0][0]==7){
    posicion[0][0]=0;
    return ;
  }
  posicion[0][0]++;
  return ;
}

if(direccion==3){
  if(posicion[0][0]==0){
    posicion[0][0]=7;
    return ;
  }
  posicion[0][0]--;
  return ;
}
if(direccion==0){
  if(posicion[0][1]== 7){
    posicion[0][1]=0;
    return ;
  }
  posicion[0][1]++;
  return ;
}

if(direccion==1){
  if(posicion[0][1]==0){
    posicion[0][1]=7;
    return ;
  }
  posicion[0][1]--;
  return ;
}
}
void Control_muerte(){

for( byte i=longitud; i>1; i--){
  if(Serial.available()>0){//comprobamos si en el buffer hay datos
aux = Serial.read();}  
  if(posicion[i-1][0]==posicion[0][0] || aux == 'p'){
    if(posicion[i-1][1]==posicion[0][1] || aux == 'p'){
      Escribir_matriz();
      muerte();
    }
  }
  if(longitud==1){
    break;
  } 
}
}
//Función encargada de reestablecer lo valores inciales tras la muerte
void muerte(){
longitud=1;
posicion[0][0]=0;
posicion[0][0]=0;
alimento[0][0]= random(0, 7);
alimento[0][1]= random(0, 7);
}
void Comprobar_alimento(){
if(posicion[0][0]==alimento[0][0]){
  if(posicion[0][1]==alimento[0][1]){
    Cambio_posicion();
    //Función encargada de aumentar el tamaño de la serpiente
    crecer();
    alimento[0][0]= random(3, 6);
    alimento[0][1]= random(3, 6);            
  }
}
}

void crecer(){
longitud++;
posicion[longitud-1][0]=alimento[0][0];
posicion[longitud-1][1]=alimento[0][1];
}

Pruebauno.ino (4.08 KB)

No has puesto esquema de como activas los leds. Muestranos como es el accionamiento de los mismos.

Te he corregido el título : Retirada la palabra URGENTE
Te he puesto los tag de código porque como no leiste las Normas los pegaste asi como asi.
De modo que estas comprometido a hacerlo.

Pues lo único que tengo para analizar como se encienden los leds es ese código de arriba y que pues físicamente a todas las columnas les conecté resistencias de 10k en serie con los pines del arduino

10k? Las salidas del arduino entregan 5V en HIGH.
5V/10k = 0.5mA con esa corriente apenas se ve un led encendido.
Igual, sigues sin entenderme porque tu hablas de una matrix de 8x8, o sea son 64 leds.

Lo que no entiendes es que hay que alimentarlos con drivers (transitores, porque requieren mas corriente de la que puede entregar 8 salidas simultanas de arduino.
No te quiereo aburrir pero arduino no puede entregar mas de 200mA / 8 = 25mA por rama.
Estas usando un MEGA, y pones a FILAS entregando corriente y a COLUMNAS recibiendo corriente (LOW).
Para 25mA necesitas resistores de 5V/25mA= 200 ohms usa 220 que es el valor mas próximo.

Con eso va a mejorar, pero para que se viera bien deberias armar un driver con transitores o un driver como el ULN2003 o similar.
Prueba con los resistores que te indiqué.