Envoie d'informations entre 2 arduinos

Bonjour à tous, je débute en arduino, notamment à utiliser des capteurs.

J'ai deux arduinos, j'aimerais que l'une des arduino lise l'info d'un capteur I2C, transforme ce qu'elle lit légerement et envoie sous forme de tension entre 0 et 5 V l'information à la seconde arduino qui doit la lire sur l'une de ses pins.

J'arrive à lire la valeur, à la transformer et à l'envoyer (analogWrite), c'est au moment de la réception que ça coince.

J'ai naivement essayé un analogRead mais cela ne marche pas car la "tension variable" en sortie de la première arduino est en fait un pwm, j'obtiens alors 0 ou 5V, de façon aléatoire. j'ai donc cherché à lire un pwm. la fonction "pulseIn(pwmPin, HIGH);" me retourne 0 et en utilisant attachInterrupt(digitalPinToInterrupt(pwmPin), pulseHandler, CHANGE); la fonction pulseHandler n'est jamais appelée. pourtant à l'oscillo je vois mon PWM entre 0 et 5V, sa fréquence de 2 ms et aucun bruit.

Je suis preneur de toute solution permettant d'envoyer à la seconde arduino cette info.

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

Il y a une raison valable pour faire cette transmission pour le moins improbable?

+1 sur le mode de transmission incongru (ne pas oublier de relier les GNDs)

lesquels? (le PWM va varier en fonction de l'arduino et de la broche)

Par exemple sur un Arduino Uno, la plupart des broches PWM ont une fréquence PWM standard d'environ 490 Hz. Cependant la broche 5 a une fréquence PWM de base de 980 Hz

pulseIn peut fonctionner

oui pardon, une pro mini et une méga. j'ai deux capteurs de pression de chez blue robotics qui ont la meme adresse I2c et ne peut donc pas les lire avec la meme arduino. j'utilise donc la seconde pour transmettre à la principale la valeur mesurée

pas la peine de mettre 2 arduinos... il existe des composants pour cela ➜ Overview | Working with Multiple Same Address I2C Devices | Adafruit Learning System

sinon envoyez les donnes par Série ou SPI ou I2C, ce sera quand même plus précis que d'avoir à réinventer un protocole en PWM...

Un PCA9548 ?
Grillé par J-M-L ...

d'accord, je ne connaissais pas désolé...
des conseils pour du série ou spi ?

la MEGA a plusieurs ports série ça pourrait être la console maîtresse, utiliser Serial1

sur le pro mini, on utiliserait le port série Serial (pin 0 et 1 donc pas de debug possible et débrancher lors de l'upload du code)

on relie Rx à Tx1 et Tx à Rx1 (en croisant donc) plus le GND entre les cartes

ensuite il suffit de balancer la valeur avec un println() et pour écouter le port série vous pouvez jeter un oeil à mon petit tuto sur le sujet

Bonjour
Si je ne me trompe pas, les capteurs en I2 peuvent changer d'adresse avec un petit pont de soudure, pour la plupart ? @alexbonbons quel est ton capteur, stp ? Parfois, la bibliothèque utilisée peu permettre de changer l'adresse, également. Postes ton/tes code(s).

Bonne bidouille

Amitiés
Pandaroux007

oh ce serait fou ! mais j'ai peur que l'electro ne soit pas accessible. ce sont deux Depth sensors (la version 02). j'ai donc utilisé les codes proposés avec pour lire les valeurs de pression et c'est cette valeur que j'utilisais pour mon analogWrite.


#include <Wire.h>
#include "MS5837.h"

MS5837 sensor;

void setup() {

  Serial.begin(9600);

  Serial.println("Starting");

  Wire.begin();
  // We can't continue with the rest of the program unless we can initialize the sensor
  while (!sensor.init()) {
    Serial.println("Init failed!");
    Serial.println("Are SDA/SCL connected correctly?");
    Serial.println("Blue Robotics Bar30: White=SDA, Green=SCL");
    Serial.println("\n\n\n");
    delay(5000);
  }
  sensor.setFluidDensity(997); // kg/m^3 (freshwater, 1029 for seawater)
}

void loop() {
  sensor.read();

  Serial.print("Depth: ");
  Serial.print(sensor.depth());
  Serial.println(" m");

  delay(1000);
}

je pense essayer par liaison série comme le conseille J-M-L

Ah oui, effectivement, c'est pas le genre de capteurs dont on change l'adresse d'un coup de fer à souder... S'aurait été possible si tu avais un capteur en module sur PCB (comme ceci : )
https://www.gotronic.fr/art-capteur-de-pression-et-de-t-ada4258-30116.htm

  • Adresse I2C par défaut : 0x5d (modifiable en 0x5c via pontet à souder)

Bon, là je ne pense pas pouvoir te proposer une autre idée... Désolé :woozy_face:

Bonne bidouille

Amitiés
Pandaroux007

Il y a des alternatives:

  • le multiplexeur comme proposé au #6
  • l'émulation soft I2C sur une autre paire de broches. Un exemple ci-dessous mais il y a d'autres librairies qui proposent la même chose
    SoftwareWire - Arduino Reference

Interessant ! je me suis penché sur la librairie softwire et je ne comprend pas comment est ce que je pourrais l'utiliser avec mon capteur bluerobotics. Ce capteur est fait pour être lu par la librairie "MS5837.h" et je ne vois pas comment récupérer cette info avec les cables que je défini dans "SDA,SCL,etc...". est ce que tu aurais des conseils la dessus ? Tu saurais adapter mon code ci-dessus avec cette librairie.

C’est le contraire - cette bibliothèque est un exemple de code lisant le capteur. Le capteur en lui même expose une interface standardisée et documentée.

Si vous n’utilisez pas le hardware (et donc la bibliothèque Wire sur Arduino) et vous passez par une émulation logicielle pour le protocole de communication, alors il faut modifier la bibliothèque pour qu’elle utilise l’émulation logicielle

Init et Begin utilisent explicitement TwoWire

Je n'ai pas eu le temps de regarder en profondeur et je suis occupé ce jour mais, SoftwareWire annonce une compatibilité avec Wire, je pense que l'on doit pouvoir ajouter un init() et un begin() qui prennent en argument un objet SoftwareWire et ça pourrait peut-être faire le job.
D'après le readme du projet

I added some glue to that code to make it behave like the Wire library.
....
made it a drop-in replacement for the Wire library.

@pandaroux007
Certain capteurs composants I2C ne sont pas multiples dans un montage.
Exemple un DS3231, horloge, il serait idiot d’en utiliser plusieurs simultanément. Les adresses I2C étant rares et payantes le stict nécessaire est utilisé. Je n’en ai jamais rencontré, mais j’ai lu qu’il existe maintenant des adresses sur deux octets.