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 :

Matrice Led 8x8 et state machine : problèmes


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai Avatar de Shtiderman
    Homme Profil pro
    Arts
    Inscrit en
    Février 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Arts

    Informations forums :
    Inscription : Février 2022
    Messages : 6
    Par défaut Matrice Led 8x8 et state machine : problèmes
    Bonjour, je suis en train de concevoir un dispositif avec un Arduino Uno, un bouton et une matrice led 8x8 soudée sur un module MAX7219.

    J'aimerais pouvoir charger différentes boucles animées sur l'arduino et passer de l'un à l'autre en pressant le bouton.

    Je vous montre le schematics ainsi que le code que j'ai développé en m'appuyant sur un cours traitant des State Machine et des corrections qu'on m'a données mais qui n'ont pas forcément fonctionné (le code compile néanmoins) et ce que j'ai trouvé sur un [générateur de sprites pour LedMatrix](https://xantorohara.github.io) :

    Pour le moment quand je charge le programme, je n'ai que mon state "default" qui se charge et qui boucle... le fait d'appuyer sur le bouton ne change rien.. avant tout ça j'étais arrivé à un point où mon bouton fonctionnait et permettait de passer d'un état à un autre mais il fallait appuyer avec un certain timing... et j'avais des glitch dans mes animations (surement du fait qu'elle ne comportent pas le même nombre de sprites)

    Est-ce que quelqu'un qui s'y connaît avec les LedMatrix 8x8 pourrait m'éclairer?

    Nom : Capture d’écran 2022-02-16 à 16.09.45.png
Affichages : 347
Taille : 145,7 Ko


    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
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    #include <LedControl.h>
    #include <MD_MAX72xx.h>
     
     
    //There will be 3 states, ONE, TWO, THREE, (+ one default called ZERO), each state is a sprite animation on the 8x8 LedMatrix,
    //with the push of a button the states will go from one to an other
    //Using a MAX7219
    // pin 12 is connected to the DataIn
    //pin 11 is connected to the CLK
    //pin 10 is connected to LOAD
    //pin 2 is connected to switch
    #define button 2
     
     
    LedControl display = LedControl(12, 11, 10, 1);
     
    int state = 0;              //integrer to hold current state
    int ButtonState = 0;        //take current button state
    int LastButtonState = 0;    //take last button state
    int ControlState = 0;       //take control unit status
     
    int old = 0;                //integrer to hold last state
    int buttonPoll = 0;         //integrer to hold button state
     
     
     
     
    const uint64_t ZERO[] PROGMEM = {
      0x3c4281818181423c,
      0x003c424242423c00,
      0x0000182424180000,
      0x0000001818000000,
      0x0000182424180000,
      0x0018244242241800,
      0x003c424242423c00,
      0x3c4281818181423c,
      0x6681810000818166,
      0x8100000000000081,
      0x4281000000008142
    };
    const int ZERO_LEN = sizeof(ZERO) / 8;
     
     
    const uint64_t ONE[] PROGMEM = {
      0x3c4201010101023c,
      0x3c0201010101423c,
      0x1c0201010181423c,
      0x0c0201018181423c,
      0x040201818181423c,
      0x000281818181423c,
      0x004081818181423c,
      0x204080818181423c,
      0x304080808181423c,
      0x384080808081423c,
      0x3c4080808080423c,
      0x3c4280808080403c,
      0x3c42818080804038,
      0x3c42818180804030,
      0x3c42818181804020,
      0x3c42818181814000,
      0x3c42818181810200,
      0x3c42818181010204,
      0x3c4281810101020c,
      0x3c4281010101021c
    };
    const int ONE_LEN = sizeof(ZERO) / 8;
     
    const uint64_t TWO[] PROGMEM = {
      0x0c0e0c0800000000,
      0x0002070f00000000,
      0x000000000f070200,
      0x00000000080c0e0c,
      0x0000000010307030,
      0x00000000f0e04000,
      0x0040e0f000000000,
      0x3070301000000000
    };
    const int TWO_LEN = sizeof(ZERO) / 8;
     
    const uint64_t THREE[] PROGMEM = {
      0x3c4299a5a599423c,
      0x0018244242241800,
      0x003c665a5a663c00
    };
    const int THREE_LEN = sizeof(ZERO) / 8;
     
    void setup() {
     
      pinMode (button, INPUT);        //button set as input
      display.shutdown(0, false);
      /* Set the brightness to a medium values */
      display.setIntensity(0, 7);
      /* and clear the display */
      display.clearDisplay(0);
    }
     
     
     
    void displayImage(uint64_t image) {
      for (int i = 0; i < 8; i++) {
        byte row = (image >> i * 8) & 0xFF;
        for (int j = 0; j < 8; j++) {
          display.setLed(0, i, j, bitRead(row, j));
        }
      }
    }
     
    int i = 0;
    void loop() {
      //debouncing routine to read button
      buttonPoll = digitalRead(button);                   //poll the state of button
      ButtonState;
      LastButtonState;
     
      if (ButtonState == LOW && LastButtonState == HIGH)
      { //check if it has been pressed
        ControlState = old + 1;                                   //increase state by 1
        i = 0;
        LastButtonState = ButtonState;
     
      }
     
      switch (state) {                         //react to button press & state
        case 1:                                // if state is 1
          //insert ONE
          /*wheel pattern */
          uint64_t one;
          memcpy_P(&one, &ONE[i], 8);
     
          displayImage(one);
          if (++i >= ONE_LEN ) {
            i = 0;
          }
     
     
          delay(100);
     
     
          old = state;
     
     
     
          break;
        case 2:
          uint64_t two;
          memcpy_P(&two, &TWO[i], 8);
     
          displayImage(two);
          if (++i >= TWO_LEN ) {
            i = 0;
          }
          delay(100);
     
     
          old = state;
     
     
     
          break;
        case 3:
          //insert THREE
          uint64_t three;
          memcpy_P(&three, &THREE[i], 8);
     
          displayImage(three);
          if (++i >= THREE_LEN ) {
            i = 0;
          }
          delay(100);
     
          old = state;
     
     
     
          break;
     
     
        default:
          //insert ZERO
          //if state is not 1,2,3
          uint64_t zero;
          memcpy_P(&zero, &ZERO[i], 8);
     
          displayImage(zero);
          if (++i >= ZERO_LEN ) {
            i = 0;
          }
          delay(100);
     
     
          old = 0;
     
     
     
          break;
     
     
     
     
      }
    }
    Je précise que je suis novice en Arduino mais que j'arrive à démêler pas mal de chose en regardant des sketchs et que j’espérais trouver plus de tutoriels ou de documentation concernant les Led à Matrice mais après plusieurs semaines à tourner en rond je bloque.. Je vois des projets bien plus compliqués fonctionner et des librairies qui regorgent de super effets (comme Parola) mais rien permettant d'incorporer proprement ses propres sprites/animations.

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    La variable state ne change jamais de valeur et vaut toujours 0, donc le denier case est toujours appelé.

    Pour info, "state machine" = "machine à états" en français.

    Au niveau du bouton, il faudra gérer les rebonds : Arduino : comment gérer les rebonds d’un interrupteur dans vos programmes ?

  3. #3
    Membre à l'essai Avatar de Shtiderman
    Homme Profil pro
    Arts
    Inscrit en
    Février 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Arts

    Informations forums :
    Inscription : Février 2022
    Messages : 6
    Par défaut
    Okay, j'ai mélangé un peu trop de sketchs je vais reprendre la state machine à zéro.

    Pour info mon premier sketch ressemblait à ça :

    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
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    #include <LedControl.h>
    #include <MD_MAX72xx.h>
     
     
    //There will be 3 states, ONE, TWO, THREE, (+ one default called ZERO), each state is a sprite animation on the 8x8 LedMatrix,
    //with the push of a button the states will go from one to an other
    //Using a MAX7219
    // pin 12 is connected to the DataIn
    //pin 11 is connected to the CLK
    //pin 10 is connected to LOAD
    //pin 2 is connected to switch
    #define button 2
     
     
    LedControl display = LedControl(12, 11, 10, 1);
     
    int state = 0;              //integrer to hold current state
    int old = 0;                //integrer to hold last state
    int buttonPoll = 0;         //integrer to hold button state
     
     
     
     
    const uint64_t ZERO[] PROGMEM = {
      0x3c4281818181423c,
      0x003c424242423c00,
      0x0000182424180000,
      0x0000001818000000,
      0x0000182424180000,
      0x0018244242241800,
      0x003c424242423c00,
      0x3c4281818181423c,
      0x6681810000818166,
      0x8100000000000081,
      0x4281000000008142
    };
    const int ZERO_LEN = sizeof(ZERO) / 8;
     
     
    const uint64_t ONE[] PROGMEM = {
      0x3c4201010101023c,
      0x3c0201010101423c,
      0x1c0201010181423c,
      0x0c0201018181423c,
      0x040201818181423c,
      0x000281818181423c,
      0x004081818181423c,
      0x204080818181423c,
      0x304080808181423c,
      0x384080808081423c,
      0x3c4080808080423c,
      0x3c4280808080403c,
      0x3c42818080804038,
      0x3c42818180804030,
      0x3c42818181804020,
      0x3c42818181814000,
      0x3c42818181810200,
      0x3c42818181010204,
      0x3c4281810101020c,
      0x3c4281010101021c
    };
    const int ONE_LEN = sizeof(ZERO) / 8;
     
    const uint64_t TWO[] PROGMEM = {
      0x0c0e0c0800000000,
      0x0002070f00000000,
      0x000000000f070200,
      0x00000000080c0e0c,
      0x0000000010307030,
      0x00000000f0e04000,
      0x0040e0f000000000,
      0x3070301000000000
    };
    const int TWO_LEN = sizeof(ZERO) / 8;
     
    const uint64_t THREE[] PROGMEM = {
      0x3c4e8d9999b1723c,
      0x3c46879db9e1623c,
      0x3c4287bffde1423c,
      0x3c4281ffff81423c,
      0x3c42e1f99f87423c,
      0x3c62f1b99d8f463c,
      0x3c72b199998d4e3c,
      0x3c5a999999995a3c
    };
    const int THREE_LEN = sizeof(ZERO) / 8;
     
    void setup() {
      pinMode (button, INPUT);        //button set as input
      display.shutdown(0, false);
      /* Set the brightness to a medium values */
      display.setIntensity(0, 7);
      /* and clear the display */
      display.clearDisplay(0);
    }
     
     
     
    void displayImage(uint64_t image) {
      for (int i = 0; i < 8; i++) {
        byte row = (image >> i * 8) & 0xFF;
        for (int j = 0; j < 8; j++) {
          display.setLed(0, i, j, bitRead(row, j));
        }
      }
    }
     
    int i = 0;
    void loop() {
      //debouncing routine to read button
      buttonPoll = digitalRead(button);    //poll the state of button
      if (buttonPoll == 1) {               //check if it has been pressed
        delay(10);                            //wait 50ms
        buttonPoll = digitalRead(button);     //poll button again
        if (buttonPoll == 0) {                //if it is 0 considered one press
          state = old + 1;                    //increase state by 1
        }
      }
      else {                                 //if button has not been pressed
        delay(10);                            //wait 50ms
      }
      switch (state) {                      //react to button press & state
        case 1:                                 // if state is 1
          //insert ONE
          /*wheel pattern */
          uint64_t one;
          memcpy_P(&one, &ONE[i], 8);
     
          displayImage(one);
          if (++i >= ONE_LEN ) {
            i = 0;
          }
     
     
          delay(100);
     
     
          old = state;
          break;
        case 2:
          uint64_t two;
          memcpy_P(&two, &TWO[i], 8);
     
          displayImage(two);
          if (++i >= TWO_LEN ) {
            i = 0;
          }
          delay(100);
     
     
          old = state;
          break;
        case 3:
          //insert THREE
          uint64_t three;
          memcpy_P(&three, &THREE[i], 8);
     
          displayImage(three);
          if (++i >= THREE_LEN ) {
            i = 0;
          }
          delay(100);
     
          old = state;
          break;
     
     
        default:
          //insert ZERO
          //if state is not 1,2,3
          uint64_t zero;
          memcpy_P(&zero, &ZERO[i], 8);
     
          displayImage(zero);
          if (++i >= ZERO_LEN ) {
            i = 0;
          }
          delay(100);
     
     
          old = 0;
          break;
     
     
     
     
      }
    }
    Je ne sais pas si c'était une meilleure base, en tout cas j'arrivais à de meilleurs résultats mais toujours avec des problèmes.

    Merci pour l'info sur les rebonds, je vais regarder ça!

  4. #4
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 644
    Par défaut En bref
    Bonjour,

    • J'ai simplifié et homogénéisé les noms. Comme ce sont des séquences d'image, state devient seq, i devient Img_n.
    • L'usage des pointeurs permet de réduire le code.
    • L'initialisation des tailles de séquence était fausse (toujours celle de la séquence 0).
    • Le bouton nécessitait de faire un appui et un relâché en 1/100 de seconde. Le code attend sagement que le bouton soit relâché avant de poursuivre (attention durant l'appui il n'y a plus d'animation). La séquence est alors incrémentée en boucle. On tire parti du fait que le nombre de séquences est une puissance de 2 (4), un nombre différent nécessiterait de revoir cette partie du code.
    • Quand on change de séquence, on repart de la première image (Img_n = 0). Sinon c'est assez dangereux. Par exemple, si on était sur l'mage 10 de la séquence 1, le passage à la séquence 2 qui n'a que 8 images est certainement très intéressant
    • Je propose aussi une alternative à displayImage() mais c'est une affaire de goût.

    Code C++ : 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
    85
    86
    #include <LedControl.h>
    #include <MD_MAX72xx.h>
     
    // Il y a 4 séquences, SEQ_0 (défaut), SEQ_1, SEQ_2, SEQ_3 qui animent un dessin sur la matrice 8x8
    // L'appui sur le bouton passe à la séquence suivante
    // Using a MAX7219
    // pin 12 is connected to the DataIn
    // pin 11 is connected to the CLK
    // pin 10 is connected to LOAD
    // pin 2 is connected to switch
    #define button 2
     
    LedControl display = LedControl(12, 11, 10, 1);
     
    int seq     = 0;                                 // n° de séquence active
    int Img_n   = 0;                                 // n° d'image dans la séquence
     
    const uint64_t SEQ_0[] PROGMEM = {
       0x3c4281818181423c,  0x003c424242423c00,  0x0000182424180000,  0x0000001818000000,
       0x0000182424180000,  0x0018244242241800,  0x003c424242423c00,  0x3c4281818181423c,
       0x6681810000818166,  0x8100000000000081,  0x4281000000008142
    };
     
    const uint64_t SEQ_1[] PROGMEM = {
       0x3c4201010101023c,  0x3c0201010101423c,  0x1c0201010181423c,  0x0c0201018181423c,
       0x040201818181423c,  0x000281818181423c,  0x004081818181423c,  0x204080818181423c,
       0x304080808181423c,  0x384080808081423c,  0x3c4080808080423c,  0x3c4280808080403c,
       0x3c42818080804038,  0x3c42818180804030,  0x3c42818181804020,  0x3c42818181814000,
       0x3c42818181810200,  0x3c42818181010204,  0x3c4281810101020c,  0x3c4281010101021c
    };
     
    const uint64_t SEQ_2[] PROGMEM = {
       0x0c0e0c0800000000,  0x0002070f00000000,  0x000000000f070200,  0x00000000080c0e0c,
       0x0000000010307030,  0x00000000f0e04000,  0x0040e0f000000000,  0x3070301000000000
    };
     
    const uint64_t SEQ_3[] PROGMEM = {
       0x3c4e8d9999b1723c,  0x3c46879db9e1623c,  0x3c4287bffde1423c,  0x3c4281ffff81423c,
       0x3c42e1f99f87423c,  0x3c62f1b99d8f463c,  0x3c72b199998d4e3c,  0x3c5a999999995a3c
    };
     
    const int SeqLens[4] = { sizeof(SEQ_0)/8, sizeof(SEQ_1)/8, sizeof(SEQ_2)/8, sizeof(SEQ_3)/8 };
     
    void setup() {
       pinMode (button, INPUT);                      // button set as input
       display.shutdown(0, false);
       display.setIntensity(0, 7);                   // Set the brightness to a medium values
       display.clearDisplay(0);                      // and clear the display
    }
     
    void displayImage(uint64_t image) {
       // for(int i = 0; i < 8; i++) {
       //    byte row = (image >> i * 8) & 0xFF;
       //    for(int j = 0; j < 8; j++) {
       //       display.setLed(0, i, j, bitRead(row, j));
       //    }
       // }
       int j = 0;                                    // Proposition
       for(int i = 0; i < 8; ) {                  
          display.setLed(0, i, j, image & 1);
          j = (j + 1) & 7;
          if(j == 0) ++i;
          image >>= 1;      
       }
    }
     
    void loop() {
       if(digitalRead(button) == 1) {                // Bouton appuyé ?
          do {                                       // Répéter
             delay(10);                              //    Attendre 10 ms
          } while(digitalRead(button) == 1);         // Jusqu'au relâché bouton (animation suspendue!)
          seq = (seq + 1) & 3;                       // n° de séquence suivant : 0, 1, 2, 3, 0, 1, 2... 
          Img_n = 0;                                 // La nouvelle séquence commence à 0
       }
     
       uint64_t *pImg;                                  
       switch (seq) {                                // Se placer sur la bonne image
          case 0: pImg = &SEQ_0[Img_n];       break;
          case 1: pImg = &SEQ_1[Img_n];       break;
          case 2: pImg = &SEQ_2[Img_n];       break;
          case 3: pImg = &SEQ_3[Img_n];    
       }
       displayImage(*pImg);                          // Voir l'image Img_n de la séquence active
       if(++Img_n >= SeqLens[seq]) Img_n = 0;        // Se placer sur l'image suivante (boucle)
       delay(100);
    }

    Ce code n'a pas été testé, il peut (doit ?) y avoir des scories.

    Salutations

  5. #5
    Membre à l'essai Avatar de Shtiderman
    Homme Profil pro
    Arts
    Inscrit en
    Février 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Arts

    Informations forums :
    Inscription : Février 2022
    Messages : 6
    Par défaut
    Ouah merci Guesset! tu as du y passer du temps, je suis hyper reconnaissant.



    Citation Envoyé par Guesset Voir le message
    Bonjour,


    *Le bouton nécessitait de faire un appui et un relâché en 1/100 de seconde. Le code attend sagement que le bouton soit relâché avant de poursuivre (attention durant l'appui il n'y a plus d'animation). La séquence est alors incrémentée en boucle. On tire parti du fait que le nombre de séquences est une puissance de 2 (4), un nombre différent nécessiterait de revoir cette partie du code.
    Je pensais que c'était fait pour pallier à un éventuel rebond sur le code que j'avais trouvé... Mais en vrai je n'ai pas vraiment de préférence sur la manière de faire du moment que l'état change avec l'appui du bouton.

    Citation Envoyé par Guesset Voir le message
    *Quand on change de séquence, on repart de la première image (Img_n = 0). Sinon c'est assez dangereux. Par exemple, si on était sur l'mage 10 de la séquence 1, le passage à la séquence 2 qui n'a que 8 images est certainement très intéressant
    ça j'avais compris que ça posait problème mais je n'avais pas idée où est-ce que je pouvais arranger ça.

    Citation Envoyé par Guesset Voir le message
    *Je propose aussi une alternative à displayImage() mais c'est une affaire de goût.
    Oui je comprends, après je n'ai pas de préférence non plus sur ça pour le moment vu mon niveau.. de la même façon que j'ai compris qu'il y avait plusieurs façon d'afficher les anim (const byte, const uint progmem etc).. je ne sais pas ce qui est le plus viable au final et je n'ai pas trouvé beaucoup de documentation là dessus...


    Merci pour le code, je vais tester tout ça

    Merci Jay M pour tes informations, tu soulèves un problème auquel je m'étais confronté sans avoir compris pourquoi et comment le contourner avec display image et les unint64_t..

  6. #6
    Membre à l'essai Avatar de Shtiderman
    Homme Profil pro
    Arts
    Inscrit en
    Février 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Arts

    Informations forums :
    Inscription : Février 2022
    Messages : 6
    Par défaut
    Du coup les animations glitchent mais j'ai l'impression que les passages avec le bouton se font plutôt bien! du coup c'est plutôt encourageant...

    En fait pour les glitchs c'est assez illisible mais j'ai l'impression que les anim font un pot pourri du code que je teste avant et de la dernière image que la matrice a affichée avant que je ne charge le nouveau... du coup j'imagine que c'est lié au fait d'utiliser PROGMEM pour afficher... je devrais peut-être essayer une façon plus simple octet par octet comme tu disais..
    Je regarde ce que j'arrive à bricoler mais j'avoue que je ne sais pas trop comment traduire ça sur les partie du code que je ne maitrise pas...

  7. #7
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 921
    Par défaut
    Gros boulot

    Un truc à modifier: Les données étant en mémoire flash, il faut utiliser une fonction spéciale pour aller lire les octets, vous ne pouvez pas juste faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       displayImage(*pImg);                          // Voir l'image Img_n de la séquence active
    comme il n'y a pas de fonctions pour lire des uint64_t prédéfinies dans avr/pgmspace.h, soit il faudra représenter et parcourir les données différemment, soit il faudra d'abord fabriquer un petit buffer de 8 octets avec memcpy_P() par exemple.

    ----

    Sinon cette partie du code peut rester sensible aux rebonds
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
       if(digitalRead(button) == 1) {                // Bouton appuyé ?
          do {                                       // Répéter
             delay(10);                              //    Attendre 10 ms
          } while(digitalRead(button) == 1);         // Jusqu'au relâché bouton (animation suspendue!)
          seq = (seq + 1) & 3;                       // n° de séquence suivant : 0, 1, 2, 3, 0, 1, 2... 
          Img_n = 0;                                 // La nouvelle séquence commence à 0
       }
    Parce que 10 est un peu short pour élminer les premiers rebonds sur bien des boutons. S'il y a un souci essayer avec 15 pour le délai au lieu de 10.

  8. #8
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 644
    Par défaut Aie
    Bonjour Jay,
    Citation Envoyé par Jay M Voir le message
    ...Un truc à modifier: Les données étant en mémoire flash, il faut utiliser une fonction spéciale pour aller lire les octets, vous ne pouvez pas juste faire displayImage(*pImg); comme il n'y a pas de fonctions pour lire des uint64_t prédéfinies dans avr/pgmspace.h, soit il faudra représenter et parcourir les données différemment, soit il faudra d'abord fabriquer un petit buffer de 8 octets avec memcpy_P() par exemple.
    Tu as raison . J'ai écrit cela un peu rapidement en oubliant au passage la déclaration PROGMEM. On peut aussi charger l'affichage de l'image de travailler octet par octet avec un code légèrement démarqué du code original (pas ma proposition de variante).
    ----

    Citation Envoyé par Jay M Voir le message
    ...Sinon cette partie du code peut rester sensible aux rebonds
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
       if(digitalRead(button) == 1) {                // Bouton appuyé ?
          do {                                       // Répéter
             delay(10);                              //    Attendre 10 ms
          } while(digitalRead(button) == 1);         // Jusqu'au relâché bouton (animation suspendue!)
          seq = (seq + 1) & 3;                       // n° de séquence suivant : 0, 1, 2, 3, 0, 1, 2... 
          Img_n = 0;                                 // La nouvelle séquence commence à 0
       }
    Parce que 10 est un peu short pour élminer les premiers rebonds sur bien des boutons. S'il y a un souci essayer avec 15 pour le délai au lieu de 10.
    J'étais prêt à mettre les délais à 20 ms quand j'ai vu que les commentaires du code initial faisaient état de 50 ms. Je me suis donc dit que la modification à 10 ms était justifiée par la qualité du bouton. J'avais aussi pensé inverser la commande pour économiser une résistance mais la paresse m'en a dissuadé.

    Salut

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. State machine generator
    Par zorg724 dans le forum BOUML
    Réponses: 0
    Dernier message: 16/12/2009, 18h19
  2. [LabVIEW 8.6][Débutant] State machine ?
    Par boulbi dans le forum LabVIEW
    Réponses: 0
    Dernier message: 31/03/2009, 15h04
  3. Génération de code State machine
    Par Bayard dans le forum BOUML
    Réponses: 2
    Dernier message: 03/02/2008, 12h03
  4. Problème states machine
    Par MENIER dans le forum BOUML
    Réponses: 3
    Dernier message: 10/10/2007, 09h43
  5. comment générer des state machine?
    Par firaponte dans le forum BOUML
    Réponses: 2
    Dernier message: 10/08/2007, 13h09

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