[Résolu] Arduino et moteur : transistor à l'envers !

crossposté sur openclassrooms.com est-ce acceptable ?

Bonjour,

Je commence à apprendre à utiliser les moteurs CC avec mon Arduino. Avant d'exploiter mon shield motor, je veux essayer de faire un peu par moi-même. Du coup, j'ai réalisé ce tutoriel.

Ça donne ceci :

Le moteur utilisé est un petit moteur fourni avec un jeu de construction de véhicule qui était alimenté avec une pile 3V. Je l'alimente ici avec la sortie 3.3V de l'Arduino. Le transistor est un PN2222 acheté sur semageek.

Ça fonctionne bien sauf que au lieu d'être arrêté quand le PWM est à 0 et à fond quand il est à 255, c'est l'inverse. Du coup, j'ai modifié le programme pour écrire 255-speed (speed lu avec Serial) dans la sortie 3 avec analogWrite.

Est-ce que j'avais mal compris le texte du tutoriel et le fonctionnement est normal ou est-ce que il y a autre chose ?

Merci d'avance.

Gaël

Mon environnement: Arduino UNO R3, GNU/Linux KDE Neon 5.11.33, IDE arduino 2:1.0.5+dfsg2-4

Mon code:

/*
Adafruit Arduino - Lesson 13. DC Motor
*/
 
 
int motorPin = 3;
  
void setup()
{
  pinMode(motorPin, OUTPUT);
  Serial.begin(9600);
  while (! Serial);
  Serial.println("Speed 0 to 255");
  analogWrite(motorPin, 255);
 
}
  
  
void loop()
{
//      analogWrite(motorPin, 255);
//  Serial.println("Loop");
  if (Serial.available())
  {
    int speed = Serial.parseInt();
//    String msg="  Got speed ";
//      Serial.println(msg+speed);
    if (speed >= 0 && speed <= 255)
    {
//      Serial.println("  Got speed "+speed);
      analogWrite(motorPin, 255-speed);
    }
  }
  delay(100);
}

Ça fonctionne bien sauf que au lieu d'être arrêté quand le PWM est à 0 et à fond quand il est à 255, c'est l'inverse

Bonjour,
c'est correct ainsi : ton moteur étant relié à un +3v3 permanent sur l'un de ses 2 pôles, il tournera d'autant plus vite que la tension vue sur l'autre pôle est faible

trimarco232:
Bonjour,
c'est correct ainsi : ton moteur étant relié à un +3v3 permanent sur l'un de ses 2 pôles, il tournera d'autant plus vite que la tension vue sur l'autre pôle est faible

Oui, mais le transistor, s'il est bien monté, est un inverseur, donc une pwm à 0 sur sa base, il ne commute jamais, donc ne fait pas tourner le moteur...

j'allais rectifier mais tu m'as grillé : il y a effectivement un souci ... que je ne m'explique pas

Merci pour vos réponses à tous les trois.

Super_Cinci:
Oui, mais le transistor, s'il est bien monté, est un inverseur, donc une pwm à 0 sur sa base, il ne commute jamais, donc ne fait pas tourner le moteur...

C'est bien ce que j'avais compris aussi. Du coup, je reste dans le flou pour le moment...

Bonsoir,

Ça fonctionne bien sauf que au lieu d'être arrêté quand le PWM est à 0 et à fond quand il est à 255, c'est l'inverse. Du coup, j'ai modifié le programme pour écrire 255-speed (speed lu avec Serial) dans la sortie 3 avec analogWrite.

Pour moi c'est tout à fait logique.

Dans ton code tu écris :

analogWrite(motorPin, 255-speed);

Mais si tu envoie 0 pour vitesse la plus basse

255-0 = 255

Ton moteur est a fond.

Si tu veut que le moteur tourne à fond tu envoie 255.

255-255 = 0

Le moteur ne tourne pas.

-Standby:
Bonsoir,

Mais si tu envoie 0 pour vitesse la plus basse

255-0 = 255

Ton moteur est a fond.

Si j'envoie 0 par la liaison série, le PWM envoie 255-0 dans le transistor. Le moteur devrait être à fond. Or, il est à l'arrêt.

Mais je crois avoir trouvé l'explication. Cf. mon message suivant.

J'ai essayé avec un nouveau transistor et ça a fonctionné normalement !

