Projet microcontrôleur #28: Capteur de toucher avec Arduino et ADS1115

Capteur de toucher avec Arduino et ADS1115

Objectifs

  • Savoir les caractéristiques techniques du convertisseur ADC ADS1115
  • Savoir configurer le gain et la fréquence d’échantillonne du convertisseur ADS1115
  • Savoir programmer le convertisseur avec Arduino
  • Savoir utiliser le convertisseur comme capteur de touché
  • Etc.

Vidéos démonstration

Les caractéristiques techniques du convertisseur A/N ADS1115

Capteur de toucher avec Arduino

Les composants ADS1113, ADS1114 et ADS1115 (ADS111x) sont des convertisseurs analogique-numérique (CAN) ou (ADC) d’une résolution de 16 bits d’une grande précision, compatibles avec l’interface I2C. Le convertisseur intègre une référence de tension à faible dérive et un oscillateur. Le ADS1114 et ADS1115 également intègrent un amplificateur à gain programmable (PGA) et un comparateur numérique. Ces deux fonctionnalités d’un large domaine d’application rendent l’ADS111x bien adapté aux applications des capteurs à contraintes de puissance e et de l’encombrement.

L’ADS111x effectué des conversions avec des débits de données supérieurs à 860 échantillons par seconde (SPS). La tension à l’entrée du PGA variée de ± 256 mV à ± 6.144 V, ce qui permet la mesure des signaux de grandes ou petites amplitudes. L’ADS1115 est doté aussi d’un multiplexeur à l’entrée (MUX) qui permet d’avoir 2 entrées différentielles ou 4 en mode single.  Ci-dessous les caractéristiques techniques du composant et son datasheet.

ADS1115 PINOUT

  • Package: X2QFN: 2 mm × 1,5 mm × 0,4 mm
  • Résolution binaire: 16 bits
  • Amplificateur à gain programmable intégré PGA (8 gains)
  • Tension d’alimentation: 2,0 V à 5,5 V
  • Courant nominal: 150 μA (Mode de conversion continue)
  • Débit de données programmable: 8 SPS à 860 SPS
  • Règlement à cycle unique
  • Référence de tension interne à faible dérive
  • Oscillateur interne
  • Interface I2C: adresses sélectionnables à quatre broches
  • Quatre entrées asymétriques ou deux entrées différentielles (ADS1115)
  • Comparateur programmable (ADS1114 et ADS1115)
  • Température de fonctionnement: –40 ° C à + 125 ° C
  • Autres: Voir le datasheet

Amplificateur à gain programmable (PGA)

Le circuit dispos de trois bits de contrôles dédiés à la configuration du gain de l’amplificateur en aval du convertisseur A/N interne du circuit. Le PGA permet d’augmenter la précision de la mesure. En effet grâce à l’utilisation du PGA, le convertisseur peut mesurer des tensions de l’ordre de 7.8125 μV (Fort gain). Ci-dessous le tableau récapitulatif de la précision et la dynamique de mesure en fonction de l’état des bits.

GAIN Vs Dynamique de la mesure:

  • 000 : FSR = ±6.144 V(1)
  • 001 : FSR = ±4.096 V(1)
  • 010 : FSR = ±2.048 V (default)
  • 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

Dynamique Vs Précision

PGA dynamique précision

Fonctionnement

Nous constatons pour un fort gain que le convertisseur peut mesurer une tension de l’ordre de 7.8µC qui n’est pas faisable pour les convertisseurs A/N de l’Arduino (Résolution 10 bits, précision d’environ 50mV). En effet grâce à l’ADS1115 on peut détecter des tensions de très faibles valeurs qui peuvent être manifestées lorsqu’un utilisateur touche une entrée analogique. Après des tests, nous constatons que la tension de l’entrée effectivement augmente lorsqu’on touche l’entrée. La variation est de l’ordre de 70-110mV lorsqu’on branche une résistance entre  l’entrée analogique (A0) et la masse, mais d’une valeur stable. La valeur mesurée est en revanche importante lorsque l’entrée est en air, par contre la valeur est fluctuante. Ci-dessous les deux configurations:

Entrée connectée - ADS1115 Entrée connectée - ADS1115.jpg

Programmation Arduino

Librairies Arduino

Programme principal commenté

#include <I2Cdev.h>


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

-----------------------------------------------
Branchement Arduino-ADS1115:
----------------------------------------------- 
ADS1115 -->  UNO
  VDD        5V
  GND        GND
  SCL        A5 (or SCL)
  SDA        A4 (or SDA)
  ALRT       2
  
-----------------------------------------------
Paramètres du Gain: 
-----------------------------------------------
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

-----------------------------------------------
Paramètres de la fréquence de mesure: 
-----------------------------------------------
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);

// Paramètres 
const int alertReadyPin = 2;
const int AlarmePin=3; 
double ADC_mV=0.0; 
double Seuil_Alarme_mV=50.0; 

void setup() {    
    //Connexion du bus I2C
    Wire.begin();

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

    // Test de la connectivité
    Serial.println("Testing device connections...");
    Serial.println(adc0.testConnection() ? "ADS1115 connexion réussie" : "ADS1115 connexion non établie");

    // Initiation du convertisseur ADS1115
    adc0.initialize(); 

    // Mode: Lecture unique (Il existe le mode continu!)
    adc0.setMode(ADS1115_MODE_SINGLESHOT);
    
    // Affectation de la fréquence d'échantillonnage (16SPS) 
    adc0.setRate(ADS1115_RATE_16);
      
    // Affectation du Gain
    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);

    // Lancement de la conversion 
    adc0.triggerConversion();

    // Test la fin de la conversion 
    pollAlertReadyPin();

    // Lecture du convertisseur en mV
    ADC_mV=abs(adc0.getMilliVolts(false));

    // Affichage de la valeur acquise 
    Serial.print("A0: "); Serial.print(ADC_mV); Serial.println("mV");

    // Déclanchement de l'alarme 
    if (ADC_mV > Seuil_Alarme_mV)
    {
      digitalWrite(AlarmePin, HIGH);
    }
    else
    {
      digitalWrite(AlarmePin, LOW);
    }

    // Attente (Attention à la fréquence de la mesure!)  
    delay(250);
}

// Fonction affichage de l'état de conversion après 100000 tentatives
void pollAlertReadyPin() 
{
  for (uint32_t i = 0; i<100000; i++)
    if (!digitalRead(alertReadyPin)) return;
   Serial.println("Failed to wait for AlertReadyPin, it's stuck high!");
}

Photo du projet

lecture du convertisseur

projet capteur de toucher avec arduino nano

projet capteur de toucher avec arduino nano

Téléchargement du projet

Tout les projets microcontrôleur

 

 

Articles

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Anti-Robot *