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 :

Projet : Recherche de bonne connectique


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    pompier
    Inscrit en
    Janvier 2020
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : pompier

    Informations forums :
    Inscription : Janvier 2020
    Messages : 86
    Par défaut Projet : Recherche de bonne connectique
    bonjour à vous,
    je souhaite réaliser un jeu où la personne doit relier les bonnes extrémités de fils pour rétablir un relais (fictif).
    le joueur ne voit pas les couleurs bien évidement.

    Nom : connect.png
Affichages : 334
Taille : 2,2 Ko

    il faut donc relier bleu avec bleu et la led bleue s'allume; ainsi de suite pour les autres couleurs.

    Est-ce que c'est possible avec une carte Arduino?
    Pour moi si tu pars de GRD quelque soit l'extrémité, le circuit s'ouvre et la led s'allumera???

    je n'arrive pas à me représenter le circuit électrique, ni s'il faut utiliser du numérique ou analogique.

    Merci beaucoup pour votre aide

  2. #2
    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
    c'est faisable avec un arduino, mais bien sûr si vous fermez un circuit il vous faut quelque part un élément différentiateur sur le circuit.

    il y a plusieurs options mais par exemple vous pouvez jouer sur la notion de circuit diviseur de tension et faire une mesure analogique (analogRead()) au milieu des deux résistances

    Nom : idee4.png
Affichages : 329
Taille : 52,4 Ko

    pour mémoire dans un circuit diviseur
    Nom : circuit.png
Affichages : 287
Taille : 9,6 Ko
    on aura U2 défini par la formule
    Nom : U2.png
