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 :

Effectuer une association entre deux tableaux


Sujet :

Arduino

  1. #21
    Membre habitué
    Avatar de Jsiorat
    Homme Profil pro
    RETRAITE
    Inscrit en
    Juillet 2005
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : RETRAITE

    Informations forums :
    Inscription : Juillet 2005
    Messages : 398
    Points : 169
    Points
    169
    Par défaut
    Bonjour à toutes et tous (Toutes ? et pourquoi pas !)

    Je vois que votre intérêt pour ma question est au plus haut niveau ! Je vois aussi les professionnels que vous êtes !
    En vous lisant, en expérimentant vos réflexions, j'en apprends plus qu'en quelques semaines sur un banc de l'école.

    jpbbricole :

    Si j'ai bien compris ce code (du 19/09), ce tableau à 3 dimensions (bouton - pin utilisé - moteur D/G)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    bpDefinition bp[] = {
    {"C1_V1",  5, maG1_D, maA1_G, maA3_D, maNU},
    {"C1_V2",  6, maG1_D, maA1_D, maA4_D, maNU},
    {"C2_V1",  7, maB1_G, maB3_D, maA2_G, maA3_G},
    {"C2_V2",  8, maB1_G, maB3_D, maA2_D, maA4_G},
    {"C2_V3",  9, maB1_D, maB4_D, maNU, maNU},
    {"C3_V1", 10, maB2_G, maB3_G, maA2_G, maA3_G},
    {"C3_V2", 11, maB2_G, maB3_G, maA2_D, maA4_G},
    {"C3_V3", 12, maB2_G, maB4_G, maNU, maNU},
    };
    il n'y a donc que 8 pins utilisés sur la mega 2560 ?
    Les pins 22 à 52 sont donc libre. On peut donc les utiliser pour allumer des leds sur un tableau de commande qui va simuler le trajet défini par C1_V1, C1_V2, C2_V1 etc ...
    je voudrais transposer ça sur une breakboard, c'est possible ? en remplaçant les maG1_D, maA1_G, maA3_D etc. par des LEDs pour en voir le fonctionnement et voir l'utilisation du moniteur série. je vais m'atteler à ça aujourd'hui même !

    Cordialement, Jacques
    Être vieux, c'est être jeune depuis plus longtemps que les autres !

  2. #22
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    Citation Envoyé par Jsiorat Voir le message
    Bonjour en ce WE encore ensoleillé !
    ce sont des des moteurs à solénoïdes, c'est ce qu'il y a de plus simples : un côté droit, un côté gauche.
    Achetés en Allemagne, chez TILLIGBAHN.
    Bonjour

    Je ne les connais pas. Donc si je comprends bien il y a deux broches, si vous envoyez une impulsion sur une des deux broches ça bascule l’aiguillage dans son sens (droite ou gauche). Je suppose qu’il y a système d’électro aimant et un mécanisme de verrouillage ?

    il n'y a donc que 8 pins utilisés sur la mega 2560 ?
    non il en faut plus.

    Les pins des aiguillages sont dans cette structure / tableaux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     motAigDefinition motAig = {
    	{"G1 D", "A1 G", "A1 D", "A2 G", "A2 D", "A3 G", "A3 D", "A4 G", "A4 D", "B1 G", "B1 D", "B2 G", "B2 D", "B3 G", "B3 D", "B4 G", "B4 D"},
    	{  22,     23,     24,     25,     26,     27,     28,     29,     30,     31,     32,     33,     34,     35,     36,     37,     38}
    };
    Vous n’avez besoin d’avoir le contrôle des 2 broches de chaque aiguillage qui si elles servent, ici G1-G sur le dessin ne sert à rien car ça enverrait le train hors des voies mais les autres sont nécessaires.

    Et ensuite il vous faut les pins des boutons, ce sont les nombres de 5 à 12 dans cette définition de structure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     bpDefinition bp[] = {
    {"C1_V1",  5, maG1_D, maA1_G, maA3_D, maNU},
    {"C1_V2",  6, maG1_D, maA1_D, maA4_D, maNU},
    {"C2_V1",  7, maB1_G, maB3_D, maA2_G, maA3_G},
    {"C2_V2",  8, maB1_G, maB3_D, maA2_D, maA4_G},
    {"C2_V3",  9, maB1_D, maB4_D, maNU, maNU},
    {"C3_V1", 10, maB2_G, maB3_G, maA2_G, maA3_G},
    {"C3_V2", 11, maB2_G, maB3_G, maA2_D, maA4_G},
    {"C3_V3", 12, maB2_G, maB4_G, maNU, maNU},
    };
    chaque ligne de ce tableau décrit un cheminement. Par exemple la première dit que pour aller de C1 à la voie V1, ça se fait en appuyant sur le bouton relié à la pin 5. Lorsqu’il est activé il faut déclencher des impulsions sur 3 broches : maG1_D, maA1_G,p et maA3_D (l’entrée maNU est ignorée par le code).

    maG1_D (Sans doute pour moteur aiguillage G1 Droite) est défini dans une énumération.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     enum motAigIndex 
    {    maG1_D, maA1_G, maA1_D, maA2_G, maA2_D, maA3_G, maA3_D, maA4_G, maA4_D, maB1_G, maB1_D, maB2_G, maB2_D, maB3_G, maB3_D, maB4_G, maB4_D};
    Les énumérations permettent d’avoir des jolis noms pour des constantes, elles prennent des valeurs croissantes dans la liste (0,1,2,3,...) donc maG1_D vaut 0, maA1_G vaut 1 etc.
    @JP s’en sert pour faire un index dans le tableau des Nº de pins car elles sont rangées dans le même ordre. C’est ce qui permet d’envoyer la commande à la bonne pin.

    Bref vous aurez des fils sur les pins 5 à 12 vers les boutons et 22 à 38 vers les aiguillages soit 25 pins utilisées.

    ——-

    Je suppose que vos trains ne vont que des C vers les V sinon faudra faire attention à des configurations à risque

  3. #23
    Membre habitué
    Avatar de Jsiorat
    Homme Profil pro
    RETRAITE
    Inscrit en
    Juillet 2005
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : RETRAITE

    Informations forums :
    Inscription : Juillet 2005
    Messages : 398
    Points : 169
    Points
    169
    Par défaut
    quand je disais que vous étiez des chefs ...

    Maintenant, j'ai compris ce fameux tableau et l'énumération !
    Je vais essayer de transposer tout ça sur une "planche à pain " !!!

    Pour palier le fait d'"aller dans le vide" , je pense qu'il faut refaire une initialisation de la gare à l’exception du trajet initialisé par le bouton appuyé.
    Par contre, une question se pose : au cas ou l'appui sur un bouton a lieu à l'instant "T" ou une rame se trouve sur un aiguillage, l'aiguillage va changer de position ce qui risque de créer un déraillement. J'entrevois la solution d'une détection par led infrarouge située avant les aiguillages sur les circuits C1, C2 et C3. Il faut que je réfléchisse au problème !

    Pour info, TILLIGBAHN, est une société allemande de trains miniature, spécialisée sur les échelles H0 (1/87) et TT (1/120)

    Bonne journée.
    Être vieux, c'est être jeune depuis plus longtemps que les autres !

  4. #24
    Membre émérite
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 012
    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 012
    Points : 2 341
    Points
    2 341
    Par défaut
    Bonjour Jacques

    Citation Envoyé par Jsiorat Voir le message
    Bonjour à toutes et tous (Toutes ? et pourquoi pas !)
    Il y en a, mais pas assez!

    Citation Envoyé par Jsiorat Voir le message
    Si j'ai bien compris ce code (du 19/09), ce tableau à 3 dimensions (bouton - pin utilisé - moteur D/G)
    ====================
    bpDefinition bp[] = {
    {"C1_V1", 5, maG1_D, maA1_G, maA3_D, maNU},
    {"C1_V2", 6, maG1_D, maA1_D, maA4_D, maNU},
    ....
    il n'y a donc que 8 pins utilisés sur la mega 2560 ?
    Pour résumer, il n'y a aucun changement de câblage entre ton programme de l'article #7. Le programme que je te propose ne fait que répondre à la question de cette discussion, "Effectuer une association entre deux tableaux", en "rangeant" le programme différemment. Il y a toujours 8 boutons (Pin en entrée) et 17 moteurs (Pin en sortie). Les pin des moteurs sont énumérées pas les noms maG1_D, maA1_G, maA3_D, maNU etc dans l'énumération enum motAigIndex cette énumération va de 0 (maG1_D) à 16 (maB4_D) donc 17 positions. Cette énumération permet de récupérer le numéro de port du moteur concerné par la fonction byte motAigPort = motAig.port[motAigIndex];.
    Oui, je sais, c'est un peu alambiqué, mais tu t'y feras assez vite, mais c'est, à mon avis, le meilleur moyen de gérer ce type de programme qui est destiné à s'étendre assez rapidement, la preuve:

    Citation Envoyé par Jsiorat Voir le message
    Les pins 22 à 52 sont donc libre. On peut donc les utiliser pour allumer des leds sur un tableau de commande qui va simuler le trajet défini par C1_V1, C1_V2, C2_V1 etc ...
    Donc je te conseille de suivre ce que je te propose en fin de l'article #11 PS: Si ton pupitre est susceptible.....,
    Pour ce qui est d'ajouter des LED de parcours, elles seront assez facilement intégrées à ce programme.

    A+
    Cordialement
    jpbbricole
    L'expérience est la seule chose qu'il ne faut acheter que d'occasion!

  5. #25
    Membre habitué
    Avatar de Jsiorat
    Homme Profil pro
    RETRAITE
    Inscrit en
    Juillet 2005
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : RETRAITE

    Informations forums :
    Inscription : Juillet 2005
    Messages : 398
    Points : 169
    Points
    169
    Par défaut
    Citation Envoyé par Jay M Voir le message
    Bonjour

    Je suppose qu’il y a système d’électro aimant et un mécanisme de verrouillage ?

    Je suppose que vos trains ne vont que des C vers les V sinon faudra faire attention à des configurations à risque
    Effectivement, ça roule dans ce sens ... C1 vers V1, C2 vers V2 et C3 vers V3.

    Après réflexion, je pense qu'il n'est pas nécessaire de réinitialiser la gare.
    Toujours après réflexion, il ne faut pas que les électro aimant restent sous tension. Est-ce que, en fin de procédure, on peut utiliser "break" ?

    Jacques
    Être vieux, c'est être jeune depuis plus longtemps que les autres !

  6. #26
    Membre émérite
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 012
    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 012
    Points : 2 341
    Points
    2 341
    Par défaut
    Bonjour Jacques

    Citation Envoyé par Jsiorat Voir le message
    Toujours après réflexion, il ne faut pas que les électro aimant restent sous tension. Est-ce que, en fin de procédure, on peut utiliser "break" ?
    Ce n'est pas nécessaire, l'électro-aimant reçoit une impulsion de motEtatOnTemps millisecondes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	digitalWrite(motAigPort, motEtatOn);       // Moteur ON
    	delay(motEtatOnTemps);
    	digitalWrite(motAigPort, !motEtatOn);      // Moteur NOT ON
    	delay(motEtatOnTemps);
    Citation Envoyé par Jsiorat Voir le message
    ... allumer des leds sur un tableau de commande qui va simuler le trajet défini par C1_V1, C1_V2, C2_V1 etc ...
    Vu que le nombre de LED va devenir conséquent, en plus du câblage des aiguilles, je te conseille d'utiliser des LED de type WS2812, ainsi, depuis ton Mega, tu n'as que le GND, VCC et Data (3 fils) qui "courent" d'une LED à l'autre. Ces LED peuvent prendre toutes les couleurs de l'arc-en-ciel, ainsi tu pourrais mettre une LED par aiguille qui serait verte pour gauche et rouge pour droite.


    Citation Envoyé par Jsiorat Voir le message
    ... allumer des leds sur un tableau de commande qui va simuler le trajet défini par C1_V1, C1_V2, C2_V1 etc ...
    je voudrais transposer ça sur une breakboard, c'est possible ? en remplaçant les maG1_D, maA1_G, maA3_D etc. par des LEDs pour en voir
    Oui, c'est comme ceci que j'ai testé mon programme, les LED s'allument le temps de motEtatOnTemps, mais c'est tout à fait visible.

    A+
    Cordialement
    jpbbricole
    L'expérience est la seule chose qu'il ne faut acheter que d'occasion!

  7. #27
    Membre émérite
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 012
    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 012
    Points : 2 341
    Points
    2 341
    Par défaut
    Bonjour Jay M
    Citation Envoyé par Jay M Voir le message
    L'autre option qui me semble était l'intention inachevée de Jacques au départ (d'après le code posté) serait d'utiliser la bibliothèque de Thomas Ouellet Fredericks (bounce) pour gérer les boutons (Personnellement je préfère la biblio de @bricoleau du forum arduino qui a l'avantage d'être compacte et en français ou alors celle de Matthias Hertel (OneButton)).

    ==> ça permet de cacher toute cette complexité et de se concentrer sur le coeur de code, ce qui est sympathique quand on débute.
    On ne peut pas parler de complexité dans ce programme, au plus 4 lignes de code, pour traiter les rebonds! Mais c'est vrai, l'utilisation d'une bibliothèque comme celles que tu indiques c'est "plus classe", le problème, je n'ai pas trouvé comment les utiliser en tableau. J'ai trouvé une méthode pour la bibliothèque JC_Button, pour les autres? As-tu un truc pas trop alambiqué?

    Cordialement
    jpbbricole
    L'expérience est la seule chose qu'il ne faut acheter que d'occasion!

  8. #28
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    Bonjour @JP

    Citation Envoyé par jpbbricole Voir le message
    On ne peut pas parler de complexité dans ce programme, au plus 4 lignes de code, pour traiter les rebonds!
    certes, ce n'est pas la mer à boire dans les cas simples. Ca devient quand même un peu compliqué si on veut pouvoir gérer plusieurs boutons en parallèle et ne pas avoir à faire de l'attente active sur relâchement pour ne pas redéclencher.

    Mais c'est vrai, l'utilisation d'une bibliothèque comme celles que tu indiques c'est "plus classe", le problème, je n'ai pas trouvé comment les utiliser en tableau. J'ai trouvé une méthode pour la bibliothèque JC_Button, pour les autres? As-tu un truc pas trop alambiqué?
    Oui, il faut créer les éléments du tableau dynamiquement qui seront des pointeurs vers les objets (les instances de la classe, obtenus par appel à new).

    Comme ce sont des pointeurs dans le tableau, on utilise l'opérateur -> au lieu du . (point) pour appeler des méthodes sur ces objets.

    Voici un exemple avec la bibliothèque simpleBouton.h que je mentionnais plus haut et qui est en français !!

    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
    #include <simpleBouton.h>   // à télécharger sur  https://forum.arduino.cc/index.php?topic=375232.0
    const byte pinBoutons[] = {2, 3, 4}; // mettre 3 boutons momentanés sur les pin 2,3 et 4. Câblage : pin---BP---GND.
    const byte nombreDeBoutons = sizeof(pinBoutons) / sizeof(pinBoutons[0]);
     
    simpleBouton* lesBoutons[nombreDeBoutons]; // notre tableau contenant tous les pointeurs vers les objets boutons
     
    void appuiBouton(byte bp)
    {
      Serial.print(F("Bouton sur pin#"));
      Serial.print(pinBoutons[bp]);
      Serial.println(F(" est enfoncé"));
    }
     
    void relacheBouton(byte bp)
    {
      Serial.print(F("Bouton sur pin#"));
      Serial.print(pinBoutons[bp]);
      Serial.println(F(" est relâché"));
    }
     
    void setup()
    {
      Serial.begin(115200);
      for (byte bp = 0; bp < nombreDeBoutons; bp++)
        lesBoutons[bp] = new simpleBouton(pinBoutons[bp]);  //  Débounce à 20ms par défaut sinon le passer en second paramètre
    }
     
    void loop()
    {
      for (byte bp = 0; bp < nombreDeBoutons; bp++) {
        lesBoutons[bp]->actualiser();
        if (lesBoutons[bp]->vientDEtreEnfonce()) appuiBouton(bp);
        if (lesBoutons[bp]->vientDEtreRelache()) relacheBouton(bp);
      }
    }
    la loop est super simple à lire, on teste les boutons les uns après les autres et on affiche un message si un changement notable a eu lieu. La bibliothèque se charge du reste.

    Dans le cas de Jacques par exemple on se fiche même de tester le relâchement, on ne s'intéresserait à faire un mouvement des aiguillages que lorsque la méthode vientDEtreEnfonce() répond vrai et donc le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (digitalRead(bp[b].port) == bpEtatPresse) {
      bpPresseAction(b);
      delay(20);  // Pour éviter les rebonds d’appui 
      while(digitalRead(bp[b].port) == bpEtatPresse) {}         // Attente du relâchement du bp
      delay(20);  // Pour éviter les rebonds au relachement
    }
    deviendrait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if (lesBoutons[b]->vientDEtreEnfonce()) bpPresseAction(b);
    C'est plus simple à lire et en plus on gagne l'asynchronicité: on peut maintenant tenir le bouton enfoncé et appuyer sur les autres ça va fonctionner

    je vous laisse tester et j'espère que vous ne trouverez pas que la déclaration du tableau est trop "alambiquée" !


    la Classe simpleBouton expose d'autres méthodes que vientDEtreEnfonce() ou vientDEtreRelache(), jetez un oeil dans son .h pour voir toutes les possibilités. Il y a aussi des exemples.

  9. #29
    Membre émérite
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 012
    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 012
    Points : 2 341
    Points
    2 341
    Par défaut
    Bonjour Jay M

    Exactement ce que je cherchais, et c'est pas trop "alambiqué" merci!

    Cordialement
    jpbbricole
    L'expérience est la seule chose qu'il ne faut acheter que d'occasion!

  10. #30
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    cool!
    bonne continuation

    (j'aime bien cette bibliothèque simpleBouton.h car elle est très optimisée sur l'usage mémoire)

  11. #31
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    Pour Jaques

    si vous voulez explorer une version avec la bibliothèque des boutons mentionnée ci dessous, ça ressemblerait alors à cela (mettre le moniteur série à 115200 bauds pour voir les messages)

    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
    const byte entreeInutile = 255;
     
    // on déclare les aiguillages
    struct t_aiguillage {
      const char * identifiant;
      const byte pinActiverDroite;
      const byte pinActiverGauche;
    };
     
    t_aiguillage lesAiguillages[] =
    {
      {"G1", 22, entreeInutile},
      {"A1", 23, 24},
      {"A2", 25, 26},
      {"A3", 27, 28},
      {"A4", 29, 30},
      {"B1", 31, 32},
      {"B2", 33, 34},
      {"B3", 35, 36},
      {"B4", 37, 38},
    };
    const byte nombreAiguillages = sizeof(lesAiguillages) / sizeof(lesAiguillages[0]);
     
    // pour simplifier les références dans le tableau on définit des noms pour les aiguillages. cette énumération contient les indices d'un aiguillage dans le tableau
    enum : byte {a_G1, a_A1, a_A2, a_A3, a_A4, a_B1, a_B2, a_B3, a_B4};
     
    struct t_actionAiguillage {
      const byte indexAiguillage;
      const byte position;
    };
     
    const byte nombreMaximumAiguillageSurCheminement = 4;
     
    // on déclare les cheminements possibles
    struct t_cheminement {
      const char * identifiant;
      t_actionAiguillage actions[nombreMaximumAiguillageSurCheminement];
    };
     
    // pour simplifier la lecture on définit les mots clés DROITE et GAUCHE
    enum : byte {DROITE = 'D', GAUCHE = 'G'};
     
    t_cheminement lesChemins[] = {
      { "C1 V1",  {{a_G1, DROITE}, {a_A1, GAUCHE}, {a_A3, DROITE}, {entreeInutile, entreeInutile}}},
      { "C1 V2",  {{a_G1, DROITE}, {a_A1, DROITE}, {a_A4, DROITE}, {entreeInutile, entreeInutile}}},
     
      { "C2 V1",  {{a_B1, GAUCHE}, {a_B3, DROITE}, {a_A2, GAUCHE}, {a_A3, GAUCHE}}},
      { "C2 V2",  {{a_B1, GAUCHE}, {a_B3, DROITE}, {a_A2, DROITE}, {a_A4, GAUCHE}}},
      { "C2 V3",  {{a_B1, DROITE}, {a_B4, DROITE}, {entreeInutile, entreeInutile}, {entreeInutile, entreeInutile}}},
     
      { "C3 V1",  {{a_B2, GAUCHE}, {a_B3, GAUCHE}, {a_A2, GAUCHE}, {a_A3, GAUCHE}}},
      { "C3 V2",  {{a_B2, GAUCHE}, {a_B3, GAUCHE}, {a_A2, DROITE}, {a_A4, GAUCHE}}},
      { "C3 V3",  {{a_B2, GAUCHE}, {a_B4, GAUCHE}, {entreeInutile, entreeInutile}, {entreeInutile, entreeInutile}}},
    };
     
    // pour simplifier les références dans le tableau on définit des noms pour les chemins. cette énumération contient les indices d'un cheminement dans le tableau
    enum : byte {c_C1_V1, c_C1_V2, c_C2_V1, c_C2_V2, c_C2_V3, c_C3_V1, c_C3_V2, c_C3_V3};
     
     
    #include <simpleBouton.h>   // à télécharger sur  https://forum.arduino.cc/index.php?topic=375232.0
    const byte pinBoutons[] = {5, 6, 7, 8, 9, 10, 11, 12};
    const byte nombreDeBoutons = sizeof(pinBoutons) / sizeof(pinBoutons[0]); // doit correspondre au nombre de chemins
    simpleBouton* lesBoutons[nombreDeBoutons];
     
    const unsigned long dureeImpulsion = 50ul;    // durée d'une impulsion sur la pin d'un aiguillage en ms
    void impulsion(byte numPin)
    {
      digitalWrite(numPin, HIGH);
      delay(dureeImpulsion);
      digitalWrite(numPin, LOW);
    }
     
    void activerCheminement(byte c)
    {
      Serial.print(F("Cheminement "));
      Serial.print(lesChemins[c].identifiant);
      Serial.println(F(" demandé"));
     
      for (byte i = 0; i < nombreMaximumAiguillageSurCheminement; i++) {
        if (lesChemins[c].actions[i].position == DROITE) {
          Serial.print(F("Aiguillage "));
          Serial.print(lesAiguillages[lesChemins[c].actions[i].indexAiguillage].identifiant);
          Serial.println(F(" à Droite"));
          impulsion(lesAiguillages[lesChemins[c].actions[i].indexAiguillage].pinActiverDroite); // impulsion sur la pin de droite
        } else if (lesChemins[c].actions[i].position == GAUCHE) {
          Serial.print(F("Aiguillage "));
          Serial.print(lesAiguillages[lesChemins[c].actions[i].indexAiguillage].identifiant);
          Serial.println(F(" à Gauche"));
          impulsion(lesAiguillages[lesChemins[c].actions[i].indexAiguillage].pinActiverGauche); // impulsion sur la pin de gauche
        }
      }
      Serial.println();
    }
     
    void configurerLaGare()
    {
      Serial.println(F("*** Configuration Initiale ***"));
      activerCheminement(c_C1_V1);
      activerCheminement(c_C2_V2);
      activerCheminement(c_C3_V3);
    }
     
    void setup()
    {
      Serial.begin(115200);
     
      for (byte i = 0; i < nombreAiguillages; i++) {
        if (lesAiguillages[i].pinActiverGauche != entreeInutile) pinMode(lesAiguillages[i].pinActiverGauche, OUTPUT);
        if (lesAiguillages[i].pinActiverDroite != entreeInutile) pinMode(lesAiguillages[i].pinActiverDroite, OUTPUT);
        Serial.print(F("Aiguillage "));
        Serial.print(lesAiguillages[i].identifiant);
        Serial.println(F(" configuré."));
      }
      Serial.println();
     
      for (byte i = 0; i < nombreDeBoutons; i++) {
        lesBoutons[i] = new simpleBouton(pinBoutons[i]);  //Cablage : pin---BP---GND. Débounce à 20ms par défaut
        Serial.print(F("Bouton du cheminement "));
        Serial.print(lesChemins[i].identifiant);
        Serial.println(F(" configuré."));
      }
      Serial.println();
     
      // enfin on configure la gare
      configurerLaGare();
      Serial.println(F("*** CONFIGURATION TERMINEE ***\n"));
    }
     
    void loop()
    {
      for (byte bp = 0; bp < nombreDeBoutons; bp++) {
        lesBoutons[bp]->actualiser();
        if (lesBoutons[bp]->vientDEtreEnfonce()) activerCheminement(bp);
      }
    }
    j'ai repris les idées de @JP mais un peu organisées différemment

    On définit un Aiguillage par son nom et les 2 pins de commandes droite et gauche. c'est dans ce tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    t_aiguillage lesAiguillages[] =
    {
      {"G1", 22, entreeInutile},
      {"A1", 23, 24},
      {"A2", 25, 26},
      {"A3", 27, 28},
      {"A4", 29, 30},
      {"B1", 31, 32},
      {"B2", 33, 34},
      {"B3", 35, 36},
      {"B4", 37, 38},
    };
    On définit un cheminement par la succession d'ordre sur des aiguillages en leur demandant de se mettre à droite ou gauche. c'est dans ce tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    t_cheminement lesChemins[] = {
      { "C1 V1",  {{a_G1, DROITE}, {a_A1, GAUCHE}, {a_A3, DROITE}, {entreeInutile, entreeInutile}}},
      { "C1 V2",  {{a_G1, DROITE}, {a_A1, DROITE}, {a_A4, DROITE}, {entreeInutile, entreeInutile}}},
     
      { "C2 V1",  {{a_B1, GAUCHE}, {a_B3, DROITE}, {a_A2, GAUCHE}, {a_A3, GAUCHE}}},
      { "C2 V2",  {{a_B1, GAUCHE}, {a_B3, DROITE}, {a_A2, DROITE}, {a_A4, GAUCHE}}},
      { "C2 V3",  {{a_B1, DROITE}, {a_B4, DROITE}, {entreeInutile, entreeInutile}, {entreeInutile, entreeInutile}}},
     
      { "C3 V1",  {{a_B2, GAUCHE}, {a_B3, GAUCHE}, {a_A2, GAUCHE}, {a_A3, GAUCHE}}},
      { "C3 V2",  {{a_B2, GAUCHE}, {a_B3, GAUCHE}, {a_A2, DROITE}, {a_A4, GAUCHE}}},
      { "C3 V3",  {{a_B2, GAUCHE}, {a_B4, GAUCHE}, {entreeInutile, entreeInutile}, {entreeInutile, entreeInutile}}},
    };
    J'ai mis une énumération pour référencer facilement un chemin connu par son indice
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // pour simplifier les références dans le tableau on définit des noms pour les chemins. cette énumération contient les indices d'un cheminement dans le tableau
    enum : byte {c_C1_V1, c_C1_V2, c_C2_V1, c_C2_V2, c_C2_V3, c_C3_V1, c_C3_V2, c_C3_V3};
    En conséquence, pour l'initialisation de la gare c'est assez simple, on appelle maintenant configurerLaGare() qui active les 3 bons chemins
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void configurerLaGare()
    {
      Serial.println(F("*** Configuration Initiale ***"));
      activerCheminement(c_C1_V1);
      activerCheminement(c_C2_V2);
      activerCheminement(c_C3_V3);
    }

    Il faut autant de boutons que de cheminements, ils sont alloués dans le même ordre (le bouton en position 0 du tableau des boutons déclenche le cheminement en position 0 du tableau des chemins)


    Si vous regardez le code, il y a beaucoup d'indirections dans les tableaux donc faut suivre - mais une fois que l'on a bien compris comment on accède un élément d'une structure ce n'est pas si compliqué que cela et surtout comme l'explique bien @JP, on n'a plus à trop se soucier du code si on rajoute des aiguillages ou des chemins, il suffit de remplir les tableaux correctement, le reste du code s'adaptera.

  12. #32
    Membre émérite
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 012
    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 012
    Points : 2 341
    Points
    2 341
    Par défaut
    Bonjour Jay M

    C'est, dans les grandes lignes, ce que j'ai fait, c'est pas amener la confusion, surtout que Jacques est débutant.
    Je suis entrain d'intégrer SimpleBoutons dans ma version.
    On est dans un forum, je sais tout le monde peut s'exprimer, mais il faut essayer da faire au plus simple, afin de ne pas effaroucher les gens qui débutent. toi qui parlait de pédagogie dans un post précédent...

    Cordialement
    jpbbricole
    L'expérience est la seule chose qu'il ne faut acheter que d'occasion!

  13. #33
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    Pas sûr de bien comprendre...

    J’utilise des énumérations et des structures tout comme vous, Si Jacques a compris cela alors il devrait pouvoir suivre sans doute aussi ce code (et il est assez grand pour poser des questions sinon).

    j’ai pris une approche un petit peu différente sur ce que je mettais dans la structure me disant qu’un aiguillage c’était concret, on le voit bien avec un nom et ses deux pins de contrôle droite et gauche - donc ma base c’est une liste d’aiguillages. C’est comme ça que le le vois.

    Ensuite on a la notion de cheminement qui est une liste de position d’aiguillage, tout comme vous - mais avec une représentation plus détaillée: on dit quel aiguillage et s’ils doit être à droite ou gauche.

    Enfin les boutons sont associés à ces chemins.

    Il y’a l’exemple que je vous ai posté ci dessous pour montrer comment marche la bibliothèque des boutons

    Ce ne ne semble pas insurmontable et d’un point de vue pédagogique explorer différentes versions et points de vue c’est aussi formateur.

    Ça n’enlève aucun mérite à votre approche, c’est juste une autre façon de raisonner - plus centrée sur les objets ou concepts (un aiguillage, une position, un cheminement) et qui me semble plus simple qu’une grosse liste de noms et pins en sautant celles qui ne servent à rien.

  14. #34
    Membre émérite
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 012
    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 012
    Points : 2 341
    Points
    2 341
    Par défaut
    Citation Envoyé par Jay M Voir le message

    Ce ne ne semble pas insurmontable et d’un point de vue pédagogique explorer différentes versions et points de vue c’est aussi formateur.
    Ca démontre que je n'ai pas ton sens de la pédagogie, j'essayais d'avancer progressivement, mais bon...

    Cordialement
    jpbbricole
    L'expérience est la seule chose qu'il ne faut acheter que d'occasion!

  15. #35
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    Citation Envoyé par jpbbricole Voir le message
    Ca démontre que je n'ai pas ton sens de la pédagogie
    Salut

    Je n'ai pas dit que j'avais raison, c'est peut-être vous ou un juste milieu entre nos deux approches. C'est un peu le souci quand on essaye de partager des connaissances sans avoir de retour "temps réel" de l'apprenant - difficile de s'adapter au fil de l'eau.

    Au final Jacques à deux codes interessants à explorer, qui s'appuient sur des techniques similaires de programmation (struct, enum, tableaux, tests, boucles) mais qui prennent une approche différente en terme de représentation "du monde". C'est en cela que je trouve que c'est formateur.

    Votre approche est plus fonctionnelle - la mienne est un petit peu orientée objet. L'une n'est pas meilleure que l'autre.

    ---
    PS: Si vraiment je devais faire ce code pour moi, j'aurais poussé un cran plus loin et déclaré des Classes C++ et des méthodes associées. Mais je me suis abstenu car je ne pense pas que Jacques en soit là au niveau programmation.

  16. #36
    Membre éprouvé
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 562
    Points : 1 253
    Points
    1 253
    Par défaut
    Salut,

    Et oui, on n'est pas nombreuses

    Sinon ma petite et modeste contribution dans la foulée : exécutable sur https://onlinegdb.com/SJcZKGUrw

    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
    /******************************************************************************
    Online C++ Compiler: Code, Compile, Run and Debug C++ program online.
    Write your code in this editor and press "Run" button to compile and execute it.
    *******************************************************************************/
    #include <iostream>
    #include <cstdint>
     
    enum Switch : uint8_t {C1V1= 5, C1V2, C2V1, C2V2, C2V3, D3V3, };
    enum Railway: uint8_t {G1D= 22, A1G, A1D, A2G, A2D, A3G, A3D, A4G, A4D, };
    const uint8_t max_handled_railways_per_switch= 4;
     
    struct Railways_switch {
        Switch button; 
        Railway ways[max_handled_railways_per_switch];
    };
     
    const Railways_switch rs_map [] {
        {C1V1, {G1D, A1G, A3D}},
        {C2V1, {A1G, A1D, A3D, A4D}},
        {C2V3, {A2D, A3G}},
    };
     
    int main()
    {
        for (const auto& rs: rs_map) {
          std::cout<< "boutton: "<< rs.button << '\n';
          for (const auto& way: rs.ways)
            if (way)
              std::cout<< "  voie: "<< way<< '\n';
        }
    }

    edit "boutton"

  17. #37
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    Citation Envoyé par kaitlyn Voir le message
    Sinon ma petite et modeste contribution dans la foulée : exécutable sur https://onlinegdb.com/SJcZKGUrw
    Salut - oui c'est le principe retenu par @JP (sans les étiquettes "lisibles" ni bien sûr l'interaction avec les boutons) et c'est bien synthétique / concis ! bravo

  18. #38
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    Par contre, une question se pose : au cas ou l'appui sur un bouton a lieu à l'instant "T" ou une rame se trouve sur un aiguillage, l'aiguillage va changer de position ce qui risque de créer un déraillement. J'entrevois la solution d'une détection par led infrarouge située avant les aiguillages sur les circuits C1, C2 et C3. Il faut que je réfléchisse au problème !
    il y a de nombreux articles intéressants sur locoduino

    pour votre question, une option "simple": capteurs Reed ILS sur la voie + un aimant sous le train

    ==> bonus = ça se comporte comme un bouton poussoir donc vous pouvez aussi utiliser la bibliothèque simpleBouton pour détecter ces évènements

  19. #39
    Membre habitué
    Avatar de Jsiorat
    Homme Profil pro
    RETRAITE
    Inscrit en
    Juillet 2005
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : RETRAITE

    Informations forums :
    Inscription : Juillet 2005
    Messages : 398
    Points : 169
    Points
    169
    Par défaut
    Citation Envoyé par kaitlyn Voir le message
    ...
    Bonjour Kaitlyn !
    Ça fait plaisir de savoir que le boulot de programmeur n'est pas uniquement masculin !

    Merci pour ce bout de code !

    Citation Envoyé par Jay M Voir le message
    il y a de nombreux articles intéressants sur locoduino
    [...]
    Je connais locoduino, les gars qui sont sur ce site sont hyper pointus et j'ai du mal à comprendre leurs écrits.
    Ici, j'ai trouvé des exemples et de la compréhension ce qui m'a permis de m'améliorer un petit peu et de me coucher le soir, un peu ... très peu moins bête !
    Être vieux, c'est être jeune depuis plus longtemps que les autres !

  20. #40
    Membre habitué
    Avatar de Jsiorat
    Homme Profil pro
    RETRAITE
    Inscrit en
    Juillet 2005
    Messages
    398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : RETRAITE

    Informations forums :
    Inscription : Juillet 2005
    Messages : 398
    Points : 169
    Points
    169
    Par défaut
    Bonsoir à TOUTES et tous ...

    Est-ce quelqu'un pourrait m'expliquer la syntaxe de Serial.println(F("Hello !")) ?
    C'est quoi ce "F" ?

    je n'ai pas trouver cette référence sur internet !

    Merci à tous
    Être vieux, c'est être jeune depuis plus longtemps que les autres !

Discussions similaires

  1. Requête pour effectuer une comparaison entre deux dates
    Par ktm26 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/04/2017, 08h49
  2. Effectue une soustraction entre deux dates
    Par messi1987 dans le forum Développement
    Réponses: 2
    Dernier message: 05/03/2015, 14h22
  3. [XL-2003] Faire une liaison entre deux tableaux sur 2 classeurs différents
    Par Katell dans le forum Conception
    Réponses: 1
    Dernier message: 22/01/2015, 18h04
  4. implementer une association entre deux classes uml en java
    Par tabbabi dans le forum Persistance des données
    Réponses: 8
    Dernier message: 19/04/2011, 19h39
  5. Réponses: 1
    Dernier message: 11/06/2009, 23h39

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