Ligne 1 : |
Ligne 1 : |
| == Préambule == | | == Préambule == |
− | Ce tutoriel explique comment détection la longueur d'impulsion d'un signal pour Servo Moteur à l'aide de MicroPython. | + | Ce tutoriel explique comment réaliser une détection de la longueur d'impulsion d'un signal pour Servo Moteur à l'aide de MicroPython sur un [https://shop.mchobby.be/product.php?id_product=2025 Raspberry-Pi Pico]. |
| + | |
| + | Il est également applicable à tous les microcontrôleurs à base de RP2040 comme le [https://shop.mchobby.be/product.php?id_product=2025 PYBStick-RP2040]. |
| | | |
| == Introduction == | | == Introduction == |
Ligne 36 : |
Ligne 38 : |
| | | |
| Ce qu'il faut maintenant, c'est pouvoir mesurer cette largeur d'impulsion à partir d'un script MicroPython. | | Ce qu'il faut maintenant, c'est pouvoir mesurer cette largeur d'impulsion à partir d'un script MicroPython. |
| + | |
| + | Note: |
| + | * L'interrupteur 3 positions '''fixes''' (ch5) produit un signal 1050 µSec (haut), 1500 µSec (central), 2050 µSec (bas). |
| + | * L'interrupteur 3 positions '''momentanées''' (ch11) produit les mêmes signaux. |
| + | |
| + | == Fonction time_pulse_us == |
| + | MicropPython prévoit la fonction {{fname|time_pulse_us()}} disponible dans le module {{fname|machine}}. |
| + | |
| + | C'est tardivement, mais avec plaisir, que je découvre que {{fname|time_pulse_us()}} est implémenté dans dans le firmware MicroPython du Pico. |
| + | |
| + | <nowiki>from machine import time_pulse_in |
| + | usec = time_pulse_in( pin(15), pulse_level=1 ) |
| + | </nowiki> |
| + | |
| + | Le code ci-dessus, attend que le broche 15 passe au niveau High (1) puis mesure la durée pendant laquelle cette broche reste au niveau haut. |
| | | |
| == Classe PWMCounter == | | == Classe PWMCounter == |
| | | |
− | La classe {{fname|PWMCounter}} publiée par [https://github.com/phoreglad/pico-MP-modules/tree/main/PWMCounter Phoreglad sur son dépôt GitHub] permet de mesurer la durée d'une impulsion en exploitant un compteur PWM (à 125 Mhz). | + | La classe {{fname|PWMCounter}} publiée par [https://github.com/phoreglad/pico-MP-modules/tree/main/PWMCounter Phoreglad sur son dépôt GitHub] est une alternative à la fonction {{fname|time_pulse_us()}}. |
| + | |
| + | La classe {{fname|PWMCounter}} permet de mesurer la durée d'une impulsion en exploitant un compteur PWM (à 125 Mhz). |
| | | |
| {{download-box|Téléchargez PWMCounter|https://github.com/phoreglad/pico-MP-modules/tree/main/PWMCounter}} | | {{download-box|Téléchargez PWMCounter|https://github.com/phoreglad/pico-MP-modules/tree/main/PWMCounter}} |
Ligne 88 : |
Ligne 107 : |
| | | |
| [[Fichier:PICO-PULSE-IN-MICROPYTHON-20.jpg|640px]] | | [[Fichier:PICO-PULSE-IN-MICROPYTHON-20.jpg|640px]] |
| + | |
| + | Dans ce montage, c'est [https://arduino103.blogspot.com/2021/04/hack-electronique-signal-5v-sur-une.html une particularité interne des entrées de microcontrôleur] qui est exploitée pour brancher la sortie 5V RC sur l'entrée 3.3V (non tolérante) du Pico. |
| + | |
| + | {{ambox|text=L'utilisation d'un pont-diviseur 10K + 20K pour réduire la tension d'entrée à 3.3V s'est avérée inefficace en empêchant le compteur de fonctionner}} |
| + | |
| + | == Code PWMCounter == |
| + | |
| + | Voici le script d'exemple utilisé pour compter le temps d'impulsion du signal RC. |
| + | |
| + | <syntaxhighlight lang="python"> |
| + | from machine import Pin |
| + | from PWMCounter import PWMCounter |
| + | |
| + | # Initialise la broche en entrée |
| + | in_pin = Pin(13, Pin.IN) |
| + | # Compter lorsque le signal est au niveau haut |
| + | counter = PWMCounter(13, PWMCounter.LEVEL_HIGH) |
| + | # Fixer le diviseur du compteur à 16 (pour éviter le dépassement du compteur) |
| + | counter.set_div(16) |
| + | # Démarrer le compteur |
| + | counter.start() |
| + | |
| + | last_state = 0 |
| + | while True: |
| + | x = in_pin.value() |
| + | if ~(x) & last_state: |
| + | # Longueur d'impulsion en micro-secondes |
| + | print((counter.read_and_reset() * 16) / 125) |
| + | last_state = x |
| + | </syntaxhighlight> |
| + | |
| + | Une fois le script lancé, voici ce qui a été obtenu pour la '''position max du potentiomètre''': |
| + | |
| + | Le script retourne bien une valeur de l'ordre de 2500 µSec comme l'indique la capture sur l'oscilloscope. |
| + | |
| + | [[Fichier:PICO-PULSE-IN-MICROPYTHON-12.png|480px]] |
| + | |
| + | [[Fichier:PICO-PULSE-IN-MICROPYTHON-30.png]] |
| + | |
| + | |
| + | |
| + | La '''position minimale du potentiomètre''' retourne bien une valeur de l'ordre de 850 µSec comme l'indique la capture sur l'oscilloscope. |
| + | |
| + | [[Fichier:PICO-PULSE-IN-MICROPYTHON-11.png|480px]] |
| + | |
| + | |
| + | [[Fichier:PICO-PULSE-IN-MICROPYTHON-31.png]] |