GPIO led bouton en C

Les GPIO

Bonjour à tous,

beaucoup ce demande comment fonctionne les GPIO sur le rasberry pi et c’est bien normal. Ces GPIO sont très utilisées pour la domotique mais pas seulement, on peut s’en servir pour des montages électroniques, contrôle de robot, etc.

 

GPIO

C’est l’abréviation de General Purpose Input/Output, ou plus simplement entrées/sorties générales. Elles fonctionnent en 3,3v sur le raspberry et sont au nombre de 17.

raspi_gpioLes I/O sont représentées par GPIO <numéro> (fonction secondaire). Celles avec des — ne sont pas utilisées, certaines sont connectées à la masse, d’autres au 3,3v et 5v. Il est donc déconseillé de les utiliser.

Pour les piloter des exemples sont fournis par raspbian en python. Personnellement je ne connais pas ce langage je suis plus familiarisé avec le C. Je vais donc vous parlez d’un outil permettant de les manipuler en ligne de commande et en langage C.

wiringPi

wiringPi est une bibliothèque écrite en langage C par Gordon Henderson qui fournis des outils pour utiliser les GPIO : projects.drogon.net/raspberry-pi/wiringpi

Vous risquez peut être de tomber sur une page dont le certificat n’est pas conforme. Ceci n’est pas grave vous pouvez tout de même accéder au site sans risque. Le site fonctionnais sans erreur jusqu’à ce jour. Remarquer que les liens sont en https, le site ne parvient simplement pas à envoyer le certificat alors que le site n’utilisais pas la connexion sécurisée avant.

Pour installer wiringPi il faut télécharger le projet via la commande suivante :

wget https://git.drogon.net/?p=wiringPi;a=snapshot;h=98bcb20d9391ebde24f9eb1244f0d238fb1a1dab;sf=tgz

Si vous avez une erreur comme expliqué plus haut utilisez :

wget --no-check-certificate https://git.drogon.net/?p=wiringPi;a=snapshot;h=98bcb20d9391ebde24f9eb1244f0d238fb1a1dab;sf=tgz

Une fois téléchargé, il faut extraire les fichier et les compiler comme suite :

tar xfz wiringPi-98bcb20.tar.gz
cd wiringPi-98bcb20
./build

Si cela a fonctionné utilisez ceci pour le vérifier :

gpio -v

qui vous donne la version de wiringPi installée. Avec wiringPi le nommage des GPIO a légèrement changé :

  • wiringPiGPIOwiringPi Pin : correspond aux numéro de pin utilisé avec wiringPi
  • BCM GPIO : numérotation classique du raspberry pi, comme sur ma première image
  • R1 / R2 : Révision 1 / Révision 2 du raspberry.

Les GPIO en ligne de commande

La pratique étant le meilleur exemple je vais vous montrez comment allumer une led. Voici le schéma réalisé

wiringPi_schema1

Je vous ai dit de ne pas utilisé les sorties — car elles étaient indéterminées. Moi je sais que celle que j’ai utilisé est connectée à la masse (Ground) en regardant les schéma du raspberry. Dans mon cas je n’avais que des connecteurs femelles 3 broches à ma disposition.

2013-03-16 12.32.47Avant d’allumer ou éteindre une led il faut paramétrer les pins en entrée ou en sortie :

gpio [-g] mode <pin> in/out/pwm/up/down
  • gpio : commande permettant de manipuler les gpio, tout ce qui ce trouve juste après sont des options ou paramètres.
  • [-g] : est optionnel, cette option permet d’employer la notation BCM comme numéro de pin.
  • mode : défini le mode qui sera utilisé par la pin
  • <pin> : est un paramètre qui attend le numéro de la pin, si l’option -g n’est pas utilisée référez vous aux colonnes situées au extrémité du tableau précédent.
  • in : paramètre la pin en entrée.
  • out : paramètre la pin en sortie.
  • pwm : sans entrer dans les détails, c’est ce qui permet d’avoir un signal analogique en sortie.
  • up/down : active une résistance de pull-up ou pull-down (expliqué par la suite).

Dans  mon exemples j’utilise les GPIO 0 et 7, je vais donc les configurer toutes les deux en sorties :

gpio mode 0 out
gpio mode 7 out

Pour mettre les sorties a l’état haut, soit 3,3v, il faut utiliser les commandes :

gpio write 7 1
gpio write 0 1

Le dernier paramètre défini l’état de la sortie :

  • 0 : LOW – état bas – sans tension
  • 1 : HIGH – état haut – avec tension.

Ces commandes sont pratique pour des petits scriptes bash manipulant les GPIO mais insuffisant pour faire des interactions avec l’utilisateur poussées, pour cela il faut passer par un langage comme le PHP/Javascripte qui utilise des scriptes bash ou un langage procédural comme le C (il existe également une librairie java pour ceux qui préfère la programmation objet).

