Pages: [1]   Go Down
Author Topic: Comunicacion entre dos arduinos con I2C  (Read 1157 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 6
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola a todos,
Quiero comunicar dos arduinos mediante I2C, en el esclavo tengo conectado un potenciometro, y el maestro cada cierto tiempo solicita la información al esclavo.
Divido el valor del potenciometro en dos de 8bits, y los envio seguidos cuando el maestro lo pide, pero el maestro solo me guarda el ultimo que envio. ¿Como se hace para mandar los dos datos del esclavo al maestro?
Empezé ayer a usar el I2C y he estado mirando pero no encuentro este mismo problema por internet.

Codigo Maestro:
Code:
#include <Wire.h>
int dato_bajo;
int dato_alto;

void setup()
{
  Wire.begin();       
  Serial.begin(9600); 
}

void loop()
{
  Wire.requestFrom(2, 2);   

  while(Wire.available())   
  {
    dato_alto = Wire.read();
    dato_bajo = Wire.read();         
    Serial.print(dato_alto);
    Serial.print("  ");
    Serial.println(dato_bajo);
  }

  delay(1000);
}

Codigo Esclavo:
Code:
#include <Wire.h>
int dato_bajo;
int dato_alto;

void setup()
{
  Wire.begin(2);               
  Wire.onRequest(requestEvent);
}

void loop()
{
  dato=analogRead(0);
  dato_alto=dato/256;
  dato_bajo=dato-(dato_alto*256);
  delay(300);
}


void requestEvent()
{
  Wire.write(dato_alto);
  Wire.write(dato_bajo);               
}
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Desde mi ignorancia, te comento...

Por lo que veo en la Reference de Wire, el  .available crea un bucle, por lo que estás asignando siempre a las variables el mismo valor, primero el alto (a las dos) y luego el bajo (por eso sólo te guardaría el bajo) pero en el monitor te tendrían que aparecer los dos repetidos (dos altos, dos bajos)

Quizá una forma de arreglarlo sea con un array[Wire.available()] (no sé si esto funcionaría) o desplazando bits (<<).

Algo asín (asegurate que dato está a 0 o que es del mismo tamaño que el número de bytes que vas a recibir):

Code:
while(Wire.available())   
  {
    dato = dato << 8 ;
    dato += Wire.read();
  }
Serial.println(dato);

Por otro lado, en la parte del esclavo...

Cuando creas dato_bajo en el esclavo, has puesto "*256", por lo siempre le estás dando valor 0.

Tampoco sé si hay problema al enviar dato_* que son int (2bytes), cuando .write sólo coge byte (en determinados casos dice por ahí que los manda en paquetes de byte...)

Fuente: http://arduino.cc/en/Reference/WireRead

Code:
Example

#include <Wire.h>

void setup()
{
  Wire.begin();        // join i2c bus (address optional for master)
  Serial.begin(9600);  // start serial for output
}

void loop()
{
  Wire.requestFrom(2, 6);    // request 6 bytes from slave device #2

  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);
}
Logged

Pages: [1]   Go Up
Jump to: