Modifications

Sauter à la navigation Sauter à la recherche
4 673 octets ajoutés ,  27 février 2017 à 14:51
aucun résumé de modification
Ligne 8 : Ligne 8 :  
En fonction de l'état du bouton, le programme allumera la led Rouge ou Verte.
 
En fonction de l'état du bouton, le programme allumera la led Rouge ou Verte.
   −
Un [http://mchobby.be/PrestaShop/product.php?id_product=160 Pi Cobbler d'AdaFruit] (disponible chez MC Hobby) est utiliser pour faciliter le montage.
+
Un {{link-product-picobbler}} ou un {{link-product-picobblerplus}} (disponible chez MC Hobby) est utiliser pour faciliter le montage.
 +
 
 +
=== Pi-Cobbler ou Pi-Cobbler-Plus? ===
 +
 
 +
{{picobbler-compatibility}}
    
== Prérequis ==
 
== Prérequis ==
Assurez-vous d'avoir [http://mchobby.be/wiki/index.php?title=RaspberryPi-Accueil#Pr.C3.A9paration_pour_Python mis votre environnement Python à jour].
+
Assurez-vous d'avoir [[RaspberryPi-Accueil#Pr.C3.A9paration_pour_Python|mis votre environnement Python à jour]].
    
== Matériel ==
 
== Matériel ==
* Un [http://mchobby.be/PrestaShop/product.php?id_product=160 Pi-Cobbler]
+
* Un {{pl|160|Pi-Cobbler}}
 
* 2 x résistance de 330 Ohms (Orange, Orange, Brun)
 
* 2 x résistance de 330 Ohms (Orange, Orange, Brun)
 
* 1 x Led Rouge
 
* 1 x Led Rouge
Ligne 33 : Ligne 37 :     
Note: Ceux d'entre-vous qui utilisent un Arduino noterons que '''la tension du GPIO d'un Raspberry est 3.3v''' (et non 5v comme pour un Arduino)
 
Note: Ceux d'entre-vous qui utilisent un Arduino noterons que '''la tension du GPIO d'un Raspberry est 3.3v''' (et non 5v comme pour un Arduino)
 +
 +
=== Pull-up/Pull-down interne ===
 +
Pour les initiés, votre Raspberry-Pi dispose déjà de résistance pull-up ou pull-down que vous pouvez activer au moment de la déclaration de la broche en entrée.
 +
 +
<nowiki>GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
 +
GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_UP)</nowiki>
 +
 +
[http://makezine.com/projects/tutorial-raspberry-pi-gpio-pins-and-python/ Voyez cet article sur Make Magazine] pour plus d'information
    
== Montage ==
 
== Montage ==
Ligne 53 : Ligne 65 :  
On fait ensuite le copier/coller du code  
 
On fait ensuite le copier/coller du code  
   −
  <nowiki>#!/usr/bin/env python
+
<nowiki>#!/usr/bin/env python
 
# -*- coding: latin-1 -*-
 
# -*- coding: latin-1 -*-
   Ligne 85 : Ligne 97 :  
Par défaut, les fichier sont considéré comme des fichiers texte non exécutable... même s'il contiennent des scripts.
 
Par défaut, les fichier sont considéré comme des fichiers texte non exécutable... même s'il contiennent des scripts.
   −
Il faut donc indiquer au système d'exploitation qu'il peut autoriser l'exécution de notre raspi-blink.py
+
Il faut donc indiquer au système d'exploitation qu'il peut autoriser l'exécution de notre raspi-button.py
 
  <nowiki>chmod +x raspi-button.py</nowiki>
 
  <nowiki>chmod +x raspi-button.py</nowiki>
   Ligne 93 : Ligne 105 :     
== Déparasitage Logiciel du bouton ==
 
== Déparasitage Logiciel du bouton ==
Le contact d'un bouton poussoir momentané (actuateur) n'est pas franc. Il s'accompagne généralement d'une série de "contacts parasites" avant le contact franc et définitif.
+
Le contact d'un bouton poussoir momentané (actuateur) n'est pas franc.<br />
 +
Il s'accompagne généralement d'une série de "contacts parasites" avant le contact franc et définitif.
   −
[[Fichier:switchbounce.jpg|250px]]
+
[[Fichier:switchbounce.jpg|350px]]
    
Voici un exemple issus d'un article dédié au déparasitage des boutons pour Arduino (voir [http://arduino103.blogspot.be/2011/12/boutons-contacts-et-deparatisage.html cet article sur notre blog]).
 
Voici un exemple issus d'un article dédié au déparasitage des boutons pour Arduino (voir [http://arduino103.blogspot.be/2011/12/boutons-contacts-et-deparatisage.html cet article sur notre blog]).
Ligne 114 : Ligne 127 :  
=== Solution: le déparasitage logiciel ===
 
=== Solution: le déparasitage logiciel ===
   −
xxx
+
Le déparasitage logiciel consiste à faire une seconde vérification du signal après une courte pause.<br />
 +
Comme la période transitoire est très courte (de l'ordre de la milliseconde), faire une pause de 10 millisecondes entre deux lectures successives permet de s'assurer que le signal à vraiment changé de "façon définitive".<br />
 +
La pression du bouton n'étant humainement jamais inférieur à 10 ms, ont est certain de ne pas rater la pression du bouton lorsque l'action se présentera.
 +
 
 +
Si l'on se trouve dans une période transitoire, il est fort probable que la deuxième lecture ne soit pas identique (pas la même valeur).<br />
 +
Dans ce cas, il suffit d'ignorer le changement d'état car c'est une lecture parasite.
 +
 
 +
Le script python ci-dessous met ces quelques explications en oeuvre.
 +
 
 +
== Déparasitage Matériel ==
 +
Vous pouvez utiliser une {{pl|456|capacité de 10nF}} en parallèle avec votre bouton pour éliminer une bonne partie des parasites.
 +
 
 +
Vous pouvez vous inspirer [[Entr%C3%A9e_Bouton#D.C3.A9parasitage_mat.C3.A9riel_-_version_1|des explications et montages de notre tutoriel bouton pour Arduino]]. N'oubliez pas d'utiliser une tension de 3.3 Volts pour votre Pi ;-)
 +
 
 +
== Script Python - déparasitage logiciel ==
 +
Voici le script Python incluant le déparasitage logiciel du bouton.<br />
 +
En plus de faire le déparasitage, il stocke également l'état du bouton dans la variable '''BUTTON1_STATE''' en faisant en sorte qu'il soit le vrai reflet de l'état du bouton.<br />
 +
Lorsque le bouton est enfoncé, BUTTON1_STATE est True, lorsque le bouton est relâché BUTTON1_STATE est False.
 +
 
 +
=== Copier/coller le code ===
 +
Voici une méthode Copier/Coller super simple<br />
 +
 
 +
On commence par demander la création du fichier
 +
<nowiki>cat <<! > raspi-button2.py</nowiki>
 +
 
 +
On fait ensuite le copier/coller du code
 +
 
 +
<nowiki>#!/usr/bin/env python
 +
# -*- coding: latin-1 -*-
 +
 
 +
import RPi.GPIO as GPIO, time
 +
 
 +
GPIO.setmode(GPIO.BCM)
 +
GREEN_LED = 18
 +
RED_LED = 23
 +
 
 +
BUTTON1 = 24
 +
# Dernier état connu du bouton
 +
# Par defaut: le bouton n'est pas considéré comme activé
 +
BUTTON1_STATE = False
 +
 
 +
GPIO.setup(GREEN_LED, GPIO.OUT)
 +
GPIO.setup(RED_LED, GPIO.OUT)
 +
GPIO.setup(BUTTON1, GPIO.IN)
 +
 
 +
while True:
 +
        # -- Lecture avec déparasitage logiciel
 +
        # Si le bouton est pressé, la broche GPIO est raccordée
 +
        #  à la masse. Le GPIO est donc à LOW (bas).
 +
        #  Bouton pressé -> Input = LOW = False       
 +
        gpioRead1 = GPIO.input( BUTTON1 )
 +
        state1    = not(gpioRead1)
 +
        # SI changer d'etat ALORS refaire lecture de déparasitage
 +
        if( state1 != BUTTON1_STATE ):
 +
                # - attendre 10ms
 +
                time.sleep( 10 / 1000 )
 +
                # faire une 2ieme lecture
 +
                gpioRead2 = GPIO.input( BUTTON1 )
 +
                state2 = not(gpioRead2)
 +
                # SI les deux lectures concordent
 +
                # ALORS memoriser le nouvel etat du bouton
 +
                if( state1 == state2 ):
 +
                        BUTTON1_STATE = state2
 +
 
 +
 
 +
        # -- Programme principal --
 +
        # SI le bouton est pressé
 +
        # ALORS allumer la LED verte 
 +
        if( BUTTON1_STATE == True ):
 +
                GPIO.output(GREEN_LED, False)
 +
                GPIO.output(RED_LED, True)
 +
        else:
 +
                GPIO.output(GREEN_LED, True)
 +
                GPIO.output(RED_LED, False)
 +
</nowiki>
 +
 
 +
 
 +
On termine l'opération de saisie simplement avec:
 +
<nowiki>!</nowiki>
 +
 
 +
=== Rendre le fichier exécutable ===
 +
Par défaut, les fichier sont considéré comme des fichiers texte non exécutable... même s'il contiennent des scripts.
 +
 
 +
Il faut donc indiquer au système d'exploitation qu'il peut autoriser l'exécution de notre raspi-button2.py
 +
<nowiki>chmod +x raspi-button2.py</nowiki>
 +
 
 +
=== Executer le programme ===
 +
Taper simplement la commande suivante:
 +
  <nowiki>sudo ./raspi-button2.py</nowiki>
 +
 
 +
== Où acheter ==
 +
Vous pouvez trouver plusieurs modèles de bouton chez MCHobby
 +
* {{pl|39|Bouton tactile standard 6mm}}
 +
* {{pl|378|Bouton tactile étroit}}
 +
* {{pl|1086|Bouton tactile large 12mm}} (très pratique pour les Workshops).
 +
* {{pl|187|Bouton tactile avec capuchon carré}}
 +
* {{pl|344|Bouton tactile avec capuchon rond}}
 +
 
 +
{{ADF-Accord}}
 +
 
 +
{{MCH-Accord}}
29 836

modifications

Menu de navigation