Je n’ai expliqué que le fonctionnement des commandes de bases, bien d’autres sont disponibles sur le site de Gordon.

Les GPIO en langage C

Étant personnellement un grand utilisateur du mode console je vais vous montrez comment compiler en ligne de commande. Pour ceux qui préfaire utiliser un utilitaire graphique pour compiler cela fonctionnera tout aussi bien. Si vous voulez également éditer le fichier avec un éditeur graphique puis le compiler en mode console ça fonctionne également.

Dans ce 2ième exemples je vais vous montrez comment détecter l’appuie sur un bouton et allumer une led. Un petit rappel ou une découvert pour certain, comment détecter l’appuie d’un bouton électriquement :wiringPi_schema2

  • Dans le cas de gauche, la résistance R2 n’a pas de courant car la broche INPUT n’est pas a la masse. On retrouve donc les 3,3V au bornes de la résistances et donc sur la broche INPUT, soit un état haut. Quand on appuie sur le bouton on place la borne inférieur sur à la masse. Un courant ce crée dans la résistance et INPUT est enfin connecté a la masse, soit 0V soit un état bas.
  • Dans le cas de droite, la résistance R1 est connecté a la masse, la broche INPUT ne génère pas de courant, donc on retrouve a nouveau la même tension sur les bornes de la résistances, soit 0V qui ce répercute sur INPUT, donc un état bas. Quand on appuie sur le bouton on arrive dans le même cas de figure que la partie gauche sauf que INPUT est connecté directement sur la sortie du générateur de tension soit 3,3v, soit un état haut.

Le 2ème cas est dangereux, car le raspberry a une résistance interne faible, ce qui va provoquer un certain courant, si celui-ci est trop important il peut endommager votre raspberry pi. Ceci est valable pour tout montage de détection de bouton en général.

Résistance de pull-up et pull-down

Le Problème du cas précédent c’est qu’il faut dans un premier temps une résistance en plus du bouton, ce qui prend de la place. D’autre part il ne faut pas ce tromper dans le montage. Pour palier à cela on trouve une résistance dans le raspberry que l’on peut activer en pull-up, pull-down ou désactivée.wiringPi_schema3

Une résistance de pull-up est connectée au générateur interne tandis qu’une pull-down est connectée à la masse.

Voici le montage que j’ai réalisé en utilisant la résistance de pull-up de la GPIO 7 :

wiringPi_schema4

Passons au code C. Pour commencer il faut créer un fichier C, pour cela utiliser votre IDE ou éditeur de texte préférer ou comme moi nano en mode console :

nano gpio.c

Voici le code source commenté :

#include <stdio.h>
#include <stdlib.h>

// Inclure la lib wiringPi.h
#include <wiringPi.h>

int main(){
        // Initialiser la lib
        if( wiringPiSetup() ){
                fprintf(stderr, "Erreur lors de l'initialisation, est vous bien root ?");
                exit(1);
        }

        printf("wiringPi est initialisé\n");

        // Mode des pins
        pinMode(0, OUTPUT);
        pinMode(7, INPUT);

        printf("pin 0, 7 sont en mode OUTPUT et INPUT\n");
        printf("Application démarrée, appuyez sur CTRL+C pour l'arreter\n");

        // Set la résistance de pull-up
        pullUpDnControl(7, PUD_UP);

        while(1){
                if( !digitalRead(7) )           // Si on appuie sur le bouton
                        digitalWrite(0, HIGH); // On allume la led
                else
                        digitalWrite(0, LOW);   // Si non on l'eteint
        }

        return 0;
}

Je ne pense pas avoir besoin d’expliquer le code, pour ceux qui connaisse le langage C, il n’y a aucune difficulté, pour les autres je vous conseil de commencer par quelques tutos sur le langage C pour comprendre ceci.

Il faut ensuite compiler le code :

gcc -o gpio gpio.c -lwiringPi
  • gcc : GNU C Compiler, compilateur C de la fondation GNU.
  • -o gpio : cette option permet de définir le nom du fichier de sortie, si il n’est pas présent il prendra la valeur par défaut : a.out.
  • gpio.c : fichier C à compiler
  • -lwiringPi : permet de linker la librairie wiringPi

Pour exécuter le programme :

./gpio

Voici le résultat :wiringPi_button

Aller plus loin

Voici les bases des GPIO avec raspberry pi. Pour ceux qui désirent aller plus loin et approfondir le sujet je leurs conseille l’auto apprentissage. Le site de Gordon est très bien fait : projects.drogon.net/raspberry-pi/wiringpi

Vous avez également dans le dossier où vous avez extrait les fichier de wiringPi un dossier:

wiringPi-98bcb20/

qui contient un sous-dossier

wiringPi-98bcb20/exmples

avec divers fichier C contenant des exemples sur le PWM, I2C et bien d’autres.

sources; plomteuxkevin.wordpress.com/2013/03/16/les-gpio/