Cours:GpioQT : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
(Sortie)
(Entrée)
Ligne 69 : Ligne 69 :
 
using namespace exploringRPi;
 
using namespace exploringRPi;
 
...
 
...
GPIO * bp;
+
GPIO bp{16};
 
....
 
....
bp = new GPIO(16);
+
bp.setDirection(INPUT);
bp->setDirection(INPUT);
+
int n = bp.getValue();
int n = bp->getValue();
 
 
</source>
 
</source>
  
Ligne 89 : Ligne 88 :
 
// il nous faut un objet de type QFileSystemWatcher
 
// il nous faut un objet de type QFileSystemWatcher
 
#include <QFileSystemWatcher>
 
#include <QFileSystemWatcher>
QFileSystemWatcher * bpWatcher;
+
 
GPIO * bp;
+
// On ajoute un attribut de type QFileSystemWatcher:
 +
QFileSystemWatcher bpWatcher;
 +
GPIO bp{10};
 
...
 
...
 
...
 
...
 
// On configure la broche en entrée:
 
// On configure la broche en entrée:
bp = new GPIO(10);
+
bp.setDirection(INPUT);
bp->setDirection(INPUT);
 
 
// Quel type d'événement nous intéresse ? NONE, RISING, FALLING, BOTH
 
// Quel type d'événement nous intéresse ? NONE, RISING, FALLING, BOTH
bp->setEdgeType(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
 
// On ajoute la liste des fichiers dont il faut surveiller la modification
bpWatcher->addPath("/sys/class/gpio/gpio10/value");
+
bpWatcher.addPath("/sys/class/gpio/gpio10/value");
 
// Un signal "fileChanged" est généré à chaque événement surveillé (cf plus haut)
 
// Un signal "fileChanged" est généré à chaque événement surveillé (cf plus haut)
connect(bpWatcher,SIGNAL(fileChanged(QString)), ... , SLOT( .... ));
+
connect(&bpWatcher,SIGNAL(fileChanged(QString)), ... , SLOT( .... ));
 
</source>
 
</source>

Version du 8 décembre 2018 à 22:46

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 :

// 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( .... ));