Catégories
Projets Arduino

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

 

 

Laisser un commentaire