Autres PAP piloté par Arduino

gaston83
Compagnon
17 Février 2016
1 048
FR-71520
  • Auteur de la discussion
  • #1
Bonjour à tous,
Je voudrais piloter un moteur PAP avec un HY-DIV268.
Pourquoi Arduino ? J'ai récupéré ce programme
Code:
int PUL=7; //define Pulse pin
int DIR=6; //define Direction pin
int ENA=5; //define Enable Pin
void setup() {
pinMode (PUL, OUTPUT);
pinMode (DIR, OUTPUT);
pinMode (ENA, OUTPUT);

}

void loop() {
for (int i=0; i<6400; i++) //Forward 5000 steps
{
digitalWrite(DIR,LOW);
digitalWrite(ENA,HIGH);
digitalWrite(PUL,HIGH);
delayMicroseconds(50);
digitalWrite(PUL,LOW);
delayMicroseconds(50);
}
for (int i=0; i<6400; i++) //Backward 5000 steps
{
digitalWrite(DIR,HIGH);
digitalWrite(ENA,HIGH);
digitalWrite(PUL,HIGH);
delayMicroseconds(50);
digitalWrite(PUL,LOW);
delayMicroseconds(50);
}
}

D'après mes (petites) connaissances en programmation, je vois que dans la première boucle du loop, la pin Enable est à 1 et Dir à 0 alors que la pin Pulse passe de l'état 1 à 0 toutes les 50 microsecondes.

Ma question:
Si je mets à 1 ENA et DIR à 0 et que je branche un générateur (signal carré) sur le PUL, devrais-je pouvoir faire varier la vitesse du moteur ?

GG
 
Dernière édition par un modérateur:
MCrevot
Ouvrier
1 Janvier 2016
448
Bonjour,

Drole d'idée ! Le PUL est une sortie, tu vas au conflit ...

Tu peux déjà extraire les 2 premières lignes de chaque boucle, et les placer avant le for
Si tu veux faire varier la vitesse, il faut que tu fasses varier le second delay de chaque boucle : tu peux par exemple récupérer la position d'un potentiomètre sur une entrée et t'en servir pour faire varier le 50

Michel
 
JCS
Compagnon
22 Juin 2007
2 004
Cher
Bonne année à tous,

Pour tester le neurone après le premier mojito de l'année, j'ai complété le sketch de Gaston 83 en mettant un potentiomètre relié à + et - et le point milieu à A0 :



Code:
int PUL=7;  //define Pulse pin
int DIR=6;  //define Direction pin
int ENA=5;  //define Enable Pin
int VIT = 0; //Potentiomètre sur A0

void setup() {
pinMode (PUL, OUTPUT);
pinMode (DIR, OUTPUT);
pinMode (ENA, OUTPUT);
pinMode (ENA, INPUT);

}

void loop() {
int POT = analogRead(A0);
VIT = map (analogRead(POT),0,1023,10,1000);

for (int i=0; i<6400; i++) //Forward 5000 steps
{
digitalWrite(DIR,LOW);
digitalWrite(ENA,HIGH);
digitalWrite(PUL,HIGH);
delayMicroseconds(50);
digitalWrite(PUL,LOW);
delayMicroseconds(VIT);
}
for (int i=0; i<6400; i++) //Backward 5000 steps
{
digitalWrite(DIR,HIGH);
digitalWrite(ENA,HIGH);
digitalWrite(PUL,HIGH);
delayMicroseconds(50);
digitalWrite(PUL,LOW);
delayMicroseconds(VIT);
}
}
Ainsi on fait varier la vitesse du PAP avec le potentiomètre.
Ou avec un convertisseur fréquence => tension on doit pouvoir faire varier la vitesse à la place du potentiomètre.

Je pense que JPB, notre spécialiste, va certainement faire mieux.

@+

JC.
 
vax
Modérateur
5 Mars 2008
6 938
Guipavas (près de Brest)
Je ne vois pas l'intérêt de répéter à chaque passage de boucle les ordres DIR et ENA...
Une fois avant la boucle on valide ENA et on définit DIR. Une fois la boucle terminée (si on le souhaite, cela dépend des applications) on dévalise ENA...
Merci de vos éclairements si une subtilité dans Arduino impose le contraire.
 
jpbbricole
Compagnon
26 Mai 2016
1 961
Corsier-sur-Vevey (Vaud)
Bonsoir et bonne année à tous!

Je vois que les neurones sont déjà au top niveau.
Si je mets à 1 ENA et DIR à 0 et que je branche un générateur (signal carré) sur le PUL, devrais-je pouvoir faire varier la vitesse du moteur ?
Certainement, mais je ne peut pas certifier n'ayant pas ce type de matériel. Si tu nous dit quelle est l'application de ce montage on pourras mieux t'aider.

@vax +1, @MCrevot l'avait déjà signalé précédemment.
C'est plus du temps machine perdu inutilement qu'une erreur.
ça devrait ressembler à ça:
Code:
#define  PUL 7  //define Pulse pin
#define  DIR 6  //define Direction pin
#define  ENA 5  //define Enable Pin
int VIT = 0; //Potentiomètre sur A0

void setup()
{
  pinMode (PUL, OUTPUT);
  pinMode (DIR, OUTPUT);
  pinMode (ENA, OUTPUT);
  pinMode (ENA, INPUT);
}

