Commencez à mesurer le monde qui vous entoure avec ce projet pratique et complet.
Points clés à retenir
- Le Raspberry Pi ne dispose pas d'entrée analogique, mais vous pouvez ajouter des CAN externes pour convertir les tensions du monde réel en forme numérique à des fins d'enregistrement, de manipulation et de contrôle.
- Les options ADC populaires incluent MCP3004/MCP3008 pour un compromis entre vitesse et précision ou ADS111x pour des lectures 16 bits à une fréquence d'échantillonnage plus lente.
- L'ADS1115 d'Adafruit est une option simple avec un amplificateur de gain programmable (PGA) qui vous permet de détecter de petites différences de tension et d'ajuster le gain pendant le programme. Le câbler avec Raspberry Pi en utilisant I2C est simple.
Hors de la boîte, le Raspberry Pi n'a pas d'entrée analogique. Cela le désavantage par rapport aux cartes basées sur un microcontrôleur comme l'Arduino.
Mais ne désespérez pas: de nombreuses options s’offrent à vous. Soyez opérationnel avec Raspberry Pi et un ADC externe.
Pourquoi ajouter des entrées?
Le monde réel regorge de phénomènes qui, si vous disposez des circuits appropriés, peuvent être facilement décrits à l’aide d’une tension. Obtenez ces tensions sous forme numérique et vous pourrez les enregistrer, les manipuler et les utiliser pour contrôler d'autres paramètres et appareils.
Vous cherchez peut-être à surveiller l’humidité de votre sol, la température de votre serre ou le poids de votre hamster. Vous cherchez peut-être à ajouter un contrôle de volume à votre Pi, à créer une banque complète de faders ou à concevoir un joystick à partir de zéro. Les possibilités sont plus ou moins illimitées.
Options pour les ADC
Alors, quel ADC convient le mieux aux débutants ?
Parmi les options les plus populaires et les plus simples figurent les MCP3004 (et MCP3008) puces de Microchip. Vous obtiendrez quatre (ou huit) canaux de 10 bits chacun, pouvant lire jusqu'à 200 kSPS. D'un autre côté, il existe les appareils ADS111x de Texas Instruments, qui lisent 16 bits à 860 SPS. Il y a donc un compromis entre vitesse et précision (et, bien sûr, prix).
De nombreux microcontrôleurs sont livrés avec des CAN intégrés. L'ATMega que vous trouvez sur l'Arduino moyen proposera plusieurs canaux 10 bits, en plus de tout le reste. C’est ce qui permet à l’Arduino de fournir des entrées analogiques là où le Raspberry Pi ne le peut pas. Si vous avez déjà un Arduino impliqué dans votre configuration et que 10 bits suffisent pour une fidélité, cela pourrait en fait être la solution la plus simple.
Ici, nous allons faire simple, avec un ADS1115 d'Adafruit.
Qu'est-ce qu'un amplificateur de gain programmable?
Cette puce est dotée de quelques fonctionnalités intéressantes, notamment un amplificateur de gain programmable (PGA). Cela vous permettra de définir numériquement la plage de valeurs souhaitée, jusqu'à une fraction de volt. Avec le nombre de valeurs que peuvent représenter 16 bits, cela permettra de détecter des différences de quelques microvolts seulement.
L'avantage ici est que vous pouvez modifier le gain à mi-chemin du programme. D'autres puces, comme la MCP3004, adoptent une approche différente; ils sont livrés avec une broche supplémentaire à laquelle vous pouvez fournir une tension de référence.
Qu’en est-il du multiplexage?
Un multiplexeur (ou mux) est un commutateur qui vous permet de lire de nombreuses entrées à l'aide d'un seul CAN. Si votre puce ADC est livrée avec de nombreuses broches d'entrée, un multiplexage interne est alors en cours. Le multiplexeur de l'ADS1115 permet quatre entrées, que vous pouvez sélectionner via les registres internes.
Gérer les registres
L'ADS1115 offre ces options, et quelques autres encore. Vous pouvez gérer le multiplexeur, régler le gain, activer le comparateur intégré, modifier la fréquence d'échantillonnage et mettre l'appareil en mode veille à faible consommation, le tout en actionnant quelques commutateurs.
Mais où sont ces interrupteurs? Ils se trouvent à l’intérieur du package, sous la forme de très petits morceaux de mémoire appelés registres. Pour activer une fonctionnalité donnée, il vous suffit de mettre le bit correspondant à 1, plutôt qu'à 0.
Regarder la fiche technique de l'ADS111x, vous constaterez que ces modèles sont livrés avec quatre registres, y compris les registres de configuration qui régissent le comportement de l'appareil.
Par exemple, les bits 14 à 12 contrôlent le multiplexeur. En utilisant ces trois bits, vous pouvez choisir parmi huit configurations. Celui que vous voudrez ici est « 100 », qui donnera la différence entre le zéro d’entrée et la masse. Les bits 7 à 5, quant à eux, régissent la fréquence d'échantillonnage. Si vous souhaitez un maximum de 860 échantillons par seconde, vous pouvez le définir sur « 111 ».
Une fois que vous savez quelles options définir, vous aurez deux octets à envoyer à l’ADC. Si vous souhaitez ultérieurement définir un seul bit ici ou là, vous pouvez les traiter individuellement à l'aide d'opérateurs au niveau du bit.
C’est ici que cela pourrait prêter à confusion. Dans ce cas, le binaire ne représente pas une valeur, mais les valeurs de commutateurs individuels. Vous pouvez exprimer ces variables sous la forme d'un grand nombre, en décimal ou en hexadécimal. Mais si vous voulez éviter les maux de tête, vous devez vous en tenir à la version binaire, plus facile à lire.
Câblage
Vous pouvez brancher cet appareil directement sur la planche à pain. L'entrée de tension positive acceptera n'importe où entre 2 et 5,5 V, ce qui signifie que le rail 3,3 V du Raspberry Pi fonctionnera bien.
Câblez les entrées SDA et SCL aux homologues du RPi et faites les mêmes choses avec la terre et le 3,3 V. Obtenez un potentiomètre entre les lignes de terre et de tension et placez le fil du milieu dans la première entrée de l'ADC. C’est tout ce dont vous avez besoin pour commencer !
Gérer I2C
Différents ADC fonctionnent via différents protocoles. Dans le cas de notre ADS1115, nous allons utiliser I2C.
L'exemple suivant interagira avec l'ADC à l'aide de Python. Mais avant de faire cela, vous devrez le configurer. Les versions récentes du système d'exploitation Raspberry Pi ont rendu cela très simple. Se diriger vers Préférences > Configuration Raspberry Pi. Puis, à partir du Interfaces onglet, commutateur I2C sur.
Pour vérifier que tout fonctionne, ouvrez un terminal et exécutez :
sudo i2cdetect -y 1
Cette commande produira une grille. En supposant que tout fonctionne et que vous l'avez correctement câblé, vous verrez une nouvelle valeur apparaître dans la grille. Il s'agit de l'adresse de votre ADC. Gardez à l’esprit ici qu’il s’agit d’une valeur hexadécimale, vous devez donc la préfixer avec "0x" lorsque vous l'utilisez dans le code ci-dessous. Et voilà 0x48:
Une fois que vous avez l'adresse, vous pouvez utiliser la bibliothèque SMBus pour envoyer des commandes I2C. Vous aurez affaire ici à deux méthodes. Le premier est write_word_data(), qui accepte trois arguments: l'adresse de l'appareil, le registre dans lequel vous écrivez et la valeur que vous souhaitez écrire.
La seconde est read_word_data(), qui accepte uniquement l'adresse de l'appareil et le registre. L'ADC lira en permanence les tensions et stockera le résultat dans le registre de conversion. Avec cette méthode, vous pouvez récupérer le contenu de ce registre.
Vous pouvez embellir un peu le résultat, puis l'imprimer. Avant de revenir au début de la boucle, introduisez un court délai. Cela garantira que vous n’êtes pas submergé de données.
from smbus import SMBus
import time
addr = 0x48
bus = SMBus(1)# set the registers for reading
CONFIGREG = 1
CONVERSIONREG = 0# set the address register to point to the config register
# write to the config registers
bus.write_word_data(addr, CONFIGREG, (0b00000100 << 8 | 0b10000010))# define the top of the range
TOP = 26300whileTrue:
# read the register
b = bus.read_word_data(addr, CONVERSIONREG)# swap the two bytes
b = ((b & 0xFF) << 8) | ((b >> 8) & 0xFF)
# subtract half the range to set ground to zero
b -= 0x8000# divide the result by the range to give us a value between zero and one
b /= TOP# cap at one
b = min(b, 1)# bottom is zero
b = max(b, 0)
# two decimal places
b = round(b, 2)
print(b)
time.sleep(.01)
Vous avez presque terminé. Mappez la plage de valeurs que vous obtenez sur celle que vous préférez, puis tronquez-la au nombre de décimales souhaité. Vous pouvez personnaliser la fonction d'impression afin de n'imprimer une nouvelle valeur que lorsqu'elle est différente de la dernière valeur. Si vous n'êtes pas sûr de maximum, min, et rond, tu peux consultez notre liste des 20 fonctions Python les plus importantes!
Gérer le bruit
Désormais, à moins que votre configuration ne soit super, super soignée et bien rangée, vous remarquerez du bruit. C’est l’inconvénient inhérent à l’utilisation de 16 bits au lieu de seulement dix: ce petit bruit sera plus perceptible.
En reliant l'entrée adjacente (entrée 1) à la terre et en changeant de mode pour comparer les entrées un et deux, vous pouvez obtenir des résultats beaucoup plus stables. Vous pouvez également remplacer ces longs câbles volants qui collectent le bruit par des petits et ajouter quelques condensateurs pendant que vous y êtes. La valeur de votre potentiomètre peut également faire la différence.
Il existe également des options logicielles. Vous pouvez créer une moyenne mobile ou simplement ignorer les petits changements. L’inconvénient est que du code supplémentaire imposera un coût de calcul. Si vous écrivez des instructions conditionnelles dans un langage de haut niveau tel que Python et que vous prélevez des milliers d’échantillons chaque seconde, ces coûts augmenteront rapidement.
Allez plus loin avec de nombreuses prochaines étapes possibles
Prendre des mesures via I2C est assez simple et il en va de même pour d'autres méthodes, comme SPI. Bien qu’il puisse sembler qu’il existe de grandes différences entre les options ADC disponibles, la vérité est qu’une fois que l’une d’elles fonctionne, il est facile d’appliquer les connaissances aux autres.
Alors pourquoi ne pas aller plus loin? Attachez plusieurs potentiomètres ensemble ou essayez de lire la lumière, le son ou la température. Développez le contrôleur que vous venez de créer et créez une configuration Raspberry Pi véritablement pratique !