Cours:GpioQT
Révision datée du 8 décembre 2018 à 10:38 par Bjacquot (discussion | contributions) (Page créée avec « {{Rouge|'''Retour à la liste des Tds'''}} =GPIO= vignette On dispose d'un connecteur avec un certain nombre de GPIO sur la cart... »)
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
// ajout d'un attribut dans le header
#include "gpio.h"
using namespace exploringRPi;
...
GPIO * ledRouge;
....
// instanciation dans le constructeur
....
ledRouge = new GPIO(16);
ledRouge->setDirection(OUTPUT);
....
// utilisation dans une méthode
....
ledRouge->setValue(HIGH);
....
Entrée
On pourrait procéder de façon analogue :
#include ....
using namespace exploringRPi;
...
GPIO * bp;
....
bp = new GPIO(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>
QFileSystemWatcher * bpWatcher;
GPIO * bp;
...
...
// On configure la broche en entrée:
bp = new GPIO(10);
bp->setDirection(INPUT);
// Quel type d'événement nous intéresse ? NONE, RISING, FALLING, BOTH
bp->setEdgeType(BOTH);
// On crée l'objet QFileSystemWatcher:
bpWatcher = new QFileSystemWatcher();
// 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( .... ));