MCP3008: lecture des signaux analogiques sur le Raspberry Pi

MCP3008 lecture des signaux analogiques sur le Raspberry Pi
MCP3008 lecture des signaux analogiques sur le Raspberry Pi

De nombreux capteurs développés à l’origine pour l’Arduino n’offrent pas d’interface numérique et ne peuvent être lus qu’en analogique. Le problème est que le Raspberry Pi avec ses GPIO ne peut pas lire les signaux analogiques, c’est pourquoi vous avez besoin d’un convertisseur analogique-numérique (ADC) comme le MCP3008. Cela signifie que jusqu’à 8 entrées analogiques peuvent être lues via le bus SPI du Raspberry Pi.

Dans cet article, il y a une explication et une classe Python, avec lesquelles les signaux de tous les capteurs et modules analogiques peuvent être lus.

Une possibilité est, bien sûr, de connecter un Arduino au Raspberry Pi, car il possède également des broches d’E / S analogiques et peut donc lire ces signaux sans ADC. Son fonctionnement est décrit en détail dans le didacticiel lié. L’inconvénient de ceci, cependant, est que d’une part, vous avez un autre microcontrôleur et qu’il ne peut pas être adressé via Python. Étant donné que Python convient particulièrement comme langage de programmation d’entrée de gamme, la plupart des didacticiels de cette page utilisent également Python. Un Arduino, cependant, est programmé avec C ++.

Matériel requis

En plus de MCP3008 ADC, vous devriez également avoir Câbles de démarrage et un Planche à pain.

De plus, il existe un grand nombre de capteurs ou de modules qui ne peuvent être lus qu’en analogique, par exemple:

Pour la plupart de ces modules, vous trouverez également des instructions plus détaillées et / ou des projets qui les utilisent sur ce site. Cependant, si vous suivez ce didacticiel, vous pourrez lire tout autre capteur / module analogique.

Différences entre analogique et numérique

Il n’y a que deux états pour les signaux numériques: ON / HIGH ou OFF / LOW (1 ou 0). Si l’on suppose un maximum numérique tension d’entrée de 5 V, toute valeur entre 0 V et 0,4 V serait reconnue comme un niveau BAS et une valeur entre 2,4 V et 5 V comme un niveau HAUT. Toutes les valeurs intermédiaires ne sont pas définies. Si vous appliquez une telle tension, le signal serait reconnu au hasard comme 0 ou 1. Cependant, comme cela n’est pas cohérent, un signal numérique ne devrait jamais être dans cette zone grise.

Contrairement aux signaux numériques, un signal analogique peut également prendre des valeurs intermédiaires, il n’est donc pas clairement défini. Par exemple, des valeurs en pourcentage sont données (valeur ÷ tension appliquée), que de nombreux capteurs analogiques utilisent.
Pour lire cette tension sur le Raspberry Pi, un convertisseur analogique-numérique comme le MCP3008 doit être utilisé. Cependant, cela ne spécifie pas des valeurs en volts, mais un nombre compris entre 0 et 1023, ce qui correspond à 10 bits (2 ^ 10). La tension peut être déterminée comme suit:

(ADC Value ÷ 1023) * Voltage

Si le capteur analogique fonctionne avec une tension de 3,3 V et qu’une valeur de 789 a été lue, la tension appliquée correspond à 2,54 volts.

Connexion entre Raspberry Pi et MCP3008

Brochage du Raspberry Pi MCP3008

Les 8 canaux analogiques lisibles se trouvent sur le côté gauche du MCP3008.

Le moyen le plus simple d’adresser un convertisseur analogique-numérique consiste à utiliser le bus SPI. Les 8 signaux peuvent être lus avec une requête et convertis.

