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 :

Calcul automatique du nombre de Leds


Sujet :

Arduino

  1. #21
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 598
    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 598
    Par défaut
    Bonjour,

    La solution de mesure du courant peut fonctionner avec l'approche dichotomique en envoyant une chaîne de couleur à 0 sauf la dernière blanche (entre 40 et 60 mA selon l'efficacité des LEDs utilisées).

    Avantage : le capteur de courant peut être très proche du MPU ce qui n'est pas nécessairement le cas du dernier Dout (et on balade de l'ordre de 800 kHz).

    Inconvénient : un capteur en plus et un shunt de 0.1 Ohm qui avec, par exemple, 200 LEDs blanches à 60 mA soit 12 A induira une baisse de tension de 1,2 V et une dissipation de 7,.2W dans le shunt. On pourrait mettre un interrupteur qui court-circuite le shunt ou envoie le 5V sur une entrée du MPU (via un pont si en 3.3 V) pour lui signaler de faire la mesure.
    Nom : Compte LEDs.png
Affichages : 182
Taille : 277,9 Ko

    5V ou 3.3V vers l'entrée du MPU lui indique qu'il doit faire un nouveau décompte. La résistance de 18k passe à 0 si 5 Volt.

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  2. #22
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    936
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 936
    Par défaut
    Salut Guesset

    Juste pour commencer le programme
    https://wokwi.com/projects/425847120457171969

    ( je n'ai pas trouvé le module INA219 )

  3. #23
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 598
    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 598
    Par défaut
    Bonjour Pascal,

    Le programme allume la dernière LED. Les instructions de mise à 0 des autres couleurs ne servent à rien car c'est ce que fait le Clear.

    L'avantage d'un anneau est que la fin est proche du début Donc le retour du Dout pose moins de problème de transport de fréquences relativement hautes. En arrivant sur une interruption sur front montant qui passe un flag, bOver par exemple, à true puis se désactive (pas indispensable mais plus propre), on peut détecter si le nombre de couleurs envoyés dépasse le N. bOver est mis à false avant le lancement d'un envoi test.

    Salut.
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  4. #24
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    936
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 936
    Par défaut
    Salut Guesset

    je voulais juste ajouter une précision, en effet le projet est de donner "l'apparence" d'un circuit
    et qui dit circuit, suppose une boucle dont de façon "physique" le dernier DOut de la dernière Led sera proche de la première Led
    il est vrai qu'à 800kHz çà fait quand même une belle antenne

    pascal

  5. #25
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    936
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 936
    Par défaut
    Citation Envoyé par Guesset Voir le message
    Bonjour Pascal,

    En arrivant sur une interruption sur front montant qui passe un flag, bOver par exemple, à true puis se désactive (pas indispensable mais plus propre), on peut détecter si le nombre de couleurs envoyés dépasse le N. bOver est mis à false avant le lancement d'un envoi test.

    Salut.
    Bonjour Guesset
    Pourrais-tu stp me dire comment faire pour détecter ce front montant sur DOut , j'avoue ne pas saisir la manip à faire

    dans l'exemple j'ai raccordé l'entrée 7 sur l'arduino
    Est-ce chaque couleur envoyée qui applique un front montant sur DOut ou est-ce seulement la dernière couleur activée ?

    pascal

  6. #26
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 152
    Billets dans le blog
    47
    Par défaut
    Citation Envoyé par cobra38 Voir le message
    Est-ce chaque couleur envoyée qui applique un front montant sur DOut ou est-ce seulement la dernière couleur activée ?
    A l'allumage ou après un signal Reset, quand une Led reçoit 24 bits (composantes RVB), elle s'en sert pour s'allumer à la couleur demandée. Si elle reçoit un autre paquet de 24 bits, elle reconditionne les signaux et les envoie sur sa sortie Dout vers la Led suivante (principe de la patate chaude, tu passes à ton voisin...)

    Si des signaux se présentent à la sortie de la dernière Led, c'est que toutes les leds du ruban ont déjà été activées. Tu peux même commander d'éteindre les leds avec R=V=B=0 pendant la phase d'apprentissage du nombre de leds étant donné que c'est la largeur de l'impulsion qui code les 0 et les 1, il y aura des fronts à détecter.

  7. #27
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 890
    Par défaut
    voilà un code de test (que je n'ai pas pu testé)

    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
     
    #include <FastLED.h>
     
    const size_t MAX_NB_LEDS = 50;
    const byte stripInPin = 2;
    const byte stripOutPin = 3;
    volatile bool endOfStripActivated = false;
     
    CRGB leds[MAX_NB_LEDS];
     
    void endOfStrip() {
      endOfStripActivated = true;
      detachInterrupt(digitalPinToInterrupt(stripOutPin));
    }
     
    void setup() {
      pinMode(stripOutPin, INPUT);
      FastLED.addLeds<NEOPIXEL, 2>(leds, 0, MAX_NB_LEDS);
      Serial.begin(115200);
     
      for (int i = 0; i < MAX_NB_LEDS; i++) leds[i] = CRGB::Black;
      FastLED.show();
     
      detachInterrupt(digitalPinToInterrupt(stripOutPin));  // Désactiver toute interruption en attente
      attachInterrupt(digitalPinToInterrupt(stripOutPin), endOfStrip, RISING);
     
      for (int i = 0; i < MAX_NB_LEDS; i++) {
        leds[i] = CRGB::White;
        FastLED.show();
        if (endOfStripActivated) { // la lecture est atomique et on a désactivé l'interruption
          Serial.print("Fin du bandeau i=");
          Serial.println(i);
          break;
        }
        leds[i] = CRGB::Black;
        delay(100);
      }
    }
     
    void loop() {}
    Le bandeau est sur la pin 2 et son DOUT sur la pin 3 et on déclare 50 LEDs possible même si le bandeau disons en a 30.

    Le code allume en blanc une à une les LEDs tout en ayant les interruptions activées donc si on voit une activité sur DOUT, l'interruption est déclenchée et elle met le drapeau à vrai et désactive cette interruption. La loop reprend alors la suite et voit que le drapeau est passé à vrai et affiche le compte...

    Je n'ai pas regardé la doc des neopixels cependant pour voir si autre chose que la couleur était passée sur DOUT. Dans ce cas, ça ne fonctionnera pas même en affichant du noir (que des 0 donc pas de RISING)

    Peut-être faut il la pin en INPUT_PULLUP; je ne sais pas si DOUT n'est pas flottante. Dans ce cas ce serait HIGH par défaut et il faudrait attendre un LOW, donc mettre le bandeau à blanc d'abord puis ensuite envoyer du noir ?

    bref - faut creuser la spec....

  8. #28
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 152
    Billets dans le blog
    47
    Par défaut
    Citation Envoyé par Jay M Voir le message
    Je n'ai pas regardé la doc des neopixels cependant pour voir si autre chose que la couleur était passée sur DOUT. Dans ce cas, ça ne fonctionnera pas même en affichant du noir (que des 0 donc pas de RISING)
    Voici comment sont codés les 0 et les 1 dans le protocole :
    Nom : sequence-chart.jpg
Affichages : 131
Taille : 18,4 Ko

    Un signal à l'état bas pendant plus de 50us équivaut à un Reset. Il y aura donc des fronts montants même en ne passant que des 0.
    Sinon le signal n'est constitué que des 24 bits des composantes RVB pour chaque Led. S'il y a plus de 24 bits, c'est passe à ta led voisine...

  9. #29
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 152
    Billets dans le blog
    47
    Par défaut
    Il faut espérer que la librairie FastLED n'empêche pas les interruptions...

  10. #30
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 890
    Par défaut
    Si elle les bloque mais dans l’absolu ce n’est pas grave puisque le flag sera activé et sera vu après le show()

    Au lieu d’afficher tout le bandeau théorique il faut peut être demander un show() partiel

  11. #31
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 766
    Par défaut
    Hello,

    @Jay M: lignes 13 et 25, ne serait-ce pas plutôt stripInPin ?
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent ;)

  12. #32
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 890
    Par défaut
    @Jay M: lignes 13 et 25, ne serait-ce pas plutôt stripInPin
    Non, stripInPin est la pin qui envoie les data au bandeau LED

    on veut recevoir un signal sous forme d'interruption quand la pin qui est la sortie du bandeau (le OUT de la dernière LED) essaye de propager un signal à la LED suivante qui n'existe pas, donc c'est bien stripOutPin qu'il faut utiliser comme pin de surveillance des interruptions.

  13. #33
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 766
    Par défaut
    Merci de ta réponse, j'ai donc mal interprété le nom de la variable....
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent ;)

  14. #34
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    936
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 936
    Par défaut
    Bonjour à tous,

    J'ai mis le code de Jay M sur le wokwi
    https://wokwi.com/projects/425847120457171969

    mais je ne trouve que :
    "Fin du bandeau i=0"
    le programme ne passe pas à i+1 puisqu'il trouve une interruption pour chaque led semble-t-il mais j'ai du mal configuré tout çà

    si je mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void endOfStrip() {
      endOfStripActivated = false;
      detachInterrupt(digitalPinToInterrupt(stripOutPin));
    }
    on observe que les interruptions continuent au delà de 16
    votre avis svp ?

  15. #35
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 152
    Billets dans le blog
    47
    Par défaut
    Citation Envoyé par Jay M Voir le message
    voilà un code de test (que je n'ai pas pu testé)

    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
     
    #include <FastLED.h>
     
    const size_t MAX_NB_LEDS = 50;
    const byte stripInPin = 2;
    const byte stripOutPin = 3;
    volatile bool endOfStripActivated = false;
     
    CRGB leds[MAX_NB_LEDS];
     
    void endOfStrip() {
      endOfStripActivated = true;
      detachInterrupt(digitalPinToInterrupt(stripOutPin));
    }
     
    void setup() {
      pinMode(stripOutPin, INPUT);
      FastLED.addLeds<NEOPIXEL, 2>(leds, 0, MAX_NB_LEDS);
      Serial.begin(115200);
     
      for (int i = 0; i < MAX_NB_LEDS; i++) leds[i] = CRGB::Black;
      FastLED.show();
     
      detachInterrupt(digitalPinToInterrupt(stripOutPin));  // Désactiver toute interruption en attente
      attachInterrupt(digitalPinToInterrupt(stripOutPin), endOfStrip, RISING);
     
      for (int i = 0; i < MAX_NB_LEDS; i++) {
        leds[i] = CRGB::White;
        FastLED.show();
        if (endOfStripActivated) { // la lecture est atomique et on a désactivé l'interruption
          Serial.print("Fin du bandeau i=");
          Serial.println(i);
          break;
        }
        leds[i] = CRGB::Black;
        delay(100);
      }
    }
     
    void loop() {}
    En fait, quand tu écris FastLED.addLeds<NEOPIXEL, 2>(leds, 0, MAX_NB_LEDS);, tu déclares un ruban de 50 leds, et la méthode show() va systématiquement écrire sur les 50 leds du ruban. L'interruption va donc se déclencher dès le premier passage dans la boucle.

    J'ai trouvé qu'avec FastLED[0].setLeds(leds, currentNbLeds);, on pouvait dynamiquement limiter le nombre de leds actives du ruban. Je ferai des essais quand wokwi voudra bien compiler mes programmes dans un temps raisonnable, leur serveur a l'air débordé...

  16. #36
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 152
    Billets dans le blog
    47
    Par défaut
    Je pense avoir réussi avec ce code avec wokwi :
    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
    #include <FastLED.h>
     
    const size_t MAX_NB_LEDS = 50; 
    const byte stripInPin = 2;      // Pin d'entrée (DIN du ruban)
    const byte stripOutPin = 3;     // Pin de sortie (DOUT dernière LED)
    volatile bool endOfStripActivated = false;
     
    CRGB leds[MAX_NB_LEDS];
    int currentNbLeds = 1;       // Nombre de LEDs actives au départ
     
    void endOfStrip() {
      endOfStripActivated = true;
      detachInterrupt(digitalPinToInterrupt(stripOutPin));  // Désactive l'interruption
    }
     
    void setup() {
      pinMode(stripOutPin, INPUT);  // Configure Dout comme entrée
      FastLED.addLeds<NEOPIXEL, stripInPin>(leds, MAX_NB_LEDS);  // Taille maximale
      Serial.begin(115200);
    }
     
    void loop() {
      // Limite dynamiquement la plage active
      FastLED[0].setLeds(leds, currentNbLeds);
     
      // Allumer les LEDs actives
      for (int i = 0; i < currentNbLeds; i++) {
        leds[i] = CRGB::White;  // Active les LEDs blanches
      }
     
      // Attache l'interruption pour détecter la fin du ruban
      attachInterrupt(digitalPinToInterrupt(stripOutPin), endOfStrip, RISING);
      delay(10);
      FastLED.show();  // Envoie les données aux Leds actives
      delay(50);
     
      // Vérifie si la fin a été atteinte
      if (endOfStripActivated) {
        Serial.print("Fin du bandeau i=");
        Serial.println(currentNbLeds);
        endOfStripActivated = false;
        while (true);
      } else if (currentNbLeds < MAX_NB_LEDS) {
        // Si non atteint, incrémenter
        currentNbLeds++;
      } else {
        Serial.println("Toutes les Leds sont détectées.");
        while (true);
      }
    }
    50 leds au maxi, puis j'ai le message : Fin du bandeau i= 17

    Ce qui est conforme à l'attendu avec cet anneau de 16 leds.

  17. #37
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    936
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 936
    Par défaut
    Bonjour à tous

    Encore un grand merci pour votre aide
    le but semble bien atteint effectivement

    f-leb
    J'ai modestement modifié ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     FastLED[0].setLeds(leds, currentNbLeds+1);
    pour avoir
    "Fin du bandeau i=16"

    pascal

  18. #38
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 890
    Par défaut
    Citation Envoyé par f-leb Voir le message
    Je pense avoir réussi avec ce code avec wokwi
    Bravo,

    oui comme je l'avais mentionné
    Citation Envoyé par Jay M Voir le message
    Au lieu d’afficher tout le bandeau théorique il faut peut être demander un show() partiel
    il fallait trouver le moyen de limiter le nombre de leds ==> c'est ce que fait votre code.

    cool !

  19. #39
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    936
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 936
    Par défaut
    Bonjour à tous ,

    je tenais à vous remercier tous encore pour votre aide précieuse et votre patience ...comme d'hab !
    la prochaine étape est la fabrication les différents rails de Leds et voir au final comment se comporte le logiciel ...

    Bien Cordialement
    pascal

  20. #40
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 152
    Billets dans le blog
    47
    Par défaut
    Surtout qu'en théorie et en simulation, ça finit toujours par fonctionner.
    On est impatient de voir le résultat en pratique

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. [TP7] Calculer sin, cos, tan, sqrt via le FPU
    Par zdra dans le forum Assembleur
    Réponses: 8
    Dernier message: 25/11/2002, 04h09
  2. Calcul des numéros de semaine d'un calendrier
    Par Invité dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 06/11/2002, 21h29
  3. Réponses: 8
    Dernier message: 18/09/2002, 03h20
  4. Récupérer 10 nb différents avec un calcul aléatoire
    Par BXDSPORT dans le forum Langage
    Réponses: 3
    Dernier message: 04/08/2002, 02h35
  5. Algo de calcul de FFT
    Par djlex03 dans le forum Traitement du signal
    Réponses: 15
    Dernier message: 02/08/2002, 17h45

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