Pages: [1]   Go Down
Author Topic: matrice a led 5x5  (Read 860 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 19
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

salut voila j'ai trouver un code sur internet qui permet de controler une matrice a led 8x8 et j'aissai d'adapter ce code pour une matrice 5x5 et pour ne faire qu'une seule figure.
sauf que j'ai une erreur qui me dit:

 In function 'void drawScreen(int (*)[5])':
error: invalid types 'int[int]' for array subscript

et je ne sait pas d'ou sa vien.

le code orriginal:
http://blog.duklabs.com/?p=133

et celui modifier
Code:
const int rownum [5] = {13, 12, 11, 10, 9};
const int colnum [5] = {7, 6, 5, 4, 3};
int row;
int col;
int i;
int o;
int rowNumber;

int smile[5][5] = {
  {0,1,0,1,0},
  {0,1,0,1,0},
  {0,1,0,1,0},
  {1,0,0,0,1},
  {0,1,1,1,0}};

int tp;
int br;
int bc;

void setup()
{
  Serial.begin(9600);
  for (tp=0;tp <5;tp++){
    pinMode(rownum[tp], OUTPUT);
    pinMode(colnum[tp], OUTPUT);
    
      digitalWrite(colnum[tp], LOW);
      digitalWrite(rownum[tp], HIGH);
}
}

void loop()
{
  drawScreen(smile);
  
  if(i==1){row == 13;}
  else if(i==2){row == 12;}
  else if(i==3){row == 11;}
  else if(i==4){row == 10;}
  else if(i==5){row == 9;}
  
  if(o==1){col == 7;}
  else if(o==2){col == 6;}
  else if(o==3){col == 5;}
  else if(o==4){col == 4;}
  else if(o==5){col == 3;}
}


 void drawScreen(int character[5][5])
{
for(int j = 0; j < 5; j++) {
// Turn the row on
 rowNumber = j + 1;
digitalWrite(row[rowNumber], LOW);
for (int k = 0; k < 5; k++) {
// draw some letter bits
int columnNumber = k + 1;
if(character[j][k] == 1) {
digitalWrite(col(columnNumber), HIGH);
}

Pouvais vous m'aidé??
merci d'avance de vos reponse.
Logged

France
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3029
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Je n'ai pas pu voir le code d'origine. Le site est filtré par le proxy du boulot.
Après une lecture rapide de ton code je trouve quand même quelques trucs.

Il manque les accolades qui ferment les for dans la fonction drawScreen()

L'argument de digitalWrite est faux.
Code:
digitalWrite(row[rowNumber], LOW);
Je pense que ce doit plutôt être
Code:
digitalWrite(rownum[rowNumber], LOW);
la même chose sur les colonnes

Dans la fonction loop() je ne vois pas très bien à quoi servent les variables i, o, row et col que ne sont utilisées nulle part. Ces mêmes variables ne sont pas initialisées, en même temps comme elles ne servent à rien ce n'est pas grave.

Pourquoi la variable rowNumber est-elle déclarée en global alors que columnNumber est déclarée en local? C'est sans conséquence mais incohérent.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 19
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

salu merci de ta reponse.
j'ai reglé le probleme du for et j'ai changer les variable sauf que sa ne fait pas ce que je cherche,je veux afficher un smile mais tout les point lumineux s'allume.
voila mon code:

Code:
const int rownum [5] = {13, 12, 11, 10, 9};
const int colnum [5] = {7, 6, 5, 4, 3};

int timeCount;
int smile[5][5] = {
  {0,1,0,1,0},
  {0,1,0,1,0},
  {0,1,0,1,0},
  {1,0,0,0,1},
  {0,1,1,1,0}};

int tp;
int br;
int bc;

void setup()
{
  Serial.begin(9600);
  for (tp=0;tp <5;tp++){
    pinMode(rownum[tp], OUTPUT);
    pinMode(colnum[tp], OUTPUT);
    
      digitalWrite(colnum[tp], LOW);
      digitalWrite(rownum[tp], HIGH);
}
}

void loop()
{
  delay(5);
drawScreen(smile);
}
 
 int row(int i) {
if(i == 1) {
return 13;
} else if (i == 2) {
return 12;
} else if (i == 3) {
return 11;
} else if (i == 4) {
return 10;
} else if (i == 5) {
return 9;
}
}

int col(int i) {
if(i == 1) {
return 7;
} else if (i == 2) {
return 6;
} else if (i == 3) {
return 5;
} else if (i == 4) {
return 4;
} else if (i == 5) {
return 3;
}
}

 void drawScreen(int character[5][5])
{
  for(int j = 0; j < 8; j++) {
// Turn the row on
int rowNumber = j + 1;
digitalWrite(row(rowNumber), LOW);
for (int k = 0; k < 8; k++) {

int columnNumber = k + 1;
if(character[j][k] == 1) {
digitalWrite(col(columnNumber), HIGH);
}
digitalWrite(col(columnNumber), LOW);
}
digitalWrite(row(rowNumber), HIGH);
}
}

et celui du site:

Code:
const int rownum[8] = {
10,12,15,17,2,4,6,8 };
// 2-dimensional array of column pin numbers:
const int colnum[8] = {
11,14,16,18,3,5,7,9  };

float timeCount = 0;

int h[8][8] = {
{0,0,1,0,0,0,1,0},
{0,0,1,0,0,0,1,0},
{0,0,1,0,0,0,1,0},
{0,0,1,1,1,1,1,0},
{0,0,1,1,1,1,1,0},
{0,0,1,0,0,0,1,0},
{0,0,1,0,0,0,1,0},
{0,0,1,0,0,0,1,0}};

int e[8][8] = {
{0,0,1,1,1,1,1,0},
{0,0,0,0,0,0,1,0},
{0,0,0,0,0,0,1,0},
{0,0,0,0,1,1,1,0},
{0,0,0,0,1,1,1,0},
{0,0,0,0,0,0,1,0},
{0,0,0,0,0,0,1,0},
{0,0,1,1,1,1,1,0}};

int l[8][8] = {
{0,0,0,0,0,0,1,0},
{0,0,0,0,0,0,1,0},
{0,0,0,0,0,0,1,0},
{0,0,0,0,0,0,1,0},
{0,0,0,0,0,0,1,0},
{0,0,0,0,0,0,1,0},
{0,0,0,0,0,0,1,0},
{0,0,1,1,1,1,1,0}};

int o[8][8] = {
{0,0,0,1,1,1,0,0},
{0,0,1,0,0,0,1,0},
{0,0,1,0,0,0,1,0},
{0,0,1,0,0,0,1,0},
{0,0,1,0,0,0,1,0},
{0,0,1,0,0,0,1,0},
{0,0,1,0,0,0,1,0},
{0,0,0,1,1,1,0,0}};

int smile[8][8] = {
{0,0,0,0,0,0,0,0},
{0,1,1,0,0,1,1,0},
{0,1,1,0,0,1,1,0},
{0,1,1,0,0,1,1,0},
{0,0,0,0,0,0,0,0},
{0,1,0,0,0,0,1,0},
{0,0,1,0,0,1,0,0},
{0,0,0,1,1,0,0,0}};

int blank[8][8] = {
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0}};

void setup() {
Serial.begin(9600);
// initialize the I/O pins as outputs:

// iterate over the pins:
for (int thisPin = 0; thisPin < 8; thisPin++) {
// initialize the output pins:
pinMode(colnum[thisPin], OUTPUT);
pinMode(rownum[thisPin], OUTPUT);
// take the col pins (i.e. the cathodes) high to ensure that
// the LEDS are off:
digitalWrite(colnum[thisPin], LOW);
digitalWrite(rownum[thisPin], HIGH);
}

}

void loop() {
// This could be rewritten to not use a delay, which would make it appear brighter
delay(5);
timeCount += 1;
if(timeCount < 200) {
drawScreen(h);
} else if (timeCount < 230) {
// do nothing
} else if (timeCount < 400) {
drawScreen(e);
} else if (timeCount < 430) {
// nothing
} else if (timeCount < 600) {
drawScreen(l);
} else if (timeCount < 630) {
// nothing
} else if (timeCount < 800) {
drawScreen(l);
} else if (timeCount < 830) {
// nothing
} else if (timeCount < 1000) {
drawScreen(o);
} else if (timeCount < 1030) {
// nothing
} else if (timeCount < 1200) {
drawScreen(smile);
} else if (timeCount < 1230) {
// nothing
} else {
// back to the start
timeCount = 0;
}
}

int row(int i) {
if(i == 1) {
return 10;
} else if (i == 2) {
return 12;
} else if (i == 3) {
return 15;
} else if (i == 4) {
return 17;
} else if (i == 5) {
return 2;
} else if (i == 6) {
return 4;
} else if (i == 7) {
return 6;
} else if (i == 8 )  {
return 8;
}
}

int col(int i) {
if(i == 1) {
return 11;
} else if (i == 2) {
return 14;
} else if (i == 3) {
return 16;
} else if (i == 4) {
return 18;
} else if (i == 5) {
return 3;
} else if (i == 6) {
return 5;
} else if (i == 7) {
return 7;
} else if (i == 8 ) {
return 9;
}
}

void drawScreen(int character[8][8]) {
for(int j = 0; j < 8; j++) {
// Turn the row on
int rowNumber = j + 1;
digitalWrite(row(rowNumber), LOW);
for (int k = 0; k < 8; k++) {
// draw some letter bits
int columnNumber = k + 1;
if(character[j][k] == 1) {
digitalWrite(col(columnNumber), HIGH);
}

digitalWrite(col(columnNumber), LOW);
}
digitalWrite(row(rowNumber), HIGH);
}
}
Logged

France
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3029
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Dans drawScreen, les boucles for doivent compter entre 0 et 5 et non pas 0 et 8.
Les fonctions col et raw ne servent à rien
Code:
col(columnNumber) c'est pareil que colnum[columnNumber]
En plus cela oblige à passer par 2 variables intermédiaires.
Je réécrirait la fonction comme cela:
Code:
void drawScreen(int character[5][5])
{
  for(int j = 0; j < 5; j++) {
     // Turn the row on
     digitalWrite(rownum[j], LOW);
     for (int k = 0; k < 5; k++) {

       if(character[j][k] == 1) {
         digitalWrite(colnum[k], HIGH);
      }
      digitalWrite(colnum[k], LOW);
    }
    digitalWrite(row[j], HIGH);
  }
}


Ce truc est suspect
Code:
   if(character[j][k] == 1) {
      digitalWrite(col(columnNumber), HIGH);
    }
    digitalWrite(col(columnNumber), LOW);
  }
On éteint le point immédiatement après l'avoir allumé. Le motif ne doit pas être très visible.

Toi tu dis que tous les points sont allumés. D'après ce que je comprends du code on devrait au contraire voir les points à peine allumés. De la a se demander si tu n'aurais pas monté les LED à l'envers par rapport au schéma d'origine il n'y a pas loin. Essaie d'inverser le motif dans le tableau smile pour voir.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 19
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

merci de ta reponse.
j'ai chercher et j'ai trouver
le code:
Code:
const int rownum[5] = {13, 12, 11, 10, 9};
const int colnum[5] = {7, 6, 5, 4, 3};

int smile[5][5] =
{
  {0,1,0,1,0},
  {0,1,0,1,0},
  {0,1,0,1,0},
  {1,0,0,0,1},
  {0,1,1,1,0}
};
int tp;
int rowNub;
int colNub;
int final;
int r;
int c;

void setup()
{
  Serial.begin(10000);
  
  for( tp = 0; tp < 5; tp++)
  {
    pinMode(colnum[tp], OUTPUT);
    pinMode(rownum[tp], OUTPUT);
    
    digitalWrite(colnum[tp], LOW);
    digitalWrite(rownum[tp], HIGH);
  }
}

void loop()
{
  delay(100);
  for(tp = 0;tp<5;tp++)
  {
  digitalWrite(rownum[tp], LOW);
  }
  
  draw(smile);
 
}

int row(int i)
{
 if(i == 1)
  {
   return 13;
  }
  else if(i==2)
  {
    return 12;
  }
  else if(i==3)
  {
   return 11;
  }
  else if(i==4)
  {
    return 10;
  }
  else if(i==5)
  {
    return 9;
  }
}

int col(int j)
{
  if(j==1)
  {
    return 7;
  }
  else if(j==2)
  {
    return 6;
  }
  else if(j==3)
  {
    return 5;
  }
  else if(j==4)
  {
    return 4;
  }
  else if(j==5)
  {
    return 3;
  }
}

void draw(int final[5][5])
{
   for(r = 0;r<5;r++)
  {
     rowNub= r+1;
    digitalWrite(row(rowNub), HIGH);
    
    for(c = 0;c<5;c++)
    {
     colNub = c+1;
    
    if(final[r][c])
     {
      digitalWrite(col(colNub), LOW);
     }
     digitalWrite(col(colNub), HIGH);
    }
     digitalWrite(row(rowNub), LOW);
  }
}

les 2 dernieres ligne sont importante car si je ne les mais pas toute les led reste allumer.
maintenant j'ai 2 autre probleme:
1-la luminositer des point et très faible comment y remedier??
2-on vois le clignotement comment je pourrais modifier ceci??

merci d'avnace.
Logged

France
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3029
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
1-la luminositer des point et très faible comment y remedier??
Dans ma réponse précédente je t'ai dit qu'il y avait un problème sur la partie du code qui allume la LED et l'éteint tout de suite. Il faudrait placer un petit délai avant de l'éteindre.

Quote
2-on vois le clignotement comment je pourrais modifier ceci??
C'est pas très surprenant tu as mis un délai de 100ms dans ta boucle principale. Tout délai dans la boucle principale réduit la luminosité puisque c'est du temps ou l'affichage est éteint..

J'avais aussi fait des remarques sur des passages par des variables inutiles dans drawScreen. Il faut optimiser cette partie car elle plombe les performances de l'affichage.
« Last Edit: June 25, 2010, 06:28:24 am by fdufnews » Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 19
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

merci de ta reponse.

j'ai modifier le code en ajoutant des pause et le code fonctionne parfaitement.
je n'ai pas modifier les variable pour l'instant je les changerais sur un autre code amelioré.

le code:
Code:
const int rownum[5] = {13, 12, 11, 10, 9};
const int colnum[5] = {7, 6, 5, 4, 3};

int f[5][5] =
{
  {1,1,1,1,0},
  {1,0,0,0,0},
  {1,1,1,0,0},
  {1,0,0,0,0},
  {1,0,0,0,0}
};
int tp;
int rowNub;
int colNub;
int final;
int r;
int c;

void setup()
{
  Serial.begin(10000);
  
  for( tp = 0; tp < 5; tp++)
  {
    pinMode(colnum[tp], OUTPUT);
    pinMode(rownum[tp], OUTPUT);
    
    digitalWrite(colnum[tp], LOW);
    digitalWrite(rownum[tp], HIGH);
  }
}

void loop()
{
  delay(1);
  for(tp = 0;tp<5;tp++)
  {
  digitalWrite(rownum[tp], LOW);
  }
  
  draw(f);
 
}

int row(int i)
{
 if(i == 1)
  {
   return 13;
  }
  else if(i==2)
  {
    return 12;
  }
  else if(i==3)
  {
   return 11;
  }
  else if(i==4)
  {
    return 10;
  }
  else if(i==5)
  {
    return 9;
  }
}

int col(int j)
{
  if(j==1)
  {
    return 7;
  }
  else if(j==2)
  {
    return 6;
  }
  else if(j==3)
  {
    return 5;
  }
  else if(j==4)
  {
    return 4;
  }
  else if(j==5)
  {
    return 3;
  }
}

void draw(int final[5][5])
{
   for(r = 0;r<5;r++)
  {
     rowNub= r+1;
    digitalWrite(row(rowNub), HIGH);
    
    for(c = 0;c<5;c++)
    {
     colNub = c+1;
    
    if(final[r][c])
     {
      digitalWrite(col(colNub), LOW);
     }
     delay(0);
     digitalWrite(col(colNub), HIGH);
    }
     digitalWrite(row(rowNub), LOW);
  }
}
Logged

France
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3029
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Dans loop() il y a:
Code:
 for(tp = 0;tp<5;tp++)
  {
  digitalWrite(rownum[tp], LOW);
  }
Code inutile c'est déja fait à la fin de drawScreen.
« Last Edit: June 25, 2010, 08:27:17 am by fdufnews » Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 19
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

merci de ta reponse.
oui je sait je l'ai enlevé c'était au debut pour voir si toute les sortie s'initialliser correctement et j'avais oblier de les enlever.
maintenant je vé éssayer de faire une animation sur un cube a led 3x3x3.
Logged

Pages: [1]   Go Up
Jump to: