PICO-PULSE-IN-MICROPYTHON

De MCHobby - Wiki
Révision datée du 16 février 2022 à 23:45 par Admin (discussion | contributions) (→‎Classe PWMCounter)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Sauter à la navigation Sauter à la recherche

Préambule

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 Raspberry-Pi Pico.

Il est également applicable à tous les microcontrôleurs à base de RP2040 comme le PYBStick-RP2040.

Introduction

Je dispose depuis peu d'une Commande RC a multiples canaux.

La commande Carson ci-dessous dispose de 14 canaux au total. Il n'en faut que deux pour contrôler un véhicule radiocommandé (1 canal pour la direction, un canal pour les gaz).

PICO-PULSE-IN-MICROPYTHON-00.jpg

Avec 14 canaux, il est donc possible d'envisager des applications robotiques inédites.

Une télécommande RC est accompagnée d'un récepteur qui permet de réceptionner les canaux RC (14 dans le cas présent).

PICO-PULSE-IN-MICROPYTHON-01.jpg

Le récepteur RC, que l'on voit sur l'image ci-dessus, expose des connecteurs 3 pôles... parce que dans le monde RC, on utilise des Servo moteurs, moteurs que vous avez probablement déjà croisé dans les modes Arduino ou MicroPython.

Le graphique ci-dessous reprend un montage type d'un récepteur RC et ses nombreux canaux.

PICO-PULSE-IN-MICROPYTHON-02.jpg

Canaux que l'on retrouve distribués un peu partout sur la télécommande RC.

PICO-PULSE-IN-MICROPYTHON-03.jpg

Signal RC

Pour les besoins de l'expérience, j'ai branché l'oscilloscope sur la sortie signal du canal 7 (celui correspondant au potentiomètre en haut à droite de la télécommande).

PICO-PULSE-IN-MICROPYTHON-10.jpg

La largeur du signal RC est 850µS (potentiomètre au minimum) à 2150µS (potentiomètre au maximum).

PICO-PULSE-IN-MICROPYTHON-11.png PICO-PULSE-IN-MICROPYTHON-12.png

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 time_pulse_us() disponible dans le module machine.

C'est tardivement, mais avec plaisir, que je découvre que time_pulse_us() est implémenté dans dans le firmware MicroPython du Pico.

from machine import time_pulse_in
usec = time_pulse_in( pin(15), pulse_level=1 )
 

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

La classe PWMCounter publiée par Phoreglad sur son dépôt GitHub est une alternative à la fonction time_pulse_us().

La classe PWMCounter permet de mesurer la durée d'une impulsion en exploitant un compteur PWM (à 125 Mhz).

Download-icon.pngTéléchargez PWMCounter

Comme expliqué sur le dépôt GitHub de PWMCounter, le support matériel "Counter Mode" du Pico est limité à un certain nombre de broches. En effet, certaine broches partagent le même "PWM slice" et lorsqu'elles sont utilisées en mode de comptage en même temps, le signal perçu par le compteur correspond à un OU LOGIQUE entre les deux entrées.

PWM slice GPIOs
1 GP1, GP17
2 GP3, GP19
3 GP5, GP21
4 GP7, GP23
5 GP9, GP25
6 GP11, GP27
7 GP13, GP29
8 GP15

La classe supporte plusieurs mode de comptage:

  • PWMCounter.LEVEL_HIGH : Le compteur augmente seulement si l'entrée est au niveau haut. Peut être utilisé pour mesure la largeur d'impulsion ou le cycle utile. Valeur par défaut.
  • PWMCounter.EDGE_RISING : Le compteur augmente lors d'un flan montant sur l'entrée (utilisé pour mesurer la fréquence).
  • PWMCounter.EDGE_FALLING : Le compteur augmente lors d'un flan descendant (utilisé pour mesure la fréquence).


Le clock divider (diviseur d'horloge) permet d'étendre la plage de comptage effective du compteur PWM en appliquant un diviseur d'impulsion sur le signal d'entrée. Par exemple, avec un diviseur de 16, il faut 16 impulsions sur le GPIO pour avoir un incrément d'une unité dans le compteur.

Branchement

Voici comment raccorder une sortie du récepteur RC sur l'entrée GP15 du Raspberry-Pi Pico.

PICO-PULSE-IN-MICROPYTHON-20.jpg

Dans ce montage, c'est 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.

Code PWMCounter

Voici le script d'exemple utilisé pour compter le temps d'impulsion du signal RC.

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

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.

PICO-PULSE-IN-MICROPYTHON-12.png

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.

PICO-PULSE-IN-MICROPYTHON-11.png


PICO-PULSE-IN-MICROPYTHON-31.png