Différences entre versions de « MicroPython-Hack-LDR »

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche
(Contenu remplacé par « {{MicroPython-Hack-Prepare-NAV}} {{MicroPython-Hack-LDR-core}} {{MicroPython-Hack-MCH-TRAILER}} »)
 
(24 versions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
 
{{MicroPython-Hack-Prepare-NAV}}
 
{{MicroPython-Hack-Prepare-NAV}}
  
{{traduction}}
+
{{MicroPython-Hack-LDR-core}}
 
 
== Ce que nous faisons ==
 
'''.: Les photorésistances :.'''
 
 
 
{{bloc-etroit|text=Acquérir une valeur en provenance d'un potentiomètre peut être utile pour une expérience contrôlée par un humain.
 
Mais que pouvons nous utiliser pour une expérience contrôlée par l'environnement lui-même? Nous gardons exactement
 
les mêmes principes mais à la place du potentiomètre (résistance basée sur une torsion), nous utilisons une
 
photorésistance (résistance basée sur la lumière). PyBoard ne peut pas directement percevoir la résistance (il perçoit la
 
tension) donc nous utilisons un pont diviseur de tension pour créer une tension qui varie avec la résistance de la photo-résistance (résistance qui change avec l'intensité lumineuse).
 
 
 
La tension exacte sur la broche du senseur peut être calculée mais pour notre usage (juste percevoir la lumière relative), nous pouvons tester les valeurs et retenir celles qui nous conviennent.
 
 
 
Le senseur retourne une petite valeur lorsqu'il est bien éclairé et une grande valeur lorsqu'il est placé dans l'obscurité.
 
}}
 
 
 
=== Voir l'invite REPL ===
 
Une petite note complémentaire, ce montage affiche des information via connexion série disponible sur le port USB de la PyBoard.
 
 
 
Il sera nécessaire de maîtriser [[MicroPython-Hack-REPL|L'invite REPL]] pour voir le résultat de vos mesures de températures.
 
 
 
[[Fichier:MicroPython-Hack-REPL-Python-exemple.jpg]]
 
 
 
== Le montage ==
 
=== Le matériel nécessaire ===
 
{{ARDX-composant-begin}}
 
 
 
{{ARDX-composant
 
  |label=Photo-résistance
 
  |label2=x1
 
  |img=ARDX-PhotoResistance.png
 
  |pl=34
 
}}
 
 
 
{{ARDX-composant
 
  |label=Fils
 
  |label2=
 
  |img=ARDX-fils.png
 
  |pl=34
 
}}
 
 
 
{{ARDX-composant
 
  |label=Résistance de 100 Ohms (brun-noir-rbrun)
 
  |label2=x1
 
  |img=ARDX-R100.png
 
  |pl=43
 
}}
 
 
 
{{ARDX-composant
 
  |label=Résistance de 10K Ohms (brun-noir-orange)
 
  |label2=x1
 
  |img=ARDX-R10K.png
 
  |pl=43
 
}}
 
 
 
{{ARDX-composant
 
  |label=LED (ou DEL)
 
  |label2=x1
 
  |img=ARDX-LED-verte.png
 
  |pl=66
 
}}
 
 
 
{{ARDX-composant-end}}
 
Tous ces éléments sont disponibles sur [http://shop.mchobby.be shop.mchobby.be].
 
 
 
=== Schéma ===
 
[[Fichier:MicroPython-Hack-LDR-schema.png|250px]]
 
 
 
=== Montage ===
 
[[Fichier:MicroPython-Hack-LDR-montage.jpg|800px]]
 
 
 
== Le code ==
 
Explications
 
 
 
<nowiki>ldr = pyb.ADC( 'X19' )
 
while True:
 
    lecture = ldr.read()
 
    tension = (lecture * 3.3) / 4095
 
    print( 'valeur = %s, tension = %s volts' % (lecture, tension) )
 
    pyb.delay( 300 )</nowiki>
 
 
 
Code qui produit les résultats suivant:
 
 
 
<nowiki>valeur = 2728, tension = 2.198388 volts
 
valeur = 2750, tension = 2.216117 volts
 
valeur = 2762, tension = 2.225787 volts
 
valeur = 2807, tension = 2.262051 volts
 
valeur = 2795, tension = 2.252381 volts
 
valeur = 2814, tension = 2.267692 volts
 
valeur = 2799, tension = 2.255605 volts
 
valeur = 2754, tension = 2.219341 volts
 
valeur = 2287, tension = 1.843004 volts
 
valeur = 1886, tension = 1.519853 volts
 
valeur = 1919, tension = 1.546447 volts
 
valeur = 1905, tension = 1.535165 volts
 
valeur = 1910, tension = 1.539194 volts
 
valeur = 1887, tension = 1.520659 volts
 
valeur = 1815, tension = 1.462637 volts
 
valeur = 1225, tension = 0.9871795 volts
 
valeur = 680, tension = 0.5479854 volts
 
valeur = 751, tension = 0.6052015 volts
 
valeur = 819, tension = 0.6599999 volts
 
valeur = 1766, tension = 1.42315 volts
 
valeur = 1915, tension = 1.543223 volts
 
valeur = 1903, tension = 1.533553 volts
 
valeur = 1960, tension = 1.579487 volts
 
valeur = 1976, tension = 1.592381 volts
 
valeur = 1983, tension = 1.598022 volts
 
valeur = 1988, tension = 1.602051 volts
 
valeur = 1990, tension = 1.603663 volts
 
valeur = 1991, tension = 1.604469 volts
 
valeur = 1997, tension = 1.609304 volts</nowiki>
 
 
 
== Cela ne fonctionne pas? ==
 
Voici 3 choses à essayer.
 
=== La LED reste éteinte ===
 
C'est une erreur que nous continuons à faire de temps à autre, si seulement ils savaient faire des LEDs qui fonctionne dans les deux sens!
 
 
 
Sortez la et retournez la.
 
 
 
=== Ne réagit pas au changement de lumière ===
 
Il est facile de mal placer la photorésistance parce que l'écartement des broches n'est pas standard.
 
 
 
Vérifiez si elle est bien à la bonne place.
 
 
 
=== Ne fonctionne toujours pas? ===
 
Vous êtes peut-être dans une pièce trop lumineuse ou trop sombre.
 
 
 
Essayez d'allumer et éteindre la lumière pour voir si cela aide.
 
 
 
Si vous avez une lampe de poche, tentez votre chance avec elle.
 
 
 
== Faire encore mieux ==
 
{{traduction}}
 
 
 
=== Inverser la réponse ===
 
Vous voudriez peut-être une réponse inversée. Pas de problème nous pouvons facilement inverser cette réponse en changeant:
 
<nowiki>analogWrite(ledPin, lightLevel);</nowiki>
 
 
 
vers
 
 
 
<nowiki>analogWrite(ledPin, 255 - lightLevel);</nowiki>
 
 
 
Chargez le programme et notez la modification de la réponse.
 
 
 
=== La veilleuse ===
 
Plutôt que de contrôler la luminosité d'une LED en réponse à la lumière, essayons plutôt de l'allumer ou l'éteindre en fonction d'un seuil.
 
 
 
Changer le code de {{fname|loop()}} avec....
 
 
 
<nowiki>void loop(){
 
  int threshold = 300; // valeur du seuil
 
  if(analogRead(lightPin) > threshold)
 
  {
 
      digitalWrite(ledPin, HIGH);
 
  }
 
  else{
 
      digitalWrite(ledPin, LOW);
 
  }
 
}</nowiki>
 
 
 
=== Un servo contrôlé par la lumière ===
 
Utilisons notre toute nouvelle compétence sur les senseurs de lumière pour contrôler un servo (et en même temps en apprendre un peu plus sur la programmation Arduino).
 
 
 
Connectez un servo moteur sur la pin 9 (comme au CIRC-04).
 
 
 
Ouvrez ensuite l'exemple « Knob » (le même que nous avons utilisé dans CIRC-08)
 
 
 
'''Fichier > Exemples > Servo > Knob'''
 
 
 
Chargez le code sur la carte et regardez comment il fonctionne sans aucune modification supplémentaire.
 
 
 
=== Utiliser toute la portée angulaire du servo moteur ===
 
Vous noterez que le servo n'utilise qu'une partie limité de sa rotation angulaire.
 
 
 
C'est parce qu'avec le pont diviseur de tension que nous utilisons, la tension sur la pin 0 ne varie pas de 0 à 5 volts mais entre deux valeurs plus petites (valeurs qui dépendent de votre montage).
 
 
 
Pour corriger cela, modifiez et testez vos propres valeurs avec la ligne
 
 
 
<nowiki>val = map(val, 0, 1023, 0, 179);</nowiki>
 
 
 
Pour des astuces sur ce qu'il faut faire, visitez [http://arduino.cc/en/Reference/Map arduino.cc/en/Reference/Map] (''anglais'')
 
 
 
== Plus, plus et encore plus ==
 
xxx
 
== Internet ==
 
=== .:téléchargement:. ===
 
xxxx
 
 
 
  
 
{{MicroPython-Hack-MCH-TRAILER}}
 
{{MicroPython-Hack-MCH-TRAILER}}

Version actuelle datée du 20 février 2016 à 17:14


MCHobby investit du temps et de l'argent dans la réalisation de traduction et/ou documentation. C'est un travail long et fastidieux réalisé dans l'esprit Open-Source... donc gratuit et librement accessible.
SI vous aimez nos traductions et documentations ALORS aidez nous à en produire plus en achetant vos produits chez MCHobby.

Ce que nous faisons

.: Les photorésistances :.

Acquérir une valeur en provenance d'un potentiomètre peut être utile pour une expérience contrôlée par un humain. Mais que pouvons nous utiliser pour une expérience contrôlée par l'environnement lui-même? Nous gardons exactement les mêmes principes mais à la place du potentiomètre (résistance basée sur une torsion), nous utilisons une photorésistance (résistance basée sur la lumière). PyBoard ne peut pas directement percevoir la résistance (il perçoit la tension) donc nous utilisons un pont diviseur de tension pour créer une tension qui varie avec la résistance de la photo-résistance (résistance qui change avec l'intensité lumineuse).

La tension exacte sur la broche du senseur peut être calculée mais pour notre usage (juste percevoir la lumière relative), nous pouvons tester les valeurs et retenir celles qui nous conviennent.

Le senseur retourne une petite valeur lorsqu'il est bien éclairé et une grande valeur lorsqu'il est placé dans l'obscurité.

Voir l'invite REPL

Une petite note complémentaire, ce montage affiche des information via connexion série disponible sur le port USB de la PyBoard.

Il sera nécessaire de maîtriser L'invite REPL pour voir le résultat de vos mesures de températures.

MicroPython-Hack-REPL-Python-exemple.jpg

Le montage

Le matériel nécessaire

PYBX-PhotoResistance.png

Photo-résistance
x1

PYBX-R100.png

Résistance de 100 Ohms (brun-noir-rbrun)
x1

PYBX-R10K.png

Résistance de 10K Ohms (brun-noir-orange)
x1

PYBX-LED-verte.png

LED (ou DEL)
x1

 

Tous ces éléments sont disponibles sur shop.mchobby.be.

Schéma

MicroPython-Hack-LDR-schema.png

Montage

MicroPython-Hack-LDR-montage.jpg
Made with - réalisé avec - Fritzing fritzing.org

Le code

Lectures simples

Le petit programme suivant effectue une lecture toutes les 300 ms (1/3 seconde), convertir la valeur lue (entre 0 et 4096) en tension et affiche/envoi les deux valeurs sur l'interface série.

Ce petit programme, que vous pouvez saisir en mode REPL, vous permet de tester rapidement votre montage et ses réactions lorsque vous couvrez la photorésistance (ou l'éclairez).

ldr = pyb.ADC( 'X19' )
while True:
    lecture = ldr.read()
    tension = (lecture * 3.3) / 4095
    print( 'valeur = %s, tension = %s volts' % (lecture, tension) )
    pyb.delay( 300 )

Code qui produit les résultats suivants:

  • La tension chute lorsque la lumière diminue
  • La tension augmente lorsque la lumière augmente
valeur = 2728, tension = 2.198388 volts
valeur = 2750, tension = 2.216117 volts
valeur = 2762, tension = 2.225787 volts
valeur = 2807, tension = 2.262051 volts
valeur = 2795, tension = 2.252381 volts
valeur = 2814, tension = 2.267692 volts
valeur = 2799, tension = 2.255605 volts
valeur = 2754, tension = 2.219341 volts
valeur = 2287, tension = 1.843004 volts
valeur = 1886, tension = 1.519853 volts
valeur = 1919, tension = 1.546447 volts
valeur = 1905, tension = 1.535165 volts
valeur = 1910, tension = 1.539194 volts
valeur = 1887, tension = 1.520659 volts
valeur = 1815, tension = 1.462637 volts
valeur = 1225, tension = 0.9871795 volts
valeur = 680, tension = 0.5479854 volts
valeur = 751, tension = 0.6052015 volts
valeur = 819, tension = 0.6599999 volts
valeur = 1766, tension = 1.42315 volts
valeur = 1915, tension = 1.543223 volts
valeur = 1903, tension = 1.533553 volts
valeur = 1960, tension = 1.579487 volts
valeur = 1976, tension = 1.592381 volts
valeur = 1983, tension = 1.598022 volts
valeur = 1988, tension = 1.602051 volts
valeur = 1990, tension = 1.603663 volts
valeur = 1991, tension = 1.604469 volts
valeur = 1997, tension = 1.609304 volts

Modulation de lumière

Dans l'exemple suivant, nous allons utiliser la valeur lue sur la photo-résistance pour moduler la puissance lumineuse de la led.

Nous allons utiliser un signal PWM pour moduler la puissance de la LED et la fonction arduino_map pour transformer la valeur lue sur l'entrée analogique (entre 680 et 2750, comme indiqué par la programme précédent).

Le mieux est de placer ce programme dans le fichier main.py. N'oubliez pas d'éjecter le lecteur Flash de la PyBoard avant de faire un Reset de votre PyBoard pour démarrer votre programme.

# Lecture analogique LDR pour controler la puissance d'une LED PWM.
# ATTENTION: ..chantillonnage 12 Bits (valeur de 0 .. 4096)
from pyb import Timer, delay

# Creer un timer à une fréquence de 100 Hz (le timer 5)
# Créer un canal (channel) PWM avec le Timer.  
tim = pyb.Timer( 5, freq=100)
tchannel = tim.channel(1, Timer.PWM, pin=pyb.Pin.board.X1, pulse_width=0)

# Minimum et Maximum de largeur d'impulsion correspondant au minimum
# et maximum de luminosité
max_width = 150000
min_width = 0100

# Minimum et Maximum de valeur analogique correspondant au variation
# de lumière sur la LDR. Valeur relevée avec le programme précédent
max_ldr = 2750
min_ldr = 680 

# fonction qui permet de passer d'un range de valeur (in_) à une autre
#    (out_) en appliquant une règle de trois. 
def arduino_map(x, in_min, in_max, out_min, out_max):
    return int( (x - in_min) * (out_max - out_min) // (in_max - in_min) + out_min )
    
ldr = pyb.ADC( 'X19' )
while True:
	# lecture analogique
    lecture = ldr.read()
    
    # Transformer une valeur analogique (0 .. 4096) en largeur d'impulsion (20000 .. 2000000) 
    pulse_width = arduino_map( lecture, min_ldr, max_ldr, min_width, max_width )
    
    # Modifier le signal PWM
    tchannel.pulse_width( pulse_width )
    
    delay( 100 )

Couvrez votre photo-résistance avec votre doigt (sans la toucher). La luminosité de la LED devrait diminuer. Ecartez votre doigt et la LED devrait s'éclairer plus fort.

Cela ne fonctionne pas?

Voici 3 choses à essayer.

La LED reste éteinte

C'est une erreur que nous continuons à faire de temps à autre, si seulement ils savaient faire des LEDs qui fonctionne dans les deux sens!

Sortez la et retournez la.

Ne réagit pas au changement de lumière

Il est facile de mal placer la photorésistance parce que l'écartement des broches n'est pas standard.

Vérifiez si elle est bien à la bonne place.

Ne fonctionne toujours pas?

Vous êtes peut-être dans une pièce trop lumineuse ou trop sombre.

Essayez d'allumer et éteindre la lumière pour voir si cela aide.

Si vous avez une lampe de poche, tentez votre chance avec elle.

Faire encore mieux

Inverser la réponse

Vous voudriez peut-être une réponse inversée, que la LED s'éclaire de plus en plus au fur et a mesure que la lumière diminue sur le senseur Photo-résistif.

Pas de problème nous pouvons facilement inverser cette réponse en changeant la ligne:

pulse_width = arduino_map( lecture, min_ldr, max_ldr, min_width, max_width )

vers

pulse_width = arduino_map( lecture, max_ldr, min_ldr, min_width, max_width )

Chargez le programme et notez la modification de la réponse.

Couvrez votre photo-résistance et vous allez voir la luminosité de la LED grimper en flèche.

La veilleuse

Plutôt que de contrôler la luminosité d'une LED en réponse à la lumière, essayons plutôt de l'allumer ou l'éteindre en fonction d'un seuil.

Voici une nouvelle version du programme basé sur le seuil stratégiquement choisi à 1500 (entre les valeur 680 et 2750 mesurée au début du tutoriel).

# Lecture analogique d'une LDR pour allunmer une LED sur base d'un seuil.
# ATTENTION: échantillonnage 12 Bits (valeur de 0 à 4096)
from pyb import Timer, delay

adc = pyb.ADC(pyb.Pin.board.X19)    # Créer ADC sur la broche  X19
led = pyb.Pin(pyb.Pin.board.X1, pyb.Pin.OUT_PP ) # Créer la sortie pour la LED
led.low()                           # Led éteinte
seuil = 1500                        # seuil à partir duquel la LED 
                                    #    doit s'allumer 

while True:
	# Lectures analogiques
    ivalue = adc.read()
        
    # Activer la sortie si le seuil est atteinte ou dépassé
    if ivalue < seuil:
        led.high()
    else:
        led.low()
    
    delay( 100 )

Comme nous l'avons vu, la tension augmente au fur et a mesure que la lumière diminue.

Par conséquent, la valeur lue sur l'entrée analogique augmente quand la lumière diminue... par conséquent, il faut éteindre la LED lorsque la valeur lue est plus grand que le seuil (ou allumer la LED lorsque la valeur chute en dessous du seuil).

Un servo contrôlé par la lumière

# Lecture analogique d'une LDR pour contrôler allumer une LED sur base d'un seuil.
# ATTENTION: échantillonnage 12 Bits (valeur de 0 à 4096)
from pyb import Timer, delay

adc = pyb.ADC(pyb.Pin.board.X19)    # Créer ADC sur la broche  X19
servo = pyb.Servo(2)                # Servo moteur sur X2

# fonction qui permet de passer d'un range de valeur (in_) à une autre
#    (out_) en appliquant une règle de trois. 
def arduino_map(x, in_min, in_max, out_min, out_max):
    return int( (x - in_min) * (out_max - out_min) // (in_max - in_min) + out_min ) 

# Minimum et Maximum de valeur analogique correspondant au variation
# de lumière sur la LDR. Valeur relevée avec le programme précédent
max_ldr = 2750
min_ldr = 680 

while True:
	# Lectures analogiques
    ivalue = adc.read()
    
    # Transformer une valeur analogique (0 à 4096) en angle entre -90° à +90° 
    angle = arduino_map( ivalue, min_ldr, max_ldr, -90, 90 )
    
    # Activer la sortie si plus grand que seuil
    servo.angle( angle )
    
    delay( 100 )

Plus, plus et encore plus

Intéressé par les photo-résistances?

Nous disposons de nombreuses autres informations utile et pratique dans le tutoriel "Photo-Résistance pour Arduino".



Composé par Meurisse D. pour MCHobby.be - Translated by Meurisse D. for MCHobby.be

Toute référence, mention ou extrait de cette traduction doit être explicitement accompagné du texte suivant : «  Traduction par MCHobby (www.MCHobby.be) - Vente de kit et composants » avec un lien vers la source (donc cette page) et ce quelque soit le média utilisé.

L'utilisation commercial de la traduction (texte) et/ou réalisation, même partielle, pourrait être soumis à redevance. Dans tous les cas de figures, vous devez également obtenir l'accord du(des) détenteur initial des droits. Celui de MC Hobby s'arrêtant au travail de traduction proprement dit.