Blog ENI : Toute la veille numérique !
-25€ dès 75€ sur les livres en ligne, vidéos... avec le code FUSEE25. J'en profite !
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. MicroPython et Pyboard
  3. Capteurs et interfaces
Extrait - MicroPython et Pyboard Python sur microcontrôleur : de la prise en main à l'utilisation avancée
Extraits du livre
MicroPython et Pyboard Python sur microcontrôleur : de la prise en main à l'utilisation avancée
3 avis
Revenir à la page d'achat du livre

Capteurs et interfaces

Introduction

Ce chapitre reprend le branchement, l’utilisation et la documentation de différents capteurs et interfaces.

Ces éléments sont répartis entre différentes catégories, sommairement décrites ci-dessous, mais déjà largement développés dans les précédents chapitres.

Si une carte d’interface appartient à plusieurs catégories, ce qui n’est pas rare, alors c’est la catégorie dominante qui sera utilisée.

Interface à signal numérique

Comme des modules relais, bouton et contact magnétique, capteur PIR (détection de mouvement), etc. un signal numérique utilise un signal niveau haut dit HIGH (3,3 V pour la Pyboard) et niveau bas dit LOW (0 V).

Interface à signal analogique

Bien qu’aujourd’hui plus rare dans le monde de l’électronique, certains capteurs présentent encore une interface analogique. Dans ce cas, la valeur retournée est une tension entre 0 V et Vmax. C’est par exemple le cas du capteur de température TMP36 produisant une tension de sortie proportionnelle à la température.

Le TMP36 n’est pas le seul représentant de sa gamme, il existe l’accéléromètre ADXL335 ou encore le capteur de pression différentielle MPXV5010DP.

Si la tension Vmax produite par le senseur est supérieure...

Signal numérique

Les modules relais, boutons et contacts magnétiques, capteurs PIR (détection de mouvement), etc. utilisent tous des broches GPIO dans leur mode le plus simple : en entrée/sortie.

Le signal exploité utilise donc le niveau haut dit HIGH (3,3 V pour la Pyboard) et le niveau bas dit LOW (0 V).

1. Module relais

Le module relais offre une isolation galvanique dans un projet. L’isolation galvanique permet d’isoler le circuit haute tension (ex. : pompe 24 V) de la partie de commande.

images/09RI01.png

Module relais de Pololu

Grâce au relais, il devient possible de commander des appareils de puissance comme des ventilateurs, pompes à eau ou moteurs de puissance moyenne.

a. Mise en garde

Il est très tentant d’utiliser des relais pour commander des appareils branchés sur le réseau de distribution. Dans les faits, cela est parfaitement faisable.

Il est cependant important de garder à l’esprit que tout contact accidentel avec la partie haute tension du circuit peut entraîner de graves brûlures, voire la mort dans les cas les plus tragiques.

Si vous avez pour projet de commander un appareil dépassant 24 V continu ou 48 V alternatif, il est vital de vous faire accompagner par un professionnel du domaine ou une personne disposant des compétences adéquates.

À noter que certains produits spécialisés comme le PowerSwitchTail (voir plus loin) permettent de faire ce type d’expérimentation en réduisant de façon drastique les prises de risque.

b. À réaliser soi-même

Il serait tout à fait possible de décrire le raccordement d’un relais, son transistor de puissance et sa diode de protection. C’est très intéressant d’un point de vue de l’apprentissage, mais un frein à l’expérimentation rapide. Cette section se penche donc sur des solutions prêtes à l’emploi.

Ce sujet est abordé en détail dans le tutoriel relais pour la Pyboard proposé sur le Wiki de MC Hobby : https://wiki.mchobby.be/index.php?title=MicroPython-Hack-relais

c. Modules relais préassemblés

Il est également possible d’utiliser des modules relais préassemblés. La société Pololu USA (et son circuit de revendeurs) propose des modules de qualité...

Signal analogique

Les capteurs analogiques produisent une tension de sortie en relation avec le phénomène physique mesuré.

1. Capteur de température TMP36

Le TMP36 est un capteur de température analogique capable de couvrir une plage de températures de -50 °C à +125 °C pour une tension de sortie de 0 à 1,7 V (ce qui reste en dessous des 3,3 V maximum de la Pyboard).

images/09RI20.png

Conversion de tension d’un TMP36 en température

Pour obtenir la température en °C, il faut utiliser la formule de conversion suivante :

Temp en °C = ( Tension_de_sortie_en_milliVolts - 500) / 10

Avec une tension de sortie de 1 V (1 000 mV), la température mesurée est de (1000-500) / 10 = 50 °C.

