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 30 : |
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 == |
| Voici le détail du montage | | Voici le détail du montage |
| | | |
− | [[Fichier:PiButton_bb.jpg]] | + | [[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}} |