Affichages : 282
Taille : 9,5 Ko

    avec R2 identique du côté droit et des résistance (Rouge, Bleue, Jaune, Verte) R1 en série (elles peuvent êtres identiques) et bien choisies de l'autre côté, vous pourrez savoir en lisant les tension sur les pins analogiques quel fil est branché.

    (le fil rouge aura qu'une simple résistance R1, la résistance équivalente vue par le fil jaune en amont est (2 x R1) car elles sont en série, celle du fil bleu est (3 x R1) etc...)

    ----

    sinon vous pouvez jouer avec 4 pins en OUTPUT qui émettent un signal à une fréquence particulière
    par exemple:
    le fil rouge pourrait être HIGH 1ms puis LOW 4ms
    le fil bleu pourrait être HIGH 2ms puis LOW 4ms
    le fil jaune pourrait être HIGH 3ms puis LOW 2ms
    le fil vert pourrait être HIGH 4ms puis LOW 1ms

    et 4 pins en INPUT-PULLUP qui servent de pin de branchement

    pin Dx (OUTPUT) ----- Resistance de limitation de courant ------> fil à brancher pin branchement (INPUT-PULLUP)

    la loop() écouterait en permanence les pins de branchement:
    - quand rien n'est branché la pin de branchement voit HIGH en permanence car elle est en PULLUP
    - quand vous branchez un fil, elle voit le signal tel qu'émis par la pin d'origine.

    et pour ne pas surcharger votre micro-contrôleur et gérer le changement d'état des pins de sorties, au lieu de prendre des temps comme déclarés ci dessus, prenez des pins PWM et affectez leur un signal différent par analogWrite() dans le setup(), comme ça la boucle peut se contenter d'écouter la durée du signal HIGH

    comme le PWM est à ~500Hz ou 1000Hz suivant les pins sur UNO (voir la référence analogWrite), la durée d'un HIGH attendu sera très courte et donc d'un point de vue de l'utilisateur c'est comme si tout était fait en temps réel alors que vous allez écouter chaque pin l'une après l'autre.

    --> étudiez la fonction pulseIn() pour lire la durée du signal haut (avec un timeout)


    -----

    il y aurait d'autres options mais ces deux là sont fonctionnelles et simples à mettre en oeuvre si vous voulez un Arduino au milieu.

    Sinon sans arduino et avec des circuits indépendants, il suffit que la LED soit sur le circuit que vous fermez (vous créez autant de circuits indépendants que nécessaire).

    Nom : sans.png
Affichages : 281
Taille : 31,3 Ko

    et vous avez le jeu de « questions‐réponses » qu'on fabrique en primaire où il faut associer deux bons fils

  3. #3
    Membre confirmé
    Homme Profil pro
    pompier
    Inscrit en
    Janvier 2020
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : pompier

    Informations forums :
    Inscription : Janvier 2020
    Messages : 86
    Par défaut
    bonjour, merci pour ce retour.

    toujours dans la thématique si j'ai bien compris,

    le montage serait le suivant

    Nom : analogread.png
Affichages : 396
Taille : 85,9 Ko

    Le fils avec la flèche, est celui à bien connecter.

    Au niveau du programme, on aurait quelque chose du type.

    If analogread (fils orange)==1000 (au pif);
    alors la led rouge s'allume //connectée à un pin digital?
    … idem pour les autres fils

  4. #4
    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
    presque, il faut que la mesure analogique soit au milieu des 2 résistances (et au calcul mathématique près)
    Nom : gnd.png
Affichages : 341
Taille : 45,3 Ko


    Attention à ne pas mettre les résistances dans un des 2 rails externe de la breadboard:
    Nom : rail.png
Affichages : 269
Taille : 16,4 Ko
    sur la majorité des breadboards les pins sont déjà connectées entre elles en horizontal à ce niveau (et il y a une ligne bleue et une ligne rouge pour marquer cette continuité)
    Nom : ligne.png
Affichages : 299
Taille : 77,5 Ko

    (au passage —*si ça peut-être utile —*la lecture de la tension sur une des pin Ax vous dira quel fil a été connecté. ça vous permet éventuellement de donner des indications à l'utilisateur pour l'aider à corriger son erreur)

  5. #5
    Membre confirmé
    Homme Profil pro
    pompier
    Inscrit en
    Janvier 2020
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : pompier

    Informations forums :
    Inscription : Janvier 2020
    Messages : 86
    Par défaut
    bon j'ai corrigé mon circuit (effectivement court-circuit assuré), j'avais même oublié de mettre à la GRD.

    Nom : analogread.png
Affichages : 349
Taille : 51,1 Ko

    vous confirmez que c'est bon ( mon maître LOL).

    (au passage —*si ça peut-être utile —*la lecture de la tension sur une des pin Ax vous dira quel fil a été connecté. ça vous permet éventuellement de donner des indications à l'utilisateur pour l'aider à corriger son erreur)
    Je n'en suis pas rendu là, mais un vilain buzzer en cas de mauvais branchement, pour faire monter le cardio c'est top.

  6. #6
    Membre confirmé
    Homme Profil pro
    pompier
    Inscrit en
    Janvier 2020
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : pompier

    Informations forums :
    Inscription : Janvier 2020
    Messages : 86
    Par défaut
    voilà, j'ai fait le code avec mon simulateur Tinkercad.

    R1=330 ohm
    R2=200 ohm

    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
    int analogPin1 = A1; 
    int analogPin2 = A2; 
    int analogPin3 = A3; 
    int analogPin4 = A4; 
    int analogPin5 = A5; 
     
    int val1 = 0; // variable de type int pour stocker la valeur de la mesure
    int val2 = 0;
    int val3 = 0;
    int val4 = 0;
    int val5 = 0;
     
    void setup()
    {
      Serial.begin(9600);          //  initialisation de la connexion série
    // IMPORTANT : la fenêtre terminal côté PC doit être réglée sur la même valeur. 
    }
     
    void loop()
    {
     
      // lit la valeur de la tension analogique présente sur la broche
      val1 = analogRead(analogPin1);  
      val2 = analogRead(analogPin2);
      val3 = analogRead(analogPin3);
      val4 = analogRead(analogPin4);
      val5 = analogRead(analogPin5);
     
       // affiche la valeur (comprise en 0 et 1023) dans la fenêtre terminal PC
      Serial.println(val1); 
      Serial.println(val2);
      Serial.println(val3);
      Serial.println(val4);
      Serial.println(val5);
     
    }
    En résultat j'ai 305/91/28/11/0 (bizarre d'avoir valeur nulle???)

    du coup dans mon projet il va falloir dire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    If (val1==305){
    allume led1;}        //en ayant déclaré les pins avant
    If (val2==91){
    allume led2;}        //en ayant déclaré les pins avant
    If (val3==28){
    allume led3;}        //en ayant déclaré les pins avant
    If (val4==11){
    allume led4;}        //en ayant déclaré les pins avant
    If (val5==0){
    allume led5;}        //en ayant déclaré les pins avant

  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
    Citation Envoyé par hugobeauce Voir le message
    bon j'ai corrigé mon circuit (effectivement court-circuit assuré), j'avais même oublié de mettre à la GRND
    ça a l'air mieux oui

    pour le code il faudrait tester sur une marge d'erreur car analogRead() ne va pas toujours donner la même valeur à 1 ou 2 près. en fait vous pouvez presque dire si valeur > xxx rien de branché sinon si > v1 alors tel fil, sinon si > v2 alors tel fil, sinon si > v3 tel fil sinon si > v4 tel fil sinon rien de bon

  8. #8
    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
    Quel est le schéma de connexion ?

  9. #9
    Membre confirmé
    Homme Profil pro
    pompier
    Inscrit en
    Janvier 2020
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : pompier

    Informations forums :
    Inscription : Janvier 2020
    Messages : 86
    Par défaut
    Il est dans le message d'avant

  10. #10
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonjour

    Une autre approche, numérique, du sujet. En gros, je fais clignoter une sortie (ledsPin), qui me sert de LED d'indication et je reprends cette sortie sur une entrée (entreesPin), compte le nombre de clignotements (testNombre) si le comptage est OK, le fil est à la bonne place et la LED correspondante s'allume (Les LED s'allument avec un LOW (#define ledOn LOW)) et, dans le moniteur, la couleur du fil s'affiche (filsNoms[]) en MAJUSCULES.

    rouge BLEU jaune vert
    rouge BLEU jaune vert
    rouge BLEU jaune vert
    rouge BLEU jaune VERT
    rouge BLEU jaune VERT
    rouge BLEU jaune VERT
    rouge BLEU jaune VERT
    rouge BLEU jaune VERT

    Le reste est dans le programme.
    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
    char* filsNoms[] = {"rouge", "bleu", "jaune", "vert"};
     
    #define filsNombre 4                             // Nombre de fils
    #define testNombre 4                             // Nombre de boucles de test
    #define ledOn LOW                                // Quel etat pour allumer la diode
    byte ledsPin[] = {8, 9, 10, 11};                 // Liste des ports des LED
    byte entreesPin[] = {4, 5, 6, 7};                // Liste des ports en entrée
     
    void setup()
    {
    	Serial.begin(115200);
     
    	for (byte i = 0; i < filsNombre; i++)
    	{
    		pinMode(ledsPin[i], OUTPUT);
    		digitalWrite(ledsPin[i], !ledOn);        // Eteindre la LED
    		pinMode(entreesPin[i], INPUT_PULLUP);
    	}
     
    }
     
    void loop()
    {
    	for (byte i = 0; i < filsNombre; i++)
    	{
    		byte compteurTest = 0;
    		for (byte t = 0; t < testNombre; t++)                             // Boucle de test
    		{
    			digitalWrite(ledsPin[i], !digitalRead(ledsPin[i]));           // Inverser la LED
    			if (digitalRead(entreesPin[i]) == digitalRead(ledsPin[i]))    // Entre = etat LED ?
    			{
    				compteurTest ++;
    			}
    		}
    		if (compteurTest == testNombre)                                   // Si le fil est à la bonne place            
    		{
    			digitalWrite(ledsPin[i], ledOn);                              // Allumage de la LED 
    		} 
    		else
    		{
    			digitalWrite(ledsPin[i], !ledOn);                             // Allumage de la LED
    		}
     
    	}
    	for (byte i = 0; i < filsNombre; i++)
    	{
    		String filEtat = (String)filsNoms[i] + " ";
    		if (digitalRead(ledsPin[i]) == ledOn)                               // Si le fil est à la bonne place                          
    		{
    			filEtat.toUpperCase();                                          // Etat du fil en majuscules
    		} 
    		Serial.print(filEtat);
    	}
     
    	Serial.print("\n");
    	delay(1000);
    }
    et le schéma
    Nom : ARDDEV_hugobeauce_JeuxFils.png
Affichages : 288
Taille : 15,9 Ko
    Petite question à Jay M, quel programme utilises-tu pour faire les schémas que tu publies?

    Bonne journée
    Cordialement
    jpbbricole.

  11. #11
    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
    Citation Envoyé par jpbbricole Voir le message
    Petite question à Jay M, quel programme utilises-tu pour faire les schémas que tu publies?
    Bonne approche aussi (même pas besoin des LEDs d'ailleurs mais ça fait joli )

    Pour mes dessins c'est assez simple, comme je suis sur un mac j'utilise les soft gratuits fournis avec l'OS (pages, keynote, voire juste aperçu) qui ont des fonctions de dessin super simples. Je fais mon dessin et je l'exporte sous forme d'image PNG avec fond transparent que je charge ici.

    Il doit y avoir quelque chose Approchant sur Linux avec les outils de dessin Writer dans OpenOffice pour créer des objets graphiques

  12. #12
    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
    vous prenez cette fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void melange()
    {
      // algo cf https://fr.wikipedia.org/wiki/Mélange_de_Fisher-Yates
      for (size_t i = nombreDeDonnees - 1; i >= 1; --i) {
        size_t j = random(0, i + 1);
        donnee_t echange = maListe[i];
        maListe[i] = maListe[j];
        maListe[j] = echange;
      }
    }
    et vous remplacez
    - nombreDeDonnees par votre variable qui contient le nombre de données
    - donnee_t par le type des données dans votre tableau
    - maListe[] par votre tableau

    ça va mélanger votre tableau

  13. #13
    Membre confirmé
    Homme Profil pro
    pompier
    Inscrit en
    Janvier 2020
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : pompier

    Informations forums :
    Inscription : Janvier 2020
    Messages : 86
    Par défaut
    Autant pour moi,
    Dans le simulateur tinkercad, votre code plante et ça fonctionne bien dans le logiciel arduino.
    Du coup, dans la matrice maliste à quoi correspond entre chaque accolade le numéro et la lettre ?
    Merci

  14. #14
    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
    Citation Envoyé par hugobeauce Voir le message
    Du coup, dans la matrice maliste à quoi correspond entre chaque accolade le numéro et la lettre ?

    Dans mon exemple j’avais pris une structure pour montrer que la fonction pouvait mélanger un groupe de données

    Il suffit d’adapter le type des données du tableau dans la fonction

    ----
    Citation Envoyé par hugobeauce Voir le message
    Au temps pour moi,
    Dans le simulateur tinkercad, votre code plante et ça fonctionne bien dans le logiciel arduino.
    oui TinkerCad a un vieux compilateur C++ qui n'est pas à jour du tout...
    Dans la fonction imprime() j'utilisais ce que l'on appelle un "Range-based for loop" - ça fait partie du standard C++11 publié le 12 août 2011.... il y a déjà plus de 8 ans et demi...

    Dans le code ci dessous je reviens à une bonne vieille boucle for avec un indice et devrait fonctionner dans TinkerCad
    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
    struct donnee_t {
      uint8_t numeroPin;
      char caractere;
    } maListe[] = {
      {0, 'a'}, {1, 'z'}, {2, 'e'}, {3, 'r'}, {4, 't'},
      {5, 'y'}, {6, 'u'}, {7, 'i'}, {8, 'o'}, {9, 'p'}
    };
     
    const size_t nombreDeDonnees = sizeof(maListe) / sizeof(maListe[0]);
     
    void imprime()
    {
      for (size_t i = 0; i < nombreDeDonnees; i++) {
        Serial.print(F("{"));
        Serial.print(maListe[i].numeroPin);
        Serial.print(F(","));
        Serial.print(maListe[i].caractere);
        Serial.print(F("} "));
      }
     
      Serial.println();
    }
     
    void melange()
    {
      // algo cf https://fr.wikipedia.org/wiki/Mélange_de_Fisher-Yates
      for (size_t i = nombreDeDonnees - 1; i >= 1; --i) {
        size_t j = random(0, i + 1);
        donnee_t echange = maListe[i];
        maListe[i] = maListe[j];
        maListe[j] = echange;
      }
    }
     
    void setup() {
      Serial.begin(115200);
      randomSeed(analogRead(A0));
      imprime();
    }
     
    void loop() {
      delay(1000);
      melange();
      imprime();
    }
    et si vous voulez le même code qui mélange un tableau d'entier, ça ressemblerait à cela:

    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
    int maListe[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
     
    const size_t nombreDeDonnees = sizeof(maListe) / sizeof(maListe[0]);
     
    void imprime()
    {
      for (size_t i = 0; i < nombreDeDonnees; i++) {
        Serial.print(maListe[i]);
        Serial.print(F(" "));
      }
     
      Serial.println();
    }
     
    void melange()
    {
      // algo cf https://fr.wikipedia.org/wiki/Mélange_de_Fisher-Yates
      for (size_t i = nombreDeDonnees - 1; i >= 1; --i) {
        size_t j = random(0, i + 1);
        int echange = maListe[i];
        maListe[i] = maListe[j];
        maListe[j] = echange;
      }
    }
     
    void setup() {
      Serial.begin(115200);
      randomSeed(analogRead(A0));
      imprime();
    }
     
    void loop() {
      delay(1000);
      melange();
      imprime();
    }

  15. #15
    Membre confirmé
    Homme Profil pro
    pompier
    Inscrit en
    Janvier 2020
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : pompier

    Informations forums :
    Inscription : Janvier 2020
    Messages : 86
    Par défaut
    Donc si j'essai d'adapter votre code à celui de jpbbricole. UNIQUEMENT pour les ports LED, un message d'erreur dans le setup (certainement un format de variable)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char* filsNoms[] = {"Vert", "Rouge", "Jaune", "Blanc", "Bleu", "xxx"};
     
    #define filsNombre 5                             // Nombre de fils
    #define testNombre 5                             // Nombre de boucles de test
    #define ledOn LOW                                // Quel etat pour allumer la diode
    byte ledsPin[] = {35, 36, 37, 38 , 39};                 // Liste des ports des LED
    byte entreesPin[] = {30, 31, 32, 33 , 34};                // Liste des ports en entrée
    int filsPosition[filsNombre];                    // Position des fils
    ça ferait
    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
    char* filsNoms[] = {"Vert", "Rouge", "Jaune", "Blanc", "Bleu", "xxx"};
     
    #define filsNombre 5                             // Nombre de fils
    #define testNombre 5                             // Nombre de boucles de test
    #define ledOn LOW                                // Quel etat pour allumer la diode
    //byte ledsPin[] = {35, 36, 37, 38 , 39};                 // Liste des ports des LED   <=> remplacé par le tableau maListe ???
    byte entreesPin[] = {30, 31, 32, 33 , 34};                // Liste des ports en entrée
    int filsPosition[filsNombre];                    // Position des fils
     
    struct donnee_t {
      uint8_t ledsPin;
      char caractere;
    } ledsPin[] = {
      {35}, {36}, {37}, {38}, {39},       // Liste des ports des LED
      };
     
    const size_t nombreDeDonnees = sizeof(ledsPin) / sizeof(ledsPin[0]);

    Juste pour être sur; j'ai remplacé maListe par ledsPin et je ne fait apparaitre que le numéro Pin

    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
    void imprime()
    {
      for (const auto& d : ledsPin) {
        Serial.print(F("{"));
        Serial.print(d.ledsPin);
        //Serial.print(F(","));
       // Serial.print(d.caractere);
        Serial.print(F("} "));
      }
      Serial.println();
    }
     
    void melange()
    {
      // algo cf https://fr.wikipedia.org/wiki/Mélange_de_Fisher-Yates
      for (size_t i = nombreDeDonnees - 1; i >= 1; --i) {
        size_t j = random(0, i + 1);
        donnee_t echange = ledsPin[i];
        ledsPin[i] = ledsPin[j];
        ledsPin[j] = echange;
      }
    le setup, j'ai un message d'erreur

    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
    void setup() {
      Serial.begin(115200);
      randomSeed(analogRead(A0));    ?? A QUOI CA SERT???
     
     melange();    // On brasse les ports Led
    // imprime();    
     
     for (byte i = 0; i < filsNombre; i++)
      {
        pinMode(ledsPin[i], OUTPUT);          //cannot convert 'donnee_t' to 'uint8_t {aka unsigned char}' for argument '1' to 'void pinMode(uint8_t, uint8_t)'
     
        digitalWrite(ledsPin[i], !ledOn);        // Eteindre la LED
        pinMode(entreesPin[i], INPUT_PULLUP);
      }
     
    }
    }
    et la fin du code pour tester la connexion
    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
    void loop()
    {
      filsPositionRecherche();
     
      for (byte fils = 0; fils < filsNombre; fils++)
      {
        if (filsPosition[fils] == fils)                    // Si le fil est à la bonne place            
        {digitalWrite(ledsPin[fils], ledOn);}              // Allumage de la LED 
        else
        {digitalWrite(ledsPin[fils], !ledOn);}             // Allumage de la LED
      }
     
      Serial.print("\n");
      for (byte fils = 0; fils < filsNombre; fils++)         // Affichage des couleurs
      {
        Serial.print((String)filsNoms[fils] + "\t");
      }
      Serial.print("\n");
     
      /*--------------------------------------------------------------------
        Affichafe des couleurs en fonction de la connexion du fil
        Si couleur an MAJUSCULES le fil est bin connecté
        Si couleur en minusciles, le fil est connecté, mais pas à sa place
        Si xxx, le fil n'est pas connecté.
      ----------------------------------------------------------------------
      */
      for (byte fils = 0; fils < filsNombre; fils++)         // Affichage des couleurs selon bra
      {
        Serial.print(filEtat(fils) + "\t");
      }
      Serial.print("\n");
     
      delay(1000);
    }
     
    String filEtat(byte filIndex)                              // Retourne l'état du fil
    {
      String returnValeur = (String)filsNoms[filsPosition[filIndex]];
      returnValeur.toLowerCase();
     
      if (filsPosition[filIndex] == filIndex)                // Si fil en bonne position
      {
        returnValeur.toUpperCase();
      }
     
      return returnValeur;
    }
    void filsPositionRecherche()                               // Recherche de la position des fils                              
    {
      for (byte fils = 0; fils < filsNombre; fils++)
      {
        filsPosition[fils] = filsNombre;
        for (byte entree = 0; entree < filsNombre; entree++)
        {
          byte compteurTest = 0;
          for (byte t = 0; t < testNombre; t++)                                   // Boucle de test
          {
            digitalWrite(ledsPin[fils], !digitalRead(ledsPin[fils]));           // Inverser la LED
            if (digitalRead(entreesPin[entree]) == digitalRead(ledsPin[fils]))  // Entre = etat LED ?
            {compteurTest ++;}
          }
     
          if (compteurTest == testNombre)                                         // Si une connexion a été trouvée
          {
            filsPosition[fils] = entree;                                        // Mémoriser l'entrée
            break;
          }
        }
      }
    }

  16. #16
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonjour Hugo
    cette erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pinMode(ledsPin[i], OUTPUT);          //cannot convert 'donnee_t' to 'uint8_t {aka unsigned char}' for argument '1' to 'void pinMode(uint8_t, uint8_t)'
    provient du fait que cette ligne est en remarque
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //byte ledsPin[] = {35, 36, 37, 38 , 39};                 // Liste des ports des LED   <=> remplacé par le tableau maListe ???
    Mets ton code en entier pour faciliter la recherche d'erreurs.

    A+
    Cordialement
    jpbbricole

  17. #17
    Membre confirmé
    Homme Profil pro
    pompier
    Inscrit en
    Janvier 2020
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : pompier

    Informations forums :
    Inscription : Janvier 2020
    Messages : 86
    Par défaut
    [QUOTE=jpbbricole;11380534]
    provient du fait que cette ligne est en remarque
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //byte ledsPin[] = {35, 36, 37, 38 , 39};                 // Liste des ports des LED   <=> remplacé par le tableau maListe ???
    Si je retire // ça met un conflit avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct donnee_t {
      uint8_t ledsPin;
      char caractere;
    } ledsPin[] = {
      {35}, {36}, {37}, {38}, {39},       // Liste des ports des LED
      };
    Bon je vais me pencher sur le nouveau code de mister JayM

    en tout cas merci à vous deux pour votre soutien, et vos réponses hyper rapides et adaptées à mon niveau de (non)programmation.

  18. #18
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonsoir Hugo
    Petit problème de syntaxe, je sais c'est pas toujours évident, le C.
    Pour déclarer la structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #define  filsNombre 5
     
    struct donneeDef 
    {
    	uint8_t ledsPin[filsNombre]={35, 36, 37, 38, 39};
    	uint8_t EntreesPin[filsNombre]={30, 31, 32, 33 , 34};
    };
    donneeDef mesDonnees;
    Pour l'usage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     for (byte i = 0; i < filsNombre; i++)
     {
    	 pinMode(mesDonnees.ledsPin[i], OUTPUT);          //cannot convert 'donnee_t' to 'uint8_t {aka unsigned char}' for argument '1' to 'void pinMode(uint8_t, uint8_t)'
     
    	 digitalWrite(mesDonnees.ledsPin[i], !ledOn);        // Eteindre la LED
     	 pinMode(mesDonnees.EntreesPin[i], INPUT_PULLUP);          
    }
    A+
    Cordialement
    jpbbricole

  19. #19
    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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct donnee_t {
      uint8_t ledsPin;
      char caractere;
    } ledsPin[] = {
      {35}, {36}, {37}, {38}, {39},       // Liste des ports des LED
      };
    euh, là c'est le programmation casino... vous ne pouvez pas taper n'importe quoi au hasard et espérer que ça fonctionne... il y a une syntaxe et une grammaire au langage de programmation, vous devez les respecter...

    en reprenant l'approche de JP pour détecter le bon fil, voici un petit code qui fait le mélange et relance un nouveau jeu quand on a trouvé.

    Vous y verrez une petite machine à état dans la loop() qui sert à savoir dans quelle phase du jeu on se trouve.

    le câblage des pins/LEDs et la détection est fondé sur l'approche proposée par JP (j'ai mis que 3 fils dans le code) et le mélange ne se fait que sur les pins "pinDestination" (ça suffit)
    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
    /*
     
      Câblage
     
      _______
             |
             |
        Dest O-----<<-----[]     (INPUT_PULLUP)
             |
             |
         Src O----->>-----[]     (OUTPUT)
             |         |
             |         |
             |         -
      _______|       [LED]
                       +
                       |
                    [R220]
                       |
                       |
                      +5V
     
      quand on met Src à LOW  (LED_ON),  la LED s'allume
      quand on met Src à HIGH (LED_OFF), la LED s'éteint
     
      Si on relie []*de Src et []*de Dest et que Src est LOW (LED_ON), la LED s'allume et DEST voit LOW
      Si on relie []*de Src et []*de Dest et que Src est HIGH (LED_OFF), la LED s'éteint et DEST voit HIGH
     
    */
     
    #define LED_OFF HIGH
    #define LED_ON LOW
     
    // les pins à mettre en correspondance
    const uint8_t pinLEDSource[]  = {30, 32, 34};
    uint8_t pinDestination[] = {31, 33, 35}; // pas const car on va le mélanger
    const size_t nombreDeFils = sizeof(pinLEDSource) / sizeof(pinLEDSource[0]);
     
    enum : uint8_t {NOUVEAU_JEU, JEU_EN_COURS, VICTOIRE} etat;
     
     
    void imprime()
    {
      for (size_t i = 0; i < nombreDeFils; i++) {
        Serial.print(F("{"));
        Serial.print(pinLEDSource[i]);
        Serial.print(F(" <<->> "));
        Serial.print(pinDestination[i]);
        Serial.print(F("} "));
      }
      Serial.println();
    }
     
    bool cablageCorrect()
    {
      // on fait clignoter la Source et on regarde si on voit ce signal sur la destination
     
      const uint8_t nombreDeClignotements = 3;
      size_t nbFilsCorrects = 0;
     
      for (size_t unFil = 0; unFil < nombreDeFils; unFil++) {
        bool erreur = false;
     
        for (uint8_t n = 0; n < nombreDeClignotements; n++) {
          digitalWrite(pinLEDSource[unFil], LED_ON);
          erreur = (digitalRead(pinDestination[unFil]) != LED_ON);
          if (erreur) break;
          digitalWrite(pinLEDSource[unFil], LED_OFF);
          erreur = (digitalRead(pinDestination[unFil]) != LED_OFF);
          if (erreur) break;
        }
        if (erreur) {
          digitalWrite(pinLEDSource[unFil], LED_OFF);
        } else {
          // le fil est bon on laisse la LED allumée
          digitalWrite(pinLEDSource[unFil], LED_ON);
          nbFilsCorrects++;
        }
      } // fin de pour chaque fil
      return (nbFilsCorrects == nombreDeFils);
    }
     
    void melange()
    {
      // algo cf https://fr.wikipedia.org/wiki/Mélange_de_Fisher-Yates
      for (size_t i = nombreDeFils - 1; i >= 1; --i) {
        size_t j = random(0, i + 1);
        uint8_t echange = pinDestination[i];
        pinDestination[i] = pinDestination[j];
        pinDestination[j] = echange;
      }
    }
     
    // -----------------
     
    void setup() {
      Serial.begin(115200);
      randomSeed(analogRead(A0));
     
      for (size_t i = 0; i < nombreDeFils; i++) {
        pinMode(pinLEDSource[i], OUTPUT);
        digitalWrite(pinLEDSource[i], LED_OFF);
        pinMode(pinDestination[i], INPUT_PULLUP);
      }
     
      etat = NOUVEAU_JEU;
    }
     
    void loop()
    {
      switch (etat) {
     
        case NOUVEAU_JEU:
          melange();
          imprime();
          etat = JEU_EN_COURS;
          break;
     
        case JEU_EN_COURS:
          if (cablageCorrect()) etat = VICTOIRE;
          delay(500);
          break;
     
        case VICTOIRE:
          Serial.println(F("VICTOIRE"));
          for (uint8_t n = 0; n < 20; n++) {
            for (size_t i = 0; i < nombreDeFils; i++)
              digitalWrite(pinLEDSource[i], LED_OFF);
            delay(50);
            for (size_t i = 0; i < nombreDeFils; i++)
              digitalWrite(pinLEDSource[i], LED_ON);
            delay(50);
          }
          etat = NOUVEAU_JEU;
          break;
      }
    }
    bien sûr là le jeu est facile car la console dit quelles pins connecter ensemble et pour trouver il suffit de tester avec chaque fil les LEDs et elle s'allume si c'est la bonne case.

    Pour rendre cela plus difficile on peut ne pas allumer la LED une fois le fil à la bonne place ou allumer un nombre de LEDs égal au nombre de bonne connexions mais pas forcément en face de chaque fil

  20. #20
    Membre confirmé
    Homme Profil pro
    pompier
    Inscrit en
    Janvier 2020
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : pompier

    Informations forums :
    Inscription : Janvier 2020
    Messages : 86
    Par défaut
    Citation Envoyé par Jay M Voir le message


    euh, là c'est le programmation casino... vous ne pouvez pas taper n'importe quoi au hasard et espérer que ça fonctionne... il y a une syntaxe et une grammaire au langage de programmation, vous devez les respecter...

    en reprenant l'approche de JP pour détecter le bon fil, voici un petit code qui fait le mélange et relance un nouveau jeu quand on a trouvé.

    Vous y verrez une petite machine à état dans la loop() qui sert à savoir dans quelle phase du jeu on se trouve.

    le câblage des pins/LEDs et la détection est fondé sur l'approche proposée par JP (j'ai mis que 3 fils dans le code) et le mélange ne se fait que sur les pins "pinDestination" (ça suffit)

    Pour rendre cela plus difficile on peut ne pas allumer la LED une fois le fil à la bonne place ou allumer un nombre de LEDs égal au nombre de bonne connexions mais pas forcément en face de chaque fil
    Merci pour ce code qui répond largement à mes attentes, effectivement nul besoin de mélanger Pin destination et Pin entrées. Pour ma part, cette discussion est donc belle et bien résolue.
    Encore une fois, un grand merci à toi et jpbbricole pour votre aide. J'adore ce site pour cette raison.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Projets informatique : les bonnes pratiques
    Par elitost dans le forum Débats sur le développement - Le Best Of
    Réponses: 345
    Dernier message: 18/10/2011, 16h08
  2. [PROJET] Recherche développeur C/C++ et autres
    Par 4R416N33² dans le forum Autres
    Réponses: 0
    Dernier message: 29/07/2007, 04h59
  3. [projet] recherche d'inspiration
    Par gorgonite dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 09/10/2006, 20h57
  4. PHP ORACLE ? Recherche une bonne methode
    Par Torando59 dans le forum Oracle
    Réponses: 4
    Dernier message: 24/01/2006, 12h54

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