Modifications

Sauter à la navigation Sauter à la recherche
4 896 octets ajoutés ,  16 février 2022 à 23:45
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 30 : Ligne 32 :  
[[Fichier:PICO-PULSE-IN-MICROPYTHON-10.jpg|800px]]
 
[[Fichier:PICO-PULSE-IN-MICROPYTHON-10.jpg|800px]]
   −
Le signal RC est 850µS (potentiomètre au minimum) à 2150µS (potentiomètre au maximum).
+
La largeur du signal RC est 850µS (potentiomètre au minimum) à 2150µS (potentiomètre au maximum).
 +
 
 +
[[Fichier:PICO-PULSE-IN-MICROPYTHON-11.png|480px]]
 +
[[Fichier:PICO-PULSE-IN-MICROPYTHON-12.png|480px]]
 +
 
 +
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 ==
 +
 
 +
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}}
 +
 
 +
Comme expliqué sur [https://github.com/phoreglad/pico-MP-modules/tree/main/PWMCounter 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.
 +
 
 +
{| class="wikitable" style="vertical-align:middle;"
 +
|-
 +
! 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 {{fname|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 {{fname|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.
 +
 
 +
[[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-11.png|640px]]
+
[[Fichier:PICO-PULSE-IN-MICROPYTHON-31.png]]
[[Fichier:PICO-PULSE-IN-MICROPYTHON-12.png|640px]]
 
29 917

modifications

Menu de navigation