Comme on peut le voir dans le Fiche technique, l’ADC tolère une tension d’entrée comprise entre 2,7 V et 5 V. Étant donné que les GPIO fonctionnent avec 3,3 V et peuvent se casser à des tensions plus élevées, le MCP3008 ne doit fonctionner qu’avec 3,3 V. Si vous utilisez un module analogique dont la tension d’entrée est supérieure à 3,3 V (et qui peut également la transmettre), vous devez vous assurer qu’il n’atteint pas le CAN. Pour cela, par ex. Des résistances série sont utilisées et cela peut être pris en compte dans la suite (calculs, etc.).

La connexion au Raspberry Pi est assez simple car seuls les GPIO utilisés sont également destinés au bus SPI:

Raspberry PI MCP3008
Broche 1 (3,3 V) Broche 16 (VDD)
Broche 1 (3,3 V) Broche 15 (VREF)
Broche 6 (GND) Broche 14 (AGND)
Broche 23 (SCLK) Broche 13 (CLK)
Broche 21 (MISO) Broche 12 (DOUT)
Broche 19 (MOSI) Broche 11 (DIN)
Broche 24 (CE0) Broche 10 (CS / SHDN)
Broche 6 (GND) Broche 9 (DGND)

La connexion ressemble alors à ceci, même si je n’ai explicitement pas placé de capteur sur le côté droit, car tous les signaux numériques peuvent être lus de cette manière:

Connexion ADC Raspberry Pi MCP3008

Préparation

Avant que les valeurs puissent être lues, les sources de paquets doivent être mises à jour et une bibliothèque pour SPI doit être installée et bien sûr, le bus SPI doit être activé, car il est désactivé dans Raspbian par défaut.

Commençons par mettre à jour les packages et installer les outils Python Developer:

sudo apt-get update 
sudo apt-get upgrade
sudo apt-get install python-dev

Ensuite, nous pouvons télécharger, décompresser et installer le SpiDev bibliothèque:

wget https://github.com/doceme/py-spidev/archive/master.zip 
unzip master.zip
cd py-spidev-master
sudo python setup.py install

Enfin et surtout, le bus SPI doit toujours être activé s’il n’a pas déjà été fait. Dans Raspbian Jessie (et d’autres systèmes d’exploitation basés sur lui), la configuration du Raspberry Pi peut être modifiée à l’aide de sudo raspi-config. L’option «SPI» se trouve sous «Options avancées». Ici, vous activez SPI puis redémarrez le système (si aucune requête correspondante ne vient: sudo reboot).

Classe Python pour le Raspberry Pi ADC MCP3008

La classe suivante vous permet d’accéder facilement à l’ADC MCP3008. Vous pouvez soit télécharger le fichier ici ou créez-le en utilisant sudo nano MCP3008.py et insérez le code suivant:

Vous pouvez maintenant insérer ce fichier dans tous vos dossiers de projet et l’intégrer simplement:

La classe doit ensuite être initialisée une fois et les 8 canaux analogiques peuvent être lus:

Maintenant, rien ne devrait empêcher le fonctionnement de tous les modules Arduino / Genuino possibles sur le Raspberry Pi.

  • Waveshare High-Precision AD Hat for Raspberry Pi/Jetson Nano with ADS1263 Onboard 10-Ch 32-Bit Support ADC AD Input Headers for Analog Sensor Module and AD Input Screw Terminal for Analog Signal
    Compatible With Raspberry Pi Series And Jetson Nano Adopts ADS1263 chip, low noise, low temperature drift, 10-ch 32-bit high precision ADC (5-ch differential input), 38.4kSPS Max sampling rate with embedded 24-bit auxiliary ADC, internal ADC test signal, IDAC, 2.5V internal reference voltage, 8x multiplexing GPIO, PGA (32 times Max) Onboard AD header input, compatible with Waveshare sensor pinout, for connecting sorts of sensor modules Onboard AD screw terminal input, allows connecting analog signal and analog power supply, general purpose interface Onboard control header, make it easy to control the module by other hosts in additional to Raspberry Pi;Three-wire RTD (resistor temperature detector) circuit, enabled by soldering 0R resistor