jeudi 17 janvier 2019

PCF8591 et ESP8266 (ou Arduino)

Le circuit intégré PCF8591 combine un convertisseur analogique-numérique à 4 canaux, ainsi qu'un convertisseur numérique-analogique (1 canal). Il peut donc servir à ajouter 4 entrées analogiques et une sortie analogique au microcontrôleur de votre choix.

Le présent billet vous guidera dans l'utilisation d'un module PCF8591, que ce soit avec une carte Arduino ou un ESP8266. À mon avis, le PCF8591 vous sera surtout utile avec un ESP8266 (qui, dans le meilleur des cas, ne comporte qu'une seule entrée analogique limitée à une tension maximale de 1 V).

Pour mes tests, j'ai utilisé un module acheté sur eBay: en plus de comporter un circuit intégré PCF8591, le module est également muni d'un petit potentiomètre, d'une photorésistance et d'une thermistance, qui peuvent être utilisés ou non, selon nos besoins.


Les 4 connecteurs situés du côté gauche du module (SDA, SCL, VCC et GND) servent à l'alimentation du module et la communication i2c avec le microcontrôleur.

Du côté droit, AOUT est la sortie analogique, qui peut prendre n'importe quelle valeur située entre 0 et 5 V (si le module est alimenté avec 5 V) ou entre 0 et 3,3 V (si le module est alimenté avec 3,3 V).  AIN0, AIN1, AIN2 et AIN3 sont les 4 entrées analogiques, qui nous permettent de mesurer la valeur d'une tension se situant entre 0 et 5 V (le le module est alimenté avec 5 V) ou entre 0 et 3,3 V (si le module est alimenté avec 3,3 V).

Le potentiomètre est relié avec la broche INPUT0, la photorésistance est reliée à la broche INPUT1, et la thermistance est reliée à la broche INPUT2.  Lorsque vous achetez le module, des jumpers acheminent le signal du potentiomètre à l'entrée AIN0, le signal de la photorésistance à l'entrée AIN1 et le signal de  la thermistance à l'entrée AIN2, mais vous pouvez évidemment retirer ces jumpers et brancher des capteurs analogiques de votre choix aux entrées AIN0, AIN1, AIN2 et AIN3.

Connexions

On branche le module PCF8591 à une carte Arduino Uno de la façon suivante:

Module PCF8591    ---    Arduino Uno
   SDA  ----------------------  A4
   SCL  ----------------------  A5
   VCC  ---------------------  5 V
   GND  --------------------  GND



Pour brancher le module PCF8591 à un ESP8266, les connexions seront plutôt:

Module PCF8591    ---    Module ESP826
   SDA  ----------------------  GPIO4
   SCL  ----------------------  GPIO5
  VCC  -----------------------  3,3 V
  GND  ----------------------  GND






Installation de la bibliothèque PCF8591

Plutôt que d'étudier la fiche technique du PCF8591, j'ai installé la bibliothèque PCF8591 conçue par xreef. Comme vous pourrez le constater dans les deux sketches ci-dessous, cette bibliothèque rend la programmation très facile.

Sketch pour lire une entrée analogique

La valeur de n'importe quelle des 4 entrées analogiques sera mesurée grâce à la fonction analogRead(). Attention: le PCF8591 est un convertisseur 8 bits, et la valeur obtenue varie donc entre 0 et 254. Par comparaison, les entrées A0 à A5 de l'Arduino sont à 10 bits, pour une résolution 4 fois plus grande (0 à 1023).

Le sketch ci-dessous affiche dans le moniteur série la valeur mesurée à l'entrée AIN0. Si le jumper est en place sur le module, vous pouvez tester le sketch en tournant le potentiomètre du module au moyen d'un tournevis: la valeur affichée dans le moniteur série variera entre 0 et 255 selon la position du potentiomètre.  Pour lire les 3 autres entrées, il s'agit évidemment de remplacer AIN0 par AIN1, AIN2 ou AIN3.





Sketch pour contrôler la sortie analogique

Le sketch ci-dessous contrôle la tension de la sortie AOUT du module, au moyen de la fonction analogWrite(). Si le module est alimenté avec une tension de 5 V, la tension de AOUT devrait être nulle si vous écrivez "analogWrite(0)" , 5 volts si vous écrivez "analogWrite(255)", et une valeur se situant entre 0 et 5 V pour un argument se situant enter 0 et 255.  Toutefois, sur mon module, "analogWrite(255)" ne donne qu'une tension de sortie de 4,13 V, soit à peu près la même valeur que si j'écris "analogWrite(210)"! J'ignore s'il s'agit d'un défaut exclusif au module que j'ai utilisé, où s'il s'agit d'un problème plus généralisé.

Pour cette raison, le sketch ci-dessous se limite à une valeur maximale de 200 comme argument de la fonction analogWrite(). Il permet de faire varier la tension de sortie de façon sinusoïdale (ou en dents de scie si vous utilisez plutôt la ligne qui a été commentée).

Voici le résultat affiché à l'écran d'un oscilloscope branché à la sortie AOUT:









Yves Pelletier   (TwitterFacebook)

1 commentaire:

  1. Bonjour

    Je suis tombé sur votre post et je voudrai utiliser ce circuit intégré pour une application.
    Mais j'aurai besoin d'un peu plus d'informations avant d'en faire l'acquisition afin de savoir s'il est compatible avec l'usage que je pourrai en faire.
    Seriez-vous prêt à répondre à quelques questions que je me pose.
    Je suis un novice dans le domaine de l'Arduino et suis plutôt un bricoleur averti qui essaye de détourner des applications afin de servir à mon projet. Avant de vous l'exposer, je voulais être sûr de pouvoir obtenir une réponse.
    Cordialement
    Papybricolo

    RépondreSupprimer