Go Down

Topic: stepper motor voltage stop (Read 208 times) previous topic - next topic

pablo21

Bonjour, je suis sur un projet qui utilise un moteur pas à pas alimenté par batterie et je voudrais couper l'alimentation du moteur pour réduire la consommation de la batterie
Merci pour votre temps 

fdufnews

Et donc on est supposé deviner quel matériel tu utilises et comment tu t'en sers?

pablo21

#2
Oct 18, 2020, 10:28 am Last Edit: Oct 18, 2020, 02:44 pm by pablo21
Bonjour, oui effectivement je suis bête de ne pas y avoir pensé, merci de m'avoir fait par de se constat .
J'utilise un moteur pas a pas 28BYJ-48 avec un UNL2003 sur un arduino nano, j'utilise (stepper.h) pour le fonctionnement, le moteur est contrôlée par des LDR5516
Mon problème est que le moteur reste en prise et consomme 0.7A en permanence
voila mon code:


Code: [Select]
#include <Stepper.h>;
Stepper moteur(200,8,10,9,11);
int valeur = analogRead(A0);


void setup() {
Serial.begin(9600);
Serial.println(valeur);
moteur.setSpeed(100);
}

void loop() {
 valeur =analogRead(A0);
 delay(1000);
 if (valeur >= 600)
 {
   moteur.step(2048);}
 while (valeur >= 600)
 
 {
   valeur =analogRead(A0);
   delay(1000);
   Serial.println(valeur);
 }
  valeur =analogRead(A0);
  delay(1000);
 if (valeur <= 600)
 {
   moteur.step(-2048);}
 while (valeur <= 600)

 {
   valeur =analogRead(A0);
   delay(1000);
   Serial.println(valeur);
 } 
 
 }





merci pour votre réponse

#3
Oct 18, 2020, 01:25 pm Last Edit: Oct 18, 2020, 01:26 pm by vileroi
A ma connaissance, la fonction n'existe pas dans la librairie, il faut donc la rajouter. Pour que le moteur ne soit plus alimenté, il suffit de bloquer le UNL2003, en lui mettant à 0 ses entrées. Par exemple avec la fonction coupe ou en mettant ses 4 lignes de code directement là ou on en a besoin:

Code: [Select]
void coupe(void)
{
  digitalWrite(8,LOW);
  digitalWrite(9,LOW);
  digitalWrite(10,LOW);
  digitalWrite(11,LOW);
}


Par contre la bibliothèque est en mode deux phases à la fois, et lorsque l'on coupe le courant, le moteur devrait s'aligner sur un pas (rémanence minimum), et l'arrêt peut provoquer un demi-pas en plus ou en moins. A priori en reprenant  l'alimentation, on devrait rattraper le demi pas de l'arrêt.
Il est possible que des contraintes de la démultiplication ou les jeux... fassent perdre des pas entre l'arrêt et le redémarrage. Rien n'est donc garanti de la bonne position si il y a des arrêts. A vérifier.

Voir aussi comment poster sur le forum (corriger avec des balises).

pablo21

#4
Oct 18, 2020, 02:54 pm Last Edit: Oct 18, 2020, 02:56 pm by pablo21
Merci pour votre réponse j'ai lu et corrigé ^^
Le projet est une porte de poulailler .
C'est la première fois que je post sur un forum et j'ai fait l'impasse sur la lecture des règle de celui ci, bien quel soit tout a fait logique !
C'est la premier fois pour moi aussi avec un arduino et c'est mon premier code
si je comprend bien il faudrait que j'écrive mon code de cette façon ?

Code: [Select]

#include <Stepper.h>;
Stepper moteur(200,8,10,9,11);
int valeur = analogRead(A0);


void setup() {
Serial.begin(9600);
Serial.println(valeur);
moteur.setSpeed(100);
}

void loop() {
  valeur =analogRead(A0);
  delay(1000);
  if (valeur >= 600)
  {
    moteur.step(2048);}
void coupe(void)
{
  digitalWrite(8,LOW);
  digitalWrite(9,LOW);
  digitalWrite(10,LOW);
  digitalWrite(11,LOW);
}
  while (valeur >= 600)
 
  {
    valeur =analogRead(A0);
    delay(1000);
    Serial.println(valeur);
  }
   valeur =analogRead(A0);
   delay(1000);
  if (valeur <= 600)
  {
    moteur.step(-2048);}
void coupe(void)
{
  digitalWrite(8,LOW);
  digitalWrite(9,LOW);
  digitalWrite(10,LOW);
  digitalWrite(11,LOW);
}
  while (valeur <= 600)
 
  {
    valeur =analogRead(A0);
    delay(1000);
    Serial.println(valeur);
  }
 
  }
 




Je ne pense pas que la perte d'un pas soit très grave dans mon cas, bien qu'il serait préférable que ça n'arrive pas.

Encore merci pour vos réponse veuillez pardonner mon ignorance
 

Quote
Le projet est une porte de poulailler
J'ai l'impression qu'il y a plus de poules que d'Arduino sur ce forum.
Quote
Si je comprend bien il faudrait que j'écrive mon code de cette façon ?
Parfaitement.
Mais dans le cas présent, ce qui est rare, le code on pouvait répondre sans le code. C'est vrai qu'on a souvent besoin de plus, voir du contexte.
Les demandes de présentations sont faites pour simplifier la vie de ceux qui veulent répondre. Un lien qui n'est pas cliquable pénible avec un ordi, et quasi insuivable avec mon téléphone.
Quote
Encore merci pour vos réponse veuillez pardonner mon ignorance
De rien. Et A quoi servirait un forum si personne n'avait de questions à poser, moi le premier.



