Blog ENI : Toute la veille numérique !
💥 Un livre PAPIER acheté
= La version EN LIGNE offerte pendant 1 an !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Python
  3. GPIO : un pas vers l’extérieur
Extrait - Python Libérez le potentiel de votre Raspberry Pi
Extraits du livre
Python Libérez le potentiel de votre Raspberry Pi
2 avis
Revenir à la page d'achat du livre

GPIO : un pas vers l’extérieur

Définition et intérêt du GPIO

Une des caractéristiques pouvant expliquer le succès du Raspberry Pi est le fait qu’il possède une interface matérielle d’entrée/sortie permettant de communiquer avec différents instruments, dont des capteurs. On peut donc voir ici le Raspberry Pi comme un microcontrôleur qui offre l’avantage d’accueillir un système d’exploitation complet et autorise nativement l’accès à des services qu’on pourrait difficilement retrouver sur des microcontrôleurs classiques.

Cette particularité permet de répondre aux besoins de prototypage d’informaticiens n’ayant pas les compétences bas niveau pour manipuler le matériel. En effet, la couche logicielle permet une abstraction qui simplifie l’accès au matériel à l’aide de bibliothèques ; dans ce cas, les packages Python.

Les électroniciens dans une tâche de prototypage d’un capteur bénéficient d’un gain de temps important en utilisant les services du système d’exploitation : Bluetooth, réseau… sans avoir recours à une implantation fastidieuse et chronophage sur une plateforme matérielle classique, par exemple l’ARM Cortex M4.

Le port GPIO (General Purpose Input Out) comporte un connecteur possédant...

Broches d’entrée/sortie numériques

Les broches d’entrée/sortie numériques permettent d’afficher en sortie, lorsqu’elles sont configurées en écriture, la valeur logique 1 ou 0. Elles permettent de lire l’état logique imposé par un capteur lorsque la broche est configurée en lecture.

Nous allons réaliser ce processus de lecture et d’écriture à l’aide d’une bibliothèque officielle Python développée pour le système Raspbian. Cette librairie se nomme RPi.GPIO. Il est probable qu’elle soit installée, mais les lignes ci-après permettent de réaliser soit l’installation si la libraire est absente, soit sa mise à jour.


sudo apt-get update 
sudo apt-get python-dev python-rpi.gpio
 

Une fois cette librairie installée, nous pouvons concevoir un montage électronique sommaire pour simuler la présence d’entrée et de sortie sur certaines des broches du montage.

Pour cela, nous avons besoin de :

  • deux résistances

  • une LED

  • un switch

  • et quelques câbles de connexion

La LED est câblée sur la broche BCM17 qui est définie comme une sortie et le bouton poussoir est câblé juste avant la résistance sur la broche BCM27 qui est définie comme une entrée.

Ce montage est illustré à la figure...

Port I2C

I2C est proche du port série RS232, mais possède le grand avantage de connecter plusieurs éléments sur un même port, grâce à un système d’adressage des périphériques.

Pour faire simple, nous allons instancier un objet qui permet de manipuler un composant du port. À l’instanciation, nous allons passer comme paramètre l’adresse du composant sur le port. Les lectures et écritures en direction de ce composant seront donc effectuées grâce à son adresse. Afin de manipuler différents éléments connectés sur le port, il est possible d’instancier plusieurs objets. La seule limite étant le nombre maximum de composants connectables ainsi que le débit maximum du port (100 ou 400 kHz selon la configuration du port et les spécifications du composant).

Avant d’écrire le code relatif à la manipulation du port GPIO, il est nécessaire de réaliser l’activation du port I2C.

Pour cela, il faut passer par l’outil de configuration du Raspberry à l’aide de l’instruction :


sudo raspi-config
 
images/04LF02.png

Puis, il faut séléctionner l’option 5Interfacing Options et ensuite P5 I2C. Pour finalement choisir d’activer le port I2C à l’aide de l’option Yes.

Une fois l’ I2C activé, nous pouvons scanner...

Interfacer un capteur usuel : le BME 280

Nous avons vu dans la section précédente le principe de base d’un interfaçage du port I2C et les fonctions disponibles pour lire et écrire dans les registres d’un composant disponible sur ce port.