Le montage ci-dessous présente le TMP36 raccordé sur l’entrée analogique X19 de la Pyboard. Une capacité de 10 nF est utilisée pour déparasiter la sortie du capteur. En effet, les ports USB sont réputés pour laisser filtrer un bruit non négligeable depuis l’alimentation PC, bruit qui se retrouve sur l’alimentation de la carte microcontrôleur si elle est alimentée via USB. Si ce bruit n’est pas correctement filtré par l’étage d’alimentation du microcontrôleur, alors celui-ci se retrouve sur les capteurs analogiques et leurs signaux de sortie. Cela se traduit par une sortie instable et donc des lectures instables sur l’entrée analogique.

Une capacité de 10 nF, aussi appelée « petite fée de l’électronique », permet de filtrer très facilement ce bruit.

images/09RI21.png

Brancher un TMP36 sur la Pyboard

Les quelques lignes suivantes permettent de lire la tension produite par le capteur puis de la transformer en tension.

La session REPL ci-dessous indique comment convertir la lecture en température.

>>> from pyb import ADC 
>>> tmp36 = ADC('X19')  
>>> # Lecture ADC, résolution 12 bits, valeur de 0 à 4095 
>>> val = tmp36.read()  
>>> # Conversion en tension 
>>> volt = (val*3.3)/4095 
>>> # Multiplier les volts par 1000 pour obtenir des millivolts 
>>> temp = (volt*1000 - 500)/10 
>>> print( temp ) 
21.15751 

Comme...

Interface I2C

Il y a de très nombreux capteurs exploitant le bus I2C. Cette section présente quelques interfaces parmi les connues.

Le MCP23017 est l’occasion d’aborder de nombreux détails techniques concernant le bus I2C et sa mise en œuvre pratique. Même si la Pyboard ne manque pas d’entrées/sorties, il est vivement recommandé de lire cette section.

1. MCP23017 : extension d’entrée/sortie

L’une des interfaces I2C les plus utiles, selon l’auteur, reste le GPIO Expander MCP23017 de MicroChip. 

images/09RI37a.png

MCP23017

Il s’agit d’un composant 28 broches permettant d’ajouter facilement 16 entrées-sorties numériques sur n’importe quel microcontrôleur proposant un bus I2C.

Fonctionnant également sous 3,3 V, ce composant, très populaire dans le monde Arduino, dispose également de résistances pull-up internes très pratiques avec l’utilisation de broches en entrée (ex. : avec un bouton-poussoir).

Avec ses trois broches d’adresse A0, A1, A2, il est possible d’encoder jusque huit adresses différentes pour un MCP23017. Cela représente un total 8 * 16 GPIO = 128 GPIO.

Ce composant dispose, bien entendu, d’une fiche technique reprenant de nombreuses informations. Celle-ci peut être téléchargée depuis la page suivante : https://shop.mchobby.be/product.php?id_product=218

Le lecteur avisé s’interrogera sur l’intérêt d’un tel composant dans l’ouvrage puisque la carte Pyboard dispose déjà de nombreux GPIO. C’est une question pertinente avec des réponses intéressantes :

  • L’utilisation de trois cartes 8 relais, une situation pas si exceptionnelle que cela, nécessite 24 GPIO sur le microcontrôleur. De fait, il restera relativement peu de GPIO disponibles sur la Pyboard pour le support des autres fonctionnalités. Cela sans compter l’amas de 24 fils durant le prototypage. Utiliser deux MCP23017 dans ce cas de figure permet de déporter le câblage à l’écart et d’isoler toute la partie « commande de relais » du restant du projet aussi bien de façon électrique et physique qu’au niveau de la programmation.

  • Cela permet d’ajouter facilement...

Contrôle moteur

Pouvoir contrôler des moteurs depuis un microcontrôleur, c’est offrir la possibilité à un projet de devenir autonome, d’interagir avec son environnement, d’automatiser des tâches.

Il y a une très grande variété de moteurs, en type de moteur, puissance de moteur, type d’alimentation (alternatif ou continu) et consommation, type d’application cible, etc. Il est évident qu’un moteur ouvrant un portail n’est pas dimensionné de la même façon que celui qui propulse un jouet téléguidé.

Dans le cadre de cet ouvrage destiné à l’apprentissage, seuls les moteurs continus de relativement faible puissance seront abordés. De même, la tension sera limitée à 12 V.

Il y a trois grandes catégories de moteurs :

images/09RI70.png

Grandes catégories de moteurs

1. Les servomoteurs disposent d’un circuit d’asservissement permettant de positionner l’axe à un angle donné (entre 0 et 180°) et de maintenir la position. Il s’agit d’un composant emblématique des solutions robotiques à pattes.

2. Le moteur continu tourne dès qu’il est mis sous tension. Le sens de rotation est inversé si la tension d’alimentation est inversée ! Ce type de moteur, très bon marché et simple à utiliser, est présent dans une très vaste gamme de produits. Parfois équipé d’un réducteur de vitesse, le moteur continu devient capable de développer un couple suffisant pour ouvrir/fermer une trappe, une porte. Grâce à la boîte de réduction (rapport 1:75, 1:100), la vitesse du moteur est réduite tout en offrant un couple supérieur.  

3. Le moteur pas-à-pas a ceci de particulier qu’il est possible de contrôler finement la rotation de son axe. Grâce à un circuit de commande adéquat, le moteur peut tourner par pas de 1,8 degré (pour un moteur de 200 pas). Les contrôleurs récents peuvent même contrôler la rotation par 1/2, 1/4, … 1/16, 1/32 de pas. Il n’est donc pas étonnant de trouver ce type de motorisation sur les imprimantes 3D.

À propos des moteurs continus

Il serait utile d’apporter quelques...

Afficheurs

Les afficheurs permettent au projet de communiquer avec le monde extérieur. Les afficheurs, quel que soit leur type (écrans graphiques, afficheurs LCD alphanumériques, afficheurs 4x7 segments ou simples LED) sont parfaits pour réaliser des interfaces homme-machine où c’est la machine qui communique avec l’homme.

Les LED ayant déjà été abordées à de multiples reprises, cette section s’attardera sur des LED dites intelligentes (WS2812b) également appelées NeoPixel.

1. LED NeoPixel

NeoPixel est le nom commercial utilisé par Adafruit Industries pour ses produits à base de LED WS2812b. La gamme NeoPixel est rapidement devenue populaire auprès des makers car le champ d’application dépasse largement l’interface homme-machine et permet de conquérir les domaines artistiques, ludiques et même des écrans de grande taille (en montant les LED en matrice).

images/09RI92.png

LED NeoPixel (WS28126)

Une LED NeoPixel, ou LED WS2812, est une LED RGB (rouge, vert, bleu, couleur 24 bits) autonome disposant d’une puce de pilotage dédiée placée directement sous la LED. La communication des données de couleurs aux différentes LED se fait par l’intermédiaire d’un seul signal de données qui passe de LED en LED. Il faut donc une seule ligne de données sur le microcontrôleur pour contrôler de multiples LED RGB, chacune pouvant produire une couleur spécifique. Ces LED sont aussi dites « adressables » puisqu’il est possible d’adresser une couleur différente à chacune d’entre elles.

En simplifiant les raccordements à l’extrême, aussi simple qu’une « guirlande de Noël », cette technologie aura radicalement simplifié le travail de câblage des projets à base de LED.

La simplification du câblage n’est pas la seule raison à la popularité des LED WS2812. Le circuit intégré dans la LED dispose également d’une alimentation à courant constant. Celle-ci permet de conserver un courant constant dans la LED même si la tension varie sensiblement. C’est le passage du courant dans une LED qui la rend luminescente. Si ce courant est constant, alors la luminosité...

Interface UART

1. Module GPS

Le module GPS est un périphérique série calculant ses coordonnées de localisation à partir des réseaux de satellites de positionnement comme GPS (États-Unis), Galileo (Union européenne), GLONASS (Russie), Beidou (Chine). De nos jours, les modules GPS sont capables de s’appuyer simultanément sur plusieurs réseaux.

Ces informations sont communiquées vers l’hôte (microcontrôleur, ordinateur) via l’UART du module GPS en respectant le protocole NMEA relativement simple (https://fr.wikipedia.org/wiki/NMEA_0183) et même directement lisible. Le protocole NMEA permet de disposer d’informations comme le temps universel, la date, la latitude, la longitude, la vitesse de déplacement.

Ce protocole, déjà exposé avec un certain niveau de détail dans la programmation de l’interface UART (cf. Programmer - Interface UART), sera exploité par l’intermédiaire d’une bibliothèque.

images/09RI132.png

GPS ultime d’Adafruit

Le module choisi est un breakout GPS Ultimate d’Adafruit Industries. Celui-ci a l’avantage de fonctionner « out-of-the-box » sans préparatifs particuliers.

Le breakout expose les broches suivantes :

Connecteur

Direction

Description

VIN et GND

 

Connexions de l’alimentation (3 V à 5 V) et la masse.

RX

Entrée

Broche d’entrée UART. Permet au module GPS de recevoir des instructions de configuration.

TX

Sortie

Broche de sortie UART. Le module GPS émet les trames du protocole NMEA sur cette broche.

FIX

Sortie

Broche qui pilote la LED FIX présente sur la carte. Cette LED clignote une fois par seconde durant une tentative de synchronisation avec le système GPS.

Clignote une fois (durant 200 ms) toutes les 15 secondes lorsque le module GPS est synchronisé.

PPS

Sortie

Broche PulsePerSecond qui émet une impulsion de 20 à 100 ms toutes les secondes. Ce signal peut être utilisé pour la synchronisation de différents modules.

EN

Entrée

Broche Enabled qui permet de désactiver le module GPS lorsque celle-ci est maintenue au niveau bas.

VBAT

 

Connecté sur l’horloge temps réel du GPS et lui permet de la maintenir à l’heure même lorsque le module GPS est hors...

Interface USB HID

Déjà abordée par le passé dans l’ouvrage, l’interface USB de la Pyboard supporte plusieurs modes de fonctionnement (service de stockage de masse, port série via USB et périphérique HID).

Dans cette section, c’est l’interface HID (Human-Interface-Device), une classe particulière des périphériques USB qui permet de créer des claviers, souris, joysticks, boutons, etc.

La carte Pyboard est capable d’émuler un périphérique HID comme un clavier ou une souris et permet, via un système de configuration avancée, de définir d’autres types de périphériques HID par l’intermédiaire de descripteurs (mais cela est plutôt du ressort du spécialiste).

1. Configurer l’interface USB

Le mode supporté par l’interface USB se définit dans le fichier boot.py à l’aide d’un appel à pyb.usb_mode().

Pour rappel, voici le contenu d’un fichier boot.py où seule l’interface série via USB est supportée (il s’agit de l’interface VCP pour Virtual Com Port).

# boot.py -- run on boot-up 
# can run arbitrary Python, but best to keep it minimal 
 
import machine 
import pyb 
#pyb.main('main.py') # main script to run after this one 
pyb.usb_mode('VCP') # act as a serial 
#pyb.usb_mode('VCP+HID') # act as a serial device and a mouse 
#pyb.usb_mode('VCP+MSC') # act as a serial + Mass storage device 

Il faut donc passer par l’appel de pyb.usb_mode(’VCP+HID’) pour exploiter l’interface HID (clavier ou souris). Cela se fera en retirant le caractère (#) en début de ligne puis en redémarrant la carte.

Inutile de saisir l’instruction pyb.usb_mode(’VCP+HID’) dans une session REPL. Cette opération doit impérativement être exécutée depuis le fichier boot.py.

Il est possible de consulter le mode de l’interface USB à tout moment en saisissant l’instruction pyb.usb_mode() sans paramètre.

MicroPython v1.11-126-g7c2e83324 on 2019-07-05; PYBv1.1 with STM32F405RG 
Type "help()" for more information. 
>>> 
>>> pyb.usb_mode() 
'VCP+HID' 
>>>...

Interface réseau

1. Module Ethernet

Bien que peu populaire dans notre société dominée par les réseaux WiFi, une connectivité Ethernet filaire sur un microcontrôleur peut présenter un avantage certain dans les environnements bruyants (comme l’industrie) ou sur les réseaux très étendus (comme un immeuble).

Ci-dessous l’exemple d’un module WIZ820io exploitant un module WIZNET5200.

images/09RI143.png

WIZ820io

MicroPython.org produit un firmware MicroPython intégrant un pilote WIZNET5K qui devrait donc convenir pour les modules à base de WIZNET5200 et potentiellement WIZNET5500.

Ce firmware est disponible dans la zone de téléchargement de MicroPython.org. Il faut, bien entendu, sélectionner le firmware correspondant à la carte.

images/09RI142.png

Téléchargement du firmware réseau

Celui-ci devra être téléversé en utilisant la procédure de mise à jour du firmware telle que décrite dans les annexes (cf. Annexes - mises à jour du firmware).

Une fois à jour, il est possible de brancher un module WIZNET sur le bus SPI(1) et un signal complémentaire (X4).

images/09RI144.png

Brancher un module WIZ820io

L’exploitation d’un module Ethernet est documentée sur la page du pilote Wiznet5K : http://docs.micropython.org/en/v1.9.3/pyboard/library/network.html

import network 
nic = network.WIZNET5K( pyb.SPI(1), 
              pyb.Pin.board.X5, pyb.Pin.board.X4) 
print(nic.ifconfig()) 
 
# Il est maintenant possible d'utiliser les sockets 
... 

Une fois la connexion établie, il est possible d’utiliser les sockets, exactement comme pour l’interface WiFi native de MicroPython (cf. Prise de contrôle - Le mode station (STA)).

>>> import usocket as socket 
>>> addr = socket.getaddrinfo('micropython.org', 80)[0][-1] 
>>> addr 
('176.58.119.26', 80) 
>>> s = socket.socket() 
>>> s.connect(addr) 
>>> s.send(b'GET / HTTP/1.1\r\nHost: micropython.org\r\n\r\n') 
41 
>>> data = s.recv(1000) 
>>> while data: 
...     print( data ) 
...     data = s.recv(1000) 

2. Module WiFi

Un module WiFi peut être utilisé pour...