Luminosité et Orange Pi Zéro

Capteur de Luminosité analogique

Le LM393 acheté chez AliExpress, est un capteur de luminosité connectable à des nano ordinateurs comme les Orange PI. Il dispose d’une sortie numérique fournissant un 0 ou un 1 suivant la luminosité et le seuil réglable par une résistance variable. Ici nous nous intéresserons à la sortie analogique qui fournit une tension entre 0 et 3.3v (pour une alimentation en 3.3v) suivant le niveau de luminosité. En forte lumière on est près de 0v, en faible lumière près de 3.3v.

La difficulté avec les Orange Pi comme d’autres nano ordinateurs, il ne dispose pas d’une entrée analogique pour mesurer une tension mais uniquement d’entrées numériques. Nous allons convertir la mesure de tension analogique en mesure de temps de charge d’un condensateur en partant de 0v jusqu’au passage à 1 de l’entrée numérique.

Raccordement

Raccordez le LM393 au +3.3v de l’orange pi zéro et par exemple l’ensemble resistance, capacité sur la pin 19 ou PA15 comme indiqué sur le schéma.

Sur ce schéma il manque la résistance de pull up à l’entrée 19 (PA15) de l’orange pi de quelques dizaines de kΩ . Elle fait un pont avec la 200kΩ qui même si A0 est à 0V, le niveau à l’entrée est vu comme un 1.

Dans un premier temps, la broche 19 (PA15) est mise à zéro durant 200ms pour vider le condensateur de 1µF. Puis la broche 19 (PA15) passe en entrée, le condensateur se charge avec la résistance de pull up et la résistance de 200kΩ qui est connecté à la sortie A0 du capteur de luminosité. En mesurant le temps T de chargement en ms, on a une valeur représentant le niveau d’éclairement.

Code

Pour l’installation du système Armbian, voir l’article suivant: https://f1atb.fr/index.php/fr/2020/03/27/mise-en-route-orange-pi-zero/

En premier pour python 3, il faut mettre à jour et rajouter l’installateur pip. Puis rajouter la bibliothèque d’accès au GPIO OrangeOi.GPIO.

apt-get update
apt-get upgrade
apt install python3-pip
pip3 install  OrangePi.GPIO

Cette bibliothèque, OrangePi.GPIO, est décrite ici https://pypi.org/project/OrangePi.GPIO/
Elle est issue de la bibliothèque adaptée au Raspberry Pi et bien documentée
https://opi-gpio.readthedocs.io/en/latest/api-documentation.html

En cas d’erreur d’installation quelques bibliothèques complémentaires peuvent être nécessaires.

apt install python3-dev
pip3 install setuptools
 ou
apt install python-dev
pip install setuptools

En accès root, créez le source test.py avec nano.

nano test.py
import time
import math
import OPi.GPIO as GPIO

GPIO.setboard(GPIO.ZERO)
GPIO.setmode(GPIO.BOARD)  #refer as pin number
GPIO.setwarnings(False)

anal_in_out = 19 # pin 19 or PA15


Offset=70

while True:
    GPIO.setup(anal_in_out, GPIO.OUT)
    GPIO.output(anal_in_out, 0)      
    time.sleep(0.2)
    GPIO.setup(anal_in_out, GPIO.IN,pull_up_down = GPIO.PUD_UP )
    T0=time.time() * 1000                  # temps en ms
    T=T0
    Tmonte=0
    
    while T-T0<400:                        # Timeout
        state = GPIO.input(anal_in_out)
        T=time.time() * 1000
        if state==1:
            Tmonte=T-T0
            T=T0+400
    
    
    Lumi=math.floor(Tmonte-Offset)  
    print ("Lumi",Lumi)
    
    time.sleep(1)

Testez l’ensemble avec:

python3 test.py

Remarques

  • Pour décharger le condensateur, on peut réduire le temps à 10ms, cela suffit.
  • L’offset permet de caler le zéro de la réponse quand 3.3v sont en entrée. Quand la tension baisse, les durées augmentent mais d’une façon non linéaire. Cela ne constitue pas un convertisseur analogique digital de précision mais donne dejà une bonne idée.
  • Avec un pont de résistances en entrée, on peut s’adapter à une plus grande dynamique de tensions. Mais attention à ne jamais dépasser 3.3v pour ne pas endommager l’Orange Pi.
  • Pour ne pas avoir une boucle d’attente du programme, on peut faire une détection de front montant.