Moteur 5V rend fou mon microprocesseur ATMEGA328P

Bonjour,
je suis en train de faire un petit appareil qui est sensé faire (un peu) peur à mon chat quand il monte sur la table (c'est interdit !). ça ne marchera sûrement pas trop malheureusement, mais c'est aussi pour m'amuser car j'aime bien l'électronique. Donc j'ai programmé une arduino Uno (voir le code ci-dessous), à laquelle je branche 4 capteurs PIR, une led, un petit moteur 5V. Tout se passe bien mais la durée de la pile 9V est très courte. Grâce aux tutos que j'ai trouvé, pour économiser du courant je n'utilise que le microprocesseur ATMEGA328P nu, avec un quartz 16MH et deux condensateurs fournis, le tout alimenté avec une pile 9V descendu à 5V grâce à un régulateur L7805CV. Et là c'est le drame, le microprocesseur fait n'importe quoi dès que le moteur tourne. J'en ai même grillé un à force. Du coup j'ai mis le moteur sur une alimentation séparée (2 x 1,5V) avec un MOSFET IFR520N en commutation, mais pareil, dès que le moteur tourne le microprocesseur fait n'importe quoi. Alors j'ai essayé d'utiliser un ULN2803A à la place du MOSFET mais nouvel échec. Si je mets une led à la place du moteur ça marche bien, mais avec le moteur non. Alors que le seul fil qui le relie à la partie microcontroleur c'est le ground. Comment le moteur peut-il perturber à ce point mon ATMEGA328P via le GND ???? Inutile de dire que j'ai essayé de mettre des condensateurs et des diodes partout....
Le code (très basique et je pense que ça ne va pas éclairer mais bon):


#include "LowPower.h"

//pin qui commande la mise en marche du moteur pour l'animation en cas de présence
int MotorPin = 12;

//pins où seront branchés les 4 capteurs PIR
int CapteurPin1 = 2;
int CapteurPin2 = 3;
int CapteurPin3 = 4;
int CapteurPin4 = 5;

//Variables de détection de présence
int Detect1 = 0;
int Detect2 = 0;
int Detect3 = 0;
int Detect4 = 0;

//pin pour la led témoin (fonctionne / présence)
int LedPin = 10;

//variable globale de présence
bool Yaquelquun = 0;

void setup() {
  pinMode(MotorPin, OUTPUT);

  pinMode(CapteurPin1, INPUT);
  pinMode(CapteurPin2, INPUT);
  pinMode(CapteurPin3, INPUT);
  pinMode(CapteurPin4, INPUT);

  pinMode(LedPin, OUTPUT);

  //petit blink pour montrer que le programme se met en marche
  digitalWrite(LedPin,HIGH);
  delay(500);
  digitalWrite(LedPin,LOW);

 delay(5000); //laisse le temps de s'éloigner des détecteurs PIR

}
 
void loop() {  
    //détection de présence
    Detect1 = digitalRead(CapteurPin1);
    Detect2 = digitalRead(CapteurPin2);
    Detect3 = digitalRead(CapteurPin3);
    Detect4 = digitalRead(CapteurPin4);

    if(Detect1==1 || Detect2==1 || Detect3==1 || Detect4==1){
      Yaquelquun = 1;
      //mettre en marche le moteur
      digitalWrite(MotorPin, HIGH);

      //huit blinks pendant qur le moteur tourne
      for (int i = 0; i < 9; i++) {
        digitalWrite(LedPin,HIGH);
        delay(500);
        digitalWrite(LedPin,LOW); 
        delay(500);
      };

      //le moteur tourne encore un peu après le clignotement
      delay(3000);

      //arrêt du moteur
      digitalWrite(MotorPin, LOW);

      //attente avant de retester une présence
      delay(3000);
      if(Detect1==0 && Detect2==0 && Detect3==0 && Detect4==0){
        Yaquelquun = 0;
      };
    } else {Yaquelquun = 0;};

    //si il n'y a personne le microprocesseur va se mettre en veille pendant 8s avant de refaire une boucle
    if(Yaquelquun==0){
      LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
    }

    //on laisse une seconde pour que les capteurs PIR soient à nouveau bien alimentés
    delay(1000); 

    //un blink pour montrer que l'appareil est toujours en marche
    digitalWrite(LedPin,HIGH);
    delay(500);
    digitalWrite(LedPin,LOW);
}

C'est véritablement le type d'alimentation à banir.
Elle n'a aucune capacité, elle est constituée de 6 minuscules piles de 1,5 V en série.

Tu aurais même pu te dispenser du quartz. Le micro a un oscillateur interne à 8 MHz dont la précision serait suffisante pour ton projet.

Cerise sur le gâteau à 8 MHz, le micro consomme moins qu'à 16 MHz.
Le micro peut être alimenté directement sur un accumulateur lipo 3, 7 V
Il faut savoir qu'à 3,3 V le fonctionnement du micro n'est garanti que jusqu'à 12 MHz.
A 16 MHz certaines pièces fonctionneront et d'autres pas.

Un IRL aurait été préférable à un IRF : -> regarde les deux datasheets et compare les Vgs threshold.
Si tu alimentes en 3,7 V @hbachetti dans son blog a fait un topo sur les mosfets utilisables en 5V et ceux utilisables en 3,3 V.

Là tu cumules les ennuis :smile:

  1. j'ai déjà dit le mal que je pense de la pile de 9V
  2. un régulateur est à réserver pour les applications analogiques où l'alimentation doit être hyper propre.
    En applications numériques, qui sont bien plus tolérantes, on utilise des convertisseurs de tension abaisseur (step down) ou élévateur (step up).
    L'avantage du convertisseur est son rendement nettement supérieur à celui du régulateur, ce qui en alimentation autonome est très intéressant.

Je verrais bien alimenter l'atmega en 3,3/ 3,7 V a 8 MHz d'horloge
Plus un convertisseur step-up pour alimenter le moteur sous 5 V.
Toujours sur le blog de @hbachetti tu trouveras une comparaison entre les différents modèles de convertisseurs disponibles.
Ainsi que leur consommation au repos → toujours orienté alimentation autonome.

PS : un schéma papier, stylo, règle, scanné ou photographié, serait plus simple à comprendre avec moins de risque d'erreur qu'un long discours.

Merci de ne pas taper au kilomètre et de passer à la ligne et même de sauter des lignes.
Ton pavé est assez indigeste, je ne sais pas si tout le monde le lira.

1 Like

Ok pour le pavé, j'y ferai attention.

Merci pour les précieux conseils pour économiser encore plus !

J'avais déjà lu ta "passion" pour les piles 9V...Simplement j'utilise ça parce que j'ai deux piles 9V rechargeables sous la main.

voici donc le fameux schéma de montage. ATTENTION AUX VISITEURS : CE MONTAGE NE MARCHE PAS.
Est-ce qu'il y a une "faute grave" qui fait que quand le moteur tourne, l'ATM328P pète les plombs ??

Bonjour,

Ton ULN2803 c'est un ULN2803 (sans diode de protection intégrée) ou un 2803A (avec diode de protection intégrée)?
S'il n'y a pas de diode de protection intégrée il faut ajouter une diode de roue libre.
Le COM devrait être au plus et non au gnd. Si relié au gnd avec une diode de protection intégrée, le moteur devrait tourner en permanence. Si ce n'est pas le cas il n'y a pas de diode de protection dans le ULN2803.
Ajouter un condensateur de 100nF et 10µF au plus près de l'atmega.

1 Like

merci kamill et désolé 68tjs, avec le schéma tu aurais vu cette erreur grossière tout de suite. Mais bon ce n'était pas le fond du pb et tes conseils vont m'être très utiles ainsi qu'aux autres personnes qui les liront.

J'ai testé tous mes ULN2803A (c'est bien avec diode intégrée) et aucun ne marche, je suppose que la tension de puissance est trop faible, il faut 12V peut-être).

J'ai mis les condensateurs recommandés près de l'atmega, j'ai remis un transistor en commutation pour tester, mais le "bruit" du moteur fait toujours planter l'atmega.

d'ailleurs entre-temps j'ai aussi essayé d'utiliser un relai carrément, et c'est pareil.

Je vais un peu potasser les options proposées par 68tjs...Si entre-temps quelqu'un a une idée , vraiment merci d'avance !

Si tu mets un transistor (ou un relais), n'oublie pas la diode de roue libre.

1 Like

Bonjour Wabis

As tu essayé de déparasiter ton moteur?

Cordialement
jpbbricole

1 Like

bonjour jpbbricole,
non j'avoue. J'ai vu que ça se faisait mais je pensais que c'était pour des montages très sophistiqués ! Du coup je vais devoir le faire pour être sûr de ne rien louper.

Bonjour Wabis

Ces petits moteurs, style jouets à 3V. sont de véritables s.....rie pour un système comme l'Arduino, qui, entre parenthèses, est aussi un système que l'on peut classer comme sophistiqué, malgré sa facilité d'emploi :wink:

Cordialement
jpbbricole

1 Like

Bonjour,

comme le dit 68tjs, les piles 9V sont a bannir vu leur faible capacité.

Les batteries rechargeables 9V sont encore pires. La capacité est divisée par 3.

Commence par alimenter ton montage avec une batterie sérieuse et trouve une autre utilisation pour tes batteries 9V.

1 Like

Ton régulateur 5V est mal cablé :

image

il faut :

JMe87 ok ok je laisse tomber les piles 9V :slight_smile:

concernant le régulateur c'est mon schéma qui est faux (désolé), mon cablage est bon.

par contre, j'avais mal cablé le ULN2803A. Maintenant les choses vont un peu mieux, mais on sent bien que l'ATMEGA souffre du bruit du moteur, il fait encore quelques trucs bizarre non conforme au code. Va falloir déparasiter le moteur et j'en profiterai pour changer d'alim, passer sur l'horloge interne 8MH.

grace à vos conseils je me suis penché sur l'antiparasitage du petit moteur, qui est comme j'ai pu l'entendre sur Youtube "[...] une petite merde [...] qui produit peu de couple mais beaucoup de parasite.." ! Et je suis tombé sur cette excellente vidéo dont je tiens à partager le lien pour les amateurs / débutants qui viendraient à lire ces messages:

Quand j'aurai déparasité "cette petite merde", je vous dirai si ça marche enfin

1 Like

J'ai réussi ! J'ai mis les gros moyens pour déparasiter le moteur : les 3 condensateurs classiques de 47nF et 470nF sur le moteur, (puis une diode roue libre même si l'ULN2803A en a déjà une), puis des self radiales de 1MOH en séries (les trucs bleus), puis un condensateur de 100uF. J'ai testé le "bruit" avant / après avec un...petit haut parleur de talky walky démonté (c'est bricolo du dimanche mais ça marche !), et bien le bruit est bien bien calmé (au prix d'un peu de puissance/vitesse du moteur mais pas grave pour mon projet).

Coté ATMEGA328P, j'ai gardé le quartz parce que j'ai tout planté en essayant de fonctionner avec l'horloge interne 8MHz...

Côté alimentation, j'ai séparé celle du moteur de celle du microcontrôleur. Je traîne encore avec ma 9V pour le microcontrôleur parce que les Lipo 720mAh que j'ai commandées ont un délai de livraison de folie (j'avais pas vu...)

Et voilà, l'ATMEGA328P fonctionne parfaitement, même quand le moteur tourne.

Si cela fonctionne, tant mieux. :grinning:

Il y a une différence entre diode interne à l'ULN et diode à raz du moteur : les longueurs de fils.
Avec la diode le plus à raz du moteur tu court-circuites les parasites avec un chemin très court.
Si l'ULN est placé à raz du moteur l'efficacité devrait être la même. Mais si tu as des longueurs de fil entre l'ULN et le moteur, tu promènes les parasites sur tout ton montage.

Quand c'est possible, la meilleure répartition est de placer l'interface de puissance au plus près de l'organe à commander, les signaux de commandes sont plus simples à transporter.

Petit détail : même si tu as déjà une liaison de masse pour d'autres raisons, le fil de commande doit être accompagné de son fil de masse personnel, les deux fils data et masse devront être torsadés, c'est la configuration qui donne le meilleur résultat.

Truc : tu attaches les deux fils data et masse à un point fixe, tu serres l'autre extrémité des deux fils dans un mandrin de perceuse et tu fais tourner : c'est ce qui donne la torsade la plus régulière.

1 Like

Je note !
Un grand merci à 68tjs et aux autres, vous connaissez plein de trucs super utiles.

Bonjour Wabis

Super !!!

Les bobinages que ce soit un relais ou un moteur, au moment où il tirent et, également, au moment du relâchement, sont "le truc" à se méfier, surtout avec un microcontrôleur.

Bonne continuation.
Cordialement
jpbbricole

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.