Cours:GpioQT
Retour à la liste des Tds
GPIO
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 :
- lien github
- pour récupérer : git clone https://github.com/bjacquot/rpi.git
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 :
// ajout d'un attribut dans le header
#include "gpio.h"
using namespace exploringRPi;
...
class MainWindow : public QMainWindow
{
....
GPIO ledRouge;
GPIO ledVerte{20};
....
}
// 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( .... ));