neste tutorial, vamos aprender como o protocolo de comunicação I2C obras e também vamos fazer um exemplo prático do que com a Placa Arduino e um sensor que usa esse protocolo. Você pode assistir ao seguinte vídeo ou ler o tutorial escrito abaixo.,
O I2C bus de comunicação é muito popular e amplamente utilizado por muitos dispositivos eletrônicos, pois pode ser facilmente implementado em muitos eletrônico de projetos que exigem a comunicação entre um mestre e vários escravos dispositivos, ou mesmo de mestre vários dispositivos. As implementações fáceis vêm com o fato de que apenas dois fios são necessários para a comunicação entre até quase 128 (112) dispositivos quando usando endereçamento de 7 bits e até quase 1024 (1008) dispositivos quando usando endereçamento de 10 bits.,
Como Funciona
Como é possível uma comunicação entre tantos dispositivos com apenas aos fios? Bem, cada dispositivo tem um ID pré-definido ou um endereço de dispositivo único para que o Mestre possa escolher com que dispositivos estarão se comunicando.os dois fios, ou linhas são chamados de relógio Serial (ou SCL) e dados seriais (ou SDA). A linha SCL é o sinal de relógio 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 carrega os dados.,
As duas linhas são “open-drain”, o que significa que as resistências puxadas precisam ser ligadas a elas para que as linhas sejam altas porque os dispositivos no barramento I2C estão ativos Baixos. Os valores comumente usados para as resistências são de 2K para velocidades mais altas em cerca de 400 kbps, a 10K para velocidade mais baixa em cerca de 100 kbps.
protocolo I2C
o sinal de dados é transferido em sequências de 8 bits., Então, após uma condição de início especial ocorre a primeira sequência de 8 bits que indica o endereço do escravo para o qual os dados estão sendo enviados. Depois de cada sequência de 8 bits segue um bit chamado Acknowledge. Após o primeiro reconhecimento bit na maioria dos casos vem outra sequência de endereçamento, mas desta vez para os registros internos do dispositivo escravo. Logo após as seqüências de endereçamento segue as seqüências de dados como muitos até que os dados são completamente enviados e termina com uma condição de parada especial.
Let’s take even closer look at these events., A condição inicial ocorre quando a linha de dados cai baixo enquanto a linha de relógio ainda é alta. Depois disso, o relógio começa e cada bit de dados é transferido durante cada pulso de relógio.
O dispositivo de endereçamento sequência de estrelas com o bit mais significativo (MSB) e termina com o bit menos significativo (LSB) e é, na verdade, composta de 7 bits, porque o 8 bit é usado para indicar se o mestre irá escrever para o escravo (lógico baixo) ou leia a partir dele (lógico alto).,
o próximo bit AKC/ NACK é usado pelo dispositivo slave para indicar se ele recebeu com sucesso a sequência anterior de bits. Então, neste momento, o dispositivo mestre entrega o controle da linha SDA para o dispositivo escravo e se o dispositivo escravo recebeu com sucesso a sequência anterior, ele vai puxar a linha SDA para baixo para a condição chamada acusar recepção., Se o escravo não puxar a linha SDA para baixo, a condição é chamada de não reconhecer, e significa que ele não recebeu com sucesso a sequência anterior que pode ser causada por várias razões. Por exemplo, o escravo pode estar ocupado, pode não entender os dados recebidos ou comando, não pode receber mais dados e assim por diante. Nesse caso, o dispositivo principal decide como proceder.
segue-se o endereçamento dos registos internos. Os registros internos são locais na memória do escravo contendo várias informações ou dados., Por exemplo, o acelerômetro ADX345 tem um endereço de dispositivo único e endereços de registradores internos de adição para os eixos X, Y e Z. Então, se quisermos ler os dados do eixo X, primeiro precisamos enviar o endereço do dispositivo e, em seguida, o endereço interno particular de registro para o eixo X. Estes endereços podem ser encontrados na ficha do sensor.
Após o endereçamento, as sequências de transferência de dados começam a partir do mestre ou do escravo, dependendo do modo seleccionado no bit R / W., Depois que os dados são enviados completamente, a transferência terminará com uma condição de parada que ocorre quando a linha SDA vai de baixo para Alto, enquanto a linha SCL é alta.
Arduino I2C exemplo
como exemplo, usarei a placa de fuga GY-80 que consiste em 5 sensores diferentes e a placa de saída GY-521 que consiste em 3 sensores diferentes. Então podemos obter dados de 8 sensores diferentes com apenas dois fios com o autocarro I2C.,
You can get these components from any of the sites below:
- ADXL345 3-Axis Accelerator……………………………………………………… Amazon / Banggood / AliExpress
- 2 in 1: MPU6050 6-Axis Gyroscope & Accelerometer ………………… Amazon / Banggood / AliExpress
- 3 in 1: GY-80 9-Axis Magnetic Field Acceleration Gyroscope……… Amazon
- 3 in 1: GY-86 10DOF MS5611 HMC5883L MPU6050 Module……… Banggood / AliExpress
Disclosure: These are affiliate links. As an Amazon Associate I earn from qualifying purchases.,
Aqui está como vamos conectar as placas. O PIN do relógio Serial da placa Arduino será conectado aos pinos do relógio Serial das duas placas breakout, o mesmo vale para os pinos de dados seriais e vamos ligar as placas com o Gnd e o pin 5V da placa Arduino. Note aqui que não estamos usando resistências pull-up porque as placas de fuga já têm.
Agora, a fim de se comunicar com estes chips ou sensores, precisamos de saber os seus endereços únicos. Podemos encontrá-los nas fichas dos sensores., Para a GY-80 breakout board temos as seguintes 4 endereços: hexadecimal 0x53 para o Acelerómetro de 3 Eixos sensor, um hexadecimal 0x69 para os 3 Eixos Giroscópio, um hexadecimal 0x1E para o Magnetômetro de 3 Eixos e um hexadecimal 0x77 para o Barómetro e Termómetro do sensor.
Arduino e MPU6050 Acelerômetro e Giroscópio Tutorial
Para a GY-521 breakout board temos apenas um endereço e um hexadecimal 0x68., Também podemos obter ou verificar os endereços usando o esboço do scanner Arduino I2C que pode ser encontrado no site oficial da Arduino. Então aqui se carregarmos e executarmos esse esboço, vamos obter os endereços dos dispositivos conectados no ônibus I2C.,
Sensor de Número de Peça I2C Endereço
Acelerómetro de 3 Eixos Dispositivos Analógicos ADXL345 0x53 Folha de dados
3 Eixo GyroST Microeletrônica L3G4200D 0x69 Folha de dados
Magnetômetro de 3 Eixos Honeywell MC5883L 0x1E Folha de dados
o Barómetro + Termômetro Bosch BMP085 0x77 Folha de dados
Depois de ter encontrado os endereços dos dispositivos que também precisa para encontrar os endereços de seus registros internos, a fim de ler os dados a partir deles., Por exemplo, se quisermos ler os dados para o eixo X a partir do sensor de acelerômetro de 3 eixos do painel de breakout GY-80, precisamos encontrar o endereço interno de registro onde os dados do eixo X são armazenados. A partir da ficha do sensor, podemos ver que os dados do eixo X são armazenados em dois registradores, DATAX0 com um endereço hexadecimal 0x32 e DATAX1 com um endereço hexadecimal 0x33.
Arduino I2C Code
Now let’s make the code that will get the data for the X axis., Então vamos usar a biblioteca Arduino Wire que tem que ser incluída no sketch. Aqui primeiro temos que definir o endereço do sensor e os dois endereços internos dos registros que encontramos anteriormente. fio.a função begin () irá iniciar a biblioteca de fios e também precisamos iniciar a comunicação serial porque vamos usar o Monitor Serial para mostrar os dados do sensor.
In The loop () we will start with the Wire.função beginTransmission() que iniciará a transmissão para o sensor em particular, o acelerómetro de 3 eixos no nosso caso. Depois com o fio.,função write () vamos pedir os dados particulares dos dois registros do eixo X. fio.a transmissão final() terminará a transmissão e transmitirá os dados dos registos. Agora com o fio.request from () function we will request the transmitted data or the two bytes from the two registers.o fio.disponível() função irá devolver o número de bytes disponíveis para recuperação e se esse número corresponder com os nossos bytes solicitados, no nosso caso 2 bytes, usando o fio.read () função vamos ler os bytes dos dois registros do eixo X., No final, vamos imprimir os dados no monitor serial. Aqui estão os dados, mas tenha em mente que estes são dados brutos e alguma matemática é necessária para ser feito, a fim de obter os valores certos do eixo X. Você pode encontrar mais detalhes para isso no meu próximo tutorial para usar acelerômetros com a placa Arduino porque eu não quero sobrecarregar este tutorial porque seu principal objetivo era explicar como a comunicação Arduino I2C funciona.