Go Down

Topic: moteur pas à pas qui chauffe (Read 1 time) previous topic - next topic

neonex

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


et avec ce code
Quote
#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é.
N'attendez pas de savoir pour entreprendre.
Drawall, le robot qui dessine : http://drawall.cc/

LamiRene

Bonjour,

Pourriez-vous nous fournir une photo de votre montage ?

L'ami René
Tous pour un et un pour tous !

neonex

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  ;)
Je vous remercie


neonex

Code: [Select]

#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);

}

neonex

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

icare

Bonjour,
C'est quoi le plat de nouille ci-dessus ?
C'est illisible :(
2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

fdufnews

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


neonex

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)

neonex

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

Christian_R

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

neonex

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

icare

Bonjour,

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 ?
2B OR NOT(2B) = FF
Arduino 1.0.5 + Notepad++ (sous Linux Fedora et/ou Windows)

fdufnews


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.

Go Up