Go Down

Topic: faire communiquer 2 arduino (Read 1 time) previous topic - next topic

vj_dobermann

Bonjour,

je souhaite comprendre comment faire pour que 2 arduino communiquent entres-elles.
Pour l'instant j'ai sous la main 1 uno en "master" et une leo ethernet en "slave".
La uno est branchée en usb.

j'ai suivi ce tuto : http://www.instructables.com/id/I2C-between-Arduinos/
mais je n'ai pas tout compris.
voici donc le montage que j'ai fait:




le code de la UNO en master:
Code: [Select]
#include <Wire.h>

int x = 0;
void setup() {
  // Start the I2C Bus as Master
  Wire.begin();
}
void loop() {
  Wire.beginTransmission(9); // transmit to device #9
  Wire.write(x);              // sends x
  Wire.endTransmission();    // stop transmitting
  x++; // Increment x
  if (x > 5) x = 0; // `reset x once it gets 6
  delay(500);
}


le code de la Leo en slave:
Code: [Select]

#include <Wire.h>
int LED = 13;
int x = 0;
void setup() {
  // Define the LED pin as Output
  pinMode (LED, OUTPUT);
  // Start the I2C Bus as Slave on address 9
  Wire.begin(9);
  // Attach a function to trigger when something is received.
  Wire.onReceive(receiveEvent);
}
void receiveEvent(int bytes) {
  x = Wire.read();    // read one character from the I2C
}
void loop() {
  //If value received is 0 blink LED for 200 ms
  if (x == 0) {
    digitalWrite(LED, HIGH);
    delay(200);
    digitalWrite(LED, LOW);
    delay(200);
  }
  //If value received is 3 blink LED for 400 ms
  if (x == 3) {
    digitalWrite(LED, HIGH);
    delay(400);
    digitalWrite(LED, LOW);
    delay(400);
  }
}


(pour info le code est légèrement différent du tuto car il indique x == '0' et x == '3', j'ai effacé les crochets comme indiqué dans les commentaires)

Donc j'ai uploadé les deux codes sur les cartes respectives mais ça ne fonctionne pas, sur la leo la led 13 clignote même si je débranche les pin A1 et A3. D'autres tuto disent que c'est le port A2 qui est sensé être le SDA, j'ai essayé les deux également mais rien n'y fait.

Pourriez-vous me donner un petit coup de pouce s'il vous plaît ?
Un grand merci d'avance

68tjs

Je ne connais pas le plan de brochage (pinout) de la "léonardo ethernet" je n'ai trouvé que celui de la léonardo classique et cela me surprendrais que ton câblage soit correct.


Le point important que tu aurais du signaler en premier est que la proposition d'instructables.com utilise le protocole de communication I2C.
L'I2C n'est pas une fonction principale  mais une fonction secondaire.
Selon le modèle de micro la fonction secondaire I2C n'est pas sur les mêmes sorties physiques

Pour palier à cet inconvénient Arduino à ajouté au même endroit  toutes ces cartes deux broches pour l'I2C et les a appelées SDA et SCL
Commence par les utiliser ce sera plus sûr.

vj_dobermann

Salut 68tjs,

merci beaucoup pour le diagramme.
En effet le SDA et SCL sont les ports numérique 2 et 3  ;D

Tu dis que le protocole I2C est une fonction secondaire, mais quelle est la première du coup ?

J-M-L

En effet le SDA et SCL sont les ports numérique 2 et 3  ;D

Tu dis que le protocole I2C est une fonction secondaire, mais quelle est la première du coup ?
la réponse est dans la question :)
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

vj_dobermann

Salut J-M-L

merci, mais je voulais parler du protocole, il y en aurait un plus "simple" qui serait une fonction primaire ?
J'ai fais des recherches sur google et je tombe toujours sur du I2C

_pepe_

#5
Sep 10, 2017, 02:35 pm Last Edit: Aug 19, 2018, 05:16 am by _pepe_
Supprimé

Artouste

Salut J-M-L

merci, mais je voulais parler du protocole, il y en aurait un plus "simple" qui serait une fonction primaire ?
J'ai fais des recherches sur google et je tombe toujours sur du I2C
bonjour
tu veux transmettre quoi comme info ? , quel debit souhaité ?

68tjs

Quote
Tu dis que le protocole I2C est une fonction secondaire, mais quelle est la première du coup ?
La fonction principale de toutes les I/O est d'être une entrée/sortie numérique.

J'ai bien dis toutes les I/O.
Ce qui signifie qu'il n'existe pas "d'entrées analogiques" dans les avr.
Ce qui existe c'est que quelques I/O possèdent une fonction secondaire qui est la mesure analogique (ADCx).
Mais à l'allumage du micro ce sont des E/S numériques, c'est l'appel à la fonction analogRead() qui les fait passer en mode entrée analogique.

