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 :

Connexions multiples sur MEGA 2560


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2019
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2019
    Messages : 74
    Par défaut Connexions multiples sur MEGA 2560
    Nom : BOB_Interieur_web.jpg
Affichages : 334
Taille : 33,9 Ko

    Voilà à quoi ressemble le cerveau de mon robot. Un fouillis de câbles. Et il y en a autant en dessous.
    Au départ j'ai connecté directement sur la MEGA. Je me suis très vite aperçu que les broches avaient tendance à ne pas tenir les nombreuses manipulations effectuées. J'ai donc opté pour un module avec bornes (comme l'image le montre sur mon pc) Très bien au départ, mais la multitude de câbles donne ce fouillis inextricable et difficile d'accès à terme. A chaque ajout j'ai des soucis de pannes sur un autre élément.

    J'ai recherché sur le web une plus grande plaque avec des petite bornes similaire à mon module. Je n'ai rien trouvé, et les bornes électriques sont trop grosse.
    Et surtout je souhaite éviter les soudures.

    QUESTION : Auriez-vous une idée ?

    Merci

  2. #2
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 884
    Par défaut
    les bornes électriques sont trop grosse
    les wagos ne sont pas si grosses (les transparents) et on en trouve de x2, x3, x4 etc pour les connexions multiples
    Nom : wagos.jpg
Affichages : 294
Taille : 68,5 Ko



    Et surtout je souhaite éviter les soudures.
    A moins de prévoir des cartes et des modules d'interfaçage, ça restera un mélange de câbles mais le wrapping a servi à envoyer des hommes sur la lune, il doit pouvoir servir pour votre robot

    Nom : wrap.jpeg
Affichages : 300
Taille : 1,37 Mo


  3. #3
    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 Babbone
    Citation Envoyé par Babbone Voir le message
    QUESTION : Auriez-vous une idée ?
    Surtout une question, que "transportent" tout ces fils?
    Si c'est du digital, pourquoi ne pas mettre un concentrateur genre MCP23017 par ci, par là, concentrateurs reliés entre eux et au Mega par un bus i2C ce qui fait "plus que" 4 fils. Les torches ne seraient plus que "locales".

    Cordialement
    jpbbricole

  4. #4
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2019
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2019
    Messages : 74
    Par défaut
    Citation Envoyé par jpbbricole Voir le message
    Surtout une question, que "transportent" tout ces fils?
    Tous ces fils sont connectés à des capteurs ultrason HC-SR04. Dans la tête 1, dans le "col" 3, + 2 leds RGB ainsi qu'un capteur bluetooth pour télécommande et un servo pour la rotation de la tête connecté à un concentrateur servo PCA9685.
    Un capteur HC-SR04 au niveau du "nombril" et 4 capteurs au niveau plancher. Je vais rajouter 2 capteurs infrarouge dans les coins bas car le robot est plutôt myope pour la vision de près.
    Il y a bien sûr 2 moteurs connectés sur un L298Na

    Et ce n'est pas fini car je souhaite lui ajouter au moins un bras sinon 2.

    Votre idée je vais la creuser. Ces concentrateurs sont un peu comme le concentrateur servo PCA9685 ? Je suppose ?
    Donc il y aurait moins de fils qui arriveront sur la MEGA ?

    Merci à vous, cordialement.

  5. #5
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 884
    Par défaut
    Une autre approche consisterait à avoir plusieurs processeurs dédiés aux différentes parties / fonctions et communicants entre eux sur un bus (I2C comme suggéré par exemple mais il y en a d'autres avec des options pour être moins sensible aux perturbations)

    ça nécessite bien sûr de penser le code différemment mais offre une modularité importante et réduit le risque de souci sur tous les fils.

  6. #6
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2019
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2019
    Messages : 74
    Par défaut
    Ok

    Donc, entre les modules d'interfaçage et avoir plusieurs processeurs dédiés quel est la meilleure solution.
    Je comprends pas bien le principe de fonctionnement, malgré mes recherches de codes.

    Admettons que :

    1. j'utilise un arduino mini pour y connecter les capteurs, les leds et le servo de la tête.
    2. j'utilise un autre arduino mini pour y connecter les capteurs et le module moteur de la base.

    a) Je dois programmer de façon indépendant les 2 arduino.
    b) Je dois relier les 2 arduino à mon arduino MEGA (que je dois reprogrammer entièrement. C'est pas un souci)

    Comment je relie les 2 arduino mini à mon MEGA ? et sur quel pin. Il me semblait comprendre qu'il fallait utiliser les pin SDA et SDL.
    Mais sur la MEGA il n'y a qu'un pin SDA et SDL ou peut-on les brancher ailleurs.

    Je ne sais pas si c'est bien clair, en tout cas pour l'instant c'est un peu flou.

    Un petit schema serait plus explicite, je n'ai rien trouver sur le web qui m'éclaire.

    Merci, cordialement

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

    Au sujet de SDA et SCL, regardes Arduino bus i2C, il peut y avoir plusieurs périfériques connectés dessus. Le "Maitre" serait le Mega, les éventuels Arduino supplémentaires et le PCA9685 les "esclaves".
    Dans ce type d'architecture le Mega transmet ses ordres aux périfériques et peut leur demander des paramètres, c'est toujours le Mega qui prends l'initiative.

    Cordialement
    jpbbricole

  8. #8
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 884
    Par défaut
    pas de souci

    ce n'est pas une galère quand on a compris comment ça marche mais il faut investir un minimum de temps avant de pouvoir mettre tout cela en pratique.

    La nappe de fils et un seul microcontroller c'est plus simple tant qu'on n'arrive pas dans des contraintes de temps de réponse parce que votre arduino serait trop occupé à gérer les capteurs, les moteurs etc

  9. #9
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2019
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2019
    Messages : 74
    Par défaut HELP !!! Maitre/Esclave
    HELLO !!! Vous vous souvenez de moi, BOB !!!
    Un acte chirurgical incontrôlé m'a mis dans tous mes états.
    Nom : Help_F.jpg
Affichages : 270
Taille : 28,0 Ko

    Bref. Suite à un malencontreux coup de ciseau j'ai décidé de me lancer dans la programmation Maitre/Esclave.

    J'ai réussi a programmer quelque chose qui fonctionne à peu près.

    La question est:

    J'ai plusieurs capteurs ultrason HC-SR04 (2 connectés pour l'instant), et un led connectés à un UNO Esclave lui-même connecté à un MEGA 2560.
    Le LED pas de problème, mais les 2 capteurs en test, fonctionne... Une fois!!!, au démarrage.
    Les distances de capture semblent cohérant. Mais quand je passe la main sur les capteurs le scoop m'affiche des chiffres tout à fait erronés.

    Où est l'erreur. Merci pour votre compréhension.

    Ci-dessous les deux prog Maitre et Esclave.

    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
     
    #include <Wire.h>
     
    int dist_AVGB = 0;           // distance AVant Gauche Bas
    int dist_AVCGB = 0;          // distance AVant Centre Gauche Bas
    int dist_AVCDB = 0;          // distance AVant Centre Droit Bas
    int dist_AVDB = 0;           // distance AVant Droit Bas
     
    void setup()
    {
      Wire.begin(); // Rejoindre le bus I2C (Pas besoin d adresse pour le maitre)
      Serial.begin(9600); // Demarrer la liaison serie avec le PC
      Serial.println(F("------------------------------------- Je suis le Maitre"));
    }
     
    void loop()
    {
      //contenu du programme
      /*  Wire.beginTransmission(4); // Envoyer vers device #4
        Wire.write(0); // Envoi un 0
        Wire.endTransmission(); // Arreter la transmission
        delay(100); // Attendre 1s*/
     
      Wire.beginTransmission(4); // Envoyer vers device #4
      Wire.write(1); // Envoi un 1
      Wire.endTransmission(); // Arreter la transmission
      delay(100); // Attendre 1s
     
      Wire.beginTransmission(4); // Envoyer vers device #4
      Wire.write(2); // Envoi un 2
      Wire.endTransmission(); // Arreter la transmission
      delay(100); // Attendre 1s
     
      Wire.beginTransmission(4); // Envoyer vers device #4
      Wire.write(3); // Envoi un 3
      Wire.endTransmission(); // Arreter la transmission
      delay(100); // Attendre 1s
     
      Serial.print(" Requete - "); Serial.println();
    /*  Wire.requestFrom(4, 2);    // demande 6 octets au périphérique #4
      while (Wire.available()) { // le périphérique peut envoyer moins que demandé
        int distance_AVGB = Wire.read();    // receive a byte as character
        Serial.print("distance_AVGB :");Serial.print(distance_AVGB); Serial.println(); // print the character
     
        int distance_AVCGB = Wire.read();    // receive a byte as character
        Serial.print("distance_AVCGB :");Serial.print(distance_AVCGB); Serial.println(); // print the character
     
      }
    */
     
    Wire.requestFrom(4, 4);  // Demande a esclave4 , 4 octets 
      if (4 <= Wire.available()) { // si quatre octets disponibles    
        dist_AVGB = Wire.read();  // lire valeur de l'octet 1
        dist_AVCGB = Wire.read();  // lire valeur de l'octet 1
        Serial.print("distance_AVGB : "); Serial.println(dist_AVGB); 
        Serial.print("distance_AVCGB: "); Serial.println(dist_AVCGB);          
      }
      delay(1000);
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
     
    #include <Wire.h> // Librairie pour la communication I2C
    #include <NewPing.h>
     
    const int LED_BLU = 2; // broche 2 du micro-contrôleur se nomme maintenant : L1
    const int LED_GRE = 3; // broche 3 du micro-contrôleur se nomme maintenant : L2
    const int LED_RED = 4; // broche 4 du micro-contrôleur se nomme maintenant : L3
     
    #define TRIG_AVGB  A0     // Broche TRIGGER AVant Gauche BAS
    #define ECHO_AVGB  A1     // Broche ECHO    AVant Gauche BAS AVGB
     
    #define TRIG_AVCGB  A2    // Broche TRIGGER Avant Centre Gauche BAS
    #define ECHO_AVCGB  A3    // Broche ECHO    Avant Centre Gauche BAS AVCGB
     
     
    #define TRIG_AVCDB A4     // Broche TRIGGER Avant Centre Droit BAS
    #define ECHO_AVCDB A5     // Broche ECHO    Avant Centre Droit BAS AVCDB
     
    #define TRIG_AVDB  6      // Broche TRIGGER Avant Droit Bas
    #define ECHO_AVDB  7      // Broche ECHO    Avant Droit Bas AVDB
     
     
    #define MAX_DISTANCE 200
     
    // Constantes pour le timeout //
    const unsigned long MEASURE_TIMEOUT = 25000UL; // 25ms = ~8m à 340m/s
     
    // Vitesse du son dans l'air en mm/us
    const float SOUND_SPEED = 340.0 / 1000;
     
    int distance_AVGB = 0;           // distance AVant Gauche Bas
    int distance_AVCGB = 0;          // distance AVant Centre Gauche Bas
    int distance_AVCDB = 0;          // distance AVant Centre Droit Bas
    int distance_AVDB = 0;           // distance AVant Droit Bas
    int old_distance_AVGB = 0;           // distance AVant Gauche Bas
    int old_distance_AVCGB = 0;          // distance AVant Centre Gauche Bas
    int old_distance_AVCDB = 0;          // distance AVant Centre Droit Bas
    int old_distance_AVDB = 0;           // distance AVant Droit Bas
     
    NewPing AVCGB(TRIG_AVCGB, ECHO_AVCGB, MAX_DISTANCE);
    NewPing AVGB(TRIG_AVGB, ECHO_AVGB, MAX_DISTANCE);
    NewPing AVCDB(TRIG_AVCDB, ECHO_AVCDB, MAX_DISTANCE);
    NewPing AVDB(TRIG_AVDB, ECHO_AVDB, MAX_DISTANCE);
     
    //**************************************************
    //*  Vision Rapide Avant Gauche BAS - A13 A12 AVGB *
    //**************************************************
    void AVGBX()
    {
      /* MAX_DISTANCE == 50;*/
      distance_AVGB = (AVGB.ping() / US_ROUNDTRIP_CM) ;
      if (distance_AVGB <= 0)
      {
        distance_AVGB = old_distance_AVGB;
      }
      else
      {
        old_distance_AVGB = distance_AVGB;
      }
      /* Serial.print(" AVGB "); Serial.println(distance_AVGB);
        MAX_DISTANCE == 200;*/
     
      //**********************************************************
      //*  Vision Rapide Avant Centre Gauche BAS - A14 A15 AVCGB *
      //**********************************************************
    } void AVCGBX()
    {
      distance_AVCGB = (AVCGB.ping() / US_ROUNDTRIP_CM) ;
      if (distance_AVCGB <= 0)
      {
        distance_AVCGB = old_distance_AVCGB;
      }
      else
      {
        old_distance_AVCGB = distance_AVCGB;
      }
      /* Serial.print(" AVCGB "); Serial.println(distance_AVCGB);*/
    }
    //*********************************************************
    //*  Vision Rapide Avant Centre Droit BAS - A11 A10 AVCDB *
    //*********************************************************
    void AVCDBX()
    {
      distance_AVCDB = (AVCDB.ping() / US_ROUNDTRIP_CM) ; delay(100);
      if (distance_AVCDB <= 0)
      {
        distance_AVCDB = old_distance_AVCDB;
      }
      else
      {
        old_distance_AVCDB = distance_AVCDB;
      }
      /* Serial.print(" AVCDB "); Serial.println(distance_AVCDB);*/
    }
    //************************************************
    //*  Vision Rapide Avant Droit BAS - A9 A8 AVDB *
    //************************************************
    void AVDBX()
    {
      /* MAX_DISTANCE == 50;*/
      distance_AVDB = (AVDB.ping() / US_ROUNDTRIP_CM) ;
      if (distance_AVDB <= 0)
      {
        distance_AVDB = old_distance_AVDB;
      }
      else
      {
        old_distance_AVDB = distance_AVDB;
      }
      /* Serial.print(" AVDB "); Serial.println(distance_AVDB);
        MAX_DISTANCE == 200;*/
    }
     
    void setup()
    {
      Serial.begin(9600); // Demarrer la liaison serie avec le PC
      Serial.println(F("------------------------------------- Je suis l'Esclave"));
      Wire.begin(4); // Rejoindre le bus à l'adresse #4
      Wire.onReceive(receiveEvent); // Preparer une fonction spécifique a la reception de donnee
      Wire.onRequest(requestEvent); // register event
     
      pinMode(LED_BLU, OUTPUT); // LED_BLU est une broche de sortie
      pinMode(LED_GRE, OUTPUT); // LED_GRE est une broche de sortie
      pinMode(LED_RED, OUTPUT); // LED_RED est une broche de sortie
     
      // Initialisation des broches Avant Centre Gauche BAS AVCGB //
      pinMode(TRIG_AVCGB, OUTPUT);   // Broche TRIGGER Avant Centre Gauche BAS
      digitalWrite(TRIG_AVCGB, LOW); // Broche TRIGGER Avant Centre Gauche BAS
      pinMode(ECHO_AVCGB, INPUT);    // Broche ECHO    Avant Centre Gauche BAS
     
      // Initialisation des broches AVant Gauche BAS AVGB //
      pinMode(TRIG_AVGB, OUTPUT);   // Broche TRIGGER AVant Gauche BAS AVGB
      digitalWrite(TRIG_AVGB, LOW); // Broche TRIGGER AVant Gauche BAS AVGB
      pinMode(ECHO_AVGB, INPUT);    // Broche ECHO    AVant Gauche BAS AVGB
     
      // Initialisation des broches AVant Centre Droit Bas  AVCDB //
      pinMode(TRIG_AVCDB, OUTPUT);   // Broche TRIGGER AVant Centre Droit Bas  AVCDB
      digitalWrite(TRIG_AVCDB, LOW); // Broche TRIGGER AVant Centre Droit Bas  AVCDB
      pinMode(ECHO_AVCDB, INPUT);    // Broche ECHO    AVant Centre Droit Bas  AVCDB
     
      // Initialisation des Broche TRIGGER Avant Droit Bas AVDB //
      pinMode(TRIG_AVDB, OUTPUT);   // Broche TRIGGER Avant Droit Bas
      digitalWrite(TRIG_AVDB, LOW); // Broche TRIGGER Avant Droit Bas
      pinMode(ECHO_AVDB, INPUT);    // Broche ECHO    Avant Droit Bas
    }
     
    void loop()
    {
      /*  Wire.onRequest(requestEvent);*/
      AVGBX();    // register event
      AVCGBX();
      delay(100);
    }
     
    // Fonction qui s execute si quelque chose est present sur l interface
    void receiveEvent(int howMany)
    {
      int x = Wire.read(); // recevoir un chiffre
      Serial.print(x); // afficher ce chiffre sur l'interface serie
     
      if (x == 1)
      {
        digitalWrite(LED_BLU, HIGH); // allumer Led Bleu
        digitalWrite(LED_RED, LOW); // eteindre Led Rouge
        digitalWrite(LED_GRE, LOW); // eteindre Led Verte
      }
      if (x == 2)
      {
        digitalWrite(LED_BLU, LOW); // eteindre Led Bleu
        digitalWrite(LED_RED, HIGH); // alumer Led Rouge
        digitalWrite(LED_GRE, LOW); // eteindre Led Verte
      }
      if (x == 3)
      {
        digitalWrite(LED_BLU, LOW); // eteindre Led Bleu
        digitalWrite(LED_RED, LOW); // eteindre Led Rouge
        digitalWrite(LED_GRE, HIGH); // allumer Led Verte
     
      }
     
      if (x == 3)
      {
        Serial.print(" Soleil - "); Serial.print(" distance_AVGB "); Serial.println(distance_AVGB);
      }
      if (x == 3)
      {
        Serial.println("");
      }
      if (x == 4)
      {
        Wire.onRequest(requestEvent); // register event
     
      }
      if (x == 0)
      {
        digitalWrite(LED_BLU, LOW); // eteindre Led Bleu
        digitalWrite(LED_RED, LOW); // eteindre Led Rouge
        digitalWrite(LED_GRE, LOW); // eteindre Led Verte
      }
    }
     
    /*
      // fonction qui s'exécute chaque fois que des données sont demandées par le maître
      // cette fonction est enregistrée en tant qu'événement, voir setup()
      void requestEvent() {
      Wire.write(distance_AVGB); // respond with message of 6 bytes
      Wire.write(distance_AVCGB); // respond with message of 6 bytes
     
      // as expected by master
    */
     
    void requestEvent() {
      byte tableau[2];
      tableau[0] = distance_AVGB;
      tableau[1] = distance_AVCGB;
      Wire.write(tableau, 2);
    }

  10. #10
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 884
    Par défaut
    A quoi sert le PAYLOAD_SIZE
    à rien on dirait

    Pour imaginer votre système en fonctionnement, pensez que vous avez 2 (ou plus) personnes installées chacune dans une des parties du robot et en charge de certaines opérations. Le cerveau peut demander aux yeux "regardez à droite" ou "à quelle distance est l'obstacle". Puis le cerveau peut demander aux jambes "continuez d'avancer tout droit" ou "tournez à droite de 45°" et dire aussi à la bouche d'énoncer un message

    Là où ça devient interessant c'est pour le parallélisme. Comme il y a plusieurs "intelligences", le cerveau pourrait aussi dire aux yeux "préviens moi lorsque tu vois un obstacle" et charge aux yeux de superviser l'environnement en permanence ou à la bouche "dis cette phrase et préviens moi quand tu as fini"


    ==> Que vous utilisiez I2C ou Serial pour communiquer, il faudra définir un petit langage qui va définir les commandes possibles, l'analyseur qui va avec et le format des réponses


    l'autre option est celle que vous avez, le "cerveau" fait tout lui même, il ne sous traite aucune tâche.

  11. #11
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2019
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2019
    Messages : 74
    Par défaut
    Bonjour JAY M

    C'est là que je me pose vraiment la question. Est-ce vraiment intéressant d'installer un Esclave à une trentaine de centimètre du Maitre. (Reprogrammation complète du code en plus)
    Pour moi, l'idée de départ était bonne pour réduire le nombre de câbles. Mais quand je vois "MA GALERE" pour essayer d'utiliser I2C je pense abandonner ce projet pour l'instant.

    Je vais me réorienter vers BOB en utilisant comme je l'ai dit une nappe. J'attends aussi un nouveau module à bornes plus facile d'utilisation.

    Nom : Borniers-Electronics-Salon-.jpg
Affichages : 307
Taille : 121,7 Ko

    J'en reparlerais plus tard.

    Cordialement.

  12. #12
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 884
    Par défaut
    Et si on veut une communication "simple" dans les 2 sens, on pourrait avoir des liens séries hors bus, la carte MEGA a 4 ports série matériels.

    A vous de définir un petit protocole de communication entre les modules

  13. #13
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2019
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2019
    Messages : 74
    Par défaut
    Ca y est maintenant j'ai compris. Au boulot.

    Nom : Tete_BOB.jpg
Affichages : 258
Taille : 8,8 Ko

    BOB vous remercie. Dommage que vous ne l'entendiez pas.

    Merci à vous deux. Je ne clos pas le poste car je vous confirmerais le résultat.

    Cordialement

  14. #14
    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 BOB

    Un dernier conseil à ton "patron", quelque soit la façon de transmettre, série ou i2C, étudies les structures, ça facilite grandement les transmissions de données.
    Ainsi, au lieu de transmettre ou recevoir une suite de variables, on transmet une structure constituée de ces variables.

    Transmet mes salutations à @Babbone et bonne continuation.

    Cordialement
    jpbbricole

  15. #15
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2019
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2019
    Messages : 74
    Par défaut
    Bonjour,

    Tout d'abord une petite vidéo.



    Questions :

    Est-ce que le module ci-dessous est compatible avec mon projet, pour réduire la profusion de fils ?
    Celui-là je dois le commander

    Nom : MCP23017.jpg
Affichages : 244
Taille : 28,6 Ko

    Est-ce que le module ci-dessous est compatible avec mon projet (normalement prévu pour les Servos) ?
    Celui-là je l'ai en stock

    Nom : 16 canaux 12 bits PWM.jpg
Affichages : 243
Taille : 90,6 Ko

    J'ai encore beaucoup de questions. Fichiers H et CPP. Pour info, le code est proche de mille lignes.

    Cordialement

  16. #16
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2019
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2019
    Messages : 74
    Par défaut
    Bonjour à tous,

    Voilà, je me suis procuré 2 MCP23017 comme présenté précédemment.
    Je me suis penché sur les connexions et les codes pour utiliser ces modules.

    Après une cinquantaine de pages WEB consultées sur le sujet, je me suis arraché le peu de cheveux qu’il me restait.

    JE N’AI RIEN COMPRIS.

    Les connexions restent toujours un mystère. INTA INTB GPA0 0X00, etc…
    Les codes c’est pareil. Certains demandent des bibliothèques d’autres pas.

    J’ai téléchargé sur une MEGA successivement 2 codes très simples sans problème (ci-dessous).
    Pas d’anomalies ni d’erreurs.

    CODE 1 avec Bibliothèque MCP23X17

    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
     
    #include <Adafruit_MCP23X08.h>
    #include <Adafruit_MCP23X17.h>
    #include <Adafruit_MCP23XXX.h>
     
     
     
    #include "Adafruit_MCP23X17.h"
     
    //pin 1 and 0 are mcp pins not arduino IO pins
     
    Adafruit_MCP23X17 mcp;
     
    void setup() {  
    mcp.begin_I2C();      // use default address 0
     
    mcp.pinMode(0, INPUT);
    mcp.pinMode(1, OUTPUT);
    Serial.begin(9600);
     
    pinMode(13, OUTPUT);  // use the p13 LED as debugging
    }
     
    void loop() {
    // The LED will 'echo' the button
    digitalWrite(13, mcp.digitalRead(0)); //Writes pin 13 to the reading of pin    0
     
    mcp.digitalWrite(1, mcp.digitalRead(0)); //Writes pin 1 to the reading of 0
     
    if(mcp.digitalRead(1) == HIGH){ //if pin 1 == high serialprint led whent   high
     
    Serial.println("Led whent HIGH");
    }
    }

    CODE 2 sans Bibliothèque MCP23X17

    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
     
    // pins 15~17 to GND, I2C bus address is 0x20
     
    #include "Wire.h"
     
    void setup()
    {
      Wire.begin(); // wake up I2C bus
     
      // setup addressing style
      Wire.beginTransmission(0x20);
      Wire.write(0x12);
      Wire.write(0x20); // use table 1.4 addressing
      Wire.endTransmission();
     
      // set I/O pins to outputs
      Wire.beginTransmission(0x20);
      Wire.write(0x00); // IODIRA register
      Wire.write(0x00); // set all of bank A to outputs
      Wire.write(0x00); // set all of bank B to outputs
      Wire.endTransmission();
    }
     
    void binaryCount()
    {
      for (byte a=0; a<256; a++)
      {
        Wire.beginTransmission(0x20);
        Wire.write(0x12); // GPIOA
        Wire.write(a);    // bank A
        Wire.write(a);    // bank B
        Wire.endTransmission();
        delay(100);
      }
    }
     
    void loop()
    {
      binaryCount();
      delay(500);
    }

    Mais je ne suis pas plus avancé et je ne sais pas quoi en faire. Je rajoute un petit schéma de tous les modules que je dois connecter.

    Nom : MCP20317-Connexion.jpg
Affichages : 234
Taille : 484,4 Ko


    S’il y a parmi vous une âme charitable qui voudrait bien m’expliquer CLAIREMENT, avec un petit bout de code de lecture de capteur ultrason et d'envoi d’instruction vers un servo, je le remercie d’avance.
    Cordialement

  17. #17
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 884
    Par défaut
    généralement on parle de 60 millisecondes entre 2 pings pour être sûr d'être tranquille

  18. #18
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 884
    Par défaut
    il faut un délai entre 2 pings consécutifs sinon les ultra-sons du premier (qui rebondissent) vont venir perturber le signal de lecture du second

  19. #19
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2019
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2019
    Messages : 74
    Par défaut
    J'ai rajouté un délai de 10. Cela à l'air plus cohérent. Merci.
    Je vais continuer sur ma lancé.

  20. #20
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 884
    Par défaut
    Le MCP23017 es un périphérique I2C donc on utilise la bibliothèque Wire pour lui parler et il nécessite d'être connecté à votre arduino donc sur les port SCL et SDA (en plus de l'alimentation - entre 2.7 et 5.5V).

    Comme c'est un périphérique I2C, il a une adresse. Cette adresse est paramètrable en raccordant les broches ADDR0, ADDR1 et ADDR2 sur l'alimentation ou la masse, ce qui permet d'avoir 8 adresses uniques et donc de rajouter plusieurs MCP23017 sur le bus I2C sans conflit d'adresse.

    Le MCP23017 fournit 16 pins d'extension, chacune des 16 pins peut être configurée en entrée (INPUT), en sortie (OUTPUT), et pour les entrées on peut les avoir avec pullup (INPUT_PULLUP) ou en drain ouvert.

    Les 16 pins sont réparties en 2 groupes, A et B de 8 pins. Vous verrez donc parfois la notation GPA0...GPA7 pour les 8 pins du groupe A et GPB0...GPB7 pour les 8 pins du groupe B.

    Il est possible d'obtenir un signal d'interruption via une pin du composant lorsqu'une des broches configurée en entrée change d'état... Comme cela, il n'est pas nécessaire de continuellement vérifier l'état des entrées. Ce signal d'interruption fonctionne par groupe de pin, c'est pour cela que vous avez INTA (pour le groupe A) et INTB (pour le groupe B) (et il y a même un registre interne qui permet de configurer comment la broche d'interruption doit se comporter)

    voilà à haut niveau ce qu'il faut savoir. Ensuite le plus simple c'est de passer par une bibliothèque, par exemple https://github.com/adafruit/Adafruit...rduino-Library

    je crois que c'est @jpbricole qui avait suggéré l'usage de ce composant, je le laisse vous préciser comment l'utiliser avec le capteur ultrason par exemple

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

Discussions similaires

  1. [Autre micro] Système Arduino MEGA 2560 sur afficheur NEXTION
    Par tophe44 dans le forum Embarqué
    Réponses: 6
    Dernier message: 03/02/2018, 21h39
  2. [QThread] Problème de gestion des threads après connexions multiples sur un serveur
    Par vince-29 dans le forum Multithreading
    Réponses: 5
    Dernier message: 23/11/2010, 21h28
  3. gerer la connexion multiple sur un intranet
    Par tortuegenie dans le forum ASP.NET
    Réponses: 5
    Dernier message: 16/10/2008, 17h48
  4. Connexions multiple sur base DB2 en serveur
    Par donnadieujulien dans le forum DB2
    Réponses: 2
    Dernier message: 13/06/2008, 10h53
  5. Utiliser des connexions multiples sur des listes
    Par MasterJul dans le forum SharePoint
    Réponses: 0
    Dernier message: 08/02/2008, 12h41

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