Raspberry Pi ~05 : Ajouter un bouton matériel (avec Python)

Dans ce guide, nous allons voir comment câbler un bouton au Raspberry Pi, et le faire fonctionner grâce à Python.
Nous aurons besoin pour ce guide :

  • d’un Raspberry Pi (la préparation du mini-guide ~04 est idéale)
  • d’un bouton de type micro-switch,
  • d’une platine d’expérimentation (un petit modèle suffira),
  • de deux fils Dupont male-femelle.

Commençons par mettre à jour notre distribution Raspbian, afin d’avoir les librairies qui nous intéressent :
sudo apt-get update
sudo apt-get dist-upgrade

Ou alors, pour simplement mettre à jour le composant Rpi.GPIO :
wget http://raspberry-gpio-python.googlecode.com/files/python-rpi.gpio_0.5.3a-1_armhf.deb
wget http://raspberry-gpio-python.googlecode.com/files/python3-rpi.gpio_0.5.3a-1_armhf.deb
sudo dpkg -i python-rpi.gpio_0.5.3a-1_armhf.deb
sudo dpkg -i python3-rpi.gpio_0.5.3a-1_armhf.deb

Le circuit

Circuit pour un unique bouton

Circuit pour un unique bouton

Attention au sens du bouton, tous ne sont pas cablés de la même manière. Il est conseillé de vérifier avec un multimètre quelles sont les pattes du bouton qui ferment le circuit quand on appuie dessus.

A part ca, c’est une simple question de relier une patte du switch au GND du Raspberry Pi et l’autre patte au GPIO 23 (nous avons choisi le 23, car c’est un des GPIO qui ne peut pas avoir d’autre fonction que… GPIO)

Donc, quand on appuiera sur le bouton, le GPIO 23 sera connecté directement au GND.

Le code

#!/usr/bin/env python2.7
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)

# Le GPIO 23 est initialisé en entrée. Il est en pull-up pour éviter les faux signaux
GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_UP)

print "Veuillez vérifier que vous avez un bouton connecté de telle maniere"
print "qu il connecte le port GPIO 23 (pin 16) au GND (pin 6)\n"
raw_input("Pressez Entree quand vous etes pret\n>")

print "En attente de signal sur le port GPIO 23"
# a partir de la, le script ne fera plus rien jusqu a ce que 
# le signal sur le port 23 commence à chuter vers zéro. C'est
# la raison pour laquelle nous avons utilisé le pull-up pour 
# garder le signal "HIGH" et empecher un faux signal

print "Pendant ce temps votre Rapsberry Pi ne gaspille pas" 
print "de ressources en attendant un appui sur le bouton.\n"
print "Pressez le bouton quand vous voulez lancer un signal."
try:
    GPIO.wait_for_edge(23, GPIO.FALLING)
    print "\nAppui detecte. Maintenant votre script va"
    print "effectuer l'action correspondant a un appui sur le bouton."
except KeyboardInterrupt:
    GPIO.cleanup()       # reinitialisation GPIO lors d'une sortie CTRL+C
GPIO.cleanup()           # reinitialisation GPIO lors d'une sortie normale

Si on regarde les commentaires dans le code, on s’aperçoit qu’on vient de créer un : « j’attends que le port GPIO 23 soit relié au GND lors d’un appui sur le bouton, si c’est le cas j’affiche un message et je quitte le script ».

Bien sûr, on peut parfaitement modifier le script afin de faire faire ce que l’on veut à notre bouton. C’est d’ailleurs le sujet d’un autre tutoriel, qui enseigne comment utiliser ce bouton un peu plus efficacement pour éteindre proprement le Raspberry Pi.

Cet article fait partie d’une série de petits guides concernant le Raspberry Pi. Le sommaire se trouve ici.

About Captain Stouf

Spécialiste en systèmes informatiques, Développeur matériel et logiciel, Inventeur, Maker : électronique, Systems on Chip, micro-controlleurs, Internet of Things, Modélisation / Scan / Impression 3D, Imagerie...

4 thoughts on “Raspberry Pi ~05 : Ajouter un bouton matériel (avec Python)

  1. Marc
    21/02/2014 at 0 h 09 min

    Bonsoir ! Chouette site.
    Une petite question toutefois concernant cet article. J’ai personnellement branché un ventilateur en utilisant le 5v et le gnd (utilisé ici). Je suis une bille en électronique :x… Est-il possible d’ajouter ce genre de bouton malgré ma configuration ? Si oui, comment pourrais-je entreprendre cela ? Merci !

    1. Captain Stouf
      21/02/2014 at 2 h 40 min

      Bonsoir,
      Le ventilo est alimenté directement par le Pi ? Si c’est le cas, c’est très déconseillé : le 5v du Pi ne peut débiter que quelques dizaines de milliampères (50mA pour le 3.3v), alors que le ventilateur en demande surement bien plus (et en plus est très instable pour l’alimentation) ? D’une règle générale, on évite d’alimenter directement les éléments « consommateurs » d’ampères directement par les GPIO : ils sont plutôt faits pour véhiculer des signaux (une led, à la rigueur). Dans votre cas, à enclencher un transistor par exemple, qui serait alimenté par une autre source que le pi directement.
      Sinon coté code, en admettant que le ventilateur/transistor est connecté au GPIO BCM 24, il faudrait utiliser ce genre de choses je pense (non testé) :

      # pour configurer le GPIO en sortie
      GPIO.setup(24, GPIO.OUT)

      # A placer dans la boucle, après "GPIO.wait_for_edge(23, GPIO.FALLING)"
      # le ventilateur
      GPIO.output(24, True)

      # ou éteindre le ventilateur
      GPIO.output(24, False)

      A bientôt !

      1. Marc
        21/02/2014 at 18 h 45 min

        Bonjour.
        Je me suis fais larguer quand vous parliez de transistor. L’électronique me pose vraiment problème, à mon grand regret. Pour ce qui est du ventilateur, en effet, c’est un petit 40x40x6 5V en 0,07 A.
        Je souhaitais le brancher via port usb, mais rien à faire il ne démarre pas (j’ai essayé l’usb du raspberry et celui d’un hub avec alimentation propre à lui-même). Bref, il va falloir que j’épluche un peu tout ça. Merci en tout cas pour la piste !

        1. Captain Stouf
          22/02/2014 at 1 h 21 min

          Si c’est bien 5v 0.07A, alors le Pi devrait pouvoir effectivement le supporter sans composant additionnel (bien que pas super-conseillé quand même).
          C’est assez étrange qu’il ne démarre pas sur un port usb (5v 0.3~0.5A). Il faudrait pouvoir le tester avec par exemple un vieux chargeur de téléphone 5v, ou même 2/3 piles 1.5v (il devrait pouvoir décoller avec 4v je pense), avec un ampèremètre pour vérifier sa consommation réelle. Je pense qu’il faut éviter de dépasser les 120mA au total sur les GPIO du Pi.

          Il serait également assez judicieux de mettre une diode en parallèle du ventilateur afin d’éviter un retour de courant, notamment quand le ventilateur s’arrête (le petit retour en arrière qu’il fait en s’arrêtant produit un courant inverse). Le GPIO n’aimerait pas avoir un courant en sens contraire arriver alors qu’il est configuré en OUTPUT 🙂

          Pour le transistor, c’est un composant courant à 3 pattes qui agit comme un interrupteur commandé par un signal : sur les 2 premières pattes, on branche le ventilateur en circuit fermé avec son alimentation dédiée, et on brancherait dans notre cas la 3ème patte sur le GPIO du Pi.
          Quand le GPIO est à LOW (pas de signal), le transistor ne laisse pas passer le courant dans le ventilo.
          Quand le GPIO est à HIGH (il envoie un signal sous forme d’un faible courant), le transistor laisse passer le courant dans le ventilo.

Laisser un commentaire