Arduino - Circuito Integrado Inter
Circuito Inter-integrado (I2C) é um sistema de troca serial de dados entre os microcontroladores e circuitos integrados especializados de nova geração. É usado quando a distância entre eles é curta (o receptor e o transmissor geralmente estão na mesma placa impressa). A conexão é estabelecida por meio de dois condutores. Um é usado para transferência de dados e o outro é usado para sincronização (sinal de relógio).
Conforme visto na figura a seguir, um dispositivo é sempre um mestre. Ele executa o endereçamento de um chip escravo antes do início da comunicação. Desta forma, um microcontrolador pode se comunicar com 112 dispositivos diferentes. A taxa de transmissão é geralmente de 100 Kb / s (modo padrão) ou 10 Kb / s (modo de taxa de transmissão lenta). Recentemente, surgiram sistemas com taxa de transmissão de 3,4 Mb / s. A distância entre os dispositivos que se comunicam em um barramento I2C é limitada a vários metros.
Pinos I2C da placa
O barramento I2C consiste em dois sinais - SCL e SDA. SCL é o sinal de clock e SDA é o sinal de dados. O barramento mestre atual sempre gera o sinal de clock. Alguns dispositivos escravos podem forçar o clock baixo às vezes para atrasar o envio de mais dados pelo mestre (ou para exigir mais tempo para preparar os dados antes que o mestre tente fazer o clock out). Isso é conhecido como “alongamento do relógio”.
A seguir estão os pinos para diferentes placas Arduino -
- Uno, Pro Mini A4 (SDA), A5 (SCL)
- Mega, Devido 20 (SDA), 21 (SCL)
- Leonardo, Yun 2 (SDA), 3 (SCL)
Arduino I2C
Temos dois modos - código mestre e código escravo - para conectar duas placas Arduino usando I2C. Eles são -
- Transmissor Mestre / Receptor Escravo
- Receptor mestre / transmissor escravo
Transmissor Mestre / Receptor Escravo
Vamos agora ver o que é transmissor mestre e receptor escravo.
Transmissor Mestre
As funções a seguir são usadas para inicializar a biblioteca Wire e ingressar no barramento I2C como mestre ou escravo. Normalmente é chamado apenas uma vez.
Wire.begin(address) - O endereço é o endereço do escravo de 7 bits em nosso caso, pois o mestre não é especificado e entrará no barramento como mestre.
Wire.beginTransmission(address) - Comece uma transmissão para o dispositivo escravo I2C com o endereço fornecido.
Wire.write(value) - Fila os bytes para transmissão de um dispositivo mestre para o escravo (entre chamadas para beginTransmission () e endTransmission ()).
Wire.endTransmission() - Termina uma transmissão para um dispositivo escravo que foi iniciada por beginTransmission () e transmite os bytes que foram enfileirados por wire.write ().
Example
#include <Wire.h> //include wire library
void setup() //this will run only once {
Wire.begin(); // join i2c bus as master
}
short age = 0;
void loop() {
Wire.beginTransmission(2);
// transmit to device #2
Wire.write("age is = ");
Wire.write(age); // sends one byte
Wire.endTransmission(); // stop transmitting
delay(1000);
}
Slave Receiver
As seguintes funções são usadas -
Wire.begin(address) - O endereço é o endereço do escravo de 7 bits.
Wire.onReceive(received data handler) - Função a ser chamada quando um dispositivo escravo recebe dados do mestre.
Wire.available() - Retorna o número de bytes disponíveis para recuperação com Wire.read (). Deve ser chamado dentro do manipulador Wire.onReceive ().
Example
#include <Wire.h> //include wire library
void setup() { //this will run only once
Wire.begin(2); // join i2c bus with address #2
Wire.onReceive(receiveEvent); // call receiveEvent when the master send any thing
Serial.begin(9600); // start serial for output to print what we receive
}
void loop() {
delay(250);
}
//-----this function will execute whenever data is received from master-----//
void receiveEvent(int howMany) {
while (Wire.available()>1) // loop through all but the last {
char c = Wire.read(); // receive byte as a character
Serial.print(c); // print the character
}
}
Receptor mestre / transmissor escravo
Vamos agora ver o que é receptor mestre e transmissor escravo.
Receptor Mestre
O Master é programado para solicitar e então ler bytes de dados que são enviados do Slave Arduino endereçado exclusivamente.
A seguinte função é usada -
Wire.requestFrom(address,number of bytes)- Usado pelo mestre para solicitar bytes de um dispositivo escravo. Os bytes podem então ser recuperados com as funções wire.available () e wire.read ().
Example
#include <Wire.h> //include wire library void setup() {
Wire.begin(); // join i2c bus (address optional for master)
Serial.begin(9600); // start serial for output
}
void loop() {
Wire.requestFrom(2, 1); // request 1 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);
}
Transmissor escravo
A seguinte função é usada.
Wire.onRequest(handler) - Uma função é chamada quando um mestre solicita dados deste dispositivo escravo.
Example
#include <Wire.h>
void setup() {
Wire.begin(2); // join i2c bus with address #2
Wire.onRequest(requestEvent); // register event
}
Byte x = 0;
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(x); // respond with message of 1 bytes as expected by master
x++;
}