Aller au contenu

GO Print

Réglage d'un potentiomètre


demandeinfos

Messages recommandés

Bonjour,

J'utilise le code ci-dessous avec le matériel suivant : TB6600 + carte Arduino UNO + 1 moteur Nema 17+ 1 mini interrupteur + 1 mini potentiomètre le tout relié sur une breadboard.
 

#include <AccelStepper.h>
 
#define INTERUPTEURPIN 10
#define ANALOGPIN A0

AccelStepper stepper(1, 4, 7); // TB6600 OFF OFF ON ON ON OFF
 
void setup()
{
pinMode(INTERUPTEURPIN,INPUT);
stepper.setMaxSpeed(10000);
}
 
void loop()
{

if( digitalRead(INTERUPTEURPIN) ) stepper.setSpeed(analogRead(ANALOGPIN));
else stepper.setSpeed(0);

stepper.runSpeed();

 
}

Tout fonctionne, mais j'ai du mal à obtenir la régulation de la vitesse par le potentiomètre : après avoir mis l'alimentation, quand je tourne la vis après parfois plusieurs tours, dès fois il ne se passe rien, puis à un certain moment la vitesse change un peu mais pas trop, puis plus rien.

Mon problème est du coup que je n'arrive pas à avoir une régulation correcte sur à peine quelques tours de vis du potentiomètre. Comment peut-on gérer cet aspect ?

Merci d'avance pour vos conseils.

Bonne journée.

Lien vers le commentaire
Partager sur d’autres sites

Tu dois faire une conversion entre la tension donnée par le potentiomètre (qui retourne une valeur entre 0 et 1023 sur la pin analogique) vers une valeur en pas par seconde à fournir à la fonction setSpeed()

Lien vers le commentaire
Partager sur d’autres sites

Merci beaucoup pour cette info claire, n'étant pas du domaine, je comprends.

Alors en m'aidant du web, j'avais essayé ça (ci-dessous) car on m'avait dit "faut multiplier la valeur du potentiomètre), mais ça ne fonctionne pas mieux
 

#include <AccelStepper.h>

#define INTERUPTEURPIN 10

#define ANALOGPIN A0

int val = 0; // variable de type int pour stocker la valeur de la mesure

AccelStepper stepper(1, 4, 7);

void setup()

{

pinMode(INTERUPTEURPIN,INPUT);

stepper.setMaxSpeed(10000);

}

void loop()

{

  // lire la valeur de la tension analogique présente sur la broche

  val = analogRead(ANALOGPIN); 

  // multiplier la valeur de l'entrée analogique par 10

  val *=10 ;

if( digitalRead(INTERUPTEURPIN) ) stepper.setSpeed(val);

else stepper.setSpeed(0);

stepper.runSpeed();

}

 

Pourriez-vous me donner une info ?

Merci.

Modifié (le) par demandeinfos
Lien vers le commentaire
Partager sur d’autres sites

Non, je ne me suis jamais penché sur le fonctionnement des moteurs pas-à-pas sur Arduino.

À ta place, j'essaierais d'abord d'envoyer quelques valeurs fixes pour voir comment le moteur réagit.

Regarde aussi les fichiers exemples fournis avec la bibliothèque.

Lien vers le commentaire
Partager sur d’autres sites

Bonjour, 

Durant la période de test, je te conseil d'envoyer les donnés que tu veux vérifier sur l'interface série avec une instruction serial.println(val) pour obtenir visuellement la valeur. Vérifies que tu as bien une variation de 0 à 1023 qui s'affiche. 

Attention au type de potentiomètre que tu utilises. Si tu as un A derrière la valeur, c'est un potentiomètre linéaire donc bien adapté pour la commande du moteur. Par contre un B signifie que c'est un logarithmique et que ça va être difficile de gérer la vitesse de façon précise. 

Lien vers le commentaire
Partager sur d’autres sites

Salut, pas besoin de donner une valeur au int val (sa valeur va être donné dans le loop à chaque lecture...et y'en a assez pour lire ce bout de code autant de fois que tu vas tourner le potentiomètre dans un sens ou dans l'autre! ) :

int val;

Le max speed me semble un peu haut, essaye de descendre un peu plus bas pour voir si il y a du mieux, genre 1000, puis si ça fonctionne comme tu le veux incrémente de 1000 en 1000, puis regarde si ça va toujours, jusqu'au point trop haut que ton moteur ne pourra supporte, et peaufine en descendant de 100 en 100.....

