Ajouter un ADC à votre Raspberry Pi : ce que vous devez savoir

Ajouter un ADC à votre Raspberry Pi : ce que vous devez savoir

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 puces MCP3004 (et MCP3008 ) 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 trouverez sur l’Arduino moyen offrira 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.

Une photographie d'un ADC

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 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.

En regardant 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.

un tableau de la fiche technique ADS

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 l’entrée zéro 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 les 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. Dirigez-vous vers Préférences > Configuration Raspberry Pi . Ensuite, depuis l’ onglet Interfaces , activez I2C .

Une capture d'écran de la fenêtre de configuration du Raspberry Pi

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 par « 0x » lorsque vous l’utilisez dans le code ci-dessous. Ici, c’est 0x48 :

une capture d'écran de la console RPi

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 du périphérique, le registre dans lequel vous écrivez et la valeur que vous souhaitez écrire.

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 SMBusimport timeaddr = 0x48bus = SMBus(1)# set the registers for readingCONFIGREG = 1CONVERSIONREG = 0# set the address register to point to the config register# write to the config registersbus.write_word_data(addr, CONFIGREG, (0b00000100 << 8 | 0b10000010)) # define the top of the rangeTOP = 26300while True: # 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.

Gérer le bruit

Maintenant, à 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 prenez 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 !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *