No tutorial anteriorcobrimos o Barramento I2C em Arduino. Também aprendemos como usar a biblioteca de fios para se comunicar com o circuito interintegrado ou dispositivos I2C usando placas Arduino.
O barramento I2C é comumente usado por sensores digitais. Ao usar esta interface, centenas de dispositivos escravos podem ser conectados em apenas dois fios. Cada dispositivo – seja um mestre ou escravo I2C – requer apenas dois canais para se conectar ao barramento.
Embora este seja um protocolo de comunicação de dados lento, sua simplicidade faz do barramento I2C uma das interfaces mais populares entre os sensores digitais. Normalmente, os sensores usam apenas outras interfaces de comunicação (como UART ou SPI) quando a comunicação full-duplex é estritamente necessária. Caso contrário, o I2C é o de fato interface serial para todos os sensores digitais.
Alguns exemplos de sensores que usam um barramento I2C/TWI incluem: acelerômetro ADXL345, giroscópio L3G4200D, magnetômetro MC5883L, sensor de pressão BMP180 e DS1307 RTC.
Neste tutorial, aprenderemos como fazer a interface de um Acelerômetro ADXL345 sensor com Arduino usando o barramento I2C/TWI.
O acelerômetro ADXL345
ADXL345 é um MEMS de três eixos acelerômetro sensor. Também é digital sensor inercial que usa um design de acelerômetro capacitivo.
Características incluem:
- Uma faixa selecionável pelo usuário de até +/-16g
- Uma resolução de saída máxima de 13 bits
- Uma sensibilidade de 3,9 mg/LSB
- Uma taxa máxima de dados de saída de 3200 Hz
O sensor possui interfaces I2C e SPI para se comunicar com controladores ou computadores.
O ADXL345 mede a aceleração estática devido à gravidade e a aceleração dinâmica, resultante de movimento ou choque. Ele pode ser usado para detectar a aceleração linear em três eixos, detectando a inclinação e a queda livre de um objeto.
Existem dois pinos de interrupção junto com as interfaces I2C e SPI no sensor. É aqui que várias funções de detecção integradas, como queda livre, toque único e toque duplo, podem ser mapeadas. O ADXL345 também pode detectar a presença ou falta de movimento relativo comparando os valores de aceleração com limites definidos pelo usuário.
Como sensor digital, o ADXL345 possui registros integrados que podem ser lidos e gravados para definir configurações e ler valores de aceleração. Ele oferece quatro faixas de medição: +/-2g, +/-4g, +/-8g e +/-16g.
A faixa de medição padrão é +/-2g, que pode ser usada para detectar aceleração de até 19,6 m/s2 em qualquer direção ao longo de cada eixo.
As resoluções máximas são:
- 10 bits para +/-2g
- 11 bits para +/-4g
- 12 bits para +/-8g
- 13 bits para faixa de +/-16g
A resolução padrão é de 10 bits. Para a faixa +/-2g (padrão), permite uma sensibilidade de 3,9mg/LSB. A taxa de dados padrão é 100 Hz. Todas essas configurações podem ser alteradas ou definidas gravando dados nos registros integrados do ADXL345. Um controlador/computador pode ler a aceleração simplesmente lendo os valores dos registradores 0x32 a 0x37.
Interface ADXL345 com Arduino
O sensor ADXL345 possui interfaces I2C e SPI para se comunicar com qualquer controlador ou computador. O sensor suporta SPI de três e quatro fios. Além dessas interfaces seriais, os pinos de interrupção do sensor podem ter interface direta com canais de E/S digitais do controlador/computador.
Como o Arduino também suporta o barramento I2C e SPI, o ADXL345 pode ser conectado ao Arduino usando qualquer um deles. Neste tutorial, usaremos o barramento I2C.
Os pinos I2C do Arduino não são puxados internamente para ALTO. No entanto, o sensor ADXL345 está normalmente disponível como um módulo, em que os pinos I2C do sensor já estão em nível ALTO integrados. Portanto, podemos conectar diretamente os pinos I2C do sensor ADXL345 à porta I2C da placa Arduino.
O ADXL345 pode receber energia da saída de energia de 5V do Arduino. Este diagrama de circuito mostra a interface do ADXL345 com o Arduino.
O I2C no Arduino
A maioria das placas Arduino possui pelo menos um módulo I2C, que pode ser acessado por meio de uma ou mais portas. Uma placa Arduino pode servir como mestre e escravo I2C. Para ler dados de um sensor digital como o ADXL345, entretanto, o Arduino precisa ser programado como mestre I2C. Ele também pode ser programado para conversar com dispositivos I2C/TWI usando a biblioteca de fios.
- Configure o Arduino como um mestre I2C chamando Wire.begin sem argumentos.
- O Arduino mestre pode definir a frequência do clock I2C usando o método Wire.setClock se a velocidade do clock precisar ser modificada.
- O Arduino pode transmitir dados para um escravo (como ADXL345 para definir configurações) chamando os métodos Wire.beginTransmission , Wire.write e Wire.endTransmission .
- O Arduino também pode solicitar dados de um escravo usando o método requestFrom e recuperar os dados solicitados usando os métodos Wire.available e Wire.read .
Conversando com o ADXL345 usando Arduino
Cada dispositivo escravo I2C precisa ter um endereço I2C exclusivo. O ADXL345 possui um pino de endereço ALT que pode ser conectado para definir o endereço I2C deste sensor digital. Se o pino ALT ADDRESS for colocado em HIGH em um módulo, o endereço I2C de 7 bits para o dispositivo será 0x1D – seguido pelo bit R/W.
Isso se traduz em 0x3A para gravação e 0x3B para leitura. Se o pino ALT ADDRESS estiver conectado ao terra, o endereço I2C de 7 bits para o dispositivo será 0x53 (seguido pelo bit R/W). Isso se traduz em 0xA6 para gravação e 0xA7 para leitura.
Em um módulo, o pino ALT ADDRESS já está puxado para HIGH ou LOW. O endereço I2C do sensor ADXL345 usado neste tutorial é 0x53. Ao usar este endereço, o Arduino pode acessar o sensor no barramento I2C.
O Arduino precisa ler e gravar os dados nos registros do ADXL345 para definir as configurações (incluindo a faixa de medição de configuração, taxa de transferência de dados, sensibilidade e resolução) e para ler os valores de aceleração.
Aqui está uma tabela desses registros:
Ao gravar dados no ADXL345, o sensor pode ser endereçado usando o método Wire.beginTransmission . O primeiro byte que indica o registro ADXL345 (onde os dados serão gravados) deve ser enviado seguido do byte de dados utilizando o método Wire.write . A transmissão é concluída somente quando o método Wire.endTransmission é chamado.
Ao ler dados do ADXL345, o sensor deve ser endereçado usando o método Wire.beginTransmission . O primeiro byte que indica o registro ADXL345 (onde os dados serão lidos) deve ser escrito pelo mestre Arduino no barramento I2C usando o método Wire.write .
Esta transmissão só é completada quando o método Wire.endTransmission é chamado. Os dados zero são enviados junto com o endereço do registrador quando precisam ser lidos no registrador ADXL345. E imediatamente após endereçar o registro a ser lido, o mestre Arduino deve fazer uma chamada ao método Wire.requestFrom para ler o valor do registro selecionado.
Configurando o sensor ADXL345
Abaixo estão algumas etapas simples para configurar o sensor ADXL345 para comunicação serial.
1. Defina o modo de energia e a taxa de transferência de dados escrevendo no registro 0x2C. Este registro possui estes bits:
Se o bit LOW_POWER estiver definido como 0, o ADXL345 funciona em modo normal. Se estiver definido como 1, o ADXL345 funciona em modos de energia reduzida, onde há maior ruído.
Os bits D3 a D0 selecionam a taxa de transferência de dados de acordo com esta tabela:
2. Defina o formato dos dados escrevendo no registro 0x31. Tem estes bits:
Se o bit SELF-TEST for definido como 1, uma força de autoteste será aplicada ao sensor, causando uma mudança nos dados de saída. Se for definido como 0, a força do autoteste será desativada.
Se o bit SPI estiver definido como 1, o ADXL345 usa o modo SPI de três fios. Se estiver definido como 0, ele usa o modo SPI de quatro fios.
Se o bit INT_INVERT estiver definido como 0, ele define as interrupções como ativas em HIGH e se estiver definido como 1, ele define as interrupções como ativas em LOW.
Se o bit FULL_RES for definido como 1, o sensor gera um valor de resolução total (10 bits para +/- 2g; 11 bits para +/- 4g; 12 bits para +/- 8g; 13 bits para +/- 8g; 13 bits para +/- 8g; /- 16g). Caso contrário, se estiver definido como 0, o padrão de 10 bits será usado.
Se o bit de justificação for definido como 1, os valores de aceleração nos registros 0x32 a 0x37 serão justificados à esquerda. Se estiver definido como 0, esses valores serão justificados à direita.
A imagem a seguir mostra o formato dos registros de valor de dados com as justificações à esquerda e à direita e as posições do LSB ou MSB para diferentes faixas de medição.
Os bits de faixa D1 e D0 selecionam a faixa de medição de acordo com esta tabela:
3. Defina os recursos de economia de energia escrevendo no registro 0x2D, que possui estes bits:
Se o bit de link for definido como 1, as funções de atividade e inatividade serão vinculadas em série (o que significa que a função de atividade será atrasada até que a função de inatividade seja detectada). Se estiver definido como 0, ambas as funções serão simultâneas. A função de inatividade refere-se a uma situação em que a aceleração está abaixo do valor THRESH_INACT (ou do registro 0x25) por pelo menos o tempo indicado pelo TIME_INACT (o registro 0x26).
Se o bit de link estiver definido e o bit AUTO_SLEEP estiver definido como 1, ele ativa a funcionalidade de suspensão automática. Neste modo, o ADXL345 muda automaticamente para o modo de suspensão se a função de inatividade estiver habilitada e a inatividade for detectada. Se a atividade também estiver habilitada, o ADXL345 acorda automaticamente do sono após detectá-lo e retorna à operação na taxa de dados de saída definida no registrador BW_RATE.
Se o bit AUTO_SLEEP estiver definido como 0, ele desativa a mudança automática para o modo sleep. Se o bit de link não estiver definido, o recurso AUTO_SLEEP será desabilitado e a configuração do bit AUTO_SLEEP não terá impacto na operação do dispositivo.
Se o bit Measure estiver definido como 1, o ADXL345 opera no modo de medição. Se estiver definido como 0, o ADXL345 opera em modo de espera.
Se o bit Sleep estiver definido como 1, o ADXL345 operará no modo sleep. Se estiver definido como 0, o ADXL345 opera no modo normal. O modo sleep suprime DATA_READY, interrompe a transmissão de dados para FIFO e muda a taxa de amostragem para aquela especificada pelos bits de ativação.
No modo de suspensão, apenas a função de atividade pode ser usada. Os bits de ativação controlam a frequência da leitura no modo sleep de acordo com esta tabela:
Lendo a aceleração do ADXL345
A aceleração ao longo de:
- O eixo X é lido dos registros 0x32 e 0x33
- O eixo Y é lido dos registros 0x34 e 0x35
- O eixo Z é lido dos registros 0x36 e 0x37
Os valores brutos são de 16 bits divididos em dois para complementar o formulário. A resolução, a justificação esquerda/direita dos valores e a faixa de medição são definidas de acordo com o valor gravado no registro 0x31 do ADXL345.
Em qualquer faixa de medição, a resolução de 10 bits pode ser selecionada. O valor de aceleração de 10 bits pode ser ajustado para a esquerda ou para a direita. Se o valor for ajustado à direita, os valores de aceleração de 10 bits podem ser obtidos mascarando o segundo byte (que é lido de 0x33 para o eixo x, 0x35 para o eixo y e 0x37 para o eixo z) — com 0x03, deslocando-o para a direita oito vezes. Em seguida, os dois bytes são combinados (0x32 e 0x33; 0x34 e 0x35; 0x36 e 0x37) em um número inteiro de 16 bits.
Se o valor for ajustado para a esquerda, os valores de aceleração de 10 bits podem ser obtidos deslocando o primeiro byte para a direita (que é lido de 0x32 para o eixo x, 0x34 para o eixo y e 0x36 para o eixo z) seis vezes, mascarando o segundo byte (que é lido de 0x33 para o eixo x, 0x35 para o eixo y e 0x37 para o eixo z) com 0x3F para um byte temporário. Seu byte temporário é deslocado para a esquerda duas vezes, adicionando o byte temporário ao primeiro byte. Em seguida, desloque o primeiro byte para a esquerda seis vezes e combine os dois bytes (0x32 e 0x33; 0x34 e 0x35; 0x36; e 0x37) para obter um número inteiro de 16 bits.
Este valor de 10 bits irá variar de 0 a 1024. A aceleração é medida em ambas as direções ao longo do eixo. Portanto, se o valor for maior que 511, subtraia 1024 dele para obter um valor negativo que indica a outra direção do eixo.
Para uma resolução de 10 bits, o valor da aceleração em uma unidade de gravidade pode ser derivado multiplicando esse valor por 4 mg (0,004) para faixa de +/- 2g, 7,8 mg (0,0078) para faixa de +/- 4g, 15,6 mg (0,0156) para +/- 8g ou 31,25 mg (0,03125) para +/- 16g.
Se a resolução selecionada for de 11 bits para a faixa +/- 4g e os valores de aceleração estiverem ajustados corretamente, os valores de aceleração de 11 bits podem ser obtidos mascarando o segundo byte (lido de 0x33 para o eixo x, 0x35 para o eixo y e 0x37 para o eixo z) – com 0x07, deslocando-o para a direita oito vezes e combinando os dois bytes (0x32 e 0x33; 0x34 e 0x35; 0x36; e 0x37) para um número inteiro de 16 bits.
Se a resolução selecionada for de 11 bits para a faixa +/- 4g e os valores de aceleração forem ajustados para a esquerda, os valores de aceleração de 11 bits podem ser obtidos deslocando o primeiro byte para a direita (lido de 0x32 para o eixo x, 0x34 para o eixo y e 0x36 para o eixo z) cinco vezes, mascarando o segundo byte (lido de 0x33 para o eixo x, 0x35 para o eixo y e 0x37 para o eixo z) com 0x1F para um temporário byte. Em seguida, desloque o byte temporário para a esquerda três vezes, adicione o byte temporário ao segundo byte, desloque o segundo byte para a esquerda cinco vezes e, finalmente, combine os dois bytes (0x32 e 0x33; 0x34 e 0x35; 0x36; e 0x37) para um número inteiro de 16 bits.
Este valor de 11 bits irá variar de 0 a 2048. A aceleração é medida em ambas as direções ao longo do eixo. Portanto, se o valor for maior que 1023, subtraia 2048 dele para obter um valor negativo, que indica a outra direção do eixo.
Para uma resolução de 11 bits para a faixa de +/- 4g, o valor da aceleração na unidade de gravidade pode ser derivado multiplicando esse valor por 3,9 mg (0,0039).
Se a resolução selecionada for de 12 bits para a faixa de +/- 8g e os valores de aceleração estiverem ajustados corretamente, os valores de aceleração de 12 bits podem ser obtidos mascarando o segundo byte (lido de 0x33 para o eixo x, 0x35 para o eixo y e 0x37 para o eixo z) – com 0x0F, deslocando-o para a direita oito vezes e combinando os dois bytes (0x32 e 0x33; 0x34 e 0x35; 0x36; e 0x37) para um número inteiro de 16 bits.
Se a resolução selecionada for de 12 bits para a faixa +/- 8g e os valores de aceleração forem ajustados para a esquerda, os valores de aceleração de 12 bits podem ser obtidos deslocando o primeiro byte para a direita (lido de 0x32 para o eixo x, 0x34 para o eixo y e 0x36 para o eixo z) quatro vezes, mascarando o segundo byte (lido de 0x33 para o eixo x, 0x35 para o eixo y e 0x37 para o eixo z) com 0x0F para um byte temporário. Em seguida, desloque o byte temporário para a esquerda quatro vezes, adicione um byte temporário ao primeiro byte, desloque o segundo byte para a esquerda quatro vezes e combine os dois bytes (0x32 e 0x33; 0x34 e 0x35; 0x36; e 0x37) para obter um 16- bit inteiro.
Este valor de 12 bits irá variar de 0 a 4096. A aceleração é medida em ambas as direções ao longo do eixo. Portanto, se o valor for maior que 2.047, subtraia 4.096 dele para obter um valor negativo, que indica a outra direção do eixo.
Para a resolução de 12 bits para a faixa de +/- 8g, o valor da aceleração na unidade de gravidade pode ser derivado multiplicando esse valor por 3,9 mg (0,0039).
Se a resolução selecionada for de 13 bits para a faixa +/- 16g e os valores de aceleração estiverem ajustados corretamente, os valores de aceleração de 13 bits podem ser obtidos mascarando o segundo byte (lido de 0x33 para o eixo x, 0x35 para o eixo y e 0x37 para o eixo z) – com 0x1F, deslocando-o para a direita oito vezes e combinando os dois bytes (0x32 e 0x33; 0x34 e 0x35; 0x36; e 0x37) para um número inteiro de 16 bits.
Se a resolução selecionada for de 13 bits para a faixa +/- 16g e os valores de aceleração forem ajustados para a esquerda, os valores de aceleração de 13 bits podem ser obtidos deslocando o primeiro byte para a direita (lido de 0x32 para o eixo x, 0x34 para o eixo y e 0x36 para o eixo z) três vezes, mascarando o segundo byte (lido de 0x33 para o eixo x, 0x35 para o eixo y e 0x37 para o eixo z) – com 0x03 para um byte temporário, desloque o byte temporário para a esquerda cinco vezes, adicione um byte temporário ao primeiro byte, desloque o segundo byte para a esquerda três vezes e combine os dois bytes (0x32 e 0x33; 0x34 e 0x35; 0x36; e 0x37) para um Inteiro de 16 bits.
Este valor de 13 bits irá variar de 0 a 8192. A aceleração é medida em ambas as direções ao longo de um eixo. Portanto, se o valor for maior que 4.095, subtraia 8.192 dele para obter um valor negativo, que indica a outra direção do eixo.
Para a resolução de 12 bits para a faixa de +/- 16g, o valor da aceleração na unidade de gravidade pode ser derivado multiplicando esse valor por 3,9 mg (0,0039).
Detectando inclinação do ADXL345
O valor da aceleração obtido nas unidades de gravidade pode variar de +2 g a -2g, ou +4g a -4g, ou +8g a -8g, ou +16g a -16g — dependendo da faixa de medição selecionada.
O valor da aceleração inclui tanto a aceleração estática devido à gravidade quanto a aceleração dinâmica devido ao movimento ou choque.
Esta imagem mostra os valores de aceleração em unidades de gravidade devido à gravidade:
A inclinação do sensor pode ser detectada pelo sinal e valor da aceleração nos eixos x, y e z. Quando apenas a aceleração estática estiver atuando no sensor ADXL345, o valor da aceleração ao longo de um determinado eixo será de aproximadamente +1g ou -1g.
Ao examinar o sinal e o valor da aceleração em todos os eixos, a orientação exata do sensor ADXL345 em um quadro de três eixos pode ser determinada. Como a orientação do sensor é expressa (como o grau tangente em relação aos planos axiais) e como a orientação é usada para alguma aplicação de controle eletrônico (como para apontar o dispositivo ou controlar o movimento tridimensional de um sistema) depende do programa do usuário.
Configurando o ADXL345 para +/- 2g, resolução de 10 bits e aceleração de leitura usando Arduino
O esboço do Arduino a seguir configura o sensor ADXL345 para uma faixa de medição de +/- 2g e usa uma resolução de 10 bits. O script lê os dados de aceleração de cada um dos eixos e os converte em unidades de gravidade.
Os valores de aceleração nos eixos x, y e z são de 10 bits e justificados à direita. Conseqüentemente, os valores são derivados de registradores de 16 bits. Na resolução de 10 bits, o valor da aceleração na unidade de gravidade é obtido multiplicando por 4 mg, ou seja, multiplicando por 0,004.
Resultados
O valor da aceleração ao longo de diferentes eixos em relação às diferentes orientações do sensor ADXL345 pode ser observado neste vídeo:
No próximo tutorial, aprenderemos como usar a interface SPI no Arduino.
(tagsParaTraduzir)Arduino