Cours:GpioQT : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
(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=c>
+
<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 * ledRouge;
+
class MainWindow : public QMainWindow
....
+
{
 
+
  ....
 +
  GPIO ledRouge;
 +
  GPIO ledVerte{20};
 +
  ....
 +
}
 +
</source>
 +
<source lang=cpp>
 
// instanciation dans le constructeur
 
// instanciation dans le constructeur
 
....
 
....
ledRouge = new GPIO(16);
+
MainWindow::MainWindow(QWidget *parent) :
ledRouge->setDirection(OUTPUT);
+
    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->setValue(HIGH);
+
  ledRouge.setValue(HIGH);
....
+
  ledVerte.setValue(LOW);
 +
  ....
 
</source>
 
</source>
  

Version du 8 décembre 2018 à 16:27

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

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