Lecture analogique avec un MCP3008

Nombreux sont les capteurs fournissant un signal analogique, malheureusement la raspberry ne possède pas d’entrée analogique. La mise en place d’un circuit MCP3008 permet de palier à se problème et de pouvoir y connecter des capteurs analogiques.

Le Raspberry pi ne dispose pas d’entrée analogique, ses pins ne peuvent lire que des valeurs numériques « 1 » ou « 0 » ( tuto). Malheureusement, beaucoup de capteur (potentiomètre, photorésistance, sonde de température, capteur de force) fournisse une valeur numérique. Nous pouvons cependant ajouter un convertisseur numérique vers analogique pour pouvoir récupérer ses données, ici nous utiliserons le MCP3008.

Convertisseur analogique numérique MCP3008

Présentation du MCP3008

Comme je l’ai déjà dit, le MCP3008 est un convertisseur analogique numérique qui va permettre de transformer une valeur numérique en suite de 0 et 1. La donnée convertie sera sous forme de 8 bits donc la valeur lue sera une approximation avec un pas de 1 sur entre 0 et 1024 (nombre de valeur pouvant contenir 10 bits). Il peut être alimenté entre 2.7V et 5.5V, nous utiliserons donc l’alimentation en 3.3V.

Principe de fonctionnement

Sans entrer dans les détails, c’est juste pour comprendre ce qu’il fait. Sur une des 8 entrées disponibles (pour l’exemple nous prendrons la première a0), on vient connecter notre capteur, le fonctionnement de se capteur sera représenté par une variation de sa tension à ses bornes (dans le cas d’un potentiomètre, lorsque la résistance varie, la tension à ses bornes varie et si il est alimenté entre 0V et 3.3V comme le MCP3008, la tension sera donc comprise entre 0V et 3.3V). Le MCP3008 viendra mesuré cette tension et la convertir en binaire sur 10 bits. Pour l’exemple avec un potentiomètre de 10 kΩ :

tableau correspondance
tableau correspondance

Bien entendu, ceci est purement théorique.
Il est donc important de savoir et comprendre ce que l’on veut mesurer pour interpréter cette valeur de retour

Diagramme et nom du MCP3008

Voici le diagramme est les noms des différentes pattes :

MCP3008
MCP3008

Câblage

Le raspberry possède des entrées sli mais toutes les distributions ne prennent pas en charge l’interface SLI. Sur internet vous trouverai beaucoup d’exemple qui viennent simuler ce protocole, il n’est pas long à mettre en place et offre l’énorme avantage de pouvoir modifier le numéro des broches, voici un câblage type :

cablage MCP3008
cablage MCP3008

Codage en python

Pour lire la valeur ou les valeurs, il suffit d’intégrer ce code en python à votre script en python et de faire appel à la fonction :

#!/usr/bin/env python
import time
import os
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
#fonction lisant les donnees SPI de la puce MCP3008, parmi 8 entrees, de 0 a 7
def readadc(adcnum, clockpin, mosipin, misopin, cspin):
     if ((adcnum > 7) or (adcnum < 0)):
          return -1
     GPIO.output(cspin, True)
     GPIO.output(clockpin, False) # start clock low
     GPIO.output(cspin, False) # bring CS low
     commandout = adcnum
     commandout |= 0x18 # start bit + single-ended bit
     commandout <<= 3 # we only need to send 5 bits here
     for i in range(5):
          if (commandout & 0x80):
               GPIO.output(mosipin, True)
          else:
               GPIO.output(mosipin, False)
     commandout <<= 1
          GPIO.output(clockpin, True)
          GPIO.output(clockpin, False)
     adcout = 0
     # read in one empty bit, one null bit and 10 ADC bits
     for i in range(12):
          GPIO.output(clockpin, True)
          GPIO.output(clockpin, False)
          adcout <<= 1
          if (GPIO.input(misopin)):
                    adcout |= 0x1
     GPIO.output(cspin, True)
     adcout /= 2 # first bit is 'null' so drop it
return adcout

Ce code sera à intégrer avec le votre. Vu sur nagashur.

Exemple avec MCP3008 et potentiomètre

Le but de cette exemple est de donner la valeur de la résistance.

Câblage

cablage exemple MCP3008
cablage exemple MCP3008

<h3>Codage</h3>

Voici le code complet, il est très important de ne pas oublier de déclarer les variables SPICLK, SPIMISO, SPIMOSI, SPICS, indispensables pour définir l’interface SPI, je ne les ai pas mis dans le code précédent car on peut très bien imaginer avoir besoin de 2 MCP3008 et de définir deux interface SLI différentes :

#!/usr/bin/env python
import time
import os
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
#fonction lisant les donnees SPI de la puce MCP3008, parmi 8 entrees, de 0 a 7
def readadc(adcnum, clockpin, mosipin, misopin, cspin):
     if ((adcnum > 7) or (adcnum < 0)):
          return -1
     GPIO.output(cspin, True)
     GPIO.output(clockpin, False) # start clock low
     GPIO.output(cspin, False) # bring CS low
     commandout = adcnum
     commandout |= 0x18 # start bit + single-ended bit
     commandout <<= 3 # we only need to send 5 bits here
     for i in range(5):
          if (commandout & 0x80):
               GPIO.output(mosipin, True)
          else:
               GPIO.output(mosipin, False)
     commandout <<= 1
          GPIO.output(clockpin, True)
          GPIO.output(clockpin, False)
     adcout = 0
     # read in one empty bit, one null bit and 10 ADC bits
     for i in range(12):
          GPIO.output(clockpin, True)
          GPIO.output(clockpin, False)
          adcout <<= 1
          if (GPIO.input(misopin)):
                    adcout |= 0x1
     GPIO.output(cspin, True)
     adcout /= 2 # first bit is 'null' so drop it
     return adcout
# ces numeros de pins GPIO doivent etre modifies pour correspondre aux broches utilisées si vous avez utilisé un autre câblage que celui du tutoriel.
SPICLK = 18
SPIMISO = 23
SPIMOSI = 24
SPICS = 25
# definition de l'interface SPI
GPIO.setup(SPIMOSI, GPIO.OUT)
GPIO.setup(SPIMISO, GPIO.IN)
GPIO.setup(SPICLK, GPIO.OUT)
GPIO.setup(SPICS, GPIO.OUT)
#definition du ADC utilise (broche du MCP3008). Cette valeur peut aller de 0 à 7.
adcnum = 0
# Lecture de la valeur brute du capteur
read_adc0 = readadc(adcnum, SPICLK, SPIMOSI, SPIMISO, SPICS)
# conversion de la valeur brute lue en milivolts = ADC * ( 10000 / 1024 )
resistance = read_adc0 * ( 3300.0 / 1024.0)
print "[CODE_ligne]\[/CODE_ligne]tvaleur brute : %s" % read_adc0
print "[CODE_ligne]\[/CODE_ligne]tRésistance : %s ohms" % resistance

Voila vous êtes en mesure de venir lire n’importe quelle sonde analogique avec ce petit guide.

2 Replies to “Lecture analogique avec un MCP3008”

Laisser un commentaire