Cours:GpioQT

De troyesGEII
Aller à : navigation, rechercher
Retour à la liste des Tds

GPIO

Gpio rpi3.png

On dispose d'un connecteur avec un certain nombre de GPIO sur la carte rpi.

Ce sont des broches configurables qui peuvent servir de :

  • entrée logique
  • sortie logique
  • fonction particulière :
    • entrée analogique (pas sur les rpi actuelles)
    • i2c
    • spi
    • pwm
    • liaison série
    • ...

Vous utiliserez les classes mises à disposition sur github pour utiliser facilement une broche en entrée, sortie logique ou sortie pwm :

Sortie

Il convient de préciser le numéro de GPIO que l'on souhaite utiliser. Pour cela, le constructeur de la classe GPIO nécessite le passage d'un paramètre :

 GPIO(int number);

2 approches pour passer des paramètres au constructeur lors de la création d'un objet sont donnés ci dessous :

//1ère possibilité,
// ajout d'un attribut dans le header
#include "gpio.h"
using namespace exploringRPi;
...
class MainWindow : public QMainWindow
{
   ....
   GPIO ledRouge;
   GPIO ledVerte{20};
   ....
}
//2ère possibilité,
// instanciation dans le constructeur
....
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent),
      ui(new Ui::MainWindow),ledRouge(16)
{
   ....
   ledRouge.setDirection(OUTPUT);
   ledVerte.setDirection(OUTPUT);
   ....
}
...
// utilisation dans une méthode
   ....
   ledRouge.setValue(HIGH);
   ledVerte.setValue(LOW);
   ....

Entrée

On pourrait procéder de façon analogue :

#include ....
using namespace exploringRPi;
...
GPIO bp{16};
....
bp.setDirection(INPUT);
int n = bp.getValue();

Attention, en procédant de la sorte, il convient de scruter régulièrement la valeur de l'entrée pour vérifier si celle-ci n'a pas changée d'état. On peut par exemple utiliser un QTimer pour réaliser ce polling.


Comme nous réalisons une programmation événementielle, cette méthode n'est pas la plus adaptée, voyons comment faire :

  • les GPIOs se trouvent dans l'arborescence linux dans le répertoire /sys/class/gpio/
  • si une broche est configurée, la 10 par ex, on aura un répertoire : /sys/class/gpio/gpio10/
  • dans ce répertoire, il y a un fichier value
  • on va observer ce fichier /sys/class/gpio/gpio10/value qui reflète l'état de la broche
  • on demandera l'exécution d'un SLOT lors de la modification de ce fichier
  • mise en oeuvre :
// il nous faut un objet de type QFileSystemWatcher
#include <QFileSystemWatcher>

// On ajoute un attribut de type QFileSystemWatcher:
QFileSystemWatcher bpWatcher;
GPIO bp{10};
...
...
// On configure la broche en entrée:
bp.setDirection(INPUT);
// Quel type d'événement nous intéresse ? NONE, RISING, FALLING, BOTH
bp.setEdgeType(BOTH);
// On ajoute la liste des fichiers dont il faut surveiller la modification
bpWatcher.addPath("/sys/class/gpio/gpio10/value");
// Un signal "fileChanged" est généré à chaque événement surveillé (cf plus haut)
connect(&bpWatcher,SIGNAL(fileChanged(QString)), ... , SLOT( .... ));

Tests

Question.jpg Utilisez des leds et boutons pour valider le bon fonctionnement et la compréhension

classe Lampe

On peut maintenant modifier notre classe Lampe afin de pouvoir utiliser des leds.

Pour cela, la classe Lampe devra :

  • posséder un attribut de type GPIO : numBroche
  • avoir un paramètre dans le constructeur permettant de choisir le numéro de GPIO
  • modifier les méthodes allumer, eteindre, changer

Question.jpg Apporter les modifications nécessaires