MicroPython-Hack-moteur
Ce que nous faisons
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 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
Bloc pile 6xAA = 9 Volts
x1
Transistor P2N2222AG (TO92)
x1
Moteur de jouet
x1
Diode (1N4001)
x1
Résistance de 2.2 KOhms (rouge-rouge-rouge)
x1
Tous ces éléments sont disponibles sur 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).
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é).
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
Montage
Made with - réalisé avec - Fritzing fritzing.org
Le code
Voici le programme proposé (ce dernier contient différentes options que vous pourrez tester en décommettant la ligne appropriée).
# 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()
PWM sur X3: choisir le Timer, le Channel
En prêtant attention à la fonction motorOnThenOffWithSpeed(), vous remarquerez que la configuration PWM utilise les lignes de code suivantes:
tim = pyb.Timer( 5, freq=100) tchannel = tim.channel(3, Timer.PWM, pin=MOTOR_PIN, pulse_width=0)
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
Crédit: MicroPython micropython.org
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
# motorOff() # motorOnThenOff() motorOnThenOffWithSpeed() # motorWithAcceleration()
Ensuite charger le programme. Vous pouvez modifier les vitesses en modifiant les variables onSpeed et offSpeed dans la fonction 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
# motorOff() # motorOnThenOff() # motorOnThenOffWithSpeed() motorWithAcceleration()
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 delayTime (une valeur plus grande implique une accélération plus lente)
Source: Micro Python Intro écrit par/written by Damien P.George
Traduit par Meurisse D. pour MCHobby.be - Translated by Meurisse D. for MCHobby.be
Toute référence, mention ou extrait de cette traduction doit être explicitement accompagné du texte suivant : « Traduction par MCHobby (www.MCHobby.be) - Vente de kit et composants » avec un lien vers la source (donc cette page) et ce quelque soit le média utilisé.
L'utilisation commercial de la traduction (texte) et/ou réalisation, même partielle, pourrait être soumis à redevance. Dans tous les cas de figures, vous devez également obtenir l'accord du(des) détenteur initial des droits. Celui de MC Hobby s'arrêtant au travail de traduction proprement dit.
Traduit avec l'autorisation de micropython.org - Translated with the authorisation of micropython.org