Projeto de microcontrolador: sensor de toque com Arduino e ADS1115

Tempo de leitura: 5 minutes

Metas

  • Conheça as características técnicas do conversor ADC ADS1115
  • Saiba como configurar o ganho e a frequência de amostra do conversor ADS1115
  • Saiba como programar o conversor com Arduino
  • Saiba como usar o conversor como sensor de toque
  • Etc.

 

As características técnicas do conversor ADS1115 A/D

Os componentes ADS1113, ADS1114 e ADS1115 (ADS111x) são conversores analógico-digital (ADC) ou (ADC) de alta precisão com resolução de 16 bits compatíveis com a interface I2C. O conversor incorpora uma referência de baixa tensão de desvio e um oscilador. O ADS1114 e o ADS1115 também incorporam um amplificador de ganho programável (PGA) e um comparador digital. Esses dois amplos recursos de aplicação tornam o ADS111x bem adequado para aplicações de sensores com restrições de energia e espaço.

O ADS111x realiza conversões com taxas de dados superiores a 860 amostras por segundo (SPS). A tensão na entrada do PGA variou de ± 256 mV a ± 6,144 V, o que permite a medição de sinais de grandes ou pequenas amplitudes. O ADS1115 também está equipado com um multiplexador de entrada (MUX) que permite ter 2 entradas diferenciais ou 4 em modo simples. Abaixo estão as características técnicas do componente em seu DataSheet.

  • Pacote: X2QFN: 2 mm × 1,5 mm × 0,4 mm
  • Resolução binária: 16 bits
  • Amplificador de ganho programável integrado PGA (8 ganhos)
  • Tensão de alimentação: 2,0 V a 5,5 V
  • Corrente nominal: 150 μA (modo de conversão contínua)
  • Taxa de dados programável: 8 SPS a 860 SPS
  • Liquidação de ciclo único
  • Referência de baixa tensão interna
  • Oscilador interno
  • Interface I2C: endereços selecionáveis ​​de quatro pinos
  • Quatro entradas não balanceadas ou duas entradas diferenciais (ADS1115)
  • Comparador programável (ADS1114 e ADS1115)
  • Temperatura de operação: –40 ° C a + 125 ° C
  • Outros: Veja o datasheet

 

Amplificador de ganho programável (PGA)

O circuito tem três bits de controle dedicados a configurar o ganho do amplificador a jusante do conversor A / D interno do circuito. O PGA permite aumentar a precisão da medição. Na verdade, graças ao uso do PGA, o conversor pode medir tensões da ordem de 7,8125 μV (alto ganho). Abaixo está a tabela de resumo da precisão e dinâmica da medição de acordo com o estado dos bits.

 

GANHO Vs Dinâmico da medição:

  • 000: FSR = ±6,144 V(1)
  • 001: FSR = ±4,096 V(1)
  • 010: FSR = ±2,048 V(padrão)
  • 011: FSR = ±1,024 V
  • 100: FSR = ±0,512 V
  • 101: FSR = ±0,256 V
  • 110: FSR = ±0,256 V
  • 111: FSR = ±0,256 V

Precisão Vs Dinâmica

 

Operação

Notamos para um alto ganho que o conversor pode medir uma tensão da ordem de 7,8µC, o que não é viável para os conversores A/D do Arduino (resolução de 10 bits, precisão de cerca de 50mV). De fato, graças ao ADS1115, é possível detectar tensões de valores muito baixos que podem ser manifestados quando um usuário toca uma entrada analógica. Após o teste, descobrimos que a tensão de entrada realmente aumenta ao tocar a entrada. A variação é da ordem de 70-110mV ao conectar um resistor entre a entrada analógica (A0) e o terra, mas de valor estável. Por outro lado, o valor medido é importante quando a entrada está no ar, por outro lado, o valor flutua. Abaixo estão as duas configurações:

Programação Arduino

Bibliotecas Arduino

 

Programa principal comentado

#include <I2Cdev.h>