Ou alors mon premier transistor avait un défaut (ça arrive, ça ?) ou bien je l'avais grillé avec un faux contact ou une erreur à un moment dans le montage.

Merci pour votre aide.

Ou alors mon premier transistor avait un défaut (ça arrive, ça ?)

Non

ou bien je l'avais grillé

Ça, ça arrive souvent et même aux plus aguerris :grin:

68tjs:
NonÇa, ça arrive souvent et même aux plus aguerris :grin:

Et du coup, le fonctionnement peut être incohérent mais répétable comme ça ?

Et du coup, le fonctionnement peut être incohérent mais répétable comme ça ?

dans ces cas, il faut tout vérifier : la résistance de base que tu utilises est d'une valeur dangereusement faible : 47R au lieu de 270R dans le tuto
remplaces-la par une 1k et le problème devrait se régler

trimarco232:
dans ces cas, il faut tout vérifier : la résistance de base que tu utilises est d'une valeur dangereusement faible : 47R au lieu de 270R dans le tuto
remplaces-la par une 1k et le problème devrait se régler

J'avais mis une résistance plus faible parce que le moteur est beaucoup moins puissant. Avec une résistance plus forte, ça nemarchait pas du tout. J'avais fait un petit calcul et était tombé plutôt autour de 100R mais avait essayé avec moins pour voir. Maintenant que ça fonctionne normalement, je suis repassé à une 100R. Je pourrais aussi réessayer avec une 270R.

Regarde le tuto sur "le transistor bipolaire et Mosfet simplifié" dans le sous forum Tuto et cours.
Tu y trouvera les bases du calcul et tu en déduira que la remarque de trimarco est fondée.
La valeur de résistance de base ne se joue pas aux dès, elle se calcule.

Bonsoir,

Merci encore pour vos réponses. Je vais lire le tuto signalé. Pour le calcul, je n'avais pas fait au hasard. J'avais essayé de suivre les explications d'un certain @68tjs, :slight_smile:

Bon, évidemment, j'ai pu me tromper et, surtout, je ne suis pas certain de l'identification du moteur. J'ai cru reconnaître celui-ci mais sans certitude.

Si je suis ses spec, et les explications, la résistance doit être de :

ib = Imoteur/beta ( beta = 100 est une bonne valeur) = 250 mA/100 = 2,5 mA
Vbe = 0.8V
Rb= (3,3-0,8)/Ib = 100 Ohms

J'avais donc mis une résistance de 100 Ohms.

Après, c'est vrai que tenter une 47 Ohms "pour voir" quand ça ne marchait pas n'était sûrement pas une bonne idée. :confused:

Je vais peut-être dire une conn*rie mais ta carte UNO est alimentée en 5V.
Donc les sorties donnent un signal compris entre 0V et 5V.
C'est bien la sortie qui commande la base du transistor.
Donc dans ton calcul de résistance de base il faut remplacer 3,3V par 5V.

Remarque : c'est du pinaillage puisque pour être certain de saturer un transistor bipolaire on prend ce qu'on appelle un "beta forcé" inférieur à la valeur min des indications de la datasheet.
Donc les 100 ohms que tu as déterminés sont, en fin de compte, corrects.

Dans ce genre de calcul il n'y a pas de règles qui puissent recevoir une démonstration mathématique.
Il y a l'idéal et puis il y a le compromis de la réalité du terrain, chaque montage étant particulier.
L'important est de comprendre le principe et de l'appliquer au mieux.
Il ne faut pas oublier aussi de faire la différence entre une fabrication de série où il n'est pas possible d'ajuster chaque pièce et une réalisation unique où justement il est possible de faire des ajustements.
De nombreux multimètres ont une fonction pour mesurer le beta des transistors bipolaires.

Remarque :
Les dispersions dans les transistors (et dans les composants en général) sont dues aux différents lots de fabrication mais chaque lot est homogène.
Si tu approvisionnes "une pochette" de transistor il y a de fortes probabilités qu'ils viennent du même lot de fab et donc qu'ils soient identiques.

Bonsoir,

remplaces-la par une 1k et le problème devrait se régler

Donc les 100 ohms que tu as déterminés sont, en fin de compte, corrects

il faut tout vérifier

pour arrêter le massacre, il serait bien que kleag vérifie son calcul :smiling_imp: