MicroPython-Hack-moteur

De MCHobby - Wiki
Aller à : navigation, rechercher

MCHobby investit du temps et de l'argent dans la réalisation de traduction et/ou documentation. C'est un travail long et fastidieux réalisé dans l'esprit Open-Source... donc gratuit et librement accessible.
SI vous aimez nos traductions et documentations ALORS aidez nous à en produire plus en achetant vos produits chez MCHobby.

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

ARDX-Bloc-Pile-6xAA.png

Bloc pile 6xAA = 9 Volts
x1

PYBX-P2N2222.png

Transistor P2N2222AG (TO92)
x1

PYBX-FILS.png
 
PYBX-MOTOR.png

Moteur de jouet
x1

PYBX-DIODE-1N4001.png

Diode (1N4001)
x1

PYBX-R2200.png

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).

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é).

Schéma

MicroPython-Hack-moteur-schema.png

Montage

MicroPython-Hack-moteur-montage.jpg
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

Pybv10-pinout.jpg
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