Contrôle Moteur DC via transistor (digital et analogique)

Introduction
Il existe différentes façons de contrôler un moteur à courant continu.
Le montage le plus simple étant encore d'utiliser un étage d'amplification basé sur un transistor P2N2222.

Pourquoi utiliser un étage d'amplification?
Et bien, la raison est très simple, une sortie arduino n'est pas capable de fournir plus de 40 mA en sortie.
Si vous brancher un moteur directement dessus, le courant sera tellement intense que la sortie va rendre l'âme instantanément.
En utilisant un transistor P2N2222, courant d'alimentation du moteur peu aller jusque 600mA (selon la datasheet) et  une tension de 40v.


Montage



Attention: 
la diode montée en parallèle sur le moteur DC est excessivement importante.
En effet, elle permet de capturer les tensions/courants produits lors de l'arrêt du moteur (effet de self) et qui se propage en sens inverse (c'est un effet de réaction... donc contraire).
Si cette diode n'était pas présente, la surtension s'appliquerait sur le transistor... qui lui ne résisterait pas très longtemps à un tel traitement.

Truc et astuce:
Avant de raccorder le montage sur la pin 9 de votre Arduino, vous pouvez alternativement appliquer 5v ou 0v sur la résistance raccordée à la base du transistor.
Bien évidemment, le moteur doit fonctionner quand 5 volts sont appliqués sur la base.
Cela vous permettra de vérifier le bon fonctionnement du montage sans prendre aucun risque pour Arduino.

Avantage et inconvénient
Ce type de montage présente quelques avantages mais aussi de nombreux inconvénients si l'on désire contrôler finement le fonctionnement du moteur.

Avantages
  • Montage facile
  • Idéal pour un contrôle allumé/éteind.
Inconvénients
  • Pas de contrôle de sens de rotation
  • Le contrôle de la vitesse en analogique n'est pas vraiment approprié.
    Il faut en effet vaincre Inertie au démarrage.
    Il vaudrait mieux opter pour un contrôle PWM.
Programme
Voici le programme de démonstration.
Le fonctionnement "tout ou rien" (moteur allumé ou éteint) fonctionne parfaitement.
Le mode de contrôle analogique montre rapidement les limites d'une telle option.
Source: MoteurDC.pde
/*
 *  Controle d'un moteur DC 
 *    En utilisant une sortie digitale (allumer/eteindre)
 *    En utilisant une sortie analogique (controle de vitesse).
 *
 * Note:
 *   Le controle de vitesse en analogique n'est pas optimal.
 *   Le mieux serait d'utiliser la méthode PWM
 */

int pinMoteur = 12; // pin controlant le moteur (analogique pin)

void setup(){
  pinMode( pinMoteur, OUTPUT ); 
}

void loop(){
   MoteurOnOff();
   MoteurVitesseDigital();      // ne fonctionne pas très bien
   MoteurAccelerationDigital(); // ne fonctionne pas très bien
}

// Allume le moteur à plein régime pendant 
//     3 secondes puis l'éteind pendant 
//     3 autres secondes.
//
void MoteurOnOff(){
  digitalWrite( pinMoteur, HIGH ); // Allume le moteur
  delay( 3000 ); // pause 3 secondes
  digitalWrite( pinMoteur, LOW ); // eteind le moteur
  delay( 3000 );
}

// Controle de la vitesse du moteur en controlant
//   la tension de sortie sur la pin 9 (de 0 à 255 pour 0 à 5v).
// Comme le transistor fonctionne en amplification,
//   modifier la tension de base revient a modifier
//   la l'amplification du transistor :-).
//
void MoteurVitesseDigital(){
  int vitesse1 = int(255) / 3; // 1/3 de la tension de sortie (+/- 1/3 de la vitesse)
  int vitesse2 = int(255) / 2; // mi-tension (mi-vitesse)
  int vitesse3 = 2 * 255 / 3;
  int vitesse4 = (int)255;     // Tension totale 
  
  analogWrite( pinMoteur, vitesse1 );
  delay( 1000 );
  analogWrite( pinMoteur, vitesse2 );
  delay( 1000 );
  analogWrite( pinMoteur, vitesse3 );
  delay( 1000 );
  analogWrite( pinMoteur, vitesse4 );
  delay( 1000 );
  analogWrite( pinMoteur, vitesse3 );
  delay( 1000 );
  analogWrite( pinMoteur, vitesse2 );
  delay( 1000 );
  analogWrite( pinMoteur, vitesse1 );
  delay( 1000 );
  analogWrite( pinMoteur, LOW );
}

// Controle plus fin de l'acceleration du moteur.
// 
void MoteurAccelerationDigital(){
  // Acceleration
  for( int i = 0; i<= 255; i++ ){
    analogWrite( pinMoteur, i );
    delay(20); // delay pour avoir un progression
  }
  
  // pause de 2 secondes a plein régime
  delay( 2000 );  
  
  // Deceleration
  for( int i = 255; i>=0; i-- ){
    analogWrite( pinMoteur, i );
    delay(20); // delay pour avoir un progression
  }
}
  

2 commentaires:

  1. Bonjour,

    J'avais juste une petite question sur l'utilisation des transistor sous Raspberry ou Android...

    Effectivement les ouptus ne peuvent pas délivrer bcp de courant (ici 40mA) car cela endommagerait le SOC.

    Mais dans les schemas, on connecte le transistor à une pin 5V ou 3.3V ... de l'arduino ou du Raspberry non ?
    Donc le courant qui sort de cette pin peut atteindre les 600mA mais dans ce cas, ca ne pose pas de probleme ?

    Pourquoi ?

    Y a il une difference entre les pins d'alimentations et les autres pins ?

    Merci bcp pour les infos en tt cas

    RépondreSupprimer
  2. Le plus simple c'est encore de consulter notre section "Raspberry Pi" (cliquer sur le Rasoberry Pi en haut à droit) de notre wiki.mchobby.be

    Nous y avons des tutoriels pour contrôler des moteurs à partir d'un Pi (voir section "Pi Hacking")

    RépondreSupprimer