Nous allons ici proposer un exemple complet, dans lequel nous allons créer un module permettant la manipulation d’un composant très usuel : le BME 280.

Le BME 280 est très connu dans la communauté Raspberry, car il permet de mesurer :

  • la pression

  • la température

  • le taux d’humidité dans l’air

Ce capteur a de multiples utilisations, mais la plus répandue est sans doute son intégration au sein de la station météo DIY (Do It Yourself).

L’exemple proposé ici a pour but de vous montrer comment passer d’une documentation technique (datasheet) à un code fonctionnel suffisamment flexible pour répondre à différentes applications et pouvant être partagé avec la communauté.

Dans un premier temps, vous devez prendre connaissance de la documentation disponible sur le site du fabricant : https://ae-bst.resource.bosch.com/media/_tech/media/datasheets/BST-BME280_DS001-12.pdf

Notre but est de réaliser un accès simple aux valeurs contenues dans des registres. La documentation technique permet de définir l’adresse des registres et les valeurs attendues ainsi que le comportement en fonction des valeurs attendues. Notre code doit donc comporter un ensemble de constantes dont le nom est explicitement le nom d’un registre et dont la valeur est l’adresse du registre en question. La première partie du code proposé ici n’est autre que cette transposition.

Mais avant toute chose, il est nécessaire de fixer l’adresse par défaut du composant (voir page 31 du datasheet).


BME280_I2CADDR_DEFAULT = 0x76
 

Maintenant, définissons toutes les constantes pour les registres dont une cartographie est disponible à la page 25 du datasheet.

Définition de l’adresse des registres de 8 bits, chacun définissant la partie haute et la partie basse du capteur d’humidité :


BME280_HUM_LSB = 0xFE 
BME280_HUM_MSB = 0xFD
 

Les trois registres codant la valeur de la température :


BME280_TEMP_XLSB = 0xFC 
BME280_TEMP_LSB...

Acquérir des données analogiques

Le Raspberry Pi, quel que soit le modèle, ne possède pas de broche d’entrée/sortie analogique. À l’inverse de son plus sérieux concurrent l’Arduino, il n’est pas possible de connecter directement sur le GPIO des capteurs analogiques. Nous appelons ici capteur analogique un capteur qui mesure un phénomène et dont l’intensité ou la tension en sortie est directement (linéairement ou non) liée au phénomène mesuré.

Pour récupérer l’information provenant du capteur, il est nécessaire d’effectuer une conversion analogique/numérique. Cette conversion est facilement réalisable sans pour autant disposer de connaissances importantes en traitement du signal et en électronique numérique. En effet, il existe un nombre important de capteurs réalisant ce genre de tâches. Nous avons retenu le composant produit par Texas Instrument dont la référence est : ADS 1115.

Ce capteur présente les particularités suivantes :

  • sortie de numérisation sur 16 bits

  • quatre entrées analogiques

  • gain programmable

  • sortie en I2C

  • adresse esclave I2C programmable entre 0x48 et 0x4B à l’aide d’un système de cavaliers

Pour résumer, l’ADS 1115 est un capteur qui permet de récupérer les données d’un capteur (plus généralement d’un signal) analogique à l’aide du port I2C. Ce capteur permet de numériser deux sources à la fois. Comme il est possible de mettre jusqu’à quatre composants ADS 1115 sur le port I2C, nous avons donc la possibilité de connecter 16 (4 X 4) sources de signal numérique sur le Raspberry Pi !

Passons maintenant...

Utiliser le port USB

Le port USB peut être utilisé de différentes manières. Ici, seul son usage en port série émulé est présenté. En effet, le développement pour le port USB est assez complexe et nécessite en général le développement d’un driver pour l’hôte sur lequel on va connecter un périphérique USB.

Une manière très pratique et très employée pour récupérer des informations ou communiquer avec un autre composant, par exemple un microcontrôleur, est d’utiliser le port USB comme un port série émulé.

