Aller au contenu

Filament ABS

demandeinfos

Réglage d'un potentiomètre

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.

Partager ce message


Lien à poster
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()

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
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.

Partager ce message


Lien à poster
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. 

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
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.

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
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 ?

Partager ce message


Lien à poster
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. 😊

Partager ce message


Lien à poster
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.

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
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".

Partager ce message


Lien à poster
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();
 }

Partager ce message


Lien à poster
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

Partager ce message


Lien à poster
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.

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour,

Merci pour vos retours, je fais une pause sur le post car il faut que je comprenne un peu les histoires de temps comme vous me l'avez envoyé. J'ai trouvé aussi ce lien.

Je vais faire quelques essais et si jamais je ne m'en sortais pas, je vous tiendrai au courant.

Bonne journée.

Partager ce message


Lien à poster
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.

×