(Solucionado) Problemas enviando datos i2c si hay Display por medio

A ver,

tengo colocado las resistencias de 10k ohms en SCL y en SDA.

En el i2c scanner en Yun (maestro) me da sólo la dirección de la pantalla OLED, siempre que tenga en el cliente (DUE) todo el código de mi programa cliente. Si comento lo que ya dije (Si comento las 3 partes de inicio1, inicio2 e inicio3) me aparecen las dos dirección 1-la de la pantalla 0x03 y 2-la de arduino DUE.

Creo que el problema esta con la libreria de la pantalla OLED.
He tomado el ejemplo de la propia librería de Adafruit SSD1306 (ssd1306_128x32_i2c) y le he añadido al comienzo del setup:

// join i2c bus with address #11
  Wire.begin(9);  
  Wire.onReceive(receiveEvent); // register event

y luego le añado el método de la librería oficial de wire (slave_receiver):

// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany)
{
  while(1 < Wire.available()) // loop through all but the last
  {
    char c = Wire.read(); // receive byte as a character
    Serial.print(c);         // print the character
  }
  int x = Wire.read();    // receive byte as an integer
  Serial.println(x);         // print the integer
}

y nada no funciona. En la pantalla OLED aparece la animación pero no recibe ningún carácter del maestro (YUN). con el código:

Maestro (YUN):

#include <Wire.h>

void setup()
{
 Wire.begin(8); // join i2c bus (address optional for master)
}

byte x = 0;

void loop()
{
 Wire.beginTransmission(9); // transmit to device #4
 Wire.write("x is ");        // sends five bytes
 Wire.write(x);              // sends one byte  
 Wire.endTransmission();    // stop transmitting

 x++;
 delay(500);
}

Moderador: Agregado de etiquetas para presentación de código </>

Estoy atascado aquí. ¿Alguna idea?, ya no se que mas probar.

¿Que puede estar pasando?

Hi,
Pregunta tu ests usando el pin A4 = SDA y el pin A5=CLK?

Gracias por vuestras respuestas.

Aunque seguimos igual, tauro0221 me indicas que diga el estado del pin A4 y A5, no se muy bien como hacer esto.

Además, yo trabajo con el Arduino DUE con pin 21 (SCL) y pin 20 (SDA).

Pero gracias a tu comentario tauro0221, me empezado a probar mi codigo en otro arduino UNO que tengo, y aquí si que funciona la pantalla y la recepción de caracteres del arduino YUN (maestro), siempre que no ponga delay o llamada a otras funciones dentro del método receiveEvent, porque se queda bloqueado (no se porque).

El caso que con arduino UNO funciona pero con el DUE nada.

Se os ocurre que puede pasar?

problema de frecuencias en el DUE?

librería?

algo de luz, please!.

Hi,
Cuando usas el UNO que pines usas? Normalmenta para los display se usan los pin A4 = SDA y A5 = CLK para mandar la data al display y hasta ahora yo no he podido cambiarlos. Ellos estan asignados en la libreria. No se porque no la hacen en el setup poder cambiar los pines. Conecta el SDA al pin A4 y el clock al pin A5 de la tarjeta de YUN a ver que pasa.

En el arduino UNO usé el pin A4 y A5.

He probado en el YUN en el pin A4 y A5 y nada no funciona. También he probado en el DUE en el A4 y A5 con igual resultado. :disappointed_relieved:

Hi,
Yo probe un OLED que trabajaba pero se me cayo y se rompio el display y no lo volvi a usar pues creo que es my fragil. De todas manera yo usaba la siguente libreria en mi sketch.

/*This program use the libray using the pin 4 and pin 5 for the clock and data*/
#include "OLedI2C.h"
OLedI2C LCD;
#include <Arduino.h>
#include <Wire.h>  // Comes with Arduino IDE
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 16, 2); // Set the LCD I2C address

Puedes tratar a ver si te trabaja en tu projecto. Haz un google :"OLedI2C.h" para que te diga donde la puedes bajar.

Hi,
Encontre uno de mis Oled display que es de 1/2 de ancho y 1 pulgada de largo y corri el programa que esta en el Arduino/example/adafruit SSD1306/SSD1306 128.32.I2C y lo corrio sin problema. Como ya tu estas usando el ssd1306 driver trata de correrlo en tu systema. Si el programa corre bien entonces el problema esta en otro lado. El programa corre diferentes patrones de displays.

tauro0221 este ejemplo que comentas ya lo he probado en mi arduino DUE (cliente) y funciona perfectamente, ya lo comenté.

El problema viene cuando a este ejemplo le añades un Wire.begin(9) y el método receiveEvent como comenté en el correo del día:

Mar 11, 2018, 04:15 pm

Creo que algún problema hay con las direcciones o la librería estoy desesperado ya.

Ćreo que el error hay que reproducirlo con un arduino DUE como cliente y estas librerías #include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h> (32) sino no hay nada que ver. Pues con un arduino UNO ya dije que funciona.

A ver el/los moderador/es que opinan.

Hi,

Estoy viendo que en el sketch del due tu cambias el address al wire.begin(4) y no lo cambias para Wire.begin() cuando envias la informacion al display. I2C usa el wire para comunicarse. Anadele Wire.begin() antes de ejecutar el display.begin(SSD1306_SWITCHCAPVCC, 0x3C) a ver que pasa.

He añadido Wire.begin() delante de display.begin(SSD1306_SWITCHCAPVCC, 0x3C) pero no hace nada. Sigue igual.

He visto que la librería ya hace un Wire.begin() asi:

/
/ I2C Init
    Wire.begin();
#ifdef __SAM3X8E__
    // Force 400 KHz I2C, rawr! (Uses pins 20, 21 for SDA, SCL)
    TWI1->TWI_CWGR = 0;
    TWI1->TWI_CWGR = ((VARIANT_MCK / (2 * 400000)) - 4) * 0x101;
#endif

Alguna idea más. Lo raro es que el mismo código funcione en arduino UNO y no el arduino DUE.

No veo a esto solución.

Hi,

Estuve haciendo un estudio y encontre en el Arduino referece dice que el DUE usa los pines 20 y 21 para la comunicacion de wire con los device. Esto lo colabora en la libreria "// Force 400 KHz I2C, rawr! (Uses pins 20, 21 for SDA, SCL) " Creo entonces que cuando haces wire.begin() estas forzado a usar pines 20 y 21. Tienes que connectar los device para que usen pines 20 y 21. Como tu tienes los device connectados?
Otra cosa caundo corristes el scannerI2C "aparecen las dos dirección 1-la de la pantalla 0x03 y 2-la de arduino DUE." Mi pregunta es no debe ser 0X3C para el display? Porque el address es de 0x03?

Desde el principio utilizo los pines 20 y 21 en Arduino DUE.

El scannerI2C sólo aparece la dirección 0x3C, la del display.

Si comento el código correspondiente al display me aparece la dirección del arduino DUE.

Hi,
Cual es address del DUE cuando esta solo.

Hi,
Que pasa si corres el scannerI2c en el YUN con los tres conectados.?

Hi,
Has una cosa asignale a yun = wire.begin(3) DUE = wire.begin(4). Ya el display tiene el address de 0x3C. Corre el scannerI2C para ver que address recibes.

Gracias por responder pero eso ya lo he hecho.

Puedes mirar que lo he ido poniendo en este hilo, con un código más reducido, pero sólo aparece la dirección del display 0x3C.

Hi,
Aqui yo creo que el problema esta cuando haces el wire.begin(4) esto asignara lo ports 20 and 21 al I2C y si haces Wire.begin() asignaras los port A4 y A5. No se si esto aplica al DUE pero vas a perder uno de los dos.

Si en el sketch tienes lo siguiente:
Wire.begin(4); //Este asignara los port 20&21 a la I2C. Esto es si usas el DUE
Wire.begin(); //Este asignara los port A4&A5 a la I2C como es el ultimo comando los port seran asignados A4&A5

Pregunta es necesario usar ese display? Pues si usa rs232 entonces podrias usar los TX y RX del arduino directamente. Yo lo hago asi en algunos de mi projectos para elimanar problemas.

He conseguido que funcione.

Después de hacer algunas pruebas, he visto que el display siempre inicializa con Wire.begin() desde la librería y esto desconecta la inicialización que hacía el arduino DUE con Wire.begin(4).

Por tanto lo que me ha funcionado para poder tirar para adelante es realizar primero la inicialización del display con
display.begin(SSD1306_SWITCHCAPVCC, 0x3C) y lo último que pongo antes de terminar Setup una inicialización de la dirección del arduino DUE y sus métodos Wire así:

Wire.begin(4);
  Wire.onReceive(receiveEvent); // register event
  Wire.onRequest(requestEvent);

Y para que no se quede colgado y me permita seguir recibiendo carácteres a través de I2C, he tenido que volver a inicializar la dirección de arduino DUE, después de cada utilización de las funciones del display, así:

Wire.begin(4);

para poder seguir recibiendo datos y a la vez utilizar el display oled ssd1306 (32).

Hi,
Me alegro que hallas solucionado el problema. Fue un poco dificil de solucionar pues estabas siguendo los pasos de acuerdo al las instruciones corespondientes. Yo encontre muchas personas con este problema y algunos lo resolvieron removiendo el Wire.H de las libreria pero creo que es una mala practica. Se debe de arreglar que sirva para uso normal sin tener que cambiar las librerias de acuerdo a la aplicacion.que se van a usar.