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}} |