Accueil > ESP32, Matériel > Utilisation des ports de conversion analogique-numérique sur un ESP32 en MicroPython

Utilisation des ports de conversion analogique-numérique sur un ESP32 en MicroPython

Je viens de rencontrer un problème d’utilisation de conversion analogique vers numérique (ADC) avec un ESP32. Il y a quelques temps, j’avais testé l’utilisation de l’ADC sur un ESP8266 (celui-ci ne possédant qu’un seul port d’entrée analogique A0) sans rencontrer de problème avec l’utilisation d’un capteur de température LM35. Voici les liens de mes différents articles :

https://itechnofrance.wordpress.com/2018/02/05/capteur-de-temperature-lm35-et-afficheur-oled-ssd1306-en-micropython/

https://itechnofrance.wordpress.com/2018/01/14/nodemcu-capteur-de-temperature-lm35dz/

https://itechnofrance.wordpress.com/2018/01/14/nodemcu-entree-analogique-a0/

L’ESP32 possède 2 convertisseurs ADC, ADC1 (GPIO32 à GPIO39) et ADC2 fournissant chacun 8 ports d’entrée. ADC2 ne peut pas être utilisé si le Wifi est activé et n’est pas supporté actuellement avec MicroPython 1.10.

La configuration de l’ADC sur un ESP32 change par rapport à un ESP8266, on a la possibilité de définir l’atténuation du convertisseur qui va permettre de définir une plage de tension à convertir :

  • 0 dB (par défaut) pour une tension d’entrée de 0v à 1v sur un port.
  • 2.5 dB pour une tension d’entrée de 0v à 1.34v sur un port.
  • 6 dB pour une tension d’entrée de 0v à 2v sur un port.
  • 11 dB pour une tension d’entrée de 0v à 3.6v sur un port.

Ìl est également possible de définir la résolution en bits concernant la conversion :

  • 9 bits : plage de valeurs de 0 à 512.
  • 10 bits : plage de valeurs de 0 à 1024.
  • 11 bits : plage de valeurs de 0 à 2048.
  • 12 bits : plage de valeurs de 0 à 4096.

J’ai écrit un petit programme en MicroPython qui permet d’afficher la tension en entrée d’un port dont voici le contenu :

#
# Voltmetre
#
# Materiel :
#           Heltec Wifi Kit 32
#           Oled SSD1306 integre
#
# Auteur : iTechnoFrance
#

import machine, time, ssd1306

# Definition de l'entree analogique
input_pin = machine.Pin(35)  # GPIO35
# Creation d'une entree analogique
adc = machine.ADC(input_pin)
# Definition de l'attenuation a 11dB (tension de 0 a 3.6v en entree)
adc.atten(machine.ADC.ATTN_11DB)
# 3.6v maximum sur 12 bits (0 a 4095)
adc.width(machine.ADC.WIDTH_12BIT)

# Declaration I2C pour la gestion de l'afficheur OLED SSD1306
# GPIO15 --> SCL OLED, GPIO04 --> SDA OLED
i2c_oled = machine.I2C(scl=machine.Pin(15), sda=machine.Pin(4))
# Activation OLED
reset_oled = machine.Pin(16, machine.Pin.OUT)  # GPIO16 --> Reset OLED
reset_oled.value(0)  # reset OLED
time.sleep(0.050)  # attente 50 ms
reset_oled.value(1)  # active OLED
# Declaration OLED SSD1306
oled = ssd1306.SSD1306_I2C(128, 64, i2c_oled)  # 128 x 64 pixels

while True:
    # Effectue la mesure
    valeur = adc.read()
    # Calcul la tension en V et transforme le résultat en String
    tension = "%1.2f" % ((valeur / 4096) * 3.6)
    oled.fill(0)  # efface l'ecran
    oled.text("VOLTMETRE", 20, 0)
    oled.text(tension, 0, 20)
    oled.show()
    time.sleep(1)

Je teste l’entrée avec différentes tensions, tout fonctionne correctement avec une petite instabilité des mesures sur les dizaines de mV.

Je décide donc de tester la fonctionnalité ADC avec un capteur de température LM35.

Le capteur fournit une tension de 0 à 1V maximum pour 100°C; donc chaque degré correspond à 10mV. Après avoir branché le tout, la mesure de température est complétement erronée (pour une pièce à 20°C, il m’affiche 15°C).

En recherchant sur le net, je me suis aperçu qu’il y avait beaucoup de remontées négatives concernant l’utilisation ADC de l’ESP32.

En fait la conversion n’est pas tout à fait linéaire (surtout pour les basses et hautes tensions) comme le montre ce graphique :

Conclusion : pour vos projets d’utilisation de capteurs analogiques, oubliez les fonctionnalités de conversion analogique-numérique fournit par l’ESP32.

Plusieurs possibilités s’offrent à nous pour contourner ce problème :

  • Utiliser un ESP8266 mais il a un seul port ADC (A0).
  • Utiliser un Arduino.
  • Utiliser un convertisseur ADC externe par exemple un modèle ADS1115, dont nous verrons la mise en oeuvre dans un prochain article.

 

Catégories :ESP32, Matériel Étiquettes : ,
  1. Aucun commentaire pour l’instant.
  1. No trackbacks yet.

Votre commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l’aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google

Vous commentez à l’aide de votre compte Google. Déconnexion /  Changer )

Image Twitter

Vous commentez à l’aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l’aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s

%d blogueurs aiment cette page :