quarta-feira, 4 de abril de 2012

O protocolo I2C no Arduino

O protocolo I2C é implementado no Arduino, embora receba outro nome: TWI (Two-Wire Interface), por questões de direitos autorais. No Arduino Diecimila/Duemilanove/Uno, são utilizados os pinos A4 para o sinal SDA (dados) e A5 para o sinal SCL (clock); no Arduino Mega, são utilizados os pinos 20 para o sinal SDA (dados) e 21 para o sinal SCL (clock). Note-se que estes pinos não estão na mesma posição que os pinos I2C no Diecimila/Duemilanove/Uno, o que provoca incompatibilidade entre shields que utilizam o protocolo I2C e que tenham sido desenvolvidos para uma ou outra placa. A biblioteca que implementa o protocolo I2C no ambiente Arduino é denominada Wire.

O microcontrolador do Arduino implementa internamente os resistores pull-up requeridos pelo protocolo I2C (normalmente de 1,5 Kohms); no entanto, é interessante colocar 2 resistores de 10 Kohms; o comprimento máximo dos cabos que levam os sinais I2C para as placas periféricas é de 1 metro, em função da capacitância (embora existam chips reforçadores de sinal I2C, como o Philips P82B715, que permite uma distância de até 50 metros).

A idéia básica é um Arduino funcionando como mestre, e um ou mais slaves.


Conforme o site Arduino.cc, pode ser utilizado o código abaixo para o Master:

Code for Master Reader - Program for Arduino 1
// Wire Master Reader
// by Nicholas Zambetti

// Demonstrates use of the Wire library
// Reads data from an I2C/TWI slave device
// Refer to the "Wire Slave Sender" example for use with this

// Created 29 March 2006

// This example code is in the public domain.


#include

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);
}
O Slave deve ter o seguinte código:
Code for Slave Sender - Program for Arduino 2
// Wire Slave Sender
// by Nicholas Zambetti

// Demonstrates use of the Wire library
// Sends data as an I2C/TWI slave device
// Refer to the "Wire Master Reader" example for use with this

// Created 29 March 2006

// This example code is in the public domain.


#include

void setup()
{
  Wire.begin(2);                // join i2c bus with address #2
  Wire.onRequest(requestEvent); // register event
}

void loop()
{
  delay(100);
}

// function that executes whenever data is requested 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
}
No caso, o dispositivo slave se identifica como periférico 2 (Wire.begin(2);).

6 comentários:

  1. Olá Karl, blza?? comecei a programar arduino tem pouco tempo, e esses dias eu comprei um display de LCD de 16 x 2 que comunica via IIC (I2C) ou SPI, aqui no seu blog, eu consegui tirar algumas dúvidas sobre o protocolo, mas ainda não consegui fazer esse raio funcionar, você poderia me dar um apoio moral??? hahahaha

    Parabéns pelo conteúdo, é de ótima qualidade!
    abraços!

    ResponderExcluir
  2. Ai Bueno , abre esse link aqui
    http://www.robocore.net/upload/Modulo5-Errata.png

    Só preta atenção que o LCD pode estar de ponta cabeça

    ResponderExcluir
  3. Amigo Também comprei um lcd i2C só que ai vem a dúvida já tenho ligado nas portas 4 e 5 analógicas um rtc relógio que usa os mesmos protocolos SDA e SCL como faço agora?

    ResponderExcluir
    Respostas
    1. É só ligar a saída SDA do RTC e a saída SDA do i2C (ambas) na porta A4 e a saída SCL do RTC e a saída SCL do i2C (ambas) na porta A5.

      Excluir
  4. Olá pessoal, preciso fazer uma redundância de controladores, de forma que se algum arduino falhar, o outro deve assumir sem que haja perdas no processo de automação. Minha duvida é: O código que eu fiz para a automação do processo vai depois do delay? Ou ele vai ele fica no meio desse código descrito acima? Obrigado

    ResponderExcluir
  5. Ola tudo bem? Verificom que a mensagem fica instável no LCD, ou seja, se dermos um reset ela poderá certar ou errar. Se digitarmos outra, a chance de aparecer errada é maior que 50%. Que fazer?

    ResponderExcluir