void loop()
{

    digitalWrite(ENA,HIGH);

    digitalWrite(DIR,LOW);
    for (int i=0; i<6400; i++) //Forward 5000 steps
    {
        digitalWrite(PUL,HIGH);
        delayMicroseconds(50);
        digitalWrite(PUL,LOW);
        delayMicroseconds(VIT);
    }
    digitalWrite(DIR,HIGH);
    for (int i=0; i<6400; i++) //Backward 5000 steps
    {
        digitalWrite(ENA,HIGH);
        digitalWrite(PUL,HIGH);
        delayMicroseconds(50);
        digitalWrite(PUL,LOW);
        delayMicroseconds(VIT);
    }
    digitalWrite(ENA,LOW);
}
Tu remarquera que, pour la définition des pin DIR PUL et ENA, j'ai transformé le int en #define.
En effet, il n'est pas nécessaire de "consommer" des octets mémoires pour des valeurs qui ne changeront jamais en cours de fonctinnement.
Pour ce type d'application, je préfère y aller directement avec une bibliothèque, AccelStepper à téléchargée ici, consacrée aux MPAP et qui inclu tout les paramètres nécessaire, vitesse, accélération nécessaire à une utilisation optimale des MPAP.

Cordialement
jpbbricole
 
Dernière édition:
tronix
Compagnon
6 Mars 2012
1 128
Toulouse
Bonsoir,

mon commentaire à 2 sous : la consommation mémoire n'est plus un problème aujourd'hui, et il faut privilégier la lisibilité à l'économie de quelques octets ou quelques lignes de codes, sachant en plus que le compilateur va optimiser tout ça bien mieux qu'on pourrait le faire. En revanche, l'utilisation de boucles de delay est classique, surtout en Arduino, mais c'est une horreur. Le processeur est bloqué et ne peut rien faire d'autre. En gros, un seul signal peut être contrôlé précisément, tout le reste sera faux. Toutes les fonctions vont se perturber mutuellement. Il y a d'autres façons de faire bien plus efficaces, pas très compliquées une fois qu'on les a comprises, mais peut-être un peu longue à expliquer ici.
 
Dernière édition:
vax
Modérateur
5 Mars 2008
6 938
Guipavas (près de Brest)
Bonsoir et bonne année à tous!

@vax +1, @MCrevot l'avait déjà signalé précédemment.
C'est plus du temps machine perdu inutilement qu'une erreur.

Pour ce type d'application, je préfère y aller directement avec une bibliothèque, AccelStepper à téléchargée ici, consacrée aux MPAP et qui inclu tout les paramètres nécessaire, vitesse, accélération nécessaire à une utilisation optimale des MPAP.

Cordialement
jpbbricole
Merci, je n'avais pas relu tout le post, loin de moi l'idée de prétendre que c'était une erreur.
Ne connaissant pas encore Arduino, je me laissais même le droit d'avoir tord ! :wink:

Je vais aller voir cette bibliothèque, elle a l'air parfaite vu tes éloges à son sujet. Est-ce du C exploitable avec des puces ARM autre que sur Arduino ?

@tronix : je suis d'accord avec toi, mais je suis un "vieux" qui a appris à économiser un octet même "juste" pour la forme !... C'est donc plus par nostalgie que par besoin tu as raison.
 
gaston83
Compagnon
17 Février 2016
1 048
FR-71520
Certainement, mais je ne peut pas certifier n'ayant pas ce type de matériel. Si tu nous dit quelle est l'application de ce montage on pourras mieux t'aider.
Bonjour,
J'ai bien noté toutes les infos.
C'est uniquement le "savoir" qui me pousse à faire des expérimentations, des tests, des essais... et je me doutais qu'il n'était pas nécessaire de tripoter chaque dois le DIR et le ENA.
Comme matériel: j'ai un driver HY-DIV268N et deux types de PAP. Un PM42L-048-MLK8 (bipolaire 48 pas) et deux KH56JM2 (unipolaire 200pas).
Bon ,c'est sûr que... j'ai une petite arrière petite idée... mais pour l'instant je voudrais mieux cerner le fonctionnement avec des manips.
Et justement à propos de cette bibliothèque. Je suis allé voir mais comment on fait ?
Quand je clique dessus, je lis le sketch... et après ?
GG
 
Dernière édition:
jpbbricole
Compagnon
26 Mai 2016
1 961
Corsier-sur-Vevey (Vaud)
Salut gaston83

Tu as téléchargé le fichier AccelStepper-master.zip
Tu l'as décompressé et mis le répertoire AccelStepper-master dans le répertoire libraries du programme Arduino.
A partir de là, quand tu lances l'IDE Arduino, dans le menu
Fichier/Exemples/Accelstepper/
upload_2018-1-2_11-13-52.png

Tu as des exemples de l'utilisation de cette bibliothèque.
(n'utilises pas AFMotor_ConstantSpeed.pde c'est pas adapté à ton problème)

Un chose que tu dois faire pour que celà fonctionne pour ton installation, est de changer la ligne
AccelStepper stepper; // Defaults to AccelStepper::FULL4WIRE (4 pins) on 2, 3, 4, 5
en
#define PULpin 7 //define Pulse pin
#define DIRpin 6 //define Direction pin
AccelStepper stepper(1, DIRpin, PULpin);
// 1=commande d'un driver, expliqué ici (AccelStepper mystepper(1, pinStep, pinDirection);
Essaies Bounce en changeant les valeurs.
Regardes aussi le détail de cette bibliothèque ici.

Cordialement
jpbbricole
 
La dernière réponse à ce sujet date de plus de 6 mois
Haut