I2c entre Arduinos diferentes o modelos distintos

Buenos días,
Tengo una duda sobre la comunicación entre Arduinos de distinto modelo con el protocolo i2c. El caso es que yo tengo conectados un Arduino nano 33 IoT y un Arduino nano 33 BLE sense. Ambos teóricamente funcionan con el mismo voltaje. Entiendo que si fueran de voltajes distintos necesitaría un level shifter. Igualmente he probado del conectar el GND. El caso es que he probado de enviar la palabra ‘hello’ entre ambos. El código es de la misma web de Arduino. Está palabra se manda perfectamente entre Arduinos iguales. Es decir, entre dos IoT. Pero si lo intentas entre un BLE sense y un IoT se recibe algo como: → @o hello @o hello @o hello @o hello @o hello @o hello. He visto que en internet todos los Arduinos interconectados son del mismo modelo, es decir, UNO con UNO. Me pregunto si es posible mandar información entre Arduinos distintos y si es así que tengo que modificar del código? He probado muchas cosas y no sé qué más puedo hacer… Muchísimas gracias.

Transmisor:

#include <Wire.h>
void setup() {
    Wire.begin(0x60);                          // join i2c bus with addresss
    Wire.onRequest(requestEvent); // register event
}
    
void loop() {
    delay(100);
}

// function that executes whenever data is requestedd by master
// this function is registered as an event, see setup()
void requestEvent() {
     Wire.write("hello "); // respond with message of  6 bytes
                           // as expected by master
 }

Receptor/lector:

#include <Wire.h>

void setup() {
    Wire.begin();        // join i2c bus (address optionall for master)
    Serial.begin(9600);  // start serial for output
 }
    
 void loop() {
    Wire.requestFrom(0x60, 6);    // request 6 bytes from slave device #8
    while (Wire.available()) { // slave may send less than requested
              char c = Wire.read(); // receive a byte as character
              Serial.print(c);         // print the character
    }
    delay(500);
 }

`

Moderador:
He movido tu hilo a Software

Por supuesto que puedes comunicar Arduinos diferentes y solo usar Level Shifter si uno de ellos es de diferente tensión (5V vs 3.3V).
Ahora reviso tu código a ver si observo algo peculiar.
No veo nada fuera de lo común.
Porque no inviertes el Transmisor y receptor I2C a ver que pasa?

Estimado Surbyte,
Después de leer mucho y romperme la cabeza hasta el infinito y más allá…he dado con la solución. Cuándo se tienen problemas de comunicación entre modelos de Arduino distintos lo mejor es:

  1. Poner un level shifter. Sobretodo si los voltajes son distintos.
  2. Poner resistencia externas pull up de 4.7 kOms.

Con ésta solución la comunicación es perfecta en ambos sentidos.
Gracias.

Sinceramente no comprendo. No son ambos 3.3V?
Arduino NANO 33 IOT dice 3.3V Operating Voltage

Arduino NANO 33 BLE sense Operating Voltage 3.3V
Entonces porque necesistas level shifter? Supongo que lo que si necesitas es la R pull up porque no la tiene.

Sí, pero es la única manera que lo he conseguido…seguramente suena raro, pero lo he logrado así.

No tengo ninguno de los dos NANOs indicados asi que no puedo reproducir tu experiencia.
Si esta resuelto, dale click a Solution que ahora reemplaza al [SOLUCIONADO] de antes.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.