8x8 LED MATRIX et intensité +/- forte en OUTPUT digitale ?

Bonjour,

J'ai une question à 5.. cents sur cet excellent tuto (Row-columm Scanning to control an 8x8 LED Matrix) !!?! que je tâche de comprendre à fond ...
=>
https://www.arduino.cc/en/Tutorial/RowColumnScanning

Note 1 : J'ai changé un chouga la config, je me passe de potentiomètre pour l'instant

analog pins 2 through 5 used as digital 16 through 19

=>

analog pins 0 through 3 used as digital 14 through 17

Note 2 : Je teste ces positions pixels[5][3] et pixels[1][7] = LOW;
=>

void setupScreen(){
 
    for (int x = 0; x < 8; x++) {
      for (int y = 0; y < 8; y++) {
        pixels[x][y] = HIGH;
      }
    }
   
    //OFF current pos
   //pixels[posX][posY] = LOW;
   pixels[5][3] = LOW;
   pixels[1][7] = LOW;

}

Voici mon code, je teste donc le "comment allumer une led de mon choix "

// 2-dimensional array of row pin numbers:
const int row[8] = {
  2, 7, 17, 5, 13, 16, 12, 14
};

// 2-dimensional array of column pin numbers:
const int col[8] = {
  6, 11, 10, 3, 15, 4, 8, 9
};

// 2-dimensional array of pixels:
int pixels[8][8];

int posX = 7;
int posY = 7;
int count = 1000;
int thisPixel;
int thisPixel2;
      
void setup() {
  // initialize the I/O pins as outputs
  // iterate over the pins:
  for (int thisPin = 0; thisPin < 8; thisPin++) {
    // initialize the output pins:
    
    pinMode(col[thisPin], OUTPUT);
    pinMode(row[thisPin], OUTPUT);
    // take the col pins (i.e. the cathodes) high to ensure that
    // the LEDS are off:
    digitalWrite(col[thisPin], HIGH);
  }

  setupScreen();

}

void loop() {

  // draw the screen:
  refreshScreen();
  
  if(count-- == 0){
    count = 40;
    if(posX--==0){
      posX = 7;
      if(posY--==0){
        posY = 7;
      }
    }

  }
    
  setupScreen();

}

void setupScreen(){
 
    for (int x = 0; x < 8; x++) {
      for (int y = 0; y < 8; y++) {
        pixels[x][y] = HIGH;
      }
    }
    
    //OFF current pos
   //pixels[posX][posY] = LOW;
   pixels[5][3] = LOW;
   pixels[1][7] = LOW;

}

void refreshScreen() {
    thisPixel = pixels[5][3];
    digitalWrite(row[5], HIGH);
    digitalWrite(col[3], thisPixel);
    digitalWrite(col[3], HIGH);
    thisPixel2 = pixels[1][7];
    digitalWrite(row[1], HIGH);
    digitalWrite(col[7], thisPixel2);


}

Voici le résultat http://www.messinmaisoui.org/Arduino/_DSC0184.JPG
Note 3 : Bon je teste 2 leds, mais j'en ai allumé 4, ça s'explique sans doute
*par les croisements lignes/colonnes, ça c'est pas un soucis ... *

Ma question du jour ... c'est pourquoi ceci m'affiche une led brillante
=>

    thisPixel = pixels[5][3];
    digitalWrite(row[5], HIGH);
    digitalWrite(col[3], thisPixel);

Alors que ceci me fait baisser la luminosité de la led en question !?
=>

    thisPixel = pixels[5][3];
    digitalWrite(row[5], HIGH);
    digitalWrite(col[3], thisPixel);
    digitalWrite(col[3], HIGH);

Ce qui est d'ailleurs pour moi (compte tenu de mon programme) équivalent à
=>

    digitalWrite(row[5], HIGH);
    digitalWrite(col[3], LOW);
    digitalWrite(col[3], HIGH);

Et la led devrait s'éteindre mais ça n'est pas le cas :o ...

Merci pour votre aide précieuse

