Cours:TPheritageIO
Nous allons utiliser un gpio expander en i2c qui permet d'ajouter facilement un grand nombre d'entrées/sorties sur un système.
Le composant utilisé, un mcp23017, possède 16 gpio. Son @i2c est réglable à l'aide de 3 broches ce qui permet au maximum d'en utiliser 8 sur le même bus i2c.
On peut donc ajouter jusqu'à 128 entrées/sorties en utilisant ce composant.
Nous souhaitons écrire un programme qui permet de piloter des lampes/leds, certaines connectées directement sur les gpio de la carte programmable, d'autres branchées sur le gpio expander.
Dans tous les cas, il s'agit de Lampe
, qu'elle soit une LampeI2c
ou une LampeGPIO
.
Chaque Lampe
présente :
- la propriété ou attribut suivant :
- isAllumee
- les fonctionnalités ou méthodes suivantes :
- allumer
- eteindre
- changer
Sommaire
"Diagramme" de classe
classe abstraite Lampe
- hérite de QObject
- a un attribut protected :
- isAllumee : bool
- a des slots public :
- allumer
- eteindre
- changer
- a une méthode protected
- virtual void setValue(bool etat)
Remarque :
- setValue est la seule méthode qui sera redéfinie dans les classes filles
- du coup il est nécessaire de la déclarer comme virtual
- les méthodes(slots plutôt) allumer/eteindre/changer doivent utiliser la méthode setValue
classe LampeGPIO
Ecrivez maintenant la classe LampeGPIO
:
- elle hérite de
Lampe
- le constructeur doit permettre d'indiquer le numéro de broche
- elle a un attribut protected
- pin de type GPIO
- elle doit redéfinir
setValue
- on ajoute le mot clé override dans la déclaration :
virtual void setValue(bool etat) override
- virtual n'est pas indispensable, il est utile si on souhaite spécialiser la classe
LampeGPIO
Remarque :
- il convient de définir la broche en sortie ( méthode
setDirection
de la classeGPIO
) ... oui oui dans le constructeur ! - pour modifier la sortie, on utilisera la méthode
setValue
de la classeGPIO
Peut-être le moment de tester un peu tout ça ??
classe LampeI2C
Et c'est parti pour la dernière classe : LampeGPIO
:
- elle spécialise également la classe
Lampe
- on ajoute des attributs
- pinMCP : int le numéro du GPIO, par ex 2 si on utilise PA2
- port de type portMCP
- enum portMCP {portA,portB};
- du coup ce sera soit PORTA ou PORTB comme valeur
- i2c de type
QI2cDevice
- ça va servir ... à utiliser le bus i2c c'est ça ;-)
- chercher à la fin de l'énoncé, il doit y avoir les fichiers
- sur les cartes raspberry-pi on utilise le bus i2c 1
Remarque :
- le numéro de port/pin ne changeant pas, on peut les déclarer comme constante ) condition de :
- déclaration :
const int pinMCP;
- définition :
LampeMCP23017::LampeMCP23017( int _pinMCP, ...): Lampe{parent},pinMCP(_pinMCP) ....
- déclaration :