Modifications

Sauter à la navigation Sauter à la recherche
8 025 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 ==
 +
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 25 : Ligne 32 :  
Pour connecter un bouton sur un GPIO, il faut utiliser le montage suivant:
 
Pour connecter un bouton sur un GPIO, il faut utiliser le montage suivant:
   −
3.3v --> Résistance pull-up de 10k --> GPIO --> Bouton --> GND  
+
<nowiki>3.3v --> Résistance pull-up de 10k --> GPIO --> Bouton --> GND</nowiki>
 +
 
 +
[[Fichier:PiButton-schematic.jpg|400px]]
    
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 ==
 +
Voici le détail du montage
 +
 +
[[Fichier:PiButton_bb2.jpg|640px]]
 +
 +
 +
[[Fichier:PiButton_bb.jpg|800px]]
 +
 +
== Le script Python ==
 +
Pour créer facilement ce script sur votre python, nous vous proposons une méthode à base de copier/coller à l'aide des étapes suivantes à réaliser dans un terminal (ou une connexion SSH).
 +
 +
=== 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-button.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
 +
 +
GPIO.setup(GREEN_LED, GPIO.OUT)
 +
GPIO.setup(RED_LED, GPIO.OUT)
 +
GPIO.setup(BUTTON1, GPIO.IN)
 +
 +
while True:
 +
        # Si le bouton est pressé, la broche GPIO est raccordée
 +
        #  à la masse. Le GPIO est donc à LOW (bas).
 +
        # Bouton pressé -> Input = LOW = False
 +
        if( GPIO.input( BUTTON1 ) == False ):
 +
        GPIO.output(GREEN_LED, True)
 +
        GPIO.output(RED_LED, False)
 +
else:
 +
        GPIO.output(GREEN_LED, False)
 +
        GPIO.output(RED_LED, True)
 +
</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-button.py
 +
<nowiki>chmod +x raspi-button.py</nowiki>
 +
 +
=== Executer le programme ===
 +
Taper simplement la commande suivante:
 +
  <nowiki>sudo ./raspi-button.py</nowiki>
 +
 +
== Déparasitage Logiciel du bouton ==
 +
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|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]).
 +
 +
Cette période de "contact parasite" est appelée période transitoire.
 +
 +
Comme un Raspberry est terriblement rapide, il pourrait détecter plusieurs fois les signaux haut et bas durant la période transitoire.<br />
 +
Dans le cadre de ce projet, cela pourrait se manifester de différentes façon:
 +
* La Led rouge semble clignoter légèrement avant de s'éteindre ou l'allumer.
 +
* La Led verte ne semble pas s'allumer d'un coup et clignote un peu.
 +
* Les deux leds "semblent" allumées en même temps pendant une très courte période.
 +
 +
=== Conséquences du parasitage ===
 +
dans le cas de ce projet, les conséquences néfastes du parasitage sont purement esthétique.<br />
 +
Par contre, lors de la conception d'un compteur (qui compte le nombre de pression), cette période transitoire fera grimper artificiellement la valeur du compteur.<br />
 +
Difficile dans ce cas de compter le nombre de fois qu'un événement s'est produit.
 +
 +
=== Solution: le déparasitage logiciel ===
 +
 +
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