Capteur de poussières et Micropython (Partie 1)

L’un de mes projets est de réaliser des sondes connectées pouvant intégrer différents types de capteurs. L’objectif est de relever des grandeurs climatiques, domotiques ou environnementales. La mise à disposition des informations se fera soit directement avec un serveur web accessible sur la sonde, soit en les enregistrant dans un système de type EMONCMS.

Dans le cas présent, je m’intéresse à l’empoussièrement de l’air.

Le capteur

N’ayant aucun apriori sur les différents produits, j’ai retenu une solution économique avec le capteur SHARP  GP2Y1010AU0F qui se trouve facilement dans bon nombre de boutique en ligne.

sharpdust-capteur-1-wp

Le principe

C’est assez simple, on éclaire avec une led infra-rouge une chambre dans laquelle circule l’air ambiant et on mesure la lumière réfléchie par les particules de poussière en suspension. Donc plus, il y a de poussière dans la chambre plus il y a de lumière réfléchie donc plus le signal en sortie et important.

sharpdust-principe-1

Dans notre cas, la valeur retournée sera une tension comprise entre  0 V et 3.4 V. Cette tension sera une fonction linéaire de la densité massique de poussière dans l’air.

sharpdust-reponse-1

La mise en œuvre

Le principe du circuit

Le schéma ci-dessous décrit le câblage entre le capteur et le microcontrôleur.

sharpdust-connection-1

Le nodeMCU à une tension de fonctionnement de 3,3 V, son entrée analogique sature à partir de 3.1 V et le 5 V de l’USB est accessible sur l’une des broches.

Le circuit

La tension d’entré sur l’ADC :

Nous avons vu dans cet article que l’entrée de l’adc est pourvu d’un pont diviseur de tension.

esp-8266-voltagedivider

La relation entre la tension entrée ADC_Ex et la tension de sortie ADC est donnée par l’expression ci-dessous :

Vadc = R11 / (R9 +R11) Vadc_ex

La valeur max de Vadc et 1 V, la tension max Vadc_ex est

Vadc_ex = 1 * (220k + 100k) / 100k = 3.2 V

Cette valeur est inférieure à la tension de sortie max de notre capteur. Il faut donc faire quelque chose, par exemple augmenter la valeur de R9 pour augmenter la chute de potentiel à ses bornes.

Sa valeur est donné par

R9 = (Vadc_ex / Vadc – 1) R11

Nous avons Vadc_ex  = 3.4 V, Vadc = 1 V et R11 = 100 k, ce qui donne finalement

R9 = ( 3.4 / 1 -1)  100k  = 240 k

Un peut donc facilement modifier le pont diviseur original en intercalant une résistance de 22k en série avec celle de 220k existante.

Le courant de contrôle de la led :

La datasheet indique que ce courant iLed (broche 3) doit être compris entre 10 mA et 20 mA. Les documents du fabricant montre un bipolaire avec une résistance de polarisation pour la création de ce courant. Nous allons suivre cette recommandation et j’ai dans mes cartons quelques BC337 (B = 290).

Déterminons la valeur de la résistance de polarisation associée à ce transistor pour obtenir un tel courant. Pour cela, exprimons les courants circulant dans le transistor :

  • Le courant de collecteur (ic) en fonction du courant de base (ib) :

ic = B ib

  • Le courant de base en fonction de la tension de de sortie Vs du nodeMCU :

Vs = Rb  ib

Cela nous donne  ic = B  Vs / Rb soit pour Rb :

Rb = ( B * Vs ) / ic

Avec ic = 15mA Vs = 3.3 V et B = 290;

Rb = 63800 Ohms

Cette valeur n’existe pas dans les séries de résistances, ce sera donc une résistance de 68k

Et voila le schéma final :

sharpdust-connection-2

Le code

Le code va être assez simple. Il faut générer un créneau de 320ms et faire un mesure sur l’adc à 280 ms avec une période de 10ms.

sharpdust-pulsecycle-1

Ce cycle peut s’écrire de la façon suivante en micropython :

from machine import Pin, ADC
import time

p0 = Pin(0, Pin.OUT)
adc = ADC(0)

def measure():
p0.high()                          # début du créneau
time.sleep_us(280)        # les 0.28 ms
readvalue = adc.read()    # lecture de l’adc
time.sleep_us(40)           # complément du créneau à 0.32 ms
p0.low()                             # fin du créneau
time.sleep_us(9680)       # complément du cycle à 10 ms
return readvalue

print(‘début’)
for i in range(10000): # on fait 10000 mesures
print(measure())
print(‘fin’)

#Cablage du capteur
# ADC : A0
# ILED : D3 / GIPO00

Le circuit sur plaque d’essais

Et voila, une vue générale de l’implantation des composants sur la plaque d’essai :

sharpdust-circuittop-1-wp

Une vue détaillée du câblage des composants :

sharpdust-circuitside-bipolaire-1-wp

A l’arrière plan, il est possible de distinguer la résistance de 22k en série avec l’entrée de l’ADC.

Conclusions

La réalisation du circuit peut-être un peu confuse, il est préférable de suivre le schéma fournis dans la note d’application qui celui fourni dans la datasheet.

Dans certains circuits à base d’arduino le bipolaire de commande de led est omis, dans notre cas cela rend le circuit non fonctionnel. Les caractéristiques de contrôle de courant ne sont pas les mêmes pour les deux microcontrôleurs.

Il faut aussi faire attention au compatibilité de tension sur les entrées/sortie des différents éléments du circuit, mais il n’y a rien de vraiment compliqué.

Maintenant, il reste à faire des test et voir ce qu’il faut ajuster pour avoir des choses qui veulent à peu prés significative.

Références

http://www.sharp-world.com/products/device/lineup/data/pdf/datasheet/gp2y1010au_e.pdf

http://www.sharp-world.com/products/device/lineup/data/pdf/datasheet/gp2y1010au_appl_e.pdf

https://hackaday.io/project/4977-portable-environmental-monitor/log/21910-the-dust-sensor

http://www.howmuchsnow.com/arduino/airquality/

http://arduinodev.woofex.net/2012/12/01/standalone-sharp-dust-sensor/

Publicités

1 réflexion sur « Capteur de poussières et Micropython (Partie 1) »

  1. Hi, sorry this comment is in English. I can just about read French, but I can’t write anything that will make sense.

    1- This is the first time I’ve seen anyone use a transistor to switch the LED output for this sensor. Everyone else just pulls the digital output low, which seems to work – at least with Arduinos.
    2- If adc.read() works the same as AnalogRead on an Arduino then the ADC conversion will take time, which will make you pulse width timings wrong.

    What sort of voltage readings are you getting from this?

    J'aime

Laisser un 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 )

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 )

Photo Google+

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

Connexion à %s