[Resolu] Communication MKR WiFi - Arduino Mega

Bonjour à tous,

Je tente, sans succès, maintenant depuis plusieurs jours de faire communiquer mon MKR WIFI 1010 avec mon Arduino Mega.

Sur le MKR j'envoi un ping toutes les deux secondes vers le port série. J'utilise l'objet Serial.
Ca ne fonctionne pas du tout, le mega ne reçois rien du tout (il est sensé emettre un bip à chaque ping reçu sur son Serial2).

En cherchant un peu j'ai trouvé ce sujet:

Si je lis bien et que ce qui est dit est vrai, ça veut dire que:

  • Je dois sortir le ping sur le Serial1 et non pas Serial
  • Il faut un diviseur de tension entre les deux cartes car 3.3v pour la MKR et 5v pour la Mega (ce que je trouve carrément c**)

Y a t-il quelqu'un qui pourrait confirmer/infirmer ça ?

postez les codes des 2 arduino,

Sinon, oui Serial sur votre MKR WIFI 1010 est connecté directement aux USB host pins du SAMD21. Les Pins 13 and 14 vous permettent d'utiliser Serial1 et c'est du 3.3V donc attention aux échanges avec votre MEGA en 5V.

(si le MEGA ne répond pas vous pouvez vous contenter de relier les GND et la pin Tx du MKR à une des pins Rx du MEGA, le 3.3V sera vu comme un HIGH aussi sur le MEGA donc ça devrait marcher sans adaptation dans ce sens.)

Merci J-M-L !
Je n’ai pas les sources à dispo là maintenant.

Déjà un problème de réglé, je dois utiliser le Serial1.

L’autre souci c’est que j’ai besoin de pouvoir communiquer dans les 2 sens. C’est à dire que le Mega doit envoyer des données au MKR, qui est ensuite chargé de les stocker sur un serveur de base de données en ligne. Le MKR se contentant de signaler au Mega qu’il est connecté (en lui voyant un ping toute les 2 secondes) ainsi qu’un éventuel signal d’erreur si le stockage ne s’est pas bien passé.

En gros:
Mega → MKR = Données (JSON)
MKR → Mega = Ping + statut

J’ai trouvé un tuto expliquant un peu le principe des diviseurs et shifter de tension. J’imagine que je ne vais pas avoir le choix dans mon cas ?

J’avoue avoir du mal à comprendre pourquoi avoir utilisé du 3.3v sur le MKR, rendant par ce biais la compatibilité MKR/Arduino plus compliquée…

Problème résolu, merci à toi J-M-L

Pour ceux que ça intéresse, j'ai fait ceci:

  • TX MKR -> RX Mega = 1 résistance limitrice de 220 ohms (par sécurité)
  • TX Mega -> RX MKR = 1 diviseur de tension tout simple tiré du tuto que j'ai cité plus haut (avec R1 = 1kOhm et R2 = 2 kOhm)

J'ai testé mon diviseur sur platine d'essai, et j'avais 3.4v au lieu des 3.3v mais je pense que ça ne devrait pas lui poser de problème (ai-je tort ?)

Le ping est bien détecté par mon Mega, qui considère donc que le MKR est prêt à recevoir des requêtes tant qu'il reçoit ce ping.
Il envoie donc toutes les minutes des JSONs contenant les mesures effectuées par mes capteurs (un JSON par capteur).

Le côté galère a été de bien synchroniser les délais d'envoi de données au MKR et de postage de la requête HTTP pour éviter de perdre un JSON dans le processus (car je vide le buffer du MKR après chaque JSON reçu).

Je vais maintenant essayer d'optimiser tout ça pour n'envoyer plus qu'un seul JSON contenant un JsonArray, ça m'évitera les problèmes de synchro, et developper une petite procédure de reconnexion automatique du MKR dans le cas où il perd le contact avec ma box Internet.

OK si c'est dans les deux sens il faut effectivement une adaptation de tension. Le 3.3V c'est parce que les processeurs modernes vont vers des tensions de plus en plus basse... économie d'énergie :wink:

il n'y a pas besoin de résistance de limitation de courant entre Tx MKR ---> Rx MEGA car la pin Rx étant une entrée elle a une impédance très forte et très peu de courant donc sera tiré.

il existe des petits composants d'adaptation de tension pour communication (cherchez I2C level shifter) --> un te291 level shifter par exemple, il en existe à 2, 4, 8 entrées et c'est pas cher (5 pour un peu plus d'un euro).

On alimente en 5V d'un côté, 3.3V de l'autre et ce qui est mis d'un côté resort de l'autre avec la tension adaptée.

Pour gérer le port série (ou gérer un flux asynchrone) vous pouvez jeter un oeil à mon petit tuto sur le sujet

Merci J-M-L pour ces precisions.

L'achat d'un de ces petits modules risque d'etre utile, je vais voir ca. L'ideal serait de decoupler ma petite centrale meteo de mon systeme domotique. La couche logicielle de mon mega commence a etre un peu lourde et ca se ressent au niveau du temps de reponse de la carte. Je vais peut etre investir dans une deuxieme MKR qui sera dediée à la station meteo. Ca m'evitera ces problemes de latence quand la carte doit gerer la fermeture de mes relais.

Vérifiez si vous avez des delay() dans le code, piloter les relais ne prend pas bcp de temps, il s'agit juste de mettre une pin à HIGH ou LOW, c'est quelques micro-secondes. plus vous aurez de MKR et plus vous aurez de points de fragilité, de besoin d'alimentation, de complication dans les communications etc...

Oui il y en a. Notamment au moment de l'envoi des JSON via serial. Pour eviter de remplir le buffer de la carte qui reçoit. Mais je dois pouvoir optimiser tout ca, je voulais que ca marche avant de penser optimisation :slight_smile:

Tu as raison, ca multiplie les problemes c'est vrai. Mais j'aime bien quand c'est modulaire, que tout puisse fonctionner independamment, mais bon faut que j'y reflechisse...