De nombreux capteurs développés à l’origine pour l’Arduino n’offrent pas d’interface numérique et ne peuvent être lus que de manière analogique. Le problème est que le Raspberry Pi, avec ses GPIO, ne peut pas lire de 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 laquelle 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, puisqu’il possède également des broches d’E/S analogiques et peut donc lire ces signaux sans ADC. La façon dont cela fonctionne est décrite en détail dans le tutoriel lié. L’inconvénient, 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 est particulièrement adapté comme langage de programmation d’entrée de gamme, la plupart des tutoriels de cette page utilisent également Python. Un Arduino, en revanche, se programme en C ++.
Pièces de matériel requises
En plus du MCP3008 ADC, vous devez aussi avoir des Câbles Jumper et un Breadboard.
En outre, il existe un grand nombre de capteurs ou de modules qui ne peuvent être lus qu’en analogique, par exemple :
- Joysticks
- Capteurs de distance à infrarouge
- Capteurs de pulsation/ fréquence cardiaque
- Capteurs de son
- Capteurs d’humidité
- capteur photo
- Codeur rotatif
- Capteurs de gaz MQ
- et bien d’autres encore
Pour la plupart de ces modules, vous trouverez également sur ce site des instructions plus détaillées et/ou des projets qui les utilisent. Cependant, si vous suivez ce tutoriel, vous serez en mesure de lire n’importe quel autre capteur/module analogique.
Différences entre l’analogique et le numérique
Il n’existe que deux états pour les signaux numériques : ON/HIGH ou OFF/LOW (1 ou 0). Si l’on suppose une tension d’entrée numérique maximale de 5V, toute valeur comprise entre 0V et 0,4V sera reconnue comme un niveau BAS et une valeur comprise entre 2,4V et 5V comme un niveau HAUT. Toutes les valeurs intermédiaires sont indéfinies. Si vous appliquez une telle tension, le signal sera reconnu aléatoirement comme 0 ou 1. Cependant, comme cela n’est pas cohérent, un signal numérique ne devrait jamais se trouver 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, les valeurs en pourcentage sont données (valeur ÷ tension appliquée), ce que de nombreux capteurs analogiques utilisent.
Pour lire cette tension sur le Raspberry Pi, il faut utiliser un convertisseur analogique-numérique comme le MCP3008. Cependant, celui-ci ne spécifie pas des valeurs en volts, mais un nombre 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
La façon la plus simple d’adresser un convertisseur analogique-numérique est d’utiliser le bus SPI. Les 8 signaux peuvent être lus avec une requête et convertis.
Comme on peut le voir dans la fiche technique, le CAN tolère une tension d’entrée comprise entre 2,7V et 5V. Etant donné que les GPIOs fonctionnent avec 3.3V et qu’elles peuvent se rompre à des tensions plus élevées, le MCP3008 ne doit être utilisé qu’avec 3.3V. Si vous utilisez un module analogique qui a une tension d’entrée plus élevée que 3.3V (et qui peut aussi la transmettre), vous devez vous assurer qu’elle n’atteint pas l’ADC. Pour cela, on utilise par exemple des résistances en série qui peuvent être prises en compte dans la suite du parcours (calculs, etc.).
La connexion au Raspberry Pi est assez simple puisque seuls les GPIOs qui sont également destinés au bus SPI sont utilisés :
RaspberryPi | MCP3008 |
---|---|
Pin 1 (3.3V) | Pin 16 (VDD) |
Pin 1 (3.3V) | Pin 15 (VREF) |
Pin 6 (GND) | Pin 14 (AGND) |
Pin 23 (SCLK) | Pin 13 (CLK) |
Pin 21 (MISO) | Pin 12 (DOUT) |
Pin 19 (MOSI) | Pin 11 (DIN) |
Pin 24 (CE0) | Pin 10 (CS/SHDN) |
Pin 6 (GND) | Pin 9 (DGND) |
La connexion ressemble alors à ceci, bien que je n’aie explicitement pas placé de capteur sur le côté droit, car tous les signaux numériques peuvent être lus de cette manière :
Préparation
Avant de pouvoir lire les valeurs, il faut mettre à jour les sources de paquets et installer une bibliothèque pour SPI et, bien sûr, activer le bus SPI, car celui-ci est désactivé par défaut dans Raspbian.
Commençons par mettre à jour les paquets 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 la bibliothèque SpiDev :
wget https://github.com/doceme/py-spidev/archive/master.zip unzip master.zip cd py-spidev-master sudo python setup.py install
Enfin, le bus SPI doit encore être activé si ce n’est pas encore fait. Dans Raspbian Jessie (et d’autres systèmes d’exploitation basés sur ce dernier), la configuration du Raspberry Pi peut être modifiée en utilisant les commandes suivantes sudo raspi-config
. L’option « SPI » se trouve sous « Options avancées ». Vous activez ici le SPI et redémarrez ensuite le système (si aucune requête correspondante ne vient: sudo reboot
).
Classe Python pour l’ADC MCP3008 de Raspberry Pi
La classe suivante vous permet d’accéder facilement à l’ADC MCP3008. Vous pouvez soit télécharger le fichier ici ou le créer en utilisant sudo nano MCP3008.py
et insérez le code suivant :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
from spidev import SpiDev class MCP3008: def __init__(self, bus = 0, device = 0): self.bus, self.device = bus, device self.spi = SpiDev() self.open() self.spi.max_speed_hz = 1000000 # 1MHz def open(self): self.spi.open(self.bus, self.device) self.spi.max_speed_hz = 1000000 # 1MHz def read(self, channel = 0): adc = self.spi.xfer2([1, (8 + channel) << 4, 0]) data = ((adc[1] & 3) << 8) + adc[2] return data def close(self): self.spi.close() |
Vous pouvez alors insérer ce fichier dans tous les dossiers de votre projet et l’intégrer simplement :
1 |
from MCP3008 import MCP3008 |
La classe doit ensuite être initialisée une fois et les 8 canaux analogiques peuvent être lus :
3 4 5 |
adc = MCP3008() value = adc.read( channel = 0 ) # Vous pouvez bien entendu adapter le canal à lire print("Tension appliquée : %.2f" % (valeur / 1023.0 * 3.3) ) |
Maintenant, plus rien ne devrait vous empêcher de faire fonctionner tous les modules Arduino/Genuino possibles sur le Raspberry Pi.
Un commentaire
Bonjour,
La dernière ligne de commande « sudo python setup.py install » ne fonctionne pas pour moi, il n’y aurait pas une erreur.
Merci