/*
-----------------------------------------------
Bibliotecas Arduino
-----------------------------------------------
I2C: https://github.com/jrowberg/i2cdevlib
ADS1115: https://github.com/addicore/ADS1115

-----------------------------------------------
Conexão Arduino-ADS1115:
----------------------------------------------- 
ADS1115 -->  UNO
  VDD        5V
  GND        GND
  SCL        A5 (or SCL)
  SDA        A4 (or SDA)
  ALRT       2
  
-----------------------------------------------
Parâmetros de ganho:
-----------------------------------------------
ADS1115_PGA_6P144           0x00
ADS1115_PGA_4P096           0x01
ADS1115_PGA_2P048           0x02 // default
ADS1115_PGA_1P024           0x03
ADS1115_PGA_0P512           0x04
ADS1115_PGA_0P256           0x05
ADS1115_PGA_0P256B          0x06

0 : FSR = ±6.144 V(1)
1 : FSR = ±4.096 V(1)
2 : FSR = ±2.048 V (default)
3 : FSR = ±1.024 V
4 : FSR = ±0.512 V
5 : FSR = ±0.256 V
6 : FSR = ±0.256 V
7 : FSR = ±0.256 V

-----------------------------------------------
Parâmetros da frequência de medição:
-----------------------------------------------
ADS1115_RATE_8              0x00
ADS1115_RATE_16             0x01
ADS1115_RATE_32             0x02
ADS1115_RATE_64             0x03
ADS1115_RATE_128            0x04 // default
ADS1115_RATE_250            0x05
ADS1115_RATE_475            0x06
ADS1115_RATE_860            0x07

*/

#include "ADS1115.h"

ADS1115 adc0(ADS1115_DEFAULT_ADDRESS);

// Configurações
const int alertReadyPin = 2;
const int AlarmePin=3; 
double ADC_mV=0.0; 
double Seuil_Alarme_mV=50.0; 

void setup() {    
   // Conexão do barramento I2C
    Wire.begin();

    // Init interface série 
    Serial.begin(115200); 

    // Teste de conectividade
    Serial.println("Testando conexões do dispositivo ...");
    Serial.println(adc0.testConnection() ? "ADS1115 conexão bem-sucedida" : "Conexão ADS1115 não estabelecida");

    // Iniciação do conversor ADS1115
    adc0.initialize(); 

    // Modo: leitura única (há modo contínuo!)
    adc0.setMode(ADS1115_MODE_SINGLESHOT);
    
    // Alocação da frequência de amostragem (16SPS)
    adc0.setRate(ADS1115_RATE_16);
      
    // Ganhar alocação
    adc0.setGain(ADS1115_PGA_0P512);

    // Connexion de l'indicateur de fin de conversion 
    pinMode(alertReadyPin,INPUT);
    adc0.setConversionReadyPinMode();

    // Alarme 
    pinMode(AlarmePin,OUTPUT);
}

void loop() 
{       
    // Sélection de l'entrée (A0)
    adc0.setMultiplexer(ADS1115_MUX_P0_NG);

    // Comece a conversão
    adc0.triggerConversion();

    // Teste o final da conversão
    pollAlertReadyPin();

    // Leia o conversor em mV
    ADC_mV=abs(adc0.getMilliVolts(false));

    // Mostra o valor adquirido
    Serial.print("A0: "); Serial.print(ADC_mV); Serial.println("mV");

    // Aciona o alarme
    if (ADC_mV > Seuil_Alarme_mV)
    {
      digitalWrite(AlarmePin, HIGH);
    }
    else
    {
      digitalWrite(AlarmePin, LOW);
    }

    // Aguarde (preste atenção à frequência da medição!)
    delay(250);
}

// Função de exibição do status de conversão após 100.000 tentativas
void pollAlertReadyPin() 
{
  for (uint32_t i = 0; i<100000; i++)
    if (!digitalRead(alertReadyPin)) return;
   Serial.println("Falha ao esperar por AlertReadyPin, ele está preso no alto!");
}

 

Foto do projeto

Fotos (Originais em Francês)

 

Conclusão

Neste artigo, mostrei como usar um ADS1115 com o Arduino Nano. Espero que você tenha achado útil e informativo. Se sim, compartilhe com um amigo que também gosta de eletrônica e de fazer coisas!

Eu adoraria saber quais projetos você planeja construir (ou já construiu) com esse ADS11115. Se você tiver alguma dúvida, sugestão ou se achar que falta algo neste tutorial, por favor, deixe um comentário abaixo.