Modifications

Sauter à la navigation Sauter à la recherche
2 530 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 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 87 : Ligne 106 :  
Voici comment raccorder une sortie du récepteur RC sur l'entrée GP15 du Raspberry-Pi Pico.
 
Voici comment raccorder une sortie du récepteur RC sur l'entrée GP15 du Raspberry-Pi Pico.
   −
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.
+
[[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-20.jpg]]
+
[[Fichier:PICO-PULSE-IN-MICROPYTHON-31.png]]
29 917

modifications

Menu de navigation