IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Arduino & matrice 8x8


Sujet :

Arduino

  1. #1
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    955
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 955
    Par défaut Arduino & matrice 8x8
    Bonjour ,

    j'ai réalisé un projet de Pong avec 2 joueurs
    à l'aide de Arduino Nano et une matrice 8x8
    si le prg fonctionne de façon satisfaisante, je souhaite y rajouter les scores des 2 joueurs
    sous cette forme Nom : 2020-10-21_11-58-19.jpg
Affichages : 286
Taille : 29,3 Ko

    mais je n'y arrive pas
    j'ai essayé de le faire sur croquis à part mais sans résultat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    // Chiffres de 0 à 9 du score ***************************************** 
     
    uint16_t Chiffre[10]= {111101101101111,010110010010111,111001111100111,111001011001111,
    100101111001001,111100111001111,111100111101111,
    111001001001001,111101111101111, 111101111001111};
     
    byte rows[8] = {9, 14, 8, 12, 1, 7, 2, 5};
    byte cols[8] = {13, 3, 4, 10, 6, 11, 15, 16};
    byte pins[16] = {5, 4, 3, 2, 14, 15, 16, 17, 13, 12, 11, 10, 9, 8, 7, 6};
    byte screen[8] = {0, 0, 0, 0, 0, 0, 0, 0};
     
    int sG = 0; // score du joueur gauche
    int sD = 0; // score du joueur droit
     
    void setup() {
      Serial.begin(9600);
      for (int i = 0; i < 8; i++)  {
        screen[i] = B11111111;
        delay(25);
      }
      for (int i = 0; i < 8; i++)  {
        screen[i] = B00000000;
        delay(25);
      }
    }
     
    void loop() {
      int tempo = 250 ;
      score(Chiffre,1000);
      delay(tempo);
    }
     
     
    // Affichage du score
    void score(uint16_t * image, unsigned long duree) {
    unsigned long debut = millis();  
    //Serial.println(Chiffre[sG]);
     
     
      for (int i = 0; i < 8; i++)  screen[i] = 0;
         for(int rows = 0; rows < 5; rows++){
             for(int cols = 0; cols < 3; cols++){
              boolean pixel = bitRead(image[0]*3,cols); 
              if (pixel == 1){
              on(rows,cols);
              }
            }
           }
    }
     
     
     void on(byte row, byte column) {
       screen[column-1] |= (B1<<(row-1));
    }

    merci par avance si vous pouviez m'aider à finir ce projet


    pascal

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    On ne représente pas du binaire comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     uint16_t Chiffre[10]= {111101101101111,010110010010111,111001111100111,111001011001111,
    100101111001001,111100111001111,111100111101111,
    111001001001001,111101111101111, 111101111001111};
    il faut mettre 0b devant les suites de 0 et 1 par exemple 0b111101101101111 (le compilateur doit vous mettre des messages, activez la version détaillée des warning dans les préférences)

  3. #3
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    955
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 955
    Par défaut
    merci pour la réponse Jay M
    j'ai corrigé un peu le croquis mais sans résultat probant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    // Chiffres de 0 à 9 du score ***************************************** 
     
    uint16_t Chiffre[10]= {0b111101101101111,0b010110010010111,0b111001111100111,0b111001011001111,
    0b100101111001001,0b111100111001111,0b111100111101111,
    0b111001001001001,0b111101111101111, 0b111101111001111};
     
    byte rows[8] = {9, 14, 8, 12, 1, 7, 2, 5};
    byte cols[8] = {13, 3, 4, 10, 6, 11, 15, 16};
    byte pins[16] = {5, 4, 3, 2, 14, 15, 16, 17, 13, 12, 11, 10, 9, 8, 7, 6};
    byte screen[8] = {0, 0, 0, 0, 0, 0, 0, 0};
     
    int sG = 0; // score du joueur gauche
    int sD = 0; // score du joueur droit
     
    void setup() {
      Serial.begin(9600);
      for (int i = 0; i < 8; i++)  {
        screen[i] = B11111111;
        delay(25);
      }
      for (int i = 0; i < 8; i++)  {
        screen[i] = B00000000;
        delay(25);
      }
    }
     
     
    void loop() {
      int tempo = 250 ;
      score(Chiffre[sG]);
      delay(tempo);
    }
     
     
    // Affichage du score
    void score(uint16_t * Chiffre) {
    unsigned long debut = millis();  
    //Serial.println(Chiffre[sG]);
    int x;
    int y;
    boolean v = 0;
     
      for(x = 0; x < 5; x++){
        for(y = 0; y < 3; y++){
             v = bitRead(Chiffre[sG],y*3+x) ;
             Serial.println(v);
             if (v=1) {
              on(x,y);
             }
         }
      }
    }
     
     void on(byte row, byte column) {
       screen[column-1] |= (B1<<(row-1));
    }

  4. #4
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    Vous n’avez pas de hardware en fait?

    A quoi servent les delay(25); des boucles for du setup et pourquoi faire deux boucles, la seconde efface le contenu du tableau de la première et il n’y a eu aucun "affichage" entre temps

    Attention à ne pas confondre assignation (=) et test d’égalité (==) dans

  5. #5
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    955
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 955
    Par défaut
    Vous n’avez pas de hardware en fait?
    Si, un Arduino Nano couplé à une matrice 8x8

    A quoi servent les delay(25); des boucles for du setup et pourquoi faire deux boucles, la seconde efface le contenu du tableau de la première et il n’y a eu aucun "affichage" entre temps
    Vous avez certainement raison , je pensais à une méthode d'initialisation de la matrice

    Attention à ne pas confondre assignation (=) et test d’égalité (==) dans
    J'ai corrigé mais au final il n'y toujours pas d'affichage


    pascal

  6. #6
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    Mais pourquoi y aurait il affichage?

    Ou sont les ordres d’affichage? Vous ne déclarez aucune pin en sortie, vous ne pilotez rien du tout... remplir un tableau qui s’appelle screen display ou écran n’a aucun effet externe particulier

    Quel est votre module 8x8? Y a t’il un driver? Utilisez éventuellement une bibliothèque existante

  7. #7
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    955
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 955
    Par défaut
    RE ...

    Historique
    N'ayant pas trop de connaissance dans ce domaine je me sui inspiré d'un exemple sur le net
    pour m'aider à comprendre le principe après bien des soucis de câblage il fonctionne
    Ce que j'essaie de faire maintenant c'est de reproduire la même chose dans mon projet
    à partir de Chiffre[10]


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    /*
      Tutoriel : Matrice de LEDs 8x8
      Affichage d'une image personnalisée (clignotement du nombre 42)
    */
     
    // Déclaration du tableau définissant l'image
    // Un bit à '0' correspont à une LED éteinte, un bit à '1' à une LED allumée
    byte fortyTwo[] =
    {
      B00000000,
      B00100000,
      B01100111,
      B10100001,
      B11110111,
      B00100100,
      B00000111,
      B00000000,
    };
     
    // Déclaration des pins utilisées pour le branchement de la matrice
    const int columnPins[] = {2, 3, 4, 5, 6, 7, 8, 9};
    const int rowPins[] = {10, 11, 12, 15, 16, 17, 18, 19};
     
    void setup()
    {
      // Utilisation d'une boucle for pour optimiser l'initialisation
      for (int i = 0; i < 8; i++)
      {
        pinMode(rowPins[i], OUTPUT);        // lignes en sorties
        pinMode(columnPins[i], OUTPUT);     // colonnes en sorties
     
        /* Optionnel - permet d'éviter un "scintillement" au démarrage du programme
        digitalWrite(columnPins[i], HIGH);  // déconnexion des cathodes de la masse
        */
      }
    }
     
    void loop()
    {
      // Délai entre deux affichages
      int tempo = 250 ;
      // Afficher le nombre pendant une seconde
      aff(fortyTwo, 1000);
      // ne rien afficher pendant la temporisation définie
      delay(tempo);
    }
     
    // Sous-routine pour la commande des LEDs à partir des données du tableau
    // Elle s'affiche pendant la durée donnée en second paramètre
    void aff(byte * image, unsigned long duree)
    {
      // On note le moment où l'on commence
     unsigned long debut = millis();
     // On joue la boucle tant qu'on n'a pas atteint la durée souhaitée
     while (debut + duree > millis())
      {
        // Première itération (boucle for) sur les lignes
        for(int row = 0; row < 8; row++)
        {
          // Connexion de la ligne au +5V
          digitalWrite(rowPins[row], LOW);
          // Seconde itération sur les colonnes
          for(int col = 0; col < 8; col++)
          {
            // Miroir sur le poids du bit pour avoir le bon numéro de colonne
            int situ = 7 - col;
            // Lecture du bit concerné
            boolean pixel = bitRead(image[row],col);
            // S'il est à un...
            if(pixel == 1)
            {
              // ...on connecte la colonne concernée à la masse pour allumer la LED
              digitalWrite(columnPins[situ], HIGH);
            }
            // On attend un peu entre chaque LED (délai total ~20ms pour 64 LEDs)
            delayMicroseconds(300);
            // Et on déconnecte la colonne de la masse...
            digitalWrite(columnPins[situ], LOW);
          }
          // ...puis la ligne de l'alimentation
          digitalWrite(rowPins[row], HIGH);
        }
      }
    }

    Ou sont les ordres d’affichage? Vous ne déclarez aucune pin en sortie,
    J'ai effectivement oublié
    et j'ai changé la méthode d'affichage

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    // Chiffres de 0 à 9 du score ***************************************** 
     
    uint16_t Chiffre[10]= {0b111101101101111,0b010110010010111,0b111001111100111,0b111001011001111,
    0b100101111001001,0b111100111001111,0b111100111101111,
    0b111001001001001,0b111101111101111, 0b111101111001111};
     
    byte rows[8] = {2, 3, 4, 5, 6, 7, 8, 9};
    byte cols[8] = {10, 11, 12, 15, 16, 17, 18, 19};
    byte pins[16] = {5, 4, 3, 2, 14, 15, 16, 17, 13, 12, 11, 10, 9, 8, 7, 6};
     
     
     
    void setup() {
       Serial.begin(9600);
       for (int i = 0; i < 8; i++)
      {
        pinMode(rows[i], OUTPUT); // lignes en sorties
        pinMode(cols[i], OUTPUT); // colonnes en sorties
      }
        Serial.begin(9600);
    }
     
    void loop() {
      int tempo = 250 ;
      score();
      delay(tempo);
    }
     
     
    // Affichage du score
    void score() {
    unsigned long debut = millis();  
     
    int x;
    int y;
    boolean v = 0;
     
      for(x = 0; x < 5; x++){
         digitalWrite(rows[x], LOW);
        for(y = 0; y < 3; y++)
        {
             int situ = 3 - y;
             v = bitRead(Chiffre[0],y) ;
             Serial.print("v=");
             Serial.println(v);
             if (v==1) {
              digitalWrite(cols[situ], HIGH);
              //delayMicroseconds(300);
              digitalWrite(cols[situ], LOW);
              Serial.print("x=");
              Serial.println(x);
              Serial.print("y=");
              Serial.println(y);
     
             }
          digitalWrite(rows[x], HIGH);   
         }
      }
    }

    Module : 1088AS

  8. #8
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    vous avez compris que le code d'exemple (qui a quelques défauts et les commentaires ne sont pas corrects) que vous donnez fonctionne sur la notion de persistance rétinienne?

    Pour peindre l'écran on procède ligne par ligne et colonne par colonne. Suivant comment est orienté le module, on met à 5V une ligne et à GND une colonne et ça crée un circuit qui allume la LED
    Nom : principe.png
Affichages : 221
Taille : 482,0 Ko
    (ou si le module est tourné on met à GND une ligne et on met à 5V une colonne)
    pour tous les circuits ainsi crées, la LED correspondante s'allume tour à tour en fonction de là où on met le GND

    On attend un peu pour que l'oeil ait le temps de percevoir la luminosité puis on éteint cette LED et on passe à la suivante, puis on remet la ligne à GND (ou 5V si le circuit est tourné) et on passe à la ligne suivante et on recommence.

    la fonction aff() prend en paramètre un tableau de 8 octets. Un bit à '0' correspont à une LED éteinte, un bit à '1' à une LED allumée.
    Nom : 42.png
Affichages : 248
Taille : 22,3 Ko

    Dans son code, l'auteur met successivement les lignes à GND (contrairement à ce que dit le commentaire)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        for(int row = 0; row < 8; row++)
        {
          // Connexion de la ligne au +5V GND
          digitalWrite(rowPins[row], LOW);
    et on met à HIGH successivement les colonnes de cette lignes dont le pixel doit être allumé créant ainsi le circuit qui allume la LED à l'intersection de cette ligne et colonne puis l'éteint après une petite attente. C'est ce que fait cette boucle for (les commentaires sont erronés)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
          for (int col = 0; col < 8; col++)
          {
            // Miroir sur le poids du bit pour avoir le bon numéro de colonne
            int situ = 7 - col;
            // Lecture du bit concerné
            boolean pixel = bitRead(image[row], col);
            // S'il est à un...
            if (pixel == 1)
            {
              // ...on connecte la colonne concernée à la masse 5V pour allumer la LED
              digitalWrite(columnPins[situ], HIGH);
            }
            // On attend un peu entre chaque LED (délai total ~20ms pour 64 LEDs)
            delayMicroseconds(300);
            // Et on déconnecte la colonne de la masse... On remet à la masse
            digitalWrite(columnPins[situ], LOW);
          }

    pour l'appliquer à votre cas, vous n'avez pas un bitmap avec tous les score possibles (il en faudrait 100 de 0-0 à 9-9 je suppose). Il vous faudrait définir sans doute dans une matrix 3x5 le bitmap pour les chiffres de 0 à 9, voici un exemple
    Nom : bitmaps.png
Affichages : 442
Taille : 32,1 Ko

    et vous voulez construire dynamiquement le score. Il faudra donc calculer un petit tableau de 8 octets dont vous aurez rempli les bits à partir des bitmaps des scores des 2 adversaires en positionnant les bit en haut à gauche pour le premier et en bas à droite pour le second
    Nom : zones.png
Affichages : 421
Taille : 15,2 Ko
    donc un peu de maths à effectuer pour trouver les bons bits sur lesquels copier les bits du bitmap. Rien de compliqué puisque les tableau 3x5 va toujours au même endroit.

    Ensuite vous appelez la fonction aff() qui existe dans le code d'exemple avec ce tableau et ça va fonctionner.


    PS/ pour éviter des soucis de rollover si d'aventure le module devait tourner 50 jours au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      // On note le moment où l'on commence
      unsigned long debut = millis();
      // On joue la boucle tant qu'on n'a pas atteint la durée souhaitée
      while (debut + duree > millis())
    il faut écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      // On note le moment où l'on commence
      unsigned long debut = millis();
      // On joue la boucle tant qu'on n'a pas atteint la durée souhaitée
      while (millis() - debut < duree)
    Même si mathématiquement ça semble identique, ça trait le rollover correctement (quand millis() retombera à zéro dans une cinquantaine de jours)

  9. #9
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    955
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 955
    Par défaut
    j'ai donc refait le prg test suivant vos conseils

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    // Chiffres de 0 à 9 du score ***************************************** 
     
    uint16_t Chiffre[10]= {0b111101101101111,0b010110010010111,0b111001111100111,0b111001011001111,
    0b100101111001001,0b111100111001111,0b111100111101111,
    0b111001001001001,0b111101111101111, 0b111101111001111};
     
    byte rows[8] = {2, 3, 4, 5, 6, 7, 8, 9};
    byte cols[8] = {10, 11, 12, 15, 16, 17, 18, 19};
    //byte pins[16] = {5, 4, 3, 2, 14, 15, 16, 17, 13, 12, 11, 10, 9, 8, 7, 6};
     
     
     
    void setup() {
       Serial.begin(9600);
       for (int i = 0; i < 8; i++)
      {
        pinMode(rows[i], OUTPUT); // lignes en sorties
        pinMode(cols[i], OUTPUT); // colonnes en sorties
      }
        Serial.begin(9600);
    }
     
    void loop() {
      //int tempo = 250 ;
      score(Chiffre[0],1000);
      //delay(tempo);
    }
     
    // Affichage du score
    void score(uint16_t Chiffre[],unsigned long duree) {
      int x;
      int y;
      boolean v = 0;
      unsigned long debut = millis();
      while (millis() - debut < duree)
      {
         for(x = 0; x < 8; x++) 
         {
         digitalWrite(rows[x], LOW); // Connexion de la ligne à GND
           for(y = 0; y < 8; y++) // Colonne de 1 à 3 
           {
             int situ = 7-y;
             v = bitRead(Chiffre[0],y) ;
             Serial.print("v=");
             Serial.println(v);
             if (v==1) {
                  digitalWrite(cols[situ], HIGH);  // on connecte la colonne au +5v pour allumer la LED
                  delayMicroseconds(300);
                  digitalWrite(cols[situ], LOW); // On remet à la masse
             }
           }
         digitalWrite(rows[x], HIGH); 
         }
      } 
    }
    le résultat se traduit par un "balayage" (?) de gauche à droite de toutes les Leds malgré
    la validation de "v" qui change pourtant de la valeur suivant => Chiffre[0] = {0b111101101101111}

  10. #10
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    Regardez ce que vous dit le compilateur (activez tous les warnings dans les préférences)

    votre fonction score
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void score(uint16_t Chiffre[],unsigned long duree) {
    attend un tableau de uint16_t

    vous l'appelez comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     score(Chiffre[0],1000);
    avec un uint16_t et pas un tableau...

    que représentent vos uint16_t ? 15 bits significatifs pour un tableau 5x3 ?

  11. #11
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    955
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 955
    Par défaut
    Je dois donc mettre Chiffre[0] dans une variable ?
    puis appeler cette variable byte dans ma sous-routine

    si oui j'avoue que je ne sais pas faire

  12. #12
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    Comme dit auparavant, Gardez la fonction d’origine qui affiche les bits d’un tableau de 8 octets et construisez ce tableau en copiant les bits du modèle de chiffre au bon endroit

    Vous ne m’avez pas répondu sur cela: que représentent vos uint16_t ? 15 bits significatifs pour un tableau 5x3 ?

  13. #13
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    955
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 955
    Par défaut
    Vous ne m’avez pas répondu sur cela: que représentent vos uint16_t ? 15 bits significatifs pour un tableau 5x3 ?
    oui , 15bits par chiffre de 0 à 9

    dans la matrice je dois pour y incorporer mes 2 chiffres
    l'un appelé sG composé de 5x3 bits en position 0,0
    et l'autre sD en position 5,3

  14. #14
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    J’ai pas regardé en détail ce que vous faites des bits mais en supposant que c’est correct déclarez la fonction comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     void score(uint16_t chiffre,unsigned long duree) {
    et au lieu de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     v = bitRead(Chiffre[0],y) ;
    faites
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    v = bitRead(chiffre,y) ;
    puisque vous passez déjà la valeur en paramètre de la fonction

    Mais ça ne suffit pas pour afficher les 2 scores

  15. #15
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    955
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 955
    Par défaut
    merci pour ces informations

    mais çà ne fonctionne toujours pas

  16. #16
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    Ma supposition n’était donc pas bonne

    Ça ne marche pas ne veut pas dire grand chose. Que constatez vous? Avez vous essayé d’afficher les bits sur le moniteur série? etc...

  17. #17
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    Je vous suggère de modifier votre code pour qu’il reprenne la fonction d’affichage de votre exemple sur un buffer de 8 octets.

    Votre code doit appeler dans cesse cet affichage mais de temps en temps modifiez le buffer en copiant les bits des 10 chiffres aux bons endroit. Faites 2 fonctions scoreJoueurG(byte v) et une autre scoreJoueurD(byte v) qui prennent en paramètre une valeur entre 0 et 9 qui est le chiffre à afficher à Gauche ou à Droite. Ces fonctions devront aller lire les 15 bits de votre dessin dans Chiffre[v] et les mettre au bon endroit dans le buffer de 8 octets dédié à l’affichage.

    Vous essayez et postez cela et on vous aidera à améliorer le tout

  18. #18
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    955
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 955
    Par défaut
    Bonjour ,

    Encore merci pour votre patience

    j'ai refait le croquis comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    // Chiffres de 0 à 9 du score ***************************************** 
    uint16_t Chiffre[1]= {010110010010111};
     
    //uint16_t Chiffre[10]= {0b111101101101111,0b010110010010111,0b111001111100111,0b111001011001111,
    //0b100101111001001,0b111100111001111,0b111100111101111,
    //0b111001001001001,0b111101111101111, 0b111101111001111};
     
    byte rows[8] = {2, 3, 4, 5, 6, 7, 8, 9};
    byte cols[8] = {10, 11, 12, 15, 16, 17, 18, 19};
     
    int sG; // score joueur gauche
     
    void setup() {
       Serial.begin(9600);
       for (int i = 2; i <= 12; i++)  pinMode(i, OUTPUT);
       for (int i = 15; i <= 19; i++)  pinMode(i, OUTPUT);
     
       for (int i = 0; i < 8; i++)
      {
        pinMode(rows[i], OUTPUT); // lignes en sorties
        pinMode(cols[i], OUTPUT); // colonnes en sorties
      }
    }
     
    void loop() {
      int tempo = 250 ;
      sG = 1 ;
      scoreGauche(sG);
      delay(tempo);
    }
     
    // Affichage du score Gauche
    void scoreGauche(int sG) {
      // Position du score en 0,0
      int x = 0;
      int y = 0 ;
      boolean v = 0;
        {
         for(x = 0; x < 5; x++) // Colonne de 1 à 5
         {
         digitalWrite(rows[x], LOW); // Connexion de la ligne à GND
           for(y = 0; y < 3; y++) // Colonne de 1 à 3 
           {
             int situ = 7-y;
            v = bitRead(Chiffre[sG],y) ;
            if (v==1) {
                  digitalWrite(cols[situ], HIGH);  // on connecte la colonne au +5v pour allumer la LED
                  delayMicroseconds(300);
                  digitalWrite(cols[situ], LOW); // On remet à la masse
            }
           }
         digitalWrite(rows[x], HIGH); 
         }
      } 
    }
    avec sG ( score du joueur gauche) = 1
    créé une fonction scoreGauche(int sG)
    ( le moniteur montre que la variable "v" suit les valeurs de Chiffre[sG] ( ici Chiffre[1] )

    et le résultat est le suivant (?) :

    Nom : 2020-10-25_10-40-11.jpg
Affichages : 209
Taille : 37,2 Ko



    pascal

  19. #19
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    Comme je vous l’ai proposé bâtissez la représentation dans un buffer de 8 octets. N’essayez pas d’afficher directement ça va vous compliquer la vie quand vous aurez l’autre score à gérer.

  20. #20
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    Voici un exemple de structure de code à explorer et compléter:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    // Déclaration du tableau définissant l'image
    // Un bit à '0' correspont à une LED éteinte, un bit à '1' à une LED allumée
    byte bitmapEcran[8]; // 8 octets, initialisé à zéro par défaut
    
    // pour faire "lisible" on ne condense pas les 15 bits sur 2 octets, on va en utiliser 5. à optimiser plus tard
    // les chiffres de 0 à 9 dans une matrice de 3x5
    const byte lesChiffres[][5] =
    {
      {0b111, 0b101, 0b101, 0b101, 0b111},    // 0
      {0b010, 0b110, 0b010, 0b010, 0b010},    // 1
      {0b111, 0b001, 0b010, 0b100, 0b111},    // 2
      {0b111, 0b001, 0b011, 0b001, 0b111},    // 3
      {0b101, 0b101, 0b111, 0b001, 0b001},    // 4
      {0b111, 0b100, 0b111, 0b001, 0b111},    // 5
      {0b100, 0b100, 0b111, 0b101, 0b111},    // 6
      {0b111, 0b001, 0b011, 0b001, 0b001},    // 7
      {0b111, 0b101, 0b111, 0b101, 0b111},    // 8
      {0b111, 0b101, 0b111, 0b001, 0b001},    // 9
    };
    
    // Déclaration des pins utilisées pour le branchement de la matrice
    const int columnPins[] = {2, 3, 4, 5, 6, 7, 8, 9};
    const int rowPins[] = {10, 11, 12, 15, 16, 17, 18, 19};
    
    // on remplit les bit 7 6 5 des octets 0,1,2,3 et 4 de bitmapEcran  en fonction des bits 2 1 et 0 des octets lesChiffres[valeur][0->4]
    void scoreJoueurGauche(byte valeur)
    {
      for (int8_t ligne = 0; ligne < 5; ligne++) {
        for (int8_t bit = 7; bit > 4; --bit) {
          // à faire en utilisant bitRead, bitSet ou bitClear
        }
      }
    }
    
    // on remplit les bit 2 1 0 des octets 3,4,5,6 et 7 de bitmapEcran en fonction des bits 2 1 et 0 des octets lesChiffres[valeur][0->4]
    void scoreJoueurDroite(byte valeur)
    {
      for (int8_t ligne = 3; ligne < 8; ligne++) {
        for (int8_t bit = 2; bit >= 0; --bit) {
          // à faire en utilisant bitRead, bitSet ou bitClear
        }
      }
    }
    
    // Sous-routine pour la commande des LEDs à partir des données du tableau
    void afficherEcran(byte * bitmap)
    {
      for (byte row = 0; row < 8; row++) {                                              // Première itération (boucle for) sur les lignes
        digitalWrite(rowPins[row], LOW);                                                // Connexion de la ligne au GND
        for (byte col = 0; col < 8; col++) {                                            // Seconde itération sur les colonnes
          byte situ = 7 - col;                                                          // Miroir sur le poids du bit pour avoir le bon numéro de colonne
          if (bitRead(bitmap[row], col) == 1) digitalWrite(columnPins[situ], HIGH);     // si bit à 1 on allume cette LED
          delayMicroseconds(300);                                                       // On attend un peu entre chaque LED (délai total ~20ms pour 64 LEDs)
          digitalWrite(columnPins[situ], LOW);                                          // Et on reconnecte la colonne de la masse...
        }
        digitalWrite(rowPins[row], HIGH);                                               // et en fin,  la ligne de l'alimentation
      }
    }
    
    void setup()
    {
      // On met toutes les pins en sortie
      for (byte i = 0; i < 8; i++)  {
        pinMode(rowPins[i], OUTPUT);        // lignes en sorties
        pinMode(columnPins[i], OUTPUT);     // colonnes en sorties
      }
      // par exemple mettre des scores
      scoreJoueurGauche(2);
      scoreJoueurDroite(5);
    }
    
    void loop()
    {
      afficherEcran(bitmapEcran);  // à effectuer souvent, c'est la persistence rétinienne qui permet de voir les chiffres
    
      // vous pouvez coder autre chose ici mais il ne faut pas que ce soit bloquant
    }
    (en supposant que le code de l'exemple fonctionnait pour vous)

    J'ai mis (je pense) dans le tableau lesChiffres[][5] les bits qui correspondent à ces dessins

    ce n'est pas la représentation optimale vu qu'on prend 5 octets par chiffre alors que 2 pourraient suffire, mais c'est pour simplifier pour le moment. il sera toujours temps d'optimiser cela plus tard si vous manquez de RAM.

    dans les fonctions en orange (qu'il vous faut finaliser) vous devez remplir la bonne zone de bit du tableau bitmapEcran, comme indiqué dans ma figure


    dans le setup j'appelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      scoreJoueurGauche(2);
      scoreJoueurDroite(5);
    donc on devrait voir à l'écran 2 à 5 comme score.

    j'ai tapé cela rapidement ici sans tester, en me basant sur l'exemple que vous aviez dit être fonctionnel pour vous. il y peut-être des typos, l'important c'est de comprendre le principe de structuration du code.

Discussions similaires

  1. Transformer une matrice 255x255 en sous-matrices 8x8
    Par omar-malek dans le forum MATLAB
    Réponses: 3
    Dernier message: 02/04/2008, 17h26
  2. Multiplication rapide de deux matrices 8x8
    Par progfou dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 28/05/2006, 16h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo