moteur pas à pas qui chauffe

Bonjour,
j'ai réalisé un montage avec un moteur pas à pas branché comme ceci

et avec ce code

#include <Stepper.h> // inclusion de la librairie Stepper

const int nbr_pas = 200; // définit le nombre de pas pour un tour complet
Stepper mon_moteur(nbr_pas, 0, 1);// déclare un moteur pas à pas appelé mon_moteur,
// 200 pas/tour, utilisant les broches 0 et 1

void setup() {

mon_moteur.setSpeed(20); // définit la vitesse de rotation à 20 tr/min
}
void loop()
{
mon_moteur.step(400); // deux tour ;
delay(2000);

mon_moteur.step(-800); // quatre tour dans l'autre sens ;
delay(2000); }

le moteur et le code fonctionne mais le moteur fait des petits clic sans cesse et chauffe.. je ne sais pas pourquoi?

Inverse 2 fils de ton moteur, il est peut-être mal cablé.

Bonjour,

Pourriez-vous nous fournir une photo de votre montage ?

L'ami René

Voici mon code et mon schéma aprés quelques modifications.
Le code fonctionne, mais le servo moteur ou le moteur pas à pas ont tendance à chauffer. Je pense que c'est du à des parasites; Mais je n'arrive pas à trouver comment y remedier.
C'est le montage qui ne doit pas étre optimal.
Pourriez vous aider un novice un peu perdu :wink:
Je vous remercie

#include <LiquidCrystal.h>
#include <Wire.h>
#include "RTClib.h"
#include <Servo.h> // inclusion de la librairie Servo
#include <Stepper.h> // inclusion de la librairie Stepper

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
RTC_DS1307 RTC;

Servo myservo; // déclaration d'une variable de type Servo
int pos = 14; // variable contenant la position du servomoteur

const int nbr_pas = 200; // définit le nombre de pas pour un tour complet 
Stepper mon_moteur(nbr_pas, 9, 10);// déclare un moteur pas à pas appelé mon_moteur, 
       // 200 pas/tour, utilisant les broches 9 et 10  

int comled=6;     // init de la sortie de commande du retroeclairage du LCD (vers la base du transistor)
int bouton1=7;   // init entrée correspondant au bouton 1 = +
int bouton2=8;   // init entrée correspondant au bouton 2 = -
int bouton3=13;  // init entrée correspondant au bouton 3 = heure de distribution


int var1=0;  // variables pour le test des boutons
int var2=0;   
int var3=0; 
int ancvar1=0;
int ancvar2=0;
int ancvar3=0;   


int compteurallumage=300; // variable temps retroeclairage (en dixième de secondes)
int heure1=0; // variable pour heure première distribution
int heure2=0; // variable pour heure deuxieme distribution
int heure3=0; // variable pour heure troisieme distribution
int heure4=0; // variable pour heure quatrieme distribution
int dist=0; // mode d'affichage 0=> affichage normal ; 1=> heure distribution 1 ; 2=> heure distribution 2 ; 3=> heure distribution 3 ; 4=> heure distribution 4


void setup() {
  
  myservo.attach(14); // attache la variable Servo à la broche 14 (A0)
  myservo.write(20);  // set servo a 20°
  
  mon_moteur.setSpeed(20); // définit la vitesse de rotation à 20 tr/min
  
  // set up de l'écran LCD
  pinMode(comled,OUTPUT);   // déclaration des sorties
  



  pinMode(bouton1,INPUT);  // déclaration des entrées
  pinMode(bouton2,INPUT);
  pinMode(bouton3,INPUT);
 
  digitalWrite(bouton1, HIGH);  // entrées par défaut à 1, évite une résistance de pull-UP.
  digitalWrite(bouton2, HIGH);
  digitalWrite(bouton3, HIGH);
 
  Serial.begin(9600);
  Wire.begin();
  RTC.begin();
  lcd.begin(16, 2);
  
  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
   RTC.adjust(DateTime(__DATE__, __TIME__));
  }
}




void loop() {
    
  
  DateTime now = RTC.now();
    long time_mil = now.hour()*10000 + now.minute()*100 + now.second();
  
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
  
    if (compteurallumage>0)
    {
      compteurallumage=compteurallumage-1;
      digitalWrite(comled,HIGH);
    }
    else
    {
       digitalWrite(comled,LOW);
    }

  
  // reglage des distributions ;
  switch (dist) {
    
    case 0: 
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print(now.hour());
      lcd.print(":");
      if (now.minute() < 10) {
      lcd.print("0");
      }
      lcd.print(now.minute());
      lcd.print(":");
      if (now.second() < 10) {
      lcd.print("0");
      }
      lcd.print(now.second());
      break;
    
    case 1:
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Heure distrib 1?");
      lcd.setCursor(0, 1);
      lcd.print(heure1);
      lcd.print("H");
      break;
   
    case 2:
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Heure distrib 2?");
      lcd.setCursor(0, 1);
      lcd.print(heure2);
      lcd.print("H");
      break;
      
    case 3:
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Heure distrib 3?");
      lcd.setCursor(0, 1);
      lcd.print(heure3);
      lcd.print("H");
      break;
      
    case 4:
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Heure distrib 4?");
      lcd.setCursor(0, 1);
      lcd.print(heure4);
      lcd.print("H");
      break;
  }

 
   // check des boutons
 
   var1=1-digitalRead(bouton1);
   var2=1-digitalRead(bouton2);
   var3=1-digitalRead(bouton3);
 
   if (var1==1) ancvar1=1;
   if (var2==1) ancvar2=1;
   if (var3==1) ancvar3=1;
 
 
 
   if (var1!=ancvar1) // relache du bouton 1
   {
      ancvar1=0;
     if (compteurallumage!=0)
     {
         switch (dist) {
            case 1:
              heure1=heure1+1;
              if (heure1==24) heure1=0;
              break;
            case 2:
              heure2=heure2+1;
              if (heure2==24) heure2=0;
              break;
            case 3:
              heure3=heure3+1;
              if (heure3==24) heure3=0;
              break;
            case 4:
              heure4=heure4+1;
              if (heure4==24) heure4=0;
              break;
          } 
          
     }
     compteurallumage=300;
   }


if (var2!=ancvar2) // relache du bouton 2
   {
      ancvar2=0;
     if (compteurallumage!=0)
     {
         switch (dist) {
            case 1:
              heure1=heure1-1;
              if (heure1<0) heure1=23;
              break;
            case 2:
              heure2=heure2-1;
              if (heure2<0) heure2=23;
              break;
            case 3:
              heure3=heure3-1;
              if (heure3<0) heure3=23;
              break;
            case 4:
              heure4=heure4-1;
              if (heure4<0) heure4=23;
              break;
          } 
          
     }
     compteurallumage=300;
   }

if (var3!=ancvar3) // relache du bouton 3
   {
     ancvar3=0;
     if (compteurallumage!=0)
     {
     
        dist=dist+1;
     }
       if (dist==5)
       {
         dist=0;
       }
    compteurallumage=300;
   }




//commande des moteurs ;

    if (heure1!=0 && heure1*10000 == time_mil) // distribution 1 ;
    { myservo.write(140); //tourne servo a 140°; 
      delay (5000);
      mon_moteur.step(200); // un tour vis sans fin ;
      delay (5000) ;
     myservo.write(20); // remet servo en position neutre;
    }
  
    if (heure2!=0 && heure2*10000 == time_mil) // distribution 2 ;
    { myservo.write(140); //tourne servo a 140°; 
      delay (5000);
      mon_moteur.step(200); // un tour vis sans fin ;
      delay (5000) ;
     myservo.write(20); // remet servo en position neutre;
    }
    
    if (heure3!=0 && heure3*10000 == time_mil) // distribution 3 ;
    { myservo.write(140); //tourne servo a 140°; 
      delay (5000);
      mon_moteur.step(200); // un tour vis sans fin ;
      delay (5000) ;
     myservo.write(20); // remet servo en position neutre;
    }
    
    if (heure4!=0 && heure4*10000 == time_mil) // distribution 4 ;
    { myservo.write(140); //tourne servo a 140°; 
      delay (5000);
      mon_moteur.step(200); // un tour vis sans fin ;
      delay (5000) ;
     myservo.write(20); // remet servo en position neutre;
    }
 
    
   delay(100);

}

Sinon, pour expliquer le projet : c'est pour réaliser un distributeur de nourriture pour animaux.
Un module horloge ds 1307, un ecran LCD , les boutons pour regler les heures de distributions (possibilite de faire 4 distributions par jour) et un servo moteur pour ouvrir une trappe (ou la nourriture s'écoulera) ainsi qu'un moteur pas à pas (pour réaliser une vis sans fin pour pousser la nourriture dans la trappe).

Bonjour,
C'est quoi le plat de nouille ci-dessus ?
C'est illisible :frowning:

Ce moteur pas-à-pas, quelle tension? et quel courant dans les bobines? Pour se faire une idée de la puissance.

voila, j'ai essayé de refaire plus propre.
Le moteur pas à pas 12V ; 0.3A (celui qui chauffe)
Et le servo c'est un futaba S3003 (lui il vibre)

Petite info supplémentaire : ma led TX clignote sans cesse

Tx clignote normalement lors de chaque Serial.print pour passer des infos sur le serial monitor.

Le moteur pas à pas cherche à verrouiller sa position, il consomme du courant pendant qu'il ne tourne pas.
Avec une vis sans fin qui ne peut pas tourner toute seule, ça ne me semble pas utile de maintenir le couple statique en permanence.

merci beaucoup.
Du coup, comment je fais pour ne pas maintenir le couple statique en permanence?

Bonjour,

neonex:
merci beaucoup.
Du coup, comment je fais pour ne pas maintenir le couple statique en permanence?

La seule façon de maintenir le couple c'est d'alimenter le moteur.
Quand tu dis que le moteur chauffe, quelle température ?

neonex:
merci beaucoup.
Du coup, comment je fais pour ne pas maintenir le couple statique en permanence?

Tu coupes le moteur tout simplement.

En même temps qu'une bobine chauffe quand on passe du courant dedans n'a rien de choquant en soit.

Mais pour ton application, il n'y a, à priori, pas besoin de tenir le moteur alimenté entre deux distributions. Je doute que le poids de la nourriture puisse entraîner la vis sans fin.

Bonjour,

fdufnews:
Tu coupes le moteur tout simplement.
En même temps qu'une bobine chauffe quand on passe du courant dedans n'a rien de choquant en soit.
Mais pour ton application, il n'y a, à priori, pas besoin de tenir le moteur alimenté entre deux distributions. Je doute que le poids de la nourriture puisse entraîner la vis sans fin.

Tout va dépendre de la mécanique qui se trouve derrière. En général un dispositif vis/écrou est rarement réversible (tout dépend de l'angle d'attaque du dispositif). Il faudrait que tu précises un peu comment tu réalises la partie mécanique.
Les propos de fnews sont tout à fait exact si le dispositif n'est pas réversible, par contre sur des CNC avec vis/écrous (non réversibles) on maintien le couple pour de sécurité, de suivi et d'exploitation.
Par contre les soi-disant problème de moteurs qui chauffe (ce qui ne dit rien si on n'a pas une valeur de la température) on déjà fait l'objet de quelques topics.
"Une mesure vaut mieux que l'avis d'un millier d'experts"
@+