et tu as oublié l'accélération (moi j'ai 3000 pour un petit moteur à toi de voir pour le tient...) :

    stepper.setAcceleration(3000);

Pour éviter de multiplier ta valeur val par 10 fait une map, comme ça tu monteras proportionnellement la vitesse en rapport à la lecture de ton potentiomètre (tout en mettant une limite à chaque valeur...):

  Speed =analogRead(Pin_Pot);
  Speed = map(Speed, 0, 1015, 9, 195);

en gros à 0 en lecture du potentiomètre le moteur fait 9 rotation/sec et à 1015 en lecture il fait 195 rot/sec, les valeurs lu entre 0 et 1015 monteront proportionnellement la vitesse du moteur...

C'est des bouts de code à moi donc pas les bonnes déclarations....

Et pour ma part je vois pas l’intérêt de l'interrupt dans ton bout de code, se sera plus tard si tu comptes ajouter certaine chose, et encore ça dépend...

https://pastebin.com/YJM19uZj > code valable une semaine ^^

Modifié (le) par Djam
Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Pour le potentiomètre, j'utilise celui-ci.

J'ai testé ce code, mais je n'ai pas vu de changement (un seul en passan de 10000 à 1000 le moteur tourne moins vite) :

#include <AccelStepper.h>
#define INTERUPTEURPIN 10
#define ANALOGPIN A0
#define Speed
int val ;
AccelStepper stepper(1, 4, 7); // TB6600 OFF OFF ON ON ON OFF
void setup()
{
Serial.begin(115200); //Initialisation de la communication avec la console
pinMode(INTERUPTEURPIN,INPUT);
stepper.setMaxSpeed(100);
}
void loop()
{
val = analogRead(ANALOGPIN);
val *=10 ;
Serial.print("Valeur lue : ");
Serial.println(val); // affiche la valeur du potentiomètre
delay(0); // affiche 1 fois par seconde
if( digitalRead(INTERUPTEURPIN) ) stepper.setSpeed(analogRead(val)) ;
if( digitalRead(INTERUPTEURPIN) ) stepper.setAcceleration(3000) ;
else stepper.setSpeed(0);
stepper.runSpeed();
 }

 

Je n'ai pas réussi à placer (messag d'erreur).

  Speed =analogRead(Pin_Pot);
  Speed = map(Speed, 0, 1015, 9, 195);

il apparaît des messages d'erreur.

Merci pour la page web de code, je suis dessus ;).

Bonne journée.

Lien vers le commentaire
Partager sur d’autres sites

Il est normal que tu ai une erreur puisque la variable Pin_Pot n'existe pas dans ton code (pas de déclaration). 

il y a une heure, demandeinfos a dit :

if( digitalRead(INTERUPTEURPIN) ) stepper.setSpeed(analogRead(val)) ;

Cela n'a pas de sens. Tu effectue une mesure que tu multiplies par 10 dans tes lignes précédantes et tu refais une lecture de ton potentiomètre pour initialiser ta variable setSpeed...

Replace cette ligne par

if( digitalRead(INTERUPTEURPIN) ) stepper.setSpeed(val) ;

Tu peux faire un mappage comme indiqué par Djam et ajuster les valeurs par la suite pour optimiser (avec un max speed à 1000)

val = map(val, 0, 1023, 0, 1000);

à la place de:

val *=10 ;
il y a une heure, demandeinfos a dit :

if( digitalRead(INTERUPTEURPIN) ) stepper.setAcceleration(3000) ;

Cette instruction doit être installer dans le setup comme le fait Djam... (sans la condition évidemment 😉

Modifié (le) par Zlika
Lien vers le commentaire
Partager sur d’autres sites

Merci pour les infos.

Voilà le code (Prog1) corrigé :

#include <AccelStepper.h>
#define INTERUPTEURPIN 10
#define ANALOGPIN A0
int val=0 ;
AccelStepper stepper(1, 4, 7); // TB6600 OFF OFF ON ON ON OFF
void setup()
{
Serial.begin(115200); //Initialisation de la communication avec la console
pinMode(INTERUPTEURPIN,INPUT);
stepper.setMaxSpeed(1000);
stepper.setAcceleration(3000);
}
void loop()
{
val = analogRead(ANALOGPIN);
val = map(val,0,1023,0,1000);
Serial.print("Valeur lue : ");
Serial.println(val); // affiche la valeur du potentiomètre
delay(0); // affiche 1 fois par seconde
if( digitalRead(INTERUPTEURPIN) ) stepper.setSpeed(val) ;
else stepper.setSpeed(0);
stepper.runSpeed();
 }

par contre j'ai toujours le même souci, quand je lance le programme ci-dessous (prog2) :

#include <AccelStepper.h>
 #define INTERUPTEURPIN 10
AccelStepper stepper(1, 4, 7); // TB6600 OFF OFF ON ON ON OFF
 void setup()
{
pinMode(INTERUPTEURPIN,INPUT);
stepper.setMaxSpeed(10000);
stepper.setAcceleration(3000);
}
 void loop()
{
if( digitalRead(INTERUPTEURPIN) ) stepper.setSpeed(3000);
else stepper.setSpeed(0);
stepper.runSpeed();
 }

je m'aperçois que le moteur tourne beaucoup plus vite qu'avec le Prog1 (avec lequel le moteur plafonne à une faible vitesse, quel que soit le réglage du potentiomètre)

auriez-vous une piste ?

Lien vers le commentaire
Partager sur d’autres sites

Dans le prog2, tu fixes ta vitesse de rotation à 3000 pour une limite maxi à 10000, alors que le prog1 a une limite maximale à 1000. Tu tournés donc 3 fois plus vite que la position du potentiomètre à son maximum. 

Prend bien le temps de relire tes lignes de code et de les comprendre. C'est essentiel si tu veux trouver rapidement un éventuel problème et n'hésite pas à afficher les variables sur l'écran si tu as un doute su leur valeur. Ça peut te faire gagner du temps. 😊

Lien vers le commentaire
Partager sur d’autres sites

Je suis tout à fait d'accord, j'essaye de faire mon max pour ne pas diffuser de programme avec des fautes 😉 (je ne suis pas à l'abri, et à je débuté).

C'est vrai que j'ai diffusé un programme avec stepper.setMaxSpeed(1000) mais si je mets stepper.setMaxSpeed(10000) j'obtiens exactement les mêmes résultats, le moteur plafonne à une vitesse faible même au max du potentiomètre, et je n'arrive pas à atteindre les vitesses du "Prog2".

Je comprends depuis peu avec mes débuts que le signal analogique de 0 à 1023 doit être multiplier par un valeur X pour obtenir un plus grand nombre de pas envoyé au moteur (si j'ai bien compris).

Mais dans tous mes essais avec le potentiomètre, j'ai beau essayé de multiplier la valeur, d'utiliser du mappage, j'arrive toujours pas aux vitesses que j'obtiens avec le "Prog2".

Je me disais donc que soit je me trompre dans le code (c'est tout à fait possible :)) ) soit je n'ai pas bien compris la façon dont on multiplie le signal analogique et ou on place la variable multipliée dans le programme.

Merci d'avance pour vos retour.

Lien vers le commentaire
Partager sur d’autres sites

J'avais bien compris que tu débutais en programmation d'où ma démarche plus pédagogique 😉. On est tous passé par là. 

il y a une heure, demandeinfos a dit :

val = map(val,0,1023,0,1000);

Quand tu dis avoir modifié le mappage, as tu bien pensé à changer le dernier paramètre 1000 par 3000 ? Cette donnée représente la valeur retournée pour une valeur de 1023 (troisième paramètre) provenant du convertisseur analogique. 

Logiquement tu dois voir ta valeur affichée qui varie de 0 à 3000.

Modifié (le) par Zlika
Lien vers le commentaire
Partager sur d’autres sites

j'avais déjà essayé

j'avais même essayé val = map(val,0,1023,-6000,6000); pour voir mais il se passe toujours la même chose,

avec le Prog1 le moteur plafonne à une vitesse faible même au max du potentiomètre, e quelle que soit la valeur affichée dans le moniteur et du mappage (que je mette, 5, 1000 ou 6000), et je n'arrive pas à atteindre des vitesses importantes comme je le fais "à la main" dans le "Prog2".

Lien vers le commentaire
Partager sur d’autres sites

ci-dessous mon dernier code avec toujours le même résultat d'un moteur qui plafonne à basse vitesse :

#include <AccelStepper.h>
#define INTERUPTEURPIN 10
#define ANALOGPIN A0
int val=0 ;
int valInter=0 ;
AccelStepper stepper(1, 4, 7); // TB6600 OFF OFF ON ON ON OFF
void setup()
{
Serial.begin(115200); //Initialisation de la communication avec la console
pinMode(INTERUPTEURPIN,INPUT);
stepper.setMaxSpeed(10000);
stepper.setAcceleration(3000);
}
void loop()
{
val = analogRead(ANALOGPIN);
valInter = map(val,0,1023,0,3000);
Serial.print("Valeur lue : ");
Serial.println(valInter); // affiche la valeur du potentiomètre
delay(0); // affiche 1 fois par seconde
if( digitalRead(INTERUPTEURPIN) ) stepper.setSpeed(valInter) ;
else stepper.setSpeed(0);
stepper.runSpeed();
 }
Lien vers le commentaire
Partager sur d’autres sites

Le problème vient peut être du fait que tu attribues une valeur à setspeed a chaque passage dans la boucle. Il serait judicieux de faire une lecture du potentiomètre et la modification du paramètre setspeed toute les 50 ms. 

Pour vérifier, je te conseille de mettre cette partie de code dans une condition liée au temps où éventuellement à l'état d'une broche de l'arduino pour pouvoir le shunter

Modifié (le) par Zlika
Lien vers le commentaire
Partager sur d’autres sites

Je proposerais aussi pour test de remplacer le valInter lu par un une boucle for de 100 en 100 toutes les secondes pour vérifier comment se comporte le stepper et être sur qu'il n'y ait pas de problème 'externe' pouvant limiter la vitesse.

Lien vers le commentaire
Partager sur d’autres sites

Salut fait vite fait donc peut étre des erreurs:

#include <AccelStepper.h>

int INTERUPTEURPIN = 10 ;
int Pin_Pot = 0 ;
int val_Pot ;
int Speed ;
unsigned long Val_Read;
unsigned long Old_Read;
const long Interval = 1000; // interval de lecture valeur Potentiométre
AccelStepper stepper(1, 4, 7); // TB6600 OFF OFF ON ON ON OFF

void setup()
{
  Serial.begin(115200); //Initialisation de la communication avec la console
  pinMode(INTERUPTEURPIN,INPUT);
  digitalWrite(INTERUPTEURPIN, HIGH); //Pullup interne activé
  stepper.setMaxSpeed(10000);
  stepper.setAcceleration(3000);
}

void loop()
{
  val_Pot = analogRead(Pin_Pot);
  Speed = map(val_Pot,0,1023,0,3000);

  Val_Read = millis();
    if (Val_Read - Old_Read >= Interval){ //Lecture potentiométre tout les "Interval"
      Serial.print("Valeur Pot : ");
      Serial.println(val_Pot); // affiche la valeur du potentiomètre
      Serial.print("Vitesse : ");
      Serial.println(Speed); // affiche la vitesse
      Old_Read = Val_Read;
    }

    if( digitalRead(INTERUPTEURPIN) == true )
      stepper.setSpeed(Speed) ;
    else 
      stepper.setSpeed(0);
      
  stepper.runSpeed();
 }
Modifié (le) par Djam
Lien vers le commentaire
Partager sur d’autres sites

Et pour finir une version avec quelques améliorations et qui passe à la compilation:

#include <AccelStepper.h>

int INTERUPTEURPIN = 10;
int Pin_Pot = 0;
int Val_Pot;
int Speed;
bool Switch_ON = false; // variable utilisée pour détecter un basculement 
unsigned long Val_Read;
unsigned long Old_Read;
const long Interval = 250; // interval de lecture valeur Potentiométre
const int MaxSpeed = 3000; // vitesse maximale du moteur
AccelStepper stepper(1, 4, 7); // TB6600 OFF OFF ON ON ON OFF

void setup()
{
  Serial.begin(115200); //Initialisation de la communication avec la console
  pinMode(INTERUPTEURPIN,INPUT);
  digitalWrite(INTERUPTEURPIN, HIGH); //Pullup interne activé
  stepper.setMaxSpeed(MaxSpeed);
  stepper.setAcceleration(3000);
}

void loop()
{
  if( digitalRead(INTERUPTEURPIN) == true ) { // si l'interrupteur moteur est sur "Rotation"
    Val_Read = millis(); // lecture du temps pour comparaison
    if ((Switch_ON == false) or (Val_Read - Old_Read >= Interval)) { // si l'interrupteur moteur vient juste d'être positionné sur "Rotation" ou si "Interval" est dépassé => Lecture du potentiomètre et
      Val_Pot = analogRead(Pin_Pot);
      Speed = map(Val_Pot,0,1023,0,MaxSpeed);
      Serial.print("Valeur Pot : ");
      Serial.println(Val_Pot); // affiche la valeur du potentiomètre
      Serial.print("Vitesse : ");
      Serial.println(Speed); // affiche la vitesse
      stepper.setSpeed(Speed); // Assigne la consigne de vitesse
      Old_Read = Val_Read; // mémorise le temps comme réference pour la prochaine itération
      Switch_ON = true; // Mémorise la position de l'interrupteur du moteur
    }
  }
  else { // si l'interrupteur moteur n'est pas sur rotation
    if (Switch_ON == true) { // mais qu'il vient juste d'être basculé
      stepper.setSpeed(0); // on stoppe la rotation du moteur
      Switch_ON = false; // et on mémorise le nouvel état de l'interrupteur moteur
    }
  }
  stepper.run(); // utilisation de la procedure stepper.run() à la place de stepper.runSpeed() pour inclure les accélérations/décélérations
}

A noter dans la documentation de la librairie une limitation à prendre en compte.

Citation

The fastest motor speed that can be reliably supported is about 4000 steps per second at a clock frequency of 16 MHz on Arduino such as Uno etc. Faster processors can support faster stepping speeds.

il est donc certain que l'utilisation d'une carte Uno ou équivalent en puissance limitera la vitesse du moteur. Mais vu la capacité de mémoire, il est de toute façon impossible de stocker un programme complexe.

@demandeinfos

La bibliothèque 'AccelStepper'  possède de nombreuses procédures et propriétés qui seraient parfaites pour la gestion d'un déplacement sur un axe X/Y. Elle dispose, en plus de la gestion de l'accélération/décélération, d'une propriété qui 'compte' les pas, de procédures pour des déplacements en nombre de pas relatifs et absolus. Il serait vraiment dommage de ne pas l'intégrer dans ton projet car dans ce cas il te faudra réécrire des fonctions pour gérer les déplacements.

tu peux trouver sa documentation en anglais dans le répertoire 'projets/libraries/AccelStepper/extras/doc' si tu as fait une installation classique de l'IDE ARDUINO.

Modifié (le) par Zlika
Lien vers le commentaire
Partager sur d’autres sites

  • 2 weeks later...

Bonsoir,

Désolé pour le retour tardif.

Le code de Djam fonctionne très bien : j'en avais déjà un mais celui de Djam donne une plage de vitesse assez large de faibles à hautes.

Par contre celui Zlika, je ne comprends pas ce qu'il se passe : une fois le code téléversé, rien de ne se passe, et quand je tourne le potentiomètre, le moteur va se mettre à tourner doucement à un moment donné puis décélère (sans toucher au potentiomètre), si je tourne de nouveau le potentiomètre ceci peut encore se reproduire.

Merci pour vos retours, je vais poursuivre mes essais et reviendrai sur le post si besoin.

Bonne soirée.

Lien vers le commentaire
Partager sur d’autres sites

Le 08/10/2018 at 21:08, Zlika a dit :

if ((Switch_ON == false) or (Val_Read - Old_Read >= Interval)) { // si l'interrupteur moteur vient juste d'être positionné sur "Rotation" ou si "Interval" est dépassé => Lecture du potentiomètre et

Oups petit mélange de language 

Peux-tu essayer en remplaçant le code au dessus par:

 if ((Switch_ON == false) || (Val_Read - Old_Read >= Interval)) { // si l'interrupteur moteur vient juste d'être positionné sur "Rotation" ou si "Interval" est dépassé => Lecture du potentiomètre et

En espérant que cette fois ci ça fonctionne... 

Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
  • Sur cette page :   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
  • YouTube / Les Imprimantes 3D .fr

×
×
  • Créer...