communication i2c entre entre UNO et DUE

bonjour

j'ai besoin de faire communiquer une carte Due et Uno ensemble par i2c
pour testé sa j'ai trouvé un petit bout de code simple que voici:

#include <Wire.h>
 
#define I2C_ADDRESS_OTHER 0b0111111
#define I2C_ADDRESS_ME 0b0001010

void setup() {
 Serial.begin(9600);
 Wire.begin(I2C_ADDRESS_ME);
 Wire.setClock(100000);
 Wire.onReceive(receiveI2C);
}
 
void loop() {
 delay(500);
 Wire.beginTransmission(I2C_ADDRESS_OTHER);
 Wire.write("hello world from 0x1 to 0x2");
 Serial.println(Wire.endTransmission());

 
}
 
void receiveI2C(int howMany) {
  
 while (Wire.available() != 0)
 {
  char c = Wire.read();
  Serial.print(c);
 }
 
 Serial.println();

les 2 cartes on le même programme seule les adresses sont inversé.

j'ai tester entre 2 arduino uno aucun soucis :slight_smile:

mais entre la due et la uno sa ne fonctionne pas ...

Si je me connecte au port serie de la due je peux voir quelle réceptionne bien le message de la uno puis lors de l'envoie du message vers la uno Wire.endTransmission() me retourne le code "2"(received NACK on transmit of address) et la uno elle ne recptione rien.

C'est un peu comme si la communication marché a sens unique (la due réceptionne mais ne peux pas envoyer) :confused:

coté matériel j'ai relié les masse ensemble ainsi que les 5v A5 vers pin 21 et A4 vers pin 20

Si quelqu’un voie un soucis ?

Oui et un gros

Sur un bus I2C, il y a obligatoirement un maître et des esclaves.
Là tu essayes de faire dialoguer deux esclaves entre eux.
C'est interdit.
Un esclave n'a le droit de s'exprimer que si le maître lui donne la parole

Révise ton protocole :slight_smile:

Bonsoir

justement mon besoin et d'avoir 2 arduino qui communique entre eux (le premier envoie des paramétrés au second celui ci pilote un servomoteur avec les infos reçu une fois que le servomoteur a fini sont positionnement j'ai besoin de pouvoir renvoyer l'info au premier)

le code ne viens pas de moi je l'ai trouvé ici:

Se qui est étonnant c'est que sa fonctionne avec 2 uno!

Pour faire simple je voudrais que chaque arduino puisse passé tour a tour de maitre a esclave mais éce possible?

L'I2C en mode multimaster suppose une gestion de l'arbitrage car à un moment donné il ne peut y avoir qu'un et un seul Master qui a "la main" sur le bus. A ma connaissance la bibiothèque Wire.h ne gère pas ce mode et de plus la carte DUE a un microcontrolleur qui lui supporte ce mode.

Quand la DUE en mode Master détecte une perte d'arbitrage, il y a un bit d'arbitrage qui change d'état dans un registre et qu'il faut gérer avec du software en plus (ça reste à faire). Il y a en fait 2 modes multimaster, celui dans lequel un Master reste toujours Master et un second dans lequel un Master peut passer à l'état Slave puis éventuellement revenir à l'état Master (ça reste aussi à faire).

Compte tenu de ce que tu veux faire, il me semble plus judicieux d'utiliser une liaison série (Software serial coté UNO) et par exemple Serial1 coté DUE, car dans ce cas tu peux gérer des flux dans les 2 sens sans problème.

Attention aux tensions coté DUE, pas plus de 3.3V, donc utilise des décaleurs de niveaux logiques pour compenser.

hello
sur DUE, il y a deux bus I2C
l'un à des résistances de pullup, l'autre pas.

Bonsoir,

ATTENTION!! Le micro de la DUE fonctionne en 3,3v. Les E/S ne tolèrent pas le 5v provenant d'une UNO.
Tu dois intercaler un translateur de niveau sur les deux signaux SCL et SDA.

bilbo83:
Bonsoir,

ATTENTION!! Le micro de la DUE fonctionne en 3,3v. Les E/S ne tolèrent pas le 5v provenant d'une UNO.
Tu dois intercaler un translateur de niveau sur les deux signaux SCL et SDA.

Utiliser un convertisseur de niveau compatible I2C (certains convertisseurs ne sont pas compatibles)

Il n'est peut-être pas nécessaire de s'aventurer dans les complications de l'I2C multi-maître.

Ne peux-tu pas tout simplement configurer l'arduino donneur d'ordre en maître, et l'arduino qui contrôle le servomoteur en esclave?
Et suite à une consigne de positionnement transmise par le maître, celui-ci peut demander régulièrement à l'esclave si la position désirée est atteinte. Par exemple toutes les 10 ms, ce qui lui donne un temps de réaction maxi de 1/100 seconde.
Cela ne conviendrait-il pas?

De manière plus générale, si le besoin est de faire communiquer entre eux deux arduino, sans aucun autre composant sur le fil, et avec la possibilité que chacun d'eux puisse spontanément émettre un message vers l'autre, l'utilisation de l'I2C n'est clairement pas la bonne option.
A la base, un bus I2C n'est pas fait pour répondre à ce type de besoin.

Autant utiliser une simple liaison série bidirectionnelle.

donc le multi master c'est possible mais pas adapté et un peu trop compliqué pour moi;)

Je pense en effet que la transmission serie devrais fonctionner .

Pour se qui est d’interroger l'esclave toute les 10ms j'y est pensé mais sa va interrompre le programme esclave qui lui envoie des signaux de pas/direction a des intervalles de temps très précise.

Merci pour toute vos réponses je vais continué en utilisant la liaison sérié.