Pour la présentation un petit cnt-T sous arduino améliore la présentation.


Pour les fonctions comme coupe, on les déclare en général en dehors de la boucle. Cela donne:
Code: [Select]

#include <Stepper.h>;
Stepper moteur(200, 8, 10, 9, 11);
int valeur = analogRead(A0);


void setup() {
  Serial.begin(9600);
  Serial.println(valeur);
  moteur.setSpeed(100);
}


void coupe(void){
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
}


void loop() {
  valeur = analogRead(A0);
  delay(1000);
  if (valeur >= 600)
  {
    moteur.step(2048);
  }
  coupe();
  while (valeur >= 600)

  {
    valeur = analogRead(A0);
    delay(1000);
    Serial.println(valeur);
  }
  valeur = analogRead(A0);
  delay(1000);
  if (valeur <= 600)
  {
    moteur.step(-2048);
  }
  coupe();
  while (valeur <= 600)

  {
    valeur = analogRead(A0);
    delay(1000);
    Serial.println(valeur);
  }

}

On peut aussi mettre les 4 lignes directement dans le code (a faire si on ne le fait qu'une fois , ici on est obligé de répéter):
Code: [Select]

#include <Stepper.h>;
Stepper moteur(200, 8, 10, 9, 11);
int valeur = analogRead(A0);


void setup() {
  Serial.begin(9600);
  Serial.println(valeur);
  moteur.setSpeed(100);
}


void loop() {
  valeur = analogRead(A0);
  delay(1000);
  if (valeur >= 600)
  {
    moteur.step(2048);
  }
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  while (valeur >= 600)

  {
    valeur = analogRead(A0);
    delay(1000);
    Serial.println(valeur);
  }
  valeur = analogRead(A0);
  delay(1000);
  if (valeur <= 600)
  {
    moteur.step(-2048);
  }
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  while (valeur <= 600)

  {
    valeur = analogRead(A0);
    delay(1000);
    Serial.println(valeur);
  }

}

pablo21

#6
Oct 19, 2020, 09:59 am Last Edit: Oct 19, 2020, 02:06 pm by pablo21
J'ai l'impression qu'il y a plus de poules que d'Arduino sur ce forum.Parfaitement.
Oui effectivement, il y a énormément de projet porte poule !  :)
J'en ait fait une avec un tuto, mais ne pas comprendre se que je fessait (même si ça fonctionne) ma décidé a le faire moi même et jusqu'à présent je m'en était bien sortie ^^
la porte n'est qu'un début, j'aimerai faire un système de gestion pour de petite exploitation en open source (météo, surveillance, suivi animal etc...) gérer avec une appli mobile, j'ai pas fini ^^
 




Pour les fonctions comme coupe, on les déclare en général en dehors de la boucle. Cela donne:
Code: [Select]

#include <Stepper.h>;
Stepper moteur(200, 8, 10, 9, 11);
int valeur = analogRead(A0);


void setup() {
  Serial.begin(9600);
  Serial.println(valeur);
  moteur.setSpeed(100);
}


void coupe(void){
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
}


void loop() {
  valeur = analogRead(A0);
  delay(1000);
  if (valeur >= 600)
  {
    moteur.step(2048);
  }
  coupe();
  while (valeur >= 600)

  {
    valeur = analogRead(A0);
    delay(1000);
    Serial.println(valeur);
  }
  valeur = analogRead(A0);
  delay(1000);
  if (valeur <= 600)
  {
    moteur.step(-2048);
  }
  coupe();
  while (valeur <= 600)

  {
    valeur = analogRead(A0);
    delay(1000);
    Serial.println(valeur);
  }

}

effectivement c'est beaucoup plus propre comme ça !
Encore merci le code fonctionne parfaitement !
la conso reste élevé mais c'est beaucoup mieux je passe de 0.7Ah a 0.025Ah
J'ai trouvé cette article très intéressant https://makecademy.com/arduino-battery/ 
En utilisant la bibliothèque low power je descend a 0.012Ah mais je n'est pas trouvé comment l'arrêté j'jusqu'au prochain changement d'état (jour/nuit)
Code: [Select]
#include "LowPower.h"
#include <Stepper.h>;

Stepper moteur(200, 8, 10, 9, 11);
int valeur = analogRead(A0);


void setup() {
  Serial.begin(9600);
  Serial.println(valeur);
  moteur.setSpeed(100);
}


void coupe(void){
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
}


void loop() {
  valeur = analogRead(A0);
  delay(1000);
  if (valeur >= 800)
  {
    moteur.step(2048);
  }
  coupe();
  LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
  while (valeur >= 800)
 
  {
    valeur = analogRead(A0);
    delay(1000);
    Serial.println(valeur);
  }
  valeur = analogRead(A0);
  delay(1000);
  if (valeur <= 800)
  {
    moteur.step(-2048);
  }
  coupe();
  LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
  while (valeur <= 800)

  {
    valeur = analogRead(A0);
    delay(1000);
    Serial.println(valeur);
  }

}



Pour ce qui est des moteurs pas à pas c'est mon rayon. Pour cet autre problème, je n'ai pas de compétences particulières. Pour avoir plus de vues/réponses c'est mieux de modifier le titre "stepper motor voltage stop" en un titre correspondant à la nouvelle problématique. Je crois que cela se fait en modifiant le premier post en éditant le sujet.

pablo21

je vais faire ça encore merci pour vos conseil 

Go Up