Je n'ai pas regardé le code (comme d'habitude) juste le coté matériel.
Les diodes sont connectées entre entre deux sorties du micro et je pense qu'il doit y avoir des résistances de limitation de courant quelque part bien que je n'en ai pas vu.

  1. Si dans une des résistances de limitation il passe le courant d'une ou de deux diodes la tension aux bornes de cette résistance variera, un nouvel équilibre s'établira () et le courant qui traverse les dels sera différent .
    (
    ) la del n'est pas un composant linéaire, formellement la loi d'Ohm ne s'y applique pas.
    Ce qu'on fait généralement pour calculer une résistance de limitation c'est de dire que la tension de la del fait "à la louche" 2,4V par exemple. Pour ce cas précis " la louche " n'est pas assez précise et donc pas de loi d'Ohm.

  2. Résistance de saturation des transistors de sortie du micro.
    Le Rdson des transistors du micro est bien plus élevé que celui des transistors de puissance. Dans un micro on est dans le domaine des dizaines d'ohms, le Rdson n'est pas négligeable.
    Si une Del est connectée vers le Vcc (ou vers la masse) à travers un ou plusieurs transistors les Rdson seront mis en parallèle et le Rdson équivalent sera plus faible .
    NB : si effectivement il n'y a pas de résistances série avec les dels cela laisserait à penser soit que les diodes sont "spéciales", soit que dans l'exemple ils se servent des Rdson pour limiter le courant, soit les deux.

Comme les deux possibilités ont des comportements opposés il faudrait établir le schéma électrique avec les transistors complémentaires du micro et les résistances de limitation (extérieures ou incluse dans la matrice) pour donner une explication matérielle, (si cela provient effectivement du matériel).

Merci 68tjs,
Hum c'est un peu balaise pour moi comme explications :wink:

Mon schéma de branchement était le suivant messinmaisoui.org/Arduino/8x8.jpg
basé sur ce schéma http://familiemeier.ch/robertsblog/wp-content/uploads/2013/11/8x8_LED_Array-300x249.jpg

Au départ j'étais parti sur ce schéma ...


Mais en allumant toutes les led, les intensités n'étaient pas les mêmes d'où le changement de place des résistances ...

J'ai tracé le schéma à ma façon (surtout pas de cette %£$#& de Fritzing).
J'espère ne pas m'être trompé.
Je le joins en PJ.

J'ai seulement considéré les deux premières diodes de la première rangée
La première qui est connectée sur la matrice entre 13 et 9.
La seconde qui est connectée sur la matrice entre 3 et 9.

Premier câblage :
Comme tu peux le voir quand les sorties arduino D6 et D11 sont à l'état haut et D2 à l'état bas les deux diodes sont commandées et les courants des 2 diodes traversent la résistance de limitation de courant.
En conséquence le courant dans la résistance n'est pas le même quand une seule diode est commandée ou quand il y en a plusieurs (maxi 8 ).
Si le courant dans la résistance augmente sa tension augmente aussi et donc le courant dans les diodes devrait diminuer.
On ne peut pas calculer simplement le nouveau courant car l'équation I= f(V) d'une diode est une formule complexe qui n'a pas de solution autrement que graphiquement.

Deuxième câblage:
J'ai un soucis avec ton deuxième câblage, si je ne me suis pas trompé en établissant le schéma il y a une diode sans résistance série.

Dernier point la résistance Rdson.
Si le transistor était parfait, c'est à dire si le barreau conducteur du transistor n'avait aucune résistance résiduelle Rdson sera nul.

Malheureusement rien n'est parfait, un câble en cuivre possède toujours une petite résistance et le barreau conducteur du transistor xFet est résistif.
La valeur de la résistance résiduelle dépend principalement de sa section, c'est pour cela que les "gros" MosFet ont un Rdson très faible mais que les tous petits transistors de sortie d'un micro contrôleur ont un Rdson de l'ordre de plusieurs dizaine d'ohms.
On peut le voir sur cette courbe tirée de la datasheet du micro :
A 25 °C pour un courant de 20 mA on a une baisse du niveau haut de 0,5V ce qui correspond à un Rdson de 25 ohms.
C'est pareil mais dans l'autre sens pour le niveau bas qui ne descend pas en dessous de 0,5V.

Courant_max_atmega328p.png

matrice_diodes.pdf (5.88 KB)

Merci 68tjs !!!

ça c'est de la réponse !

Je vois ce message à l'instant et je vais regarder / analyser tout ça
et tenter de comprendre, sinon je reviens :wink: