Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Como funciona a comunicação I2C? Tutorial Arduino e I2C


Neste tutorial vamos aprender como funciona o protocolo de comunicação I2C e também faremos um exemplo prático dele com a placa Arduino e um sensor que utiliza este protocolo. Você pode assistir ao vídeo a seguir ou ler o tutorial escrito abaixo.

Visão geral


O barramento de comunicação I2C é muito popular e amplamente utilizado por muitos dispositivos eletrônicos porque pode ser facilmente implementado em muitos projetos eletrônicos que exigem comunicação entre um mestre e vários dispositivos escravos ou até mesmo vários dispositivos mestres. As implementações fáceis vêm com o fato de que apenas dois fios são necessários para comunicação entre até quase 128 (112) dispositivos ao usar o endereçamento de 7 bits e até quase 1024 (1008) dispositivos ao usar o endereçamento de 10 bits.

Como funciona o I2C


Como é possível, uma comunicação entre tantos dispositivos apenas com fios? Bem, cada dispositivo tem um ID predefinido ou um endereço de dispositivo exclusivo para que o mestre possa escolher com quais dispositivos se comunicarão.

Os dois fios, ou linhas, são chamados Serial Clock (ou SCL) e Serial Data (ou SDA). A linha SCL é o sinal de clock que sincroniza a transferência de dados entre os dispositivos no barramento I2C e é gerado pelo dispositivo mestre. A outra linha é a linha SDA que transporta os dados.

As duas linhas são “open-drain”, o que significa que os resistores pull-up precisam ser conectados a elas para que as linhas fiquem altas porque os dispositivos no barramento I2C estão ativos em baixa. Os valores comumente usados ​​para os resistores são de 2K para velocidades mais altas em cerca de 400 kbps, a 10K para velocidades mais baixas em cerca de 100 kbps.

Protocolo I2C


O sinal de dados é transferido em sequências de 8 bits. Assim, após ocorrer uma condição especial de início, vem a primeira sequência de 8 bits que indica o endereço do escravo para o qual os dados estão sendo enviados. Após cada sequência de 8 bits segue um bit chamado Acknowledge. Após o primeiro bit de reconhecimento, na maioria dos casos, vem outra sequência de endereçamento, mas desta vez para os registradores internos do dispositivo escravo. Logo após as sequências de endereçamento seguem as sequências de dados quantas vezes forem necessárias até que os dados sejam completamente enviados e terminem com uma condição especial de parada.


Vamos dar uma olhada ainda mais de perto nesses eventos. A condição de início ocorre quando a linha de dados cai enquanto a linha do relógio ainda está alta. Depois disso, o relógio inicia e cada bit de dados é transferido durante cada pulso de relógio.

A sequência de endereçamento do dispositivo começa com o bit mais significativo (MSB) primeiro e termina com o bit menos significativo (LSB) e na verdade é composta de 7 bits porque o 8 th bit é usado para indicar se o mestre escreverá no escravo (lógica baixa) ou lerá a partir dele (lógica alta).

O próximo bit AKC/NACK é usado pelo dispositivo escravo para indicar se recebeu com sucesso a sequência anterior de bits. Assim, neste momento o dispositivo mestre passa o controle da linha SDA para o dispositivo escravo e se o dispositivo escravo tiver recebido com sucesso a sequência anterior ele puxará a linha SDA para a condição chamada Acknowledge. Se o escravo não puxar a linha SDA para baixo, a condição é chamada de Not Acknowledge, e significa que ele não recebeu com sucesso a sequência anterior o que pode ser causado por vários motivos. Por exemplo, o escravo pode estar ocupado, pode não entender os dados ou comandos recebidos, não pode receber mais dados e assim por diante. Nesse caso, o dispositivo mestre decide como proceder.

Em seguida é o endereçamento dos registradores internos. Os registradores internos são locais na memória do escravo contendo várias informações ou dados. Por exemplo, o Acelerômetro ADX345 possui um endereço de dispositivo exclusivo e endereços de registros internos adicionais para os eixos X, Y e Z. Portanto, se quisermos ler os dados do eixo X, primeiro precisamos enviar o endereço do dispositivo e, em seguida, o endereço de registro interno específico para o eixo X. Esses endereços podem ser encontrados na folha de dados do sensor.

Após o endereçamento, as sequências de transferência de dados iniciam-se no mestre ou no escravo dependendo do modo selecionado no bit R/W. Após o envio completo dos dados, a transferência terminará com uma condição de parada que ocorre quando a linha SDA passa de baixa para alta enquanto a linha SCL está alta.

Exemplo


Como exemplo, usarei a placa breakout GY-80 que consiste em 5 sensores diferentes e a placa breakout GY-521 que consiste em 3 sensores diferentes. Assim, podemos obter dados de 8 sensores diferentes com apenas dois fios com o barramento I2C.

Você pode obter esses componentes em qualquer um dos sites abaixo:
  • Acelerador de 3 eixos ADXL345………………………………………………………
  • 2 em 1:giroscópio e acelerômetro de 6 eixos MPU6050 …………………
  • 3 em 1:Giroscópio de aceleração de campo magnético de 9 eixos GY-80……… Amazon 
  • 3 em 1: GY-86 10DOF MS5611 HMC5883L MPU6050 Módulo……… Banggood  / AliExpress

Veja como vamos conectar as placas. O pino Serial Clock da placa Arduino será conectado aos pinos Serial Clock das duas placas breakout, o mesmo vale para os pinos Serial Data e alimentaremos as placas com o Gnd e o pino 5V da placa Arduino. Observe aqui que não estamos usando resistores pull-up porque as placas de fuga já têm.

Agora, para nos comunicarmos com esses chips ou sensores, precisamos conhecer seus endereços exclusivos. Podemos encontrá-los nas folhas de dados dos sensores. Para a placa de breakout GY-80 temos os seguintes 4 endereços:um hexadecimal 0x53 para o sensor do acelerômetro de 3 eixos, um hexadecimal 0x69 para o giroscópio de 3 eixos, um hexadecimal 0x1E para o magnetômetro de 3 eixos e um hexadecimal 0x77 para o barômetro e termômetro sensor.

Para a placa de fuga GY-521, temos apenas um endereço e esse é um hexadecimal 0x68. Também podemos obter ou verificar os endereços usando o esboço do Arduino I2C Scanner, que pode ser encontrado no site oficial do Arduino. Então aqui, se carregarmos e executarmos esse esboço, obteremos os endereços dos dispositivos conectados no barramento I2C.


Sensor                                             Número da peça                                     Endereço I2C

Acelerômetro de 3 eixos                   Dispositivos analógicos ADXL345                   0x53                  Folha de dados

3 Eixos GyroST                                Microeletrônica L3G4200D              0x69                  Folha de dados

Magnetômetro de 3 eixos                  Honeywell MC5883L                           0x1E                  Folha de dados

Barômetro + Termômetro        Bosch BMP085                                     0x77                  Folha de dados


Depois de encontrarmos os endereços dos dispositivos, também precisamos encontrar os endereços de seus registros internos para ler os dados deles. Por exemplo, se quisermos ler os dados do eixo X do sensor Acelerômetro de 3 eixos da placa de fuga GY-80, precisamos encontrar o endereço de registro interno onde os dados do eixo X estão armazenados. A partir da folha de dados do sensor, podemos ver que os dados para o eixo X são realmente armazenados em dois registros, DATAX0 com endereço hexadecimal 0x32 e DATAX1 com endereço hexadecimal 0x33.

Código Arduino I2C


Agora vamos fazer o código que vai pegar os dados para o eixo X. Portanto, usaremos a biblioteca de fios do Arduino que deve ser incluída no esboço. Aqui primeiro temos que definir o endereço do sensor e os dois endereços dos registradores internos que encontramos anteriormente. O Wire.begin() A função iniciará a biblioteca Wire e também precisamos iniciar a comunicação serial, pois usaremos o Serial Monitor para mostrar os dados do sensor.

No loop() começaremos com o Wire.beginTransmission() função que iniciará a transmissão para o sensor específico, o Acelerômetro de 3 Eixos em nosso caso. Em seguida, com o Wire.write() vamos pedir os dados particulares dos dois registros do eixo X. O Wire.endTransmission() encerrará a transmissão e transmitirá os dados dos registradores. Agora com o Wire.requestFrom() solicitaremos os dados transmitidos ou os dois bytes dos dois registradores.

O Wire.available() A função retornará o número de bytes disponíveis para recuperação e se esse número corresponder aos nossos bytes solicitados, no nosso caso 2 bytes, usando o Wire.read() vamos ler os bytes dos dois registradores do eixo X. No final, imprimiremos os dados no monitor serial. Aqui estão esses dados, mas lembre-se de que são dados brutos e é necessário fazer algumas contas para obter os valores corretos do eixo X. Você pode encontrar mais detalhes sobre isso no meu próximo tutorial para usar acelerômetros com a placa Arduino porque não quero sobrecarregar este tutorial porque seu objetivo principal era explicar como funciona a comunicação Arduino I2C.
/*  
 *  How I2C Communication Protocol Works - Arduino I2C Tutorial
 *  
 *   by Dejan, www.HowToMechatronics.com 
 *   
 */

#include <Wire.h>

int ADXLAddress = 0x53; // Device address in which is also included the 8th bit for selecting the mode, read in this case.

#define X_Axis_Register_DATAX0 0x32 // Hexadecima address for the DATAX0 internal register.
#define X_Axis_Register_DATAX1 0x33 // Hexadecima address for the DATAX1 internal register.
#define Power_Register 0x2D // Power Control Register

int X0,X1,X_out;

void setup() {
  Wire.begin(); // Initiate the Wire library
  Serial.begin(9600);
  delay(100);
  // Enable measurement
  Wire.beginTransmission(ADXLAddress);
  Wire.write(Power_Register);
  // Bit D3 High for measuring enable (0000 1000)
  Wire.write(8);  
  Wire.endTransmission();
}

void loop() {
  Wire.beginTransmission(ADXLAddress); // Begin transmission to the Sensor 
  //Ask the particular registers for data
  Wire.write(X_Axis_Register_DATAX0);
  Wire.write(X_Axis_Register_DATAX1);
  
  Wire.endTransmission(); // Ends the transmission and transmits the data from the two registers
  
  Wire.requestFrom(ADXLAddress,2); // Request the transmitted two bytes from the two registers
  
  if(Wire.available()<=2) {  // 
    X0 = Wire.read(); // Reads the data from the register
    X1 = Wire.read();   
  }
  
  Serial.print("X0= ");
  Serial.print(X0);
  Serial.print("   X1= ");
  Serial.println(X1);
}Code language: Arduino (arduino)

Processo de manufatura

  1. Comunicação Arduino I2C com Raspi 2 WIOT
  2. Como construir um monitor de energia Arduino e registrador de dados
  3. Registrador de dados de temperatura e umidade
  4. Comunicação Python3 e Arduino
  5. Como usar NMEA-0183 com Arduino
  6. Tutorial do Arduino:JARVIS v1 | Como fazer uma automação residencial
  7. Como fazer multithread um Arduino (tutorial de protothreading)
  8. nRF24L01 – Como Funciona, Interface Arduino, Circuitos, Códigos
  9. Tutorial de acelerômetro e giroscópio Arduino e MPU6050
  10. Como rastrear a orientação com Arduino e acelerômetro ADXL345