Différences entre versions de « P2E-Analog-Input-FR »
(Page créée avec « == Introduction == == Cas pratique == Dans cet exemple, nous allons utiliser la broche GP2 pour commander la LED rouge. === Branchement simplifiée === Réaliser le b… ») |
|||
(39 versions intermédiaires par le même utilisateur non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
+ | {{P2E-NAV}} | ||
+ | |||
== Introduction == | == Introduction == | ||
+ | Le Pico dispose de plusieurs entrées analogiques communément appelée A0, A1, A2 localisées sur les broches GP26, GP27 et GP28. | ||
+ | Ce type de broche permet de lire précisément la tension présente sur la broche d'entrée. A l'opposé d'une entrée numérique où il existe seulement deux valeurs (1 ou 0), l'entrée analogique retourne une valeur entière entre 0 et 65535 (valeur 16 bits). Cette valeur couvre la plage de tension entre 0V et 3.3V. | ||
+ | |||
+ | Il existe de très nombreux périphériques capable de produire une tension analogique en sortie. Le plus simple est le potentiomètre qui produit une tension de sortie proportionnelle à la rotation de son axe. Une tension analogique peut servir à fournir une référence de consigne ou dans le cas d'un capteur, produire une tension de sortie proportionnelle au phénomène physique mesuré (distance, température, luminosité, etc). | ||
== Cas pratique == | == Cas pratique == | ||
− | Dans cet exemple, nous allons utiliser | + | Dans cet exemple, nous allons utiliser l'entrée analogique A0 (GP26) pour mesurer la tension produite par le potentiomètre. Le script affiche la valeur du convertisseur et la tension correspondante |
− | + | Un potentiomètre linéaire produit une tension de proportionnelle à la position du curseur. L'image ci-dessous présente la mise en relation entre la position du curseur sur la résistance interne et la tension de sortie. | |
− | + | [[fichier:P2E-Analog-Input-Pot.png|320px]] | |
− | [[Fichier:P2E- | + | === Branchement simplifié === |
+ | |||
+ | Dans cet exemple, nous allons utiliser l'entrée analogique A0 (sur GP26) et mesurer la tension analogique produite par le potentiomètre. | ||
+ | |||
+ | [[Fichier:P2E-analog-input.png|800px]] | ||
=== Code === | === Code === | ||
Le code ci-dessous peut être saisi dans une session REPL ou dans Thonny IDE. | Le code ci-dessous peut être saisi dans une session REPL ou dans Thonny IDE. | ||
− | Cet exemple est également disponible dans le dépôt [https://github.com/mchobby/pico-2-explorer/tree/main/ | + | Cet exemple est également disponible dans le dépôt [https://github.com/mchobby/pico-2-explorer/tree/main/analog-pot analog-pot.py] . |
− | <syntaxhighlight lang="python" line> | + | <syntaxhighlight lang="python" line highlight="7,9,10"> |
− | from machine import Pin | + | from machine import Pin, ADC |
import time | import time | ||
− | |||
− | # | + | # Désactive PowerSafe (lower ripple) |
− | + | Pin( 23, Pin.OUT, value=True ) | |
− | |||
− | + | a0 = ADC( Pin( Pin.board.GP26 ) ) | |
− | + | while True: | |
+ | val = a0.read_u16() | ||
+ | volt = val*3.3/65535 | ||
+ | print( 'adc= %5i , volt= %1.2f' % (val,volt) ) | ||
+ | time.sleep_ms( 300 ) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Voici quelques explications: | Voici quelques explications: | ||
− | * '''Ligne 1''': importer la classe {{fname|Pin}} depuis le module {{fname|machine}}. | + | * '''Ligne 1''': importer la classe {{fname|Pin}} et {{fname|ADC}} depuis le module {{fname|machine}}. La classe {{fname|ADC}} permet d'interroger le convertisseur '''A'''nalog-to-'''D'''igital-'''C'''onverter (convertisseur analogique/numérique). |
− | + | * '''Ligne 5''': le '''GPIO23 contrôle le mode d'économie d'énergie de convertisseur DC/DC'''. Ce dernier est actif par défaut (niveau BAS), ce qui maximise le rendement du convertisseur mais génère aussi plus de bruit sur la tension 3.3V produite. Ce bruit se retrouvera inévitablement sur l'entrée analogique au moment de la lecture. Cette ligne du script place le GP12 au niveau HAUT, ce qui désactive le mode économique. Le rendement sera moins bon mais le bruit sur l'alimentation diminue significativement. | |
− | * '''Ligne | + | * '''Ligne 7''': création d'une instance de la classe {{fname|ADC}} permettant d'interroger le convertisseur ADC. Cette classe nécessite une broche en paramètre, celle sur laquelle se trouve l'entrée analogique. |
− | * '''Ligne 7''': | + | * '''Ligne 8''': Boucle infinie qui répète l'exécution du bloc 9 à 10. |
− | * '''Ligne 10''': l'appel | + | * '''Ligne 9''': l'appel {{fname|a0.read_u16()}} interroge le convertisseur et retourne un entier 16 bits (0 à 65535). Cette valeur est proportionnelle à la tension présente sur l'entrée. |
+ | * '''Ligne 10''': transformation de la valeur en tension. | ||
+ | * '''Lignes 11 et 12:''' affichage de la valeur et pause de 300 millisecondes avant la lecture suivante. | ||
=== Un problème? === | === Un problème? === | ||
− | + | Les valeurs affichées sont incohérente ? Voici quelques pistes de recherche: | |
− | # Vérifier votre câblage. Etes-vous bien connecté sur la broche | + | # Vérifier votre câblage. Etes-vous bien connecté sur la broche GP26 du microcontrôleur ? |
− | # | + | # Le script désactive t'il le mode d'économie d'énergie du régulateur ? |
− | |||
== Le défi == | == Le défi == | ||
− | + | Les utilisateurs de [https://thonny.org/ Thonny IDE] peuvent utiliser un outils nommé "Plotter" qui permet de visualiser, sous forme de graphique, des données générées par le script MicroPython. | |
+ | |||
+ | Le défi consiste a modifier le script pour afficher uniquement la tension (juste la valeur) puis visualiser cette information dans le "Plotter" de Thonny. | ||
+ | |||
+ | Modifiez la position du potentiomètre et visualisez l'effet sur le rendu du graphique. | ||
== Encore plus == | == Encore plus == | ||
+ | === Brancher un potentiomètre === | ||
+ | Brancher un potentiomètre est sur une entrée analogique est assez direct. Il ne faut pas oublier d'apporter la masse et la tension d'alimentation au potentiomètre. | ||
− | + | [[Fichier:P2E-pot-wiring.png|360px]] | |
+ | |||
+ | === Autres tutoriels === | ||
+ | Ce wiki contient d'autres exemples autour de l'acquisition analogique. | ||
+ | |||
+ | {{ttuto-begin}} | ||
+ | |||
+ | {{ttuto | ||
+ | |label=Photo-résistance | ||
+ | |descr=Détecter la présence de lumière et la luminosité générale avec ce capteur analogique | ||
+ | |img=tlogo-p2e-lde.png | ||
+ | |link=P2E-LDR-FR | ||
+ | }} | ||
+ | |||
+ | {{ttuto | ||
+ | |label=Temperature | ||
+ | |descr=Mesurer la température à l'aide du TMP-36 (analogique) | ||
+ | |img=tlogo-p2e-tmp36.png | ||
+ | |link=P2E-TMP36-FR | ||
+ | }} | ||
+ | |||
+ | {{ttuto-end}} | ||
== Truc et astuce == | == Truc et astuce == | ||
− | + | ||
+ | === Effectuer une moyenne === | ||
+ | Les valeurs acquises sur un ADC sont rarement d'une grande stabilité, il existe généralement une variation de quelques 1/100 ou 1/10 de volts autour de la valeur mesurée. Cela peut être provoqué par le bruit ou le type de montage mesuré (qui agit comme une antenne). Allumer un tube néon à proximité du montage au moment de la lecture est l'assurance de voir apparaître un bruit parasite sur l'ADC. | ||
+ | |||
+ | Une façon commune de pondérer l'impact de ces variations et facteur de parasitage est de réaliser des acquisitions multiples et d'en calculer une moyenne. | ||
+ | |||
+ | <syntaxhighlight lang="python" line highlight="10,11,12,14"> | ||
+ | from machine import Pin, ADC | ||
+ | import time | ||
+ | |||
+ | # Désactive PowerSafe (lower ripple) | ||
+ | Pin( 23, Pin.OUT, value=True ) | ||
+ | |||
+ | a0 = ADC( Pin( Pin.board.GP26 ) ) | ||
+ | while True: | ||
+ | # Effectuer 10 mesures | ||
+ | val = 0 | ||
+ | for i in range( 10 ): | ||
+ | val += a0.read_u16() | ||
+ | # calculer la moyenne | ||
+ | val = val/10 | ||
+ | |||
+ | # Calculer la tension | ||
+ | volt = val*3.3/65535 | ||
+ | print( 'adc=%5i , volt=%1.2f' % (val,volt) ) | ||
+ | time.sleep_ms( 300 ) | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Cet exemple est disponible dans le dépôt sous le nom [https://github.com/mchobby/pico-2-explorer/tree/main/analog-pot analog-mean.py] . | ||
+ | |||
+ | === Gérer le décalage === | ||
+ | Nombre de convertisseurs ADC présente ce que l'on appelle un offset. Cela signifie que les mesures sont légèrement décalée par rapport à ce qui serait mesuré avec un multimètre. | ||
+ | |||
+ | Cet '''offset''' est généralement le résultat de la technologie utilisée et des paramètres intervenant dans la fabrication du dit ADC. | ||
+ | |||
+ | Il est assez facile de tenir compte de cet offset, il suffit: | ||
+ | # de brancher l'entrée ADC sur la masse | ||
+ | # effectuer une série de mesures pour en calculer la moyenne. | ||
+ | # La valeur ainsi obtenue devient le nouveau point zéro. | ||
+ | |||
+ | Par la suite, il suffit de soustraire la valeur du point zero à toute les futures acquisitions de sorte à obtenir un résultat plus précis! | ||
+ | |||
+ | === ENOB = Bits significatifs === | ||
+ | L'acronymes ENOB (Effective Number of Bits) indique la précision réelle en nombre de bits lorsque l'on tient compte du bruit dans le circuit, de la qualité du convertisseur analogique, des distortions harmoniques, etc. C'est ainsi que l'on arrive à obtenir des valeurs valeurs en bits contenant des 1/10ième. | ||
+ | |||
+ | Le convertisseur ADC du Pico est réputé avoir 9.5 bits significatifs (ENOB). Il est donc possible de compter sur une mesures très stables et fiables si l'on réduit le nombre de bits dans une gamme de 9 ou 10 bits significatifs. | ||
+ | |||
+ | Dans l'exemple ci-dessous nous allons réduire la valeur de 16 bits à 10 bits (un "''down-scale''" en anglais). Sur 10 bits, la valeur numérique obtenue varie entre 0 et 1023! | ||
+ | |||
+ | Pour ne garder que les 10 bits les plus significatifs, il faut effectuer un décalage de 6 bits sur la droite. | ||
+ | |||
+ | <syntaxhighlight lang="python" line highlight="12,17"> | ||
+ | from machine import Pin, ADC | ||
+ | import time | ||
+ | |||
+ | # Désactive PowerSafe (lower ripple) | ||
+ | Pin( 23, Pin.OUT, value=True ) | ||
+ | |||
+ | a0 = ADC( Pin( Pin.board.GP26 ) ) | ||
+ | while True: | ||
+ | # Effectuer 10 mesures | ||
+ | val = 0 | ||
+ | for i in range( 10 ): | ||
+ | val += (a0.read_u16()>>6) | ||
+ | # calculer la moyenne | ||
+ | val = val/10 | ||
+ | |||
+ | # Calculer la tension | ||
+ | volt = val*3.3/1023 | ||
+ | print( 'adc_10bits=%5i , volt=%1.2f' % (val,volt) ) | ||
+ | time.sleep_ms( 300 ) | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Cet exemple est disponible dans le dépôt sous le nom [https://github.com/mchobby/pico-2-explorer/tree/main/analog-pot analog-10bits.py] . | ||
+ | |||
+ | Comme dans les exemples précédents, le script désactive le mode "PowerSafe" et le calcul d'une moyenne sur plusieurs acquisition. | ||
+ | |||
+ | Voici ce qu'il y a de neuf dans ce script: | ||
+ | * '''Ligne 12''': l'instruction {{fname|a0.read_u16()}} retourne une valeur sur 16 bit (valeur 0 à 65535). Par exemple: la valeur 27467 pour un tension de 1.38309 Volts.<br />La représentation binaire de 27467 est 0b0110101101001011.<br />Pour réduire la résolution à 10 bits, il faut enlever les 6 bits les plus à droite, ceux marqués en gras 0b0110101101'''001011''' .<br />En utilisant l'instruction mathématique de décalage sur la droite {{fname|>>}} nous obtenons le résultat escompté car 0b0110101101'''001011''' >> 6 donne 0b0110101101, ce qui correspond à la valeur numérique 429. | ||
+ | * '''Ligne 17:''' La conversion de la valeur numérique en tension utilise maintenant la valeur 1023 comme diviseur au lieu de 65535. La valeur étant maintenant encodée sur 10 bits, il faut bien entendu répartir les 3.3V sur une valeur de 0 (0b0000000000) à 1023 (0b1111111111). | ||
+ | |||
+ | |||
+ | {{P2E-TRAILER}} |
Version actuelle datée du 2 novembre 2024 à 12:29
Introduction
Le Pico dispose de plusieurs entrées analogiques communément appelée A0, A1, A2 localisées sur les broches GP26, GP27 et GP28.
Ce type de broche permet de lire précisément la tension présente sur la broche d'entrée. A l'opposé d'une entrée numérique où il existe seulement deux valeurs (1 ou 0), l'entrée analogique retourne une valeur entière entre 0 et 65535 (valeur 16 bits). Cette valeur couvre la plage de tension entre 0V et 3.3V.
Il existe de très nombreux périphériques capable de produire une tension analogique en sortie. Le plus simple est le potentiomètre qui produit une tension de sortie proportionnelle à la rotation de son axe. Une tension analogique peut servir à fournir une référence de consigne ou dans le cas d'un capteur, produire une tension de sortie proportionnelle au phénomène physique mesuré (distance, température, luminosité, etc).
Cas pratique
Dans cet exemple, nous allons utiliser l'entrée analogique A0 (GP26) pour mesurer la tension produite par le potentiomètre. Le script affiche la valeur du convertisseur et la tension correspondante
Un potentiomètre linéaire produit une tension de proportionnelle à la position du curseur. L'image ci-dessous présente la mise en relation entre la position du curseur sur la résistance interne et la tension de sortie.
Branchement simplifié
Dans cet exemple, nous allons utiliser l'entrée analogique A0 (sur GP26) et mesurer la tension analogique produite par le potentiomètre.
Code
Le code ci-dessous peut être saisi dans une session REPL ou dans Thonny IDE.
Cet exemple est également disponible dans le dépôt analog-pot.py .
1 from machine import Pin, ADC
2 import time
3
4 # Désactive PowerSafe (lower ripple)
5 Pin( 23, Pin.OUT, value=True )
6
7 a0 = ADC( Pin( Pin.board.GP26 ) )
8 while True:
9 val = a0.read_u16()
10 volt = val*3.3/65535
11 print( 'adc= %5i , volt= %1.2f' % (val,volt) )
12 time.sleep_ms( 300 )
Voici quelques explications:
- Ligne 1: importer la classe Pin et ADC depuis le module machine. La classe ADC permet d'interroger le convertisseur Analog-to-Digital-Converter (convertisseur analogique/numérique).
- Ligne 5: le GPIO23 contrôle le mode d'économie d'énergie de convertisseur DC/DC. Ce dernier est actif par défaut (niveau BAS), ce qui maximise le rendement du convertisseur mais génère aussi plus de bruit sur la tension 3.3V produite. Ce bruit se retrouvera inévitablement sur l'entrée analogique au moment de la lecture. Cette ligne du script place le GP12 au niveau HAUT, ce qui désactive le mode économique. Le rendement sera moins bon mais le bruit sur l'alimentation diminue significativement.
- Ligne 7: création d'une instance de la classe ADC permettant d'interroger le convertisseur ADC. Cette classe nécessite une broche en paramètre, celle sur laquelle se trouve l'entrée analogique.
- Ligne 8: Boucle infinie qui répète l'exécution du bloc 9 à 10.
- Ligne 9: l'appel a0.read_u16() interroge le convertisseur et retourne un entier 16 bits (0 à 65535). Cette valeur est proportionnelle à la tension présente sur l'entrée.
- Ligne 10: transformation de la valeur en tension.
- Lignes 11 et 12: affichage de la valeur et pause de 300 millisecondes avant la lecture suivante.
Un problème?
Les valeurs affichées sont incohérente ? Voici quelques pistes de recherche:
- Vérifier votre câblage. Etes-vous bien connecté sur la broche GP26 du microcontrôleur ?
- Le script désactive t'il le mode d'économie d'énergie du régulateur ?
Le défi
Les utilisateurs de Thonny IDE peuvent utiliser un outils nommé "Plotter" qui permet de visualiser, sous forme de graphique, des données générées par le script MicroPython.
Le défi consiste a modifier le script pour afficher uniquement la tension (juste la valeur) puis visualiser cette information dans le "Plotter" de Thonny.
Modifiez la position du potentiomètre et visualisez l'effet sur le rendu du graphique.
Encore plus
Brancher un potentiomètre
Brancher un potentiomètre est sur une entrée analogique est assez direct. Il ne faut pas oublier d'apporter la masse et la tension d'alimentation au potentiomètre.
Autres tutoriels
Ce wiki contient d'autres exemples autour de l'acquisition analogique.
Détecter la présence de lumière et la luminosité générale avec ce capteur analogique
Truc et astuce
Effectuer une moyenne
Les valeurs acquises sur un ADC sont rarement d'une grande stabilité, il existe généralement une variation de quelques 1/100 ou 1/10 de volts autour de la valeur mesurée. Cela peut être provoqué par le bruit ou le type de montage mesuré (qui agit comme une antenne). Allumer un tube néon à proximité du montage au moment de la lecture est l'assurance de voir apparaître un bruit parasite sur l'ADC.
Une façon commune de pondérer l'impact de ces variations et facteur de parasitage est de réaliser des acquisitions multiples et d'en calculer une moyenne.
1 from machine import Pin, ADC
2 import time
3
4 # Désactive PowerSafe (lower ripple)
5 Pin( 23, Pin.OUT, value=True )
6
7 a0 = ADC( Pin( Pin.board.GP26 ) )
8 while True:
9 # Effectuer 10 mesures
10 val = 0
11 for i in range( 10 ):
12 val += a0.read_u16()
13 # calculer la moyenne
14 val = val/10
15
16 # Calculer la tension
17 volt = val*3.3/65535
18 print( 'adc=%5i , volt=%1.2f' % (val,volt) )
19 time.sleep_ms( 300 )
Cet exemple est disponible dans le dépôt sous le nom analog-mean.py .
Gérer le décalage
Nombre de convertisseurs ADC présente ce que l'on appelle un offset. Cela signifie que les mesures sont légèrement décalée par rapport à ce qui serait mesuré avec un multimètre.
Cet offset est généralement le résultat de la technologie utilisée et des paramètres intervenant dans la fabrication du dit ADC.
Il est assez facile de tenir compte de cet offset, il suffit:
- de brancher l'entrée ADC sur la masse
- effectuer une série de mesures pour en calculer la moyenne.
- La valeur ainsi obtenue devient le nouveau point zéro.
Par la suite, il suffit de soustraire la valeur du point zero à toute les futures acquisitions de sorte à obtenir un résultat plus précis!
ENOB = Bits significatifs
L'acronymes ENOB (Effective Number of Bits) indique la précision réelle en nombre de bits lorsque l'on tient compte du bruit dans le circuit, de la qualité du convertisseur analogique, des distortions harmoniques, etc. C'est ainsi que l'on arrive à obtenir des valeurs valeurs en bits contenant des 1/10ième.
Le convertisseur ADC du Pico est réputé avoir 9.5 bits significatifs (ENOB). Il est donc possible de compter sur une mesures très stables et fiables si l'on réduit le nombre de bits dans une gamme de 9 ou 10 bits significatifs.
Dans l'exemple ci-dessous nous allons réduire la valeur de 16 bits à 10 bits (un "down-scale" en anglais). Sur 10 bits, la valeur numérique obtenue varie entre 0 et 1023!
Pour ne garder que les 10 bits les plus significatifs, il faut effectuer un décalage de 6 bits sur la droite.
1 from machine import Pin, ADC
2 import time
3
4 # Désactive PowerSafe (lower ripple)
5 Pin( 23, Pin.OUT, value=True )
6
7 a0 = ADC( Pin( Pin.board.GP26 ) )
8 while True:
9 # Effectuer 10 mesures
10 val = 0
11 for i in range( 10 ):
12 val += (a0.read_u16()>>6)
13 # calculer la moyenne
14 val = val/10
15
16 # Calculer la tension
17 volt = val*3.3/1023
18 print( 'adc_10bits=%5i , volt=%1.2f' % (val,volt) )
19 time.sleep_ms( 300 )
Cet exemple est disponible dans le dépôt sous le nom analog-10bits.py .
Comme dans les exemples précédents, le script désactive le mode "PowerSafe" et le calcul d'une moyenne sur plusieurs acquisition.
Voici ce qu'il y a de neuf dans ce script:
- Ligne 12: l'instruction a0.read_u16() retourne une valeur sur 16 bit (valeur 0 à 65535). Par exemple: la valeur 27467 pour un tension de 1.38309 Volts.
La représentation binaire de 27467 est 0b0110101101001011.
Pour réduire la résolution à 10 bits, il faut enlever les 6 bits les plus à droite, ceux marqués en gras 0b0110101101001011 .
En utilisant l'instruction mathématique de décalage sur la droite >> nous obtenons le résultat escompté car 0b0110101101001011 >> 6 donne 0b0110101101, ce qui correspond à la valeur numérique 429. - Ligne 17: La conversion de la valeur numérique en tension utilise maintenant la valeur 1023 comme diviseur au lieu de 65535. La valeur étant maintenant encodée sur 10 bits, il faut bien entendu répartir les 3.3V sur une valeur de 0 (0b0000000000) à 1023 (0b1111111111).