Modifications

Sauter à la navigation Sauter à la recherche
9 892 octets supprimés ,  20 février 2016 à 17:14
Contenu remplacé par « {{MicroPython-Hack-Prepare-NAV}} {{MicroPython-Hack-LDR-core}} {{MicroPython-Hack-MCH-TRAILER}} »
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|320px]]
  −
 
  −
=== Montage ===
  −
[[Fichier:MicroPython-Hack-LDR-montage.jpg|800px]]
  −
 
  −
== 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).
  −
 
  −
<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 suivants:
  −
* La tension chute lorsque la lumière diminue
  −
* La tension augmente lorsque la lumière augmente
  −
 
  −
<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>
  −
 
  −
=== 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 {{fname|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 {{fname|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.
  −
 
  −
<nowiki># 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 5 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 )
  −
</nowiki>
  −
 
  −
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 ==
  −
{{traduction}}
  −
 
  −
=== 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:
  −
 
  −
<nowiki>pulse_width = arduino_map( lecture, min_ldr, max_ldr, min_width, max_width )</nowiki>
  −
 
  −
vers
  −
 
  −
<nowiki>pulse_width = arduino_map( lecture, max_ldr, min_ldr, min_width, max_width )</nowiki>
  −
 
  −
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).
  −
<nowiki># 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 )</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}}
30 894

modifications

Menu de navigation