Go Down

Topic: Comunicação I2C entre Arduinos (Read 4941 times) previous topic - next topic

netogdo

Olá, estou tentando fazer 2 Arduino se comunicarem via I2C, o que teoricamente é muito simples usando a lib Wire.h e 4 fios para ligá-los,

porém, não está funcionando nem por decreto, tentei os exemplos da própria lib, tentei exemplos achados em blogs, e nada  :(

Alguém tem idéia de alguma causa de problema?

Eu estou usando pull-ups de 22K externos, os GNDs e o VCC estão ligados juntos, os pinos usados são o A4 e o A5 (4 e 5 analógicos) o chip é o ATMEGA168

os Arduinos estão a menos de 10 centímetros de distância, medi continuidade, etc...

netogdo

#1
Jul 28, 2010, 06:31 pm Last Edit: Jul 28, 2010, 06:45 pm by netogdo Reason: 1
Descobri! medi os pinos com um osciloscópio e descobri que o pino 4 estava se comportando de acordo com o led do pino 13... meu Arduino estava coincidentemente com um respingo de solda entre a trilha do pino analógico 4 e o pino 13 (do led) ¬¬

Agora funciona perfeitamente, mas aproveito para deixar outra pergunta,

Esta lib tem confirmação de recebimento da mensagem pelo slave (ou mesmo pelo master se for o caso) ou terei de fazer isso manualmente?

Como seria um código simples (pode ser só a lógica) com confirmação de recebimento de pacote?

Obrigado.

radames

Olá Osias,

Nunca fiz esta comunicação entre dois arduinos, mas gostaria de ver esta sua aplicação.
Pode postar o código aqui?

netogdo

Olá, eu achei um pequeno tutorial no Instructables, com uns alguns videos etc, então apenas adaptei o código para receber um numero via serial, e transmitir de um Arduino ao outro, e este último pisca 3 leds alternadamente de acordo com o numero recebido.

Aqui está,

Master:
Code: [Select]
#include <Wire.h>

#define LED_PIN 13
byte x = 0;

void setup()
{
 Wire.begin(); // Start I2C Bus as Master
 pinMode(LED_PIN, OUTPUT);
 digitalWrite(LED_PIN, LOW);
 Serial.begin(9600);
 Serial.println("start");
}

int incoming;
void loop()
{
 if(Serial.available() >0)
 {
    delay(500); // delay para carregar os bytes no buffer
    x=0; // zera variaveis
    incoming = 0;
    while(Serial.available()) // enquanto houver bytes para ler:
    {
       incoming =(Serial.read() - 0x30); // armazena  o byte lido com seu valor numerico
       x = (x*10) + incoming; // calculo para x receber numero completo digitado
    }
 Serial.println(x, DEC); // imprime x para verificar
 
 Wire.beginTransmission(9); // transmit to device #9
 Wire.send(x);              // sends x
 Wire.endTransmission();    // stop transmitting
 //x++;
 //if (x > 5) x=0;
 delay(450);
 }
}


Slave:
Code: [Select]
#include <Wire.h>

#define LED_PIN 13
#define LED_1 12
#define LED_2 11

int x;

void setup() {
 Wire.begin(9);                // Start I2C Bus as a Slave (Device Number 9)
 Wire.onReceive(receiveEvent); // register event
 
 pinMode(LED_PIN, OUTPUT);
 pinMode(LED_1, OUTPUT);
 pinMode(LED_2, OUTPUT);
 
 digitalWrite(LED_PIN, LOW);
 digitalWrite(LED_1, LOW);
 digitalWrite(LED_2, LOW);
 
 x = 0;
}

int j=13;
void loop()
{
if (x > 0)
{
  for (int i=0; i<x; i++) // funcao para piscar 3 leds alternadamente, o numero de vezes recebido via i2c
  {
    digitalWrite(j, HIGH);
    delay(200);
    digitalWrite(j, LOW);
    delay(200);
    j--;
    if(j<11) j=13;
  }
  x = 0;
  delay(1000);
}
delay(100);
}
 

void receiveEvent(int howMany) // evento
{
 x = Wire.receive();    // receive byte as an integer  
}


Go Up