C'est parfaitement visible sur le schéma que j'ai joint : chaque ligne raccordée à une pin contient des rectangles à l'intérieur des quels est inscrit une fonction secondaire.
Une I/O peut avoir plusieurs fonctions secondaires.

Tout les micro sont fait comme cela car il est bien évident que dans un boîtier le nombre de  pins n'est pas expensible à l'infini.

ard_newbie

#8
Sep 10, 2017, 06:34 pm Last Edit: Sep 10, 2017, 06:34 pm by ard_newbie
Une fois réalisées les connections SDA sur SDA, SCL sur SCL et Gnd sur Gnd (à ne pas oublier!!), il faut vérifier ce qu'il y a comme résistances de pull up.

Il faut s'assurer qu'il n'y a pas des pull ups des 2 cotés, et il me semble que sur la UNO les broches SDA/SCL n'en sont pas pourvues ( à vérifier) idem de l'autre coté. Au total il devrait y avoir de l'ordre de 4.7K Ohms sur la ligne SDA ainsi que sur la ligne SCL.

68tjs

La UNO n'a pas de résistance de charge sur SDA et SDL.
Par contre la bibliothèque qui gére l'I2C (classe  TWO-WIRE et son objet instancié Wire) active les pull-up internes des micros.

La valeur de ces résistances de tirage ("pull-up") est trop élevée ( 30k < R < 70k) pour assurer des formes de signaux correct.
Elles permettent juste de ne pas bloquer le système quand les résistances de charges sur SDA et SCL ont été oubliées.

Pour la valeur je dirais que dans la datasheet du micro Atmega328p Atmel donne toutes les caractéristiques pour un courant de 3mA dans les transistors de SDA et de SCL ce qui sous 5V donne une résistance de 1700 ohms.
Je pense qu'il ne faut pas dépasser ce courant de 3mA.

La résistance à prendre en compte est la résistance équivalente à toutes les résistances connectées sur SCL (SDA) qui se retrouvent en parallèle.

Exemple:
2 modules équipés de 10k donneront une résistance équivalente de 5k
3 modules équipés de 10k pour l'un, 4,7k pour le second et 2k pour le troisième donneront une résistance équivalente de 1,230 k --> trop faible

Cette valeur de résistance équivalente sert de variable d'ajustement quand il y a beaucoup de modules raccordés ou que la distance est longue entre maître et esclave.

Distance quelques cm et peu de module Réquivalent = 10k devrait fonctionner sans problème
Distance plusieurs décimètres et/ou beaucoup de module --> il faut diminuer la valeur de la résistance.

vj_dobermann

#10
Sep 11, 2017, 01:53 pm Last Edit: Sep 11, 2017, 02:25 pm by vj_dobermann
Bonjour,

merci pour toutes ces explications très utiles, on en apprend tout les jours ici  :smiley-mr-green:

Quote
bonjour
tu veux transmettre quoi comme info ? , quel debit souhaité ?
c'est pour un projet avec 8 capteurs ultrasonic hc-sr04 dans une demi shère sur scène, le montage enverra des mélodies selon où se placeront les danseurs. Plus on se rapproche d'un capteur plus la valeur midi sera haute.


l'arduino qui est à côté du laptop aura les librairies de musique, c'est le musicien du groupe qui s'occupe de cette partie du projet. Moi c'est les capteurs et la transmission du signal.
voilà ou j'en suis j'ai monté un hc-sr04 (le seul que j'ai sous la main) sur la leo, maintenant elle doit envoyer son signal sur la uno (master).




Artouste

c'est pour un projet avec 8 capteurs ultrasonic hc-sr04 dans une demi shère sur scène, le montage enverra des mélodies selon où se placeront les danseurs. Plus on se rapproche d'un capteur plus la valeur midi sera haute.


l'arduino qui est à côté du laptop aura les librairies de musique, c'est le musicien du groupe qui s'occupe de cette partie du projet. Moi c'est les capteurs et la transmission du signal.
voilà ou j'en suis j'ai monté un hc-sr04 (le seul que j'ai sous la main) sur la leo, maintenant elle doit envoyer son signal sur la uno (master).




Bonjour
rapide reflexion :
un cycle  ping/retour SR04 ça prend avec un peu de securité ~30 ms
comme je pense que tu va etre obligé de travailler en polling pour qu'il n'y ai pas d'interferences entre les sr04,
ton nombre de mesures/seconde sera de 1000/30 = 33 mesures secondes , arrondi à 32 çà fait 4 ping/secondes par SR04.
Je pense qu'un debit codé sur 16 bits (distance+N° de SR04) doit etre suffisant
en prenant par securité 24 bits X 40 mesures on arrive à 960 bits/secondes.
L,I²C est il la meilleure solution là ?

Go Up