Répondre à la discussion
Affichage des résultats 1 à 24 sur 24

Arduino Maitre esclave




  1. #1
    electrique10

    Arduino Maitre esclave

    Bonjour
    j'utilise actuellement un arduino Mega qui me sert a activé ou désactivé 60 sorties qui est piloté par le logiciel Vixen
    le code en lui même fonctionne très bien pas de souci la dessus.
    seulement ca fonctionne qu'avec un seul arduino.

    Seulement je voudrait ajouter cette fois-ci un arduino UNO qui sera connecté en série avec le premier arduino MEGA
    qui ajoutera des sorties supplémentaires au premier arduino MEGA.

    Seulement la je bloque j'ai connecté le TX le +5v et la masse du premier arduino MEGA
    vers le RX +5v et la masse vers le second arduino UNO

    je transfère le même code en mettant moins de sortie bien évidement seulement 10 pour le UNO mais ca ne fonctionne pas.
    parfois même ca me fait planté le 1er arduino MEGA


    Voici le code que j'ai pu voir sur le net qui me sert a piloté l'arduino via le logiciel Vixen

    Code:
    #define CANAL_01 2
    #define CANAL_02 3
    #define CANAL_03 4
    #define CANAL_04 5
    #define CANAL_05 6
    #define CANAL_06 7
    #define CANAL_07 8
    #define CANAL_08 9
    #define CANAL_09 10
    #define CANAL_10 11
    #define CANAL_11 12
    #define CANAL_12 13
    #define CANAL_13 14
    #define CANAL_14 15
    #define CANAL_15 16
    #define CANAL_16 17
    #define CANAL_17 18
    #define CANAL_18 19
    #define CANAL_19 20
    #define CANAL_20 21
    #define CANAL_21 22
    #define CANAL_22 23
    #define CANAL_23 24
    #define CANAL_24 25
    #define CANAL_25 26
    #define CANAL_26 27
    #define CANAL_27 28
    #define CANAL_28 29
    #define CANAL_29 30
    #define CANAL_30 31
    #define CANAL_31 32
    #define CANAL_32 33
    #define CANAL_33 34
    #define CANAL_34 35
    #define CANAL_35 36
    #define CANAL_36 37
    #define CANAL_37 38
    #define CANAL_38 39
    #define CANAL_39 40
    #define CANAL_40 41
    #define CANAL_41 42
    #define CANAL_42 43
    #define CANAL_43 44
    #define CANAL_44 45
    #define CANAL_45 46
    #define CANAL_46 47
    #define CANAL_47 48
    #define CANAL_48 49
    #define CANAL_49 50
    #define CANAL_50 51
    #define CANAL_51 52
    #define CANAL_52 53
    #define CANAL_53 A0
    #define CANAL_54 A1
    #define CANAL_55 A2
    #define CANAL_56 A3
    #define CANAL_57 A4
    #define CANAL_58 A5
    #define CANAL_59 A6
    #define CANAL_60 A7
    
    #define NBS_CANAUX 60
    #define BAUD_RATE 57600
    
    int CANAUX[] = {
    CANAL_01,
    CANAL_02,
    CANAL_03,
    CANAL_04,
    CANAL_05,
    CANAL_06,
    CANAL_07,
    CANAL_08,
    CANAL_09,
    CANAL_10,
    CANAL_11,
    CANAL_12,
    CANAL_13,
    CANAL_14,
    CANAL_15,
    CANAL_16,
    CANAL_17,
    CANAL_18,
    CANAL_19,
    CANAL_20,
    CANAL_21,
    CANAL_22,
    CANAL_23,
    CANAL_24,
    CANAL_25,
    CANAL_26,
    CANAL_27,
    CANAL_28,
    CANAL_29,
    CANAL_30,
    CANAL_31,
    CANAL_32,
    CANAL_33,
    CANAL_34,
    CANAL_35,
    CANAL_36,
    CANAL_37,
    CANAL_38,
    CANAL_39,
    CANAL_40,
    CANAL_41,
    CANAL_42,
    CANAL_43,
    CANAL_44,
    CANAL_45,
    CANAL_46,
    CANAL_47,
    CANAL_48,
    CANAL_49,
    CANAL_50,
    CANAL_51,
    CANAL_52,
    CANAL_53,
    CANAL_54,
    CANAL_55,
    CANAL_56,
    CANAL_57,
    CANAL_58,
    CANAL_59,
    CANAL_60,
    };
    
    int OCTET_ENTRANT[NBS_CANAUX];
    
    
    void setup() {
    
    Serial.begin(BAUD_RATE);
    
    // CONFIGURE CHAQUE CANAL COMME SORTIE
    for(int i = 0; i < NBS_CANAUX; i++) {
    pinMode(CANAUX[i], OUTPUT);
    }}
    
    
    void loop() {
    // LECTURE DES DONNÉES DE VIXEN PUIS STOCK LES VALEURS DANS UN TABLEAU
    if (Serial.available() >= NBS_CANAUX) {
    for (int i = 0; i < NBS_CANAUX; i++) {
    OCTET_ENTRANT[i] = Serial.read(); }
    
    
    // LIT LES DONNÉES PUIS ACTIVE LES SORTIES
    for (int i = 0; i < NBS_CANAUX; i++) {
    digitalWrite(CANAUX[i], OCTET_ENTRANT[i]);
    
    }}}
    Est-ce que c'est possible de mettre des arduino en série ?
    si oui est-ce que le code convient pour le second ?

    -----


  2. Publicité
  3. #2
    freepicbasic

    Re : Arduino Maitre esclave

    Le 2560 a 4 ports série.
    Il peut donc communiquer avec 4 voies.

    exemple ;
    1 PC prog (reservé)
    2 telec reception
    3 voie1 commande de 64 fribotte
    4 voie2 commande de 64 fribotte suplémentaire

    (noter qu'une voie servo en fait est un octet et pourrait commander 8 voies tout ou rien en simultané ou 255 en 1/255)

    Si on utilise un protocole simple comme celui de fribotte http://fribotte.free.fr/bdtech/8serv...vomoteurs.html
    Si on ne veut pas commander des servos on peut modifier pour commander ce qu'on veut.
    ça se porte facilement sur Arduino.
    A+, pat

  4. #3
    electrique10

    Re : Arduino Maitre esclave

    Merci mais ca résoud pas mon problème
    j'ai lu qu'il fallais ajouté cette ligne

    Serial.print(OCTET_ENTRANT[i]);

    en dessous de digitalWrite(CANAUX[i], OCTET_ENTRANT[i]);
    pour renvoyé ce qui a été recu par le premier Arduino vers le 2ème mais ca ne fonctionne pas.


  5. #4
    Seb.26

    Re : Arduino Maitre esclave

    Si tu veux faire une boucle avec tes Arduino, il faut cabler :

    PC.Tx -> Arduino1.Rx
    Arduino1.Tx -> Arduino2.Rx
    Arduino2.Tx -> PC.Rx

    il faut aussi faire en sorte que chaque Arduino ne traite que ses packets et fasse suivre ceux qui ne le concernent pas.
    Dernière modification par Seb.26 ; 06/12/2018 à 09h07.
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  6. #5
    Seb.26

    Re : Arduino Maitre esclave

    Citation Envoyé par electrique10 Voir le message
    j'ai lu qu'il fallais ajouté cette ligne
    Serial.print(OCTET_ENTRANT[i]);
    en dessous de digitalWrite(CANAUX[i], OCTET_ENTRANT[i]);
    où ?
    dans quoi ?

    Faut qu'on cherche nous même ou tu vas nous aider un peu ?? ... pas grand monde n'a de boule de cristal ici à part Daudet et le soft c'est pas son truc ... donc t'es mal barré ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  7. A voir en vidéo sur Futura
  8. #6
    Seb.26

    Re : Arduino Maitre esclave

    PS: ce programme est une passoire niveau sécurité ... si tu perds un jour un octet, plus rien ne marchera jamais ...

    Vu comment est fait ton programme, tu peux directement relier le PC.Tx au Arduino1.Rx et au Arduino2.Rx ...
    Dernière modification par Seb.26 ; 06/12/2018 à 09h14.
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  9. #7
    electrique10

    Re : Arduino Maitre esclave

    désolé c'est un code que j'ai copié sur le net pour faire controler l'arduino via le logiciel Vixen
    je débute avec les arduino au niveau du code copié j'y comprend pas grand chose a vrai dire.
    en faite tel quel ca fonctionne sur un seul arduino
    seulement c'est juste par prévention je voudrait me laisser une connectique après le premier arduino
    pour faire une extension en cas ou si un jour j'ai besoin de plus de sortie.
    du coup moi j'ai fait ce branchement

    captur10.png

    seulement j'ai besoin que le premier arduino soit directement connecté au PC car le 2ème Arduino ne sera pas forcément connecté
    du coup si j'enlève le 2ème arduino ca m'oblige a modifier la connectique au niveau de l'USB

  10. Publicité
  11. #8
    electrique10

    Re : Arduino Maitre esclave

    par contre je comprend pas ce que vous voulez dire que ce programme est une passoire niveau sécurité ?

  12. #9
    freepicbasic

    Re : Arduino Maitre esclave

    Dans les exemples Arduino (communication) il y a multiserial
    Dans cet exemple la vitesse est la même , il suffit de mettre les vitesses désirées.
    La vitesse peut être différente, bien sur, la réception doit être plus lente ou égale, sinon on risque de perdre de la donnée,
    Ou alors la vitesse réception rapide a un débit très faible et l'émetteur lent pourra suivre.

    ps)
    Parfois sur les clones Chinois, les inscriptions peuvent être fausses, mais généralement le schéma original est respecté.

    Évidemment sans protocole on risque de perdre des données, parfois c'est acceptable , parfois non, tout dépend de l'utilisation.
    Une télécommande qui envoie une rafale d'une même commande peut se contenter d'un codage simple, un fichier compressé ne supporte pas d'erreur...

    Code:
    void setup() {
      // initialize both serial ports:
      Serial.begin(9600);
      Serial1.begin(9600);
    }
    
    void loop() {
      // read from port 1, send to port 0:
      if (Serial1.available()) {
        int inByte = Serial1.read();
        Serial.write(inByte);
      }
    
      // read from port 0, send to port 1:
      if (Serial.available()) {
        int inByte = Serial.read();
        Serial1.write(inByte);
      }
    }
    A+, pat

  13. #10
    freepicbasic

    Re : Arduino Maitre esclave

    Arduino uno n'a qu'un seul port série.
    L' entrée et la sortie Rx,Tx sont équipés d'une 1K qui permet de ne pas court-circuité les sorties.
    Car Rx et TX sont des pins externes pour un shield.
    Si l'on branche plusieurs sorties ensembles, il faudra utiliser des "collecteur ouvert" , sinon la commutation peut être en conflit avec les autres sorties qui bloqueront la transmission.
    Au repos les Tx sont à l'état haut (signal RS232 inversé sur 5V) ce qui correspond à un npn bloqué, donc un autre npn peut utiliser la ligne.
    Il peut y avoir des collisions , mais si le master interroge un slave spécifique , les transmissions se font correctement , l'une après l'autre, ou s'il envoie des commandes simple à tous avec un numéro d'identification du slave ou un numéro de groupe de slave.

    Si l'on envoie une commande Tx sur de nombreux récepteurs, il faudra amplifier le courant et si le fil est long , il faudra des répéteurs, mais là ça devient complexe autant passer au net.
    A+, pat

  14. #11
    electrique10

    Re : Arduino Maitre esclave

    Merci de votre aide mais la ca deviens trop complexe pour moi
    je pensais qu'en connectant RX et TX sur la 2ème cela fonctionnerais.
    et répéter le signal reçu de la 1ère carte vers la 2ème ce qui n'est pas le cas.
    tampi je vais me contenter d'une seule carte

  15. #12
    PA5CAL

    Re : Arduino Maitre esclave

    Bonjour

    Arduino est un projet dans lequel de nombreux aspects complexes du matériel et du logiciel ont été cachés au développeur dans un but de simplification, afin qu'il puisse se concentrer sur certains points restant sous son contrôle. L'expérimentation avec Arduino est censé l'aider à en comprendre le fonctionnement, puis la bonne compréhension du fonctionnement lui permettre de réaliser des programmes qui marchent.

    Si la démarche consiste juste à recopier des bouts de code en espérant que ça tombe en marche, on a tout faux. Non seulement on n'apprend presque rien des choses simples mises à sa portée, mais on se met en situation de ne pas pouvoir aborder les choses plus compliquées.


    Arduino propose un logiciel de contrôle de l'interface de transmission série asynchrone (USART) sur les broches RX et TX, sous la forme d'un objet C++ nommé Serial qui est doté principalement de quatre méthodes (il y en a d'autres, moins usitées) :
    - begin(...) fixe la vitesse de transmission de l'interface, en émission et en réception ;
    - available() retourne le nombre d'octets déjà reçus (et mémorisés dans un tampon de réception) ;
    - read() retourne la valeur d'un octet déjà reçu au travers de la broche RX (et mémorisé dans le tampon de réception), ou -1 si aucun octet n'est disponible ;
    - write(...) commande l'envoi d'un octet au travers de la broche TX (l'octet est mémorisé dans un tampon d'émission, mais il est envoyé seulement après que l'envoi de tous les octets précédents aura été terminé).

    Les tampons d'émission et de réception ont une taille limitée (64 octets par défaut). Si un nouvel octet est reçu alors que le tampon de réception est déjà plein, alors il est perdu. Si un nouvel octet est envoyé alors que le tampon d'émission est plein, alors la fonction write() attend (en bloquant le programme) jusqu'à ce que l'envoi en cours se termine et libère une place dans le tampon.

    Comme l'interface de ne dispose d'aucun signal de contrôle, les octets sont a priori envoyés même si le destinataire n'est pas en mesure de les recevoir.

    L'envoi sur TX et la réception sur RX d'un octet prennent du temps. Si B est la vitesse de transmission de l'interface (exprimée en bauds), alors les temps nécessaires à l'envoi ou à la réception est supérieur ou égal à 10/B. Par exemple, si la vitesse de l'interface est fixée à B=9600 bauds, alors ces durées sont supérieures ou égales à 10/9600≈0,001042 seconde, soit environ 1,042 ms. L'interface étant réalisée matériellement, ces durées ne viennent pas se soustraire aux durées d'exécution du logiciel (i.e. le logiciel n'attend pas la fin de l'envoi sur TX ni la fin de la réception sur RX pour continuer).

    NB: la valeur 10 dans la formule vient du fait que la transmission de chaque octet nécessite au moins l'envoi ou la réception de 10 bits (1 bit de start + 8 bits de données + 1 bit de stop).

    Dans le cas particulier où l'Arduino émet un flot continu d'octets issu du traitement d'un flot continu d'octets qu'il reçoit, il est impératif que le temps séparant la réception sur RX de deux octets consécutifs reste supérieur au temps de traitement d'un de ces octets et au temps d'émission d'un octet sur TX. Dans le cas contraire, le tampon de réception finit par se remplir complètement et des octets reçus sont perdus, soit parce que le système reçoit parfois plus d'un octet quand il n'en traite qu'un, soit parce que le tampon d'émission finit par être complètement rempli et ralentit le déroulement du programme.

    NB : si le débit du flot reçu ne peut pas être contrôlé, alors on peut par exemple faire en sorte que dans le protocole mis en œuvre, le nombre d'octets émis par un Arduino soit suffisamment inférieur au nombre d'octets reçus.


    On peut tout-à-fait réaliser une chaîne d'Arduinos à l'aide des signaux TX et RX, à condition de régler la vitesse de transmission de leur interface à la même valeur, et de tenir compte des contraintes exposées précédemment.

    Toutefois, lorsque deux Arduinos sont connectés ensemble, si un Arduino émet un signal TX alors que l'autre (censé recevoir ce signal sur RX) est éteint, alors la sortie TX du premier Arduino va tenter d'alimenter l'ensemble du second Arduino et de ses périphériques au travers des diodes de protection de l'entrée RX de ce dernier. Cela peut conduire à endommager définitivement les circuits.

    Dans le cas d'une vitesse de transmission assez basse et d'une liaison assez courte, un moyen simple pour parer ce problème consiste à insérer une résistance de limitation en série entre la sortie TX de l'Arduino émetteur et l'entrée RX de l'Arduino récepteur. Comme l'entrée RX de l'Arduino est déjà connectée à la sortie TX de l'interface USB de la carte au travers d'une résistance de 1 kΩ, il faudrait que la valeur de résistance de limitation reste quand même suffisamment faible pour ne pas altérer les niveaux logiques transmis (prendre par exemple 180 Ω).

  16. #13
    PA5CAL

    Re : Arduino Maitre esclave

    Comme il existe des risques que les octets transmis soient perdus, altérés ou mal interprétés (un parasite sur la ligne ou un bit de donnée à zéro pouvant notamment être perçu comme un bit de start), il est généralement nécessaire d'ajouter aux données des informations permettant d'en vérifier l'exactitude, et de faire en sorte que le système puisse continuer de fonctionner en cas d'erreur ou de pertes durant la transmission.

    Imaginons un système constitué de trois Arduinos en cascade, pilotant chacun respectivement 60, 18 et 18 sorties logiques (soit 96 au total).

    Si le processus est lent (disons pas plus de quelques dizaines de commandes par seconde), alors on peut se permettre de transmettre un seul état logique par octet. Pour limiter les risques de confusion entre les deux octets transmis correspondant à un état haut et à un état base, on peut par exemple choisir de les représenter respectivement par les caractères « T » (code 0x54) et « n » (code 0x6E).

    À ces deux caractères, on peut en ajouter deux autres, l'un pour signaler le démarrage de la transmission des états logiques, et l'autre pour en signaler la fin. Ainsi, on pourra vérifier que le nombre d'états logiques reçus entre le début et la fin de la transmission correspond bien à celui attendu, ce qui réduira le risque d'affecter un état logique à une sortie auquel il n'était pas destiné. On peut par exemple choisir « U » (code 0x55) pour le début et « 3 » (code 0x33) pour la fin.

    Ainsi, l'envoi de ces différents caractères génère l'émission de séquences de bits qui sont suffisamment différentes pour limiter les risques que l'altération d'un bit ou la dé-synchronisation de la transmission produise accidentellement un symbole non souhaité sans qu'on puisse s'en rendre compte. Ainsi, si l'on prend en considération les deux bits 10 au début de la transmission de l'octet (correspondant à l'état de repos initial suivi du bit de start) et le bit 1 à la fin de la transmission de l'octet (correspondant au bit de stop), alors les différents caractères génèrent sur la ligne les séquences suivantes :
    U : 10101010101
    T : 10010010101
    n : 10011101101
    3 : 10110011001

    Toute transmission erronée sera abandonnée dans sa totalité.

    On peut également partir du principe que les états logiques concernant un Arduino ne seront pas transmis à l'Arduino suivant. En conséquence :
    - le premier Arduino reçoit 96 états, en utilise 60 et en retransmet 36,
    - le deuxième Arduino reçoit ces 36 états, en utilise 18 et en retransmet 18,
    - le dernier Arduin0 reçoit ces 18 états, les utilise et ne retransmet rien.


    Au final :

    • Le pseudo-code de la console de commande serait :

    Envoyer le caractère « U »
    Pour chaque canal de 1 à 96 :
    ¨ Si le canal doit être activé, alors envoyer le caractère « T »
    ¨ Sinon, envoyer le caractère « n »
    Envoyer le caractère « 3 »
    Attendre un peu


    • Le code de la fonction loop() du premier Arduino serait :
    Code:
    #define NBR_CANAUX 60
    int CANAUX[NBR_CANAUX] = { ... };
    
    #define NBR_TOTAL_CANAUX 96
    int OCTET_ENTRANT[NBR_TOTAL_CANAUX];
    
    ...
    
    void loop() {
      int c, i;
    
      do {
        while (!Serial.available()) {} // Attendre la réception d'un caractère
        c = Serial.read();             // Lire le caractère
      } while (c!='U');                // Répéter tant que le début de la
                                       //  séquence n'a pas été reçu
      for (i=0 ; i<NBR_TOTAL_CANAUX ; i++) {
        while (!Serial.available()) {} // Attendre la réception d'un caractère
        c = Serial.read();             // Lire le caractère
        if (c=='T')
          OCTET_ENTRANT[i] = 1;        // Enregistrer l'état 1 transmis
        else
        if (c=='n')
          OCTET_ENTRANT[i] = 0;        // Enregistrer l'état 0 transmis
        else
          return;                      // En cas d'erreur, abandonner la
                                       //  transmission en cours pour en
                                       //  démarrer une nouvelle
      }
    
      while (!Serial.available()) {}   // Attendre la réception d'un caractère
      c = Serial.read();               // Lire le caractère
      if (c!='3')
        return;                        // Si la séquence n'est pas correctement
                                       //  terminée, abandonner la transmission
                                       //  en cours pour en démarrer une
                                       //  nouvelle
    
      for (i=0 ; i<NBR_CANAUX ; i++)   // Activer/désactiver les sorties
        digitalWrite(CANAUX[i], OCTET_ENTRANT[i]);
    
      Serial.write('U');               // Débuter l'émission d'une séquence
      for (i=NBR_CANAUX ; i<NBR_TOTAL_CANAUX ; i++) {
        if (OCTET_ENTRANT[i])          // Transmettre les états
          Serial.write('T');
        else
          Serial.write('n');
      }
      Serial.write('3');               // Terminer l'émission de la séquence
    
    }
    • Le code de la fonction loop() du deuxième Arduino serait le même, mais avec :
    Code:
    #define NBR_CANAUX 18
    et :
    Code:
    #define NBR_TOTAL_CANAUX 36
    • Le code de la fonction loop() du dernier Arduino ne contiendrait que les parties correspondant à la réception et l'activation/désactivation des sorties.
    Dernière modification par PA5CAL ; 07/12/2018 à 15h43.

  17. #14
    electrique10

    Re : Arduino Maitre esclave

    Merci PA5CAL mais j'ai un message d'erreur quand je compile
    je doit remettre le code original a la place des ... que vous avez mis ?
    Si c'est possible pouvez vous me donné le code au complet car je suis un peu perdu.
    Je vous remercie

  18. #15
    PA5CAL

    Re : Arduino Maitre esclave

    Code:
    #define BAUD_RATE 57600
    
    #define NBR_CANAUX 60
    #define NBR_TOTAL_CANAUX 96
    
    #define CANAL_01 2
    #define CANAL_02 3
    #define CANAL_03 4
    #define CANAL_04 5
    #define CANAL_05 6
    #define CANAL_06 7
    #define CANAL_07 8
    #define CANAL_08 9
    #define CANAL_09 10
    #define CANAL_10 11
    #define CANAL_11 12
    #define CANAL_12 13
    #define CANAL_13 14
    #define CANAL_14 15
    #define CANAL_15 16
    #define CANAL_16 17
    #define CANAL_17 18
    #define CANAL_18 19
    #define CANAL_19 20
    #define CANAL_20 21
    #define CANAL_21 22
    #define CANAL_22 23
    #define CANAL_23 24
    #define CANAL_24 25
    #define CANAL_25 26
    #define CANAL_26 27
    #define CANAL_27 28
    #define CANAL_28 29
    #define CANAL_29 30
    #define CANAL_30 31
    #define CANAL_31 32
    #define CANAL_32 33
    #define CANAL_33 34
    #define CANAL_34 35
    #define CANAL_35 36
    #define CANAL_36 37
    #define CANAL_37 38
    #define CANAL_38 39
    #define CANAL_39 40
    #define CANAL_40 41
    #define CANAL_41 42
    #define CANAL_42 43
    #define CANAL_43 44
    #define CANAL_44 45
    #define CANAL_45 46
    #define CANAL_46 47
    #define CANAL_47 48
    #define CANAL_48 49
    #define CANAL_49 50
    #define CANAL_50 51
    #define CANAL_51 52
    #define CANAL_52 53
    #define CANAL_53 A0
    #define CANAL_54 A1
    #define CANAL_55 A2
    #define CANAL_56 A3
    #define CANAL_57 A4
    #define CANAL_58 A5
    #define CANAL_59 A6
    #define CANAL_60 A7
    
    int CANAUX[] = {
      CANAL_01,
      CANAL_02,
      CANAL_03,
      CANAL_04,
      CANAL_05,
      CANAL_06,
      CANAL_07,
      CANAL_08,
      CANAL_09,
      CANAL_10,
      CANAL_11,
      CANAL_12,
      CANAL_13,
      CANAL_14,
      CANAL_15,
      CANAL_16,
      CANAL_17,
      CANAL_18,
      CANAL_19,
      CANAL_20,
      CANAL_21,
      CANAL_22,
      CANAL_23,
      CANAL_24,
      CANAL_25,
      CANAL_26,
      CANAL_27,
      CANAL_28,
      CANAL_29,
      CANAL_30,
      CANAL_31,
      CANAL_32,
      CANAL_33,
      CANAL_34,
      CANAL_35,
      CANAL_36,
      CANAL_37,
      CANAL_38,
      CANAL_39,
      CANAL_40,
      CANAL_41,
      CANAL_42,
      CANAL_43,
      CANAL_44,
      CANAL_45,
      CANAL_46,
      CANAL_47,
      CANAL_48,
      CANAL_49,
      CANAL_50,
      CANAL_51,
      CANAL_52,
      CANAL_53,
      CANAL_54,
      CANAL_55,
      CANAL_56,
      CANAL_57,
      CANAL_58,
      CANAL_59,
      CANAL_60,
    };
    
    int OCTET_ENTRANT[NBR_TOTAL_CANAUX];
    
    void setup() {
      int i;
    
      Serial.begin(BAUD_RATE);         // Régler la vitesse de transmission
    
      for(i=0; i<NBR_CANAUX; i++)      // Configurer les sorties
        pinMode(CANAUX[i], OUTPUT);
    }
    
    void loop() {
      int c, i;
    
      do {
        while (!Serial.available()) {} // Attendre la réception d'un caractère
        c = Serial.read();             // Lire le caractère
      } while (c!='U');                // Répéter tant que le début de la
                                       //  séquence n'a pas été reçu
      for (i=0 ; i<NBR_TOTAL_CANAUX ; i++) {
        while (!Serial.available()) {} // Attendre la réception d'un caractère
        c = Serial.read();             // Lire le caractère
        if (c=='T')
          OCTET_ENTRANT[i] = 1;        // Enregistrer l'état 1 transmis
        else
        if (c=='n')
          OCTET_ENTRANT[i] = 0;        // Enregistrer l'état 0 transmis
        else
          return;                      // En cas d'erreur, abandonner la
                                       //  transmission en cours pour en
                                       //  démarrer une nouvelle
      }
    
      while (!Serial.available()) {}   // Attendre la réception d'un caractère
      c = Serial.read();               // Lire le caractère
      if (c!='3')
        return;                        // Si la séquence n'est pas correctement
                                       //  terminée, abandonner la transmission
                                       //  en cours pour en démarrer une
                                       //  nouvelle
    
      for (i=0 ; i<NBR_CANAUX ; i++)   // Activer/désactiver les sorties
        digitalWrite(CANAUX[i], OCTET_ENTRANT[i]);
    
      Serial.write('U');               // Débuter l'émission d'une séquence
      for (i=NBR_CANAUX ; i<NBR_TOTAL_CANAUX ; i++) {
        if (OCTET_ENTRANT[i])          // Transmettre les états
          Serial.write('T');
        else
          Serial.write('n');
      }
      Serial.write('3');               // Terminer l'émission de la séquence
    }
    Si ça ne compilait pas, c'est probablement parce que j'avais écrit NBR_... au lieu du NBS_... du code original.
    Dernière modification par PA5CAL ; 08/12/2018 à 09h53.

  19. #16
    electrique10

    Re : Arduino Maitre esclave

    Merci
    j'ai mis le code sur la première carte Mega uniquement pour le moment mais le logiciel Vixen ne contrôle aucune sortie.
    au niveau de vixen rien n'a changé par rapport a avant pourtant c'est bien la ligne digitalWrite(CANAUX[i], OCTET_ENTRANT[i]);
    qui active les sorties mais la je comprend pas que ca n'active pas les sorties

  20. #17
    PA5CAL

    Re : Arduino Maitre esclave

    Dans le cas de l'Arduino Mega, on dispose de trois interfaces séries supplémentaires (broches RX1/TX1, RX2/TX2 et RX3/TX3, objets Serial1, Serial2 et Serial3), qui sont totalement indépendantes de l'interface série par défaut (broches RX/TX, objet Serial), et par conséquent de l'interface USB de la carte.

    En utilisant au minimum l'une de ces trois interfaces pour envoyer les états à l'Arduino suivant, on peut éviter que la transmission soit également reçue par le PC.

    En utilisant plusieurs de ces interfaces, on peut connecter plusieurs Arduinos, et ainsi avoir une configuration de réseau « en étoile » plutôt que « en cascade », ce qui limite les re-transmissions et donc les risques d'erreurs, mais également permettrait de rendre les changements d'état que les sorties des différents Arduinos quasiment simultanés si on les réalise après la transmission (... voire d'adopter un protocole où les Arduinos esclaves pourraient retourner un accusé de réception de la transmission).

    Par exemple, si l'on branche le premier Arduino esclave sur TX1 et le second sur TX2 :
    Code:
    #define NBR_CANAUX_1 18
    void setup() {
      Serial.begin(BAUD_RATE);
      Serial1.begin(BAUD_RATE);
      Serial2.begin(BAUD_RATE);
    
    ...
    et dans loop(), après la réception :
    Code:
    ...
    
      Serial1.write('U');               // Débuter l'émission vers Arduino 1
      for (i=NBR_CANAUX ; i<NBR_CANAUX+NBR_CANAUX_1 ; i++) {
        if (OCTET_ENTRANT[i])          // Transmettre les états
          Serial1.write('T');
        else
          Serial1.write('n');
      }
      Serial1.write('3');               // Terminer l'émission de la séquence
    
      Serial2.write('U');               // Débuter l'émission vers Arduino 2
      for ( ; i<NBR_TOTAL_CANAUX ; i++) {
        if (OCTET_ENTRANT[i])          // Transmettre les états
          Serial2.write('T');
        else
          Serial2.write('n');
      }
      Serial2.write('3');               // Terminer l'émission de la séquence
    
      for (i=0 ; i<NBR_CANAUX ; i++)   // Activer/désactiver les sorties
        digitalWrite(CANAUX[i], OCTET_ENTRANT[i]);
    }

  21. #18
    electrique10

    Re : Arduino Maitre esclave

    D'accord mais le premier étant connecté en USB ca devrais fonctionné
    je n'ai pas encore connecté le 2ème arduino mais le premier celui qui est maitre il ne sort aucune sortie.
    du coup je suis pas obligé de connecté le 2ème pour que le premier fonctionne ?

  22. #19
    PA5CAL

    Re : Arduino Maitre esclave

    Citation Envoyé par electrique10 Voir le message
    j'ai mis le code sur la première carte Mega uniquement pour le moment mais le logiciel Vixen ne contrôle aucune sortie.
    Mon code ci-dessus correspond au protocole que j'ai donné en exemple et donc le pseudo-code figure en rouge au post #13.

    Si tu souhaites continuer d'utiliser le logiciel Vixen, alors il faut bien évidemment te conformer à son protocole. Comparé au code que j'ai donné, cela implique qu'on ne reçoit pas, qu'on ne teste pas et qu'on ne transmet pas les 'U' ni les '3', et qu'on reçoit et qu'on transmet des 1 et des 0 au lieu des 'T' et des 'n' respectivement. Mais comme déjà dit plus haut, ce protocole est une véritable passoire sur le plan de la sécurité. Un octet perdu ou un parasite sur la ligne, et les états peuvent être erronés ou transmis à des sorties auxquelles elles ne sont pas destinées...


    Quand je disais qu'il fallait commencer par comprendre comment ça fonctionne afin de pouvoir réaliser des programmes qui marchent, ce n'était vraiment pas des paroles en l'air ! Là, tu te contentes de recopier du code sans t'inquiéter de savoir à quoi il correspond.

  23. #20
    electrique10

    Re : Arduino Maitre esclave

    Ha super merci ca fonctionne je vous remercie.
    par contre juste une question est-il possible de controler le premier arduino sans fil a la place du cable USB ?
    disons peut importe wifi bluetooth, radio disons le plus simple ca m'éviterais de mettre un cable mais si c'est pas réalisable c'est pas grave.

  24. #21
    PA5CAL

    Re : Arduino Maitre esclave

    Il existe plusieurs modèles d'Arduinos avec une liaison sans-fil intégrée. Mais on peut tout-à-fait ajouter un module ou un shield sans-fil à un Arduino.

    Les protocoles réseau sans-fil (Wifi, Bluetooth) imposent qu'à chaque démarrage le programme se connecte au réseau choisi, ce qui rajoute bien évidemment du code. Arduino fournit des exemples.

    Pour les modules sans-fil qui réalisent une simple transmission série, il suffit juste de brancher les lignes RX et TX. Dans le cas d'un Arduino Mega, il serait préférable d'utiliser l'une des interfaces série supplémentaires (par exemple Serial1) pour recevoir les données.

  25. #22
    electrique10

    Re : Arduino Maitre esclave

    d'accord merci c'est juste a titre d'information je me pencherais sur ca un peu plus tard
    je vous remercie de votre aide

  26. #23
    electrique10

    Re : Arduino Maitre esclave

    Excusez moi encore j'aurais une question concernant le code
    en faite je voudrait également ajouter dans le code pour me réservé les 2 derniers canaux 59 et 60 pour faire autre chose que des sorties

    j'ai testé ca

    for (i = 60){ MONCODE }
    mais cela ne fonctionne pas.

  27. #24
    PA5CAL

    Re : Arduino Maitre esclave

    En langages C, C++, Java, etc., l'opérateur « = » sert à faire une assignation, c'est-à-dire à écrire une valeur dans une variable. « i = 60 » écrit la valeur 60 dans la variable i, et l'ensemble de l'expression vaut i (soit 60).

    Pour tester si la variable i vaut 60 sans modifier sa valeur, il faut utiliser l'opérateur « == » :

    Code:
      if (i==60) { ... }

Discussions similaires

  1. [PIC18 - Liaison SPI] - Envoi données Maitre > Esclave / Esclave vers Maitre
    Par jorg1n dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 12/01/2011, 17h45
  2. DD maître/esclave
    Par blackloffy dans le forum Matériel - Hardware
    Réponses: 7
    Dernier message: 05/09/2009, 00h05
  3. bascule maitre esclave !!!
    Par moho1 dans le forum Électronique
    Réponses: 9
    Dernier message: 08/03/2008, 11h54
  4. grveur dvd maitre ou esclave ???
    Par MeMyki dans le forum Matériel - Hardware
    Réponses: 35
    Dernier message: 13/07/2004, 14h51
  5. maitre/esclave
    Par weeman dans le forum Matériel - Hardware
    Réponses: 10
    Dernier message: 28/03/2004, 15h49