Modifications

Sauter à la navigation Sauter à la recherche
11 203 octets supprimés ,  20 février 2016 à 17:17
Contenu remplacé par « {{MicroPython-Hack-Prepare-NAV}} {{MicroPython-Hack-moteur-core}} {{MicroPython-Hack-Prepare-TRAILER}} »
Ligne 1 : Ligne 1 :  
{{MicroPython-Hack-Prepare-NAV}}
 
{{MicroPython-Hack-Prepare-NAV}}
   −
== Ce que nous faisons ==
+
{{MicroPython-Hack-moteur-core}}
{{bloc-etroit|text=Les sorties de PyBoard sont géniales pour contrôler directement de petits éléments électriques tels que des LEDs.
  −
 
  −
Cependant, lorsque l'on s'attaque à de plus gros composants (tels qu'un moteur de jouet ou de machine à laver), un transistor complémentaire est alors nécessaire. Un transistor est incroyablement utile. Il commute une grande quantité de courant en utilisant une quantité de courant bien plus petite.
  −
 
  −
Un transistor à 3 broches. Pour un transistor de type négatif (NPN), vous connectez la charge au collecteur et l'émetteur à la masse. Alors, lorsqu'un petit courant circulera de la base à l'émetteur, un courant circulera à travers le transistor et votre moteur tournera (cela se produira lorsque nous mettrons la broche de notre PyBoard à HIGH).
  −
 
  −
Il y a littéralement des centaines de type de transistors, permettant de répondre à la perfection à chaque situation. Nous avons choisit le {{pl|49|P2N2222AG}}, un transistor communément utilisé dans de nombreuses applications. Les facteurs importants dans notre cas sont la tension maximale (40 volts) et le courant maximum (600 milliampères) qui sont tous deux largement suffisant pour notre moteur de jouet.
  −
 
  −
}}
  −
 
  −
== Le montage ==
  −
=== Le matériel nécessaire ===
  −
 
  −
{{ARDX-composant-begin}}
  −
 
  −
{{ARDX-composant
  −
  |label=Bloc pile 6xAA = 9 Volts
  −
  |label2=x1
  −
  |img=ARDX-Bloc-Pile-6xAA.png
  −
  |pl=114
  −
}}
  −
 
  −
{{ARDX-composant
  −
  |label=Transistor P2N2222AG (TO92)
  −
  |label2=x1
  −
  |img=PYBX-P2N2222.png
  −
  |pl=49
  −
}}
  −
 
  −
{{ARDX-composant
  −
  |label=Fils
  −
  |label2=
  −
  |img=PYBX-FILS.png
  −
  |pl=34
  −
}}
  −
 
  −
{{ARDX-composant-end}}
  −
 
  −
{{ARDX-composant-begin}}
  −
 
  −
{{ARDX-composant
  −
  |label=Moteur de jouet
  −
  |label2=x1
  −
  |img=PYBX-MOTOR.png
  −
  |pl=115
  −
}}
  −
 
  −
{{ARDX-composant
  −
  |label=Diode (1N4001)
  −
  |label2=x1
  −
  |img=PYBX-DIODE-1N4001.png
  −
  |pl=46
  −
}}
  −
 
  −
{{ARDX-composant
  −
  |label=Résistance de 2.2 KOhms (rouge-rouge-rouge)
  −
  |label2=x1
  −
  |img=PYBX-R2200.png
  −
  |pl=44
  −
}}
  −
 
  −
{{ARDX-composant-end}}
  −
 
  −
Tous ces éléments sont disponibles sur [http://shop.mchobby.be shop.mchobby.be].
  −
 
  −
=== Présence de la diode ===
  −
La diode 1N4001 est utilisé comme diode anti-retour (aussi dit "en roue libre"), cette diode sert a court-circuiter la point renvoyée par le moteur lorsque vous voulez déconnecter celui-ci. Lorsque l'on déconnecte une charge d'un circuit, celle-ci rend l'énergie qu'elle à accumulée au circuit (comme c'est un processus de réaction, la polarité est inversée).
  −
 
  −
{{ambox-stop|text=La présence de la diode est indispensable. Sans elle, le transistor serait rapidement détruit. Faites également attention à l'anneau argenté qui sert de détrompeur (le "-" de la diode).}}
  −
 
  −
=== Présence du bloc pile ===
  −
Le moteur à besoin d'une tension d'alimentation entre 5 et 9 volts. Il n'est donc pas question d'alimenter d'alimenter notre moteur depuis le PyBoard (3.3V), d'ailleurs le régulateur du PyBoard ne pourrait pas fournir le courant nécessaire.
  −
 
  −
Il serait possible de se brancher sur la broche '''vin''' du PyBoard et d'ainsi obtenir les 5 Volts provenant de la connexion USB (si votre PyBoard est branché sur un ordinateur). Cependant, un moteur est quand même source de parasites qui seront renvoyé sur la source d'alimentation '''vin''' et le port USB. Ce n'est bien entendu pas une situation idéale car le matériel informatique et les microcontrôleurs n'aiment pas les parasites.
  −
 
  −
Nous allons donc opter pour une source d'alimentation externe pour le moteur, une source de 9V produite par un bloc de 6 piles AA. L'avantage est de disposer d'une alimentation assez puissante (1500mAh) pour le moteur et séparée de l'alimentation de la PyBoard (généralement recommandé).
  −
 
  −
{{ambox|text=Attention, lorsque l'on utilise plusieurs sources d'alimentation, il est impératif d'avoir une '''masse commune''' entre toutes les alimentation. Voyez le plan de montage: le "-" de l'alimentation 9V est branché sur le "-" du PyBoard (3.3v) }}
  −
 
  −
=== Schéma ===
  −
[[Fichier:MicroPython-Hack-moteur-schema.png]]
  −
 
  −
=== Montage ===
  −
{{FImage|MicroPython-Hack-moteur-montage.jpg|800px}}
  −
 
  −
== Le code ==
  −
Voici le programme proposé (ce dernier contient différentes options que vous pourrez tester en décommettant la ligne appropriée).
  −
 
  −
<nowiki># Contrôle d'un moteur jouet à l'aide d'un transistor.
  −
from pyb import Timer, delay
  −
 
  −
# Brancher le moteur sur X3
  −
MOTOR_PIN = pyb.Pin.board.X3
  −
 
  −
# fonction qui permet de passer d'un range de valeur (in_) à une autre
  −
#    (out_) en appliquant une règle de trois.
  −
def arduino_map(x, in_min, in_max, out_min, out_max):
  −
    return int( (x - in_min) * (out_max - out_min) // (in_max - in_min) + out_min )
  −
   
  −
# Eteint simplement le moteur
  −
def motorOff():
  −
onTime  = 2500 # temps allumé
  −
offTime = 1000 # temps éteint
  −
  −
p = pyb.Pin( MOTOR_PIN, pyb.Pin.OUT_PP )
  −
p.low()
  −
  −
# Allume puis éteind le moteur a interval régulier
  −
def motorOnThenOff():
  −
onTime  = 2500 # temps allumé
  −
offTime = 1000 # temps éteint
  −
  −
p = pyb.Pin( MOTOR_PIN, pyb.Pin.OUT_PP )
  −
    # Répéter l'opération encore et encore
  −
while True:
  −
p.high()
  −
delay( onTime )
  −
p.low()
  −
delay( offTime )
  −
  −
# Contrôle le moteur avec une gestion de la vitesse
  −
def motorOnThenOffWithSpeed():
  −
    # Creer un timer à une fréquence de 100 Hz (le timer 5)
  −
    # Créer un canal (channel) PWM avec le Timer.
  −
    #  Voyez le graphique PyBoard, sur PIN_MOTOR (X3), il faut utiliser
  −
    #  "Channel 3" sur le "Timer 5" 
  −
    tim = pyb.Timer( 5, freq=100)
  −
    tchannel = tim.channel(3, Timer.PWM, pin=MOTOR_PIN, pulse_width=0)
  −
 
  −
    # Minimum et Maximum de largeur d'impulsion correspondant au minimum
  −
    # et maximum de signal
  −
    max_width = 200000
  −
    min_width = 20000
  −
   
  −
    onTime = 2500  # temps allumé (a vitesse max)
  −
    offTime = 2500 # temps eteind (a vitesse min)
  −
   
  −
    onSpeed  = 250  # vitesse max (entre 0 et 255)
  −
    offSpeed = 150  # vitesse min (entre 0 et 255)
  −
   
  −
    # Répéter l'opération encore et encore
  −
    while True:
  −
        tchannel.pulse_width( arduino_map( onSpeed, 0, 255, min_width, max_width ) )
  −
        delay( onTime )
  −
        tchannel.pulse_width( arduino_map( offSpeed, 0, 255, min_width, max_width ) )
  −
        delay( offTime )
  −
 
  −
# Contrôler un moteur avec accéleration
  −
def motorWithAcceleration():
  −
    # Creer un timer à une fréquence de 100 Hz (le timer 5)
  −
    # Créer un canal (channel) PWM avec le Timer.
  −
    #  Voyez le graphique PyBoard, sur PIN_MOTOR (X3), il faut utiliser
  −
    #  "Channel 3" sur le "Timer 5" 
  −
    tim = pyb.Timer( 5, freq=100)
  −
    tchannel = tim.channel(3, Timer.PWM, pin=MOTOR_PIN, pulse_width=0)
  −
 
  −
    # Minimum et Maximum de largeur d'impulsion correspondant au minimum
  −
    # et maximum de signal
  −
    max_width = 200000
  −
    min_width = 20000
  −
   
  −
    delay_time = 50 # temps entre deux modification
  −
   
  −
    # Répéter l'opération encore et encore
  −
    while True: 
  −
    # boucler toutes les vitesses de 255 à 150
  −
    for speed in range( 255, 150, -1 ):
  −
tchannel.pulse_width( arduino_map( speed, 0, 255, min_width, max_width ) )
  −
delay( delay_time )
  −
        # boucler toutes les vitesses de 150 à 255
  −
    for speed in range( 150, 256 ):
  −
    tchannel.pulse_width( arduino_map( speed, 0, 255, min_width, max_width ) )
  −
    delay( delay_time )
  −
   
  −
# motorOff()
  −
motorOnThenOff()
  −
# motorOnThenOffWithSpeed()
  −
# motorWithAcceleration()</nowiki>
  −
 
  −
=== PWM sur X3: choisir le Timer, le Channel ===
  −
En prêtant attention à la fonction {{fname|motorOnThenOffWithSpeed()}}, vous remarquerez que la configuration PWM utilise les lignes de code suivantes:
  −
 
  −
<nowiki>tim = pyb.Timer( 5, freq=100)
  −
tchannel = tim.channel(3, Timer.PWM, pin=MOTOR_PIN, pulse_width=0)</nowiki>
  −
 
  −
Nous utilisons le '''timer 5''' en association avec le '''canal/channel 3'''!
  −
 
  −
Cela n'est pas anodin, nous utilisons du PWM sur la broche '''X3''' (voir assignation de MOTOR_PIN) et sur le diagramme des broches nous pouvons identifier les associations suivantes:
  −
* Timer 9, Channel 1
  −
* Timer 5, Channel 3
  −
* Timer 2, Channel 3
  −
 
  −
{{MPImage|pybv10-pinout.jpg|800px}}
  −
 
  −
== Cela ne fonctionne pas? ==
  −
Voici 3 choses à essayer.
  −
=== Le moteur ne tourne pas? ===
  −
Si vous avez utilisé votre propre transistor, vérifiez à l'aide de sa fiche technique que le brochage est compatible avec le P2N2222AG (beaucoup utilisent des brochages inversés)
  −
 
  −
=== Toujours pas de chance? ===
  −
Assurez-vous d'avoir correctement branché l'alimentation 9 Volts pour alimenter le moteur. Assurez-vous également d'avoir une masse commune reliant le "-" du bloc pile et le "-" (GND) de la PyBoard.
  −
 
  −
=== Cela ne fonctionne toujours pas? ===
  −
Il arrive que votre carte PyBoard se déconnecte de votre ordinateur.
  −
 
  −
Essayez de déconnecter et de reconnecter la prise USB.
  −
 
  −
=== Moteur fait du bruit mais de tourne pas ===
  −
Testez probablement l'une ou l'autre fonction mettant en oeuvre le contrôle de la vitesse à l'aide d'un signal PWM.
  −
 
  −
Le contrôle PWM d'un moteur par l'intermédiaire d'un transistor n'est pas la méthode de contrôle la plus efficace qui existe, cela est principalement à causé de la chute de tension dans le transistor.
  −
 
  −
Cela n'est reste pas moins intéressant sur le plan didactique. Plus tard, vous pourrez utiliser la même méthode avec une électronique plus adéquate.
  −
 
  −
N'hésitez pas à lancer le moteur à la main... ce petit coup de pousse pourrait être fort utile.
  −
 
  −
== Faire encore mieux ==
  −
=== Contrôler la vitesse ===
  −
Par le passé, nous avons joué avec la possibilité qu'avait notre PyBoard de contrôler la luminosité d'une LED.
  −
 
  −
Maintenant, nous allons utiliser cette même capacité pour contrôler la vitesse de notre moteur. PyBoard fait cela en utilisant une technique appelée « modulation de longueur d'impulsion » (PWM).
  −
 
  −
Plutôt que de contrôler directement la tension de sortie d'une broche, PyBoard va activer et désactiver la broche très rapidement. Dans le monde informatique c'est passer de 0 à 3.3 volts plusieurs fois par secondes, mais dans notre monde humain, nous percevons cela comme une tension plus ou moins forte.
  −
 
  −
Par exemple si un PyBoard module à 50% nous voyons la LED éclairée à 50% parce que nos yeux ne sont pas assez rapides pour voir qu'elle s'allume et s'éteint constamment plusieurs centaines de fois par seconde.
  −
 
  −
Vous ne le croyez pas ? Alors essayez le.
  −
 
  −
Nous pouvons modifier la fin du programme pour changer la fonction appelée
  −
<nowiki># motorOff()
  −
# motorOnThenOff()
  −
motorOnThenOffWithSpeed()
  −
# motorWithAcceleration()</nowiki>
  −
 
  −
Ensuite charger le programme. Vous pouvez modifier les vitesses en modifiant les variables onSpeed et offSpeed dans la fonction {{fname|motorOnThenOffWithSpeed()}}.
  −
 
  −
=== Accélérer et décélérer ===
  −
Pourquoi s'arrêter à deux vitesses ? Pourquoi ne pas accélérer et décélérer la vitesse du moteur ?
  −
 
  −
Nous pouvons modifier la fin du programme pour changer la fonction appelée
  −
<nowiki># motorOff()
  −
# motorOnThenOff()
  −
# motorOnThenOffWithSpeed()
  −
motorWithAcceleration()</nowiki>
  −
 
  −
Chargez ensuite le programme et regardez votre moteur accélérer lentement jusqu'à plein régime puis ralentir.
  −
 
  −
Si vous voulez modifier l'acceleration, modifiez la variable {{fname|delayTime}} (une valeur plus grande implique une accélération plus lente)
  −
 
      
{{MicroPython-Hack-Prepare-TRAILER}}
 
{{MicroPython-Hack-Prepare-TRAILER}}
29 917

modifications

Menu de navigation