Afin d’illustrer le mécanisme, dans l’ensemble des exemples ci-après, nous communiquons avec un microcontrôleur STM32L432KC qui possède un port USB et qui a été transformé en port série au travers d’un port USB. De cette façon, ce microcontrôleur peut transférer et lire des données provenant du Raspberry Pi. Nous allons créer des scripts permettant de lire et d’écrire sur le port USB et donc d’émettre et de réceptionner des données en direction du microcontrôleur.

La carte de développement utilisée ici est la carte LadyBug. Vous trouverez des informations complémentaires à l’adresse suivante : https://github.com/kriswiner/Ladybug

Voici une illustration de la carte de développement :

images/04LF05.png

Les éléments permettant de programmer la carte de développement sont disponibles dans les sources liées à ce livre (voir la page Informations générales) et sur le site du projet GitHub.

Le microcontrôleur utilisé ici est un STM32L432KC. Il peut être remplacé par n’importe quel microcontrôleur possédant un port USB susceptible d’être configuré pour fonctionner en port série au travers de l’USB. Ce microcontrôleur peut donc être, par exemple, remplacé par un Arduino.

Pour lire sur le port USB des données venant d’un périphérique au travers d’un port série émulé, il est nécessaire d’utiliser la librairie pySerial. Pour cela, il faut saisir la commande suivante dans un terminal :...

Utiliser le Bluetooth

Le Raspberry Pi 3 B+ possède l’avantage de proposer un module Bluetooth 4.2. Cette version du format Bluetooth est optimisée pour l’Internet des objets (IoT, Internet of Things). Elle est particulièrement adaptée pour la connexion à des objets autonomes et pour l’échange de quantités de données importantes. En effet, la norme Bluetooth 4.2 permet d’avoir un débit de 25 Mbit/s au maximum, ainsi qu’une portée de 60 m.

Le Bluetooth reste un protocole difficile à exploiter même s’il existe des librairies pour réduire la complexité de la tâche. Pour comprendre comment une communication Bluetooth entre un périphérique et un central fonctionne, il est nécessaire d’expliquer le fonctionnement du protocole.

D’une manière générale, un périphérique, qui est identifié de manière unique par une adresse MAC, propose un ou des services Bluetooth. Ces services sont normalisés par le consortium Bluetooth. À titre d’illustration, quelques services sont listés ci-après :

  • CGMS (Continuous Glucose Monitoring Service) : suivi en continu de la glycémie

  • CPS (Cycling Power Service) : service de gestion des capteurs de puissance pour le cyclisme

  • ESS (Environmental Sensing Service) : service de gestion des paramètres environnementaux : température, pression…

  • BAS (Battery Service) : service de gestion de la batterie : récupération d’informations indiquant le niveau, si la batterie est en charge…

Les services possèdent un niveau de description supplémentaire qu’on nomme caractéristiques. Ces caractéristiques sont les attributs du service, et permettent de converser en entrée ou en sortie avec le capteur.

Il existe un nombre important de services décrit par le consortium Bluetooth : https://www.bluetooth.com/specifications/gatt

Notez que plusieurs services peuvent cohabiter sur le même composant, par exemple un service pour la gestion de la batterie et un service pour la surveillance du glucose.

En outre, il est possible de créer des services de toutes pièces. C’est ce que fait l’entreprise Nordic Semiconductor, laquelle réalise...

Conclusion

Ce chapitre a décrit de manière rapide les usages du port GPIO du Raspberry Pi. Dans un premier temps, une présentation des caractéristiques du port GPIO a été réalisée, puis deux types de ports ont été étudiés : les entrées/sorties tout ou rien, ainsi que le port I2C.

Ces deux ports couvrent un très grand nombre d’usages pour l’utilisateur du Raspberry Pi qui envisage de développer des applications d’électronique et de domotique.

À titre d’exemple, nous avons réalisé un module permettant la manipulation du capteur BME280 est facilement adaptable à d’autres capteurs.

Enfin, la dernière section de ce chapitre a permis de combler une lacune du Raspberry Pi : l’absence de broche d’entrée/sortie analogique au sein de son GPIO. Nous avons expliqué comment réaliser facilement l’acquisition numérique de signaux analogiques via le port I2C.

La maîtrise de tous ces éléments vous permettra de réaliser sans problème les différentes applications de domotique qui sont en train de germer dans votre esprit.