Cours:GpioQT : Différence entre versions
(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... ») |
(→Sortie) |
||
| Ligne 22 : | Ligne 22 : | ||
==Sortie== | ==Sortie== | ||
| − | <source lang= | + | <source lang=cpp> |
// ajout d'un attribut dans le header | // ajout d'un attribut dans le header | ||
| Ligne 28 : | Ligne 28 : | ||
using namespace exploringRPi; | using namespace exploringRPi; | ||
... | ... | ||
| − | GPIO | + | class MainWindow : public QMainWindow |
| − | .... | + | { |
| − | + | .... | |
| + | GPIO ledRouge; | ||
| + | GPIO ledVerte{20}; | ||
| + | .... | ||
| + | } | ||
| + | </source> | ||
| + | <source lang=cpp> | ||
// instanciation dans le constructeur | // instanciation dans le constructeur | ||
.... | .... | ||
| − | ledRouge | + | MainWindow::MainWindow(QWidget *parent) : |
| − | + | QMainWindow(parent), | |
| − | .... | + | ui(new Ui::MainWindow),ledRouge(16) |
| + | { | ||
| + | .... | ||
| + | ledRouge.setDirection(OUTPUT); | ||
| + | ledVerte.setDirection(OUTPUT); | ||
| + | .... | ||
// utilisation dans une méthode | // utilisation dans une méthode | ||
| − | .... | + | .... |
| − | ledRouge | + | ledRouge.setValue(HIGH); |
| − | .... | + | ledVerte.setValue(LOW); |
| + | .... | ||
</source> | </source> | ||
Version du 8 décembre 2018 à 16:27
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;
...
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;
....
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( .... ));