Utilisation d'un convertisseur analogique numérique MCP3008 sur Raspberry Pi
Contrairement à un microcontrôleur tel que le ATmega328 qui équipe les cartes Arduino Uno, le Raspberry Pi n'est doté que de GPIO pouvant être utilisés en entrées/sorties numériques. On ne peut donc lire que des 0 ou des 1, il n'est pas possible d'effectuer une lecture de valeurs analogiques, comme celles fournies par un simple potentiomètre.
Il nous faut donc passer par un ADC (Analog Digital Converter) “dont la fonction est de traduire une grandeur analogique en une valeur numérique (codée sur plusieurs bits), proportionnelle au rapport entre la grandeur analogique d'entrée et la valeur maximale du signal.” (pour les infos détaillées, vous pouvez suivre https://fr.wikipedia.org/wiki/Convertisseur_analogique-num%C3%A9rique)
Il existe différents modèles d'ADC, proposant plus ou moins de canaux d'entrées analogiques. Pour notre exemple, nous utilisons un MCP3008 qui permet la lecture de 8 canaux analogiques. Il se raccorde au Raspberry Pi en utilisant une connexion série SPI (Serial Peripheral Interface : https://fr.wikipedia.org/wiki/Serial_Peripheral_Interface) qui utilisera 4 GPIO.
Préparation du Raspberry Pi
Deux méthodes de raccordement sont possibles : “matériel” : via le bus SPI, obligeant l'utilisation des 3 GPIOs spécifiques : MOSI, MISO, SCLK “logiciel” : un peu plus lent mais plus souple car elle permet d'utiliser n'importe quels GPIOs du Raspberry Pi
Dans nos exemples nous utiliserons le bus SPI, nous activons donc l'interface depuis l'outil raspi-config
sudo raspi-config
puis on descend sur le menu : 5 Interfacing Options et enfin P4 Enable/Disable automatic loading of SPI kernel module
Pour une utilisation du MCP3008 en langage Python nous commençons par installer les prérequis :
sudo apt-get install build-essential python-dev python-smbus python-pip
puis la bibliothèque spécifique qui simplifie l'utilisation du MCP3008 pour python (développée par Adafruit pour circuitpython) :
pip install adafruit-circuitpython-adafruit_mcp3xxx
Le montage
Le MCP3008 se positionne avec l'encoche sur le haut sur une breadboard.
Les 8 ports de gauche correspondent aux canaux analogiques, de haut en bas, de 0 à 7.
Les 8 ports de droite, de haut en bas seront reliés :
- VDD sur 3.3V
- VREF sur 3.3V
- AGND sur la masse
- CLK sur le port SCLK
- DOUT sur le port MISO
- DIN sur le port MOSI
- CS sur GPIO05
- DGND sur la masse GND
Pour un schéma des GPIO du Raspberry Pi, voir https://fr.pinout.xyz/#
Exemple : Utilisation d'un potentiomètre
Le montage
Nous relions notre potentiomètre au Raspberry Pi et au MCP3008 de cette manière :
- GND (fil noir) : sur la masse GND
- VCC (fil rouge) : sur 3.3V
- OUT (fil jaune) : sur le canal 0 du MCP3008
Le montage complet :
Le code
``` #On importe les modules nécessaires import time import busio import digitalio import board import adafruit_mcp3xxx.mcp3008 as MCP from adafruit_mcp3xxx.analog_in import AnalogIn
#On déclare notre bus SPI spi = busio.SPI(clock=board.SCK, MISO=board.MISO, MOSI=board.MOSI) cs = digitalio.DigitalInOut(board.D5)
#On déclare notre MCP mcp = MCP.MCP3008(spi, cs)
#On lit le canal 0 du MCP channel = AnalogIn(mcp, MCP.P0)
#Boucle infinie while True:
#On affiche la valeur lue print('Valeur brute : ', channel.value) #On affiche le voltage print('Voltage : ' + str(channel.voltage) + 'V') #On fait une petite pause time.sleep(0.5)
``` En tournant le potentiomètre la valeur Voltage affichée varie normalement de ~0.1 à ~3.3V