Bonjour
j'ai un projet de qui me demande de faire tourner un panneau en polystyrène de 50cm par 1.20m 1/4 de tour dans un sens puis 1/4 de tour dans l'autre avec une vitesse importante et avec une attente entre chaque de 3s
J'y arrive avec le code ci joint et à "vide" cela marche très bien mais lorsque je met le panneau avec la vitesse et l'inertie du panneau le moteur se décale de quelques pas à chaque 1/4 de tour.
Existe t'il un moyen (de préférence sans fins de course) de définir une position A et B et donc de pas les dépasser ?
Merci pour votre aide
j'ai un projet de qui me demande de faire tourner un panneau en polystyrène de 50cm par 1.20m 1/4 de tour dans un sens puis 1/4 de tour dans l'autre avec une vitesse importante et avec une attente entre chaque de 3s
J'y arrive avec le code ci joint et à "vide" cela marche très bien mais lorsque je met le panneau avec la vitesse et l'inertie du panneau le moteur se décale de quelques pas à chaque 1/4 de tour.
Existe t'il un moyen (de préférence sans fins de course) de définir une position A et B et donc de pas les dépasser ?
Merci pour votre aide
const int stepPin = 5;
const int dirPin = 2;
const int enPin = 8;
#define val 500
void setup() {
pinMode(stepPin,OUTPUT);
pinMode(dirPin,OUTPUT);
pinMode(enPin,OUTPUT);
digitalWrite(enPin,LOW);
}
void loop() {
delay(2000);//60000
tone(12,440,1000);
delay(2000);//7000
digitalWrite(dirPin,HIGH);
for(int x = 0; x < 400; x++) {
digitalWrite(stepPin,HIGH);
delayMicroseconds(val);
digitalWrite(stepPin,LOW); //LOW
delayMicroseconds(val);
}
delay(3000);
digitalWrite(dirPin,LOW);
for(int x = 0; x < 400; x++) {
digitalWrite(stepPin,HIGH);
delayMicroseconds(val);
digitalWrite(stepPin,LOW);
delayMicroseconds(val); }
while(1)
Peut-être ne pas démarrer plein pot mais accélérer progressivement pour ne pas perdre des pas.
Même chose pour l'arrêt décélérer progressivement.
Si le code ne doit se dérouler qu'une seule fois, au lieu de mettre un while(1) à la fin de loop() il serait plus simple de placer le code dans setup().
Merci pour vos réponses
En fait ce frein bloque ou débloque l'arbre du moteur à un point donné je pense que ça peut le faire
Mais ok je vais essayer avec la biblio AccelStepper
Tu as une idée de l'effort qui va s'appliquer sur l'ensemble, si tu bloques l'axe alors que le moteur tourne plein pot (la fixation du moteur, la fixation du frein, l'axe qui fait tourner le panneau, l'ensemble de la structure)?
Il faudrait se poser la bonne question. Est-ce que mécaniquement c'est la bonne solution?
Pourquoi, faire basculer un panneau, ce qui demande beaucoup d'énergie à cause de la pression que l'air exerce sur le panneau?
Pourquoi ne pas utiliser une guillotine, par exemple?
Si tu le désires je peux te passer le programme que j'utilise pour tester les divers paramètres de fonctionnement d'un moteur pas à pas, ce programme se commande par des instructions introduites par la ligne de commande du moniteur de l'IDE Arduino.
Ce programme fait faire un va et vient (commande ON) (PAS=400) par défaut et permet de tester, "en direct" des paramètres comme l'accélération, ACC=8000 pour mettre l'accélération à 8000.
Les commandes sont données via la ligne de commande du moniteur de l'IDE Arduino à 115200.
Le détail se trouve en remarque au-dessus de void cmdExecute(String commande).
Les seuls paramètres à adapter, éventuellement, sont:
#else // Autre montage paramètres personnels
const int driverDirPin = 5; // A4988 pin DIR
const int driverStepPin = 6; // A4988 pin STEP
const int driverEnaPin = 7; // A4988 pin ENABLE
const int driverEnableOn = LOW; // Niveau du signal ENABLE actif
const boolean driverReverseDirPin = false;
const boolean driverReverseStepPin = false;
const boolean driverReverseEnaPin = (driverEnableOn == LOW) ? true : false;
#endif
Le programme:
/*
Name: Tool_ReglageMpapA4988.ino
Created: 07.04.2022
Author: jpbbricole
Pour tester les paramètres d'un moteur pas à pas (MPAP)
*/
#include <AccelStepper.h> // https://www.pjrc.com/teensy/td_libs_AccelStepper.html
//#define shieldGRBL
#ifdef shieldGRBL
const int driverDirPin = 5; // X = 5, Y = 6, Z = 7 Shield Nano X = 2, Y = 3, Z = 4
const int driverStepPin = 2; // X = 2, Y = 3, Z = 4 Shield Nano X = 5, Y = 6, Z = 7
const int driverEnaPin = 8; // A4988 pin ENABLE GRBL commun à X, Y et Z
const boolean driverReverseDirPin = false;
const boolean driverReverseStepPin = false;
const boolean driverReverseEnaPin = true;
const int driverEnableOn = LOW; // Niveau du signal ENABLE actif
#else // Autre montage paramètres personnels
const int driverDirPin = 5; // A4988 pin DIR
const int driverStepPin = 6; // A4988 pin STEP
const int driverEnaPin = 7; // A4988 pin ENABLE
const int driverEnableOn = LOW; // Niveau du signal ENABLE actif
const boolean driverReverseDirPin = false;
const boolean driverReverseStepPin = false;
const boolean driverReverseEnaPin = (driverEnableOn == LOW) ? true : false;
#endif
struct mpapParamDef
{
boolean isOn = true;
float maxSpeed = 800.0;
float acceleration = 5000.0;
long stepsNbr = 200;
int microSteps = 1;
boolean driverIsEnabled = true;
};
mpapParamDef mpapParam;
AccelStepper mpap(1, driverStepPin, driverDirPin);
//------------------------------------- Ligne de commandes
bool cmdNouvelle = false; // Si une nouvelle commande a été reçue
String cmdTexte = ""; // Texte de la commande
#define messageDeveloppement Serial.println(F("!!!! Commande a developper !!!!\n"));
void setup()
{
Serial.begin(115200);
Serial.setTimeout(50); // Pour fin des commandes depuis le moniteur
delay(500);
mpapRestart();
mpap.enableOutputs();
cmdExecute(F("OFF")); // MPAP arrêté
Serial.println(F("Tapez la commande ON pour activer le va et vient"));
}
void loop()
{
if (mpap.distanceToGo() == 0) // Si mouvement terminé
mpap.moveTo(-mpap.currentPosition()); // Va et vient, 2*PAS
if (mpapParam.isOn)
{
mpap.run();
}
//--------------------------------- Ecoute du port serie
serialEvent(); // Lecture du port
if (cmdNouvelle) // Si une nouvelle commande depuis le moniteur
{
cmdExecute(cmdTexte);
cmdTexte = "";
cmdNouvelle = false;
}
}
/*------------------------------------- Commandes reconnues
? Liste des paramètres
ON Va et vient ON
OFF Va et vient OFF
PAS=400 Nombre de pas du va et vient à 400 (est multiplié par MPAS)
MPAS=16 Nombre de micro-pas à 16
VIT=800 Vitesse moteur pas à pas à 800 pas/seconde
ACC=8000 Acceleration moteur pas à pas à 8000 pas/seconde
MOVE=400 Tourner 400 pas
GOTO=600 Aller à la position 600
DRVENA Driver MPAP activé (driverEnaPin)
DRVDIS Driver MPAP désactivé (driverEnaPin)
Ces commandes ne sont pas sensibles à la casse.
'*
*/
//------------------------------------- Commandes execution
void cmdExecute(String commande)
{
String commandeNom = "";
commande.toUpperCase(); // Tout en majuscules
commande.replace(" ", ""); // Supprimer les espaces
Serial.println("Execution de : " + commande);
String cmdParam = commande.substring(commande.indexOf("=")+1); // Extraction du paramètre
commande = commande.substring(0, commande.indexOf("=")); // Extraction de la commande
int cmdParamInt = cmdParam.toInt();
if (commande.startsWith(F("?")))
{
paramList();
}
else if (commande.startsWith(F("ON")))
{
commandeNom = F("MPAP On");
mpapParam.isOn = true;
}
else if (commande.startsWith(F("OFF")))
{
commandeNom = F("MPAP Off");
mpapParam.isOn = false;
}
else if (commande.startsWith(F("VIT")))
{
commandeNom = F("Vitesse");
mpapParam.maxSpeed = (float)cmdParamInt;
mpapRestart();
}
else if (commande.startsWith(F("ACC")))
{
commandeNom = F("Acceleration");
mpapParam.acceleration = (float)cmdParamInt;
mpapRestart();
}
else if (commande.startsWith(F("PAS")))
{
commandeNom = F("Pas");
mpapParam.stepsNbr = (long)cmdParamInt;
mpapRestart();
}
else if (commande.startsWith(F("MPAS")))
{
commandeNom = F("Micro-pas");
mpapParam.microSteps = cmdParamInt;
mpapRestart();
}
else if (commande.startsWith(F("DRVENA")))
{
commandeNom = F("Driver ENABLE");
mpap.enableOutputs();
}
else if (commande.startsWith(F("DRVDIS")))
{
commandeNom = F("Driver DISABLE");
mpap.disableOutputs();
}
else if (commande.startsWith(F("MOVE")))
{
commandeNom = F("MOVE");
messageDeveloppement;
}
else if (commande.startsWith(F("GOTO")))
{
commandeNom = F("Goto");
messageDeveloppement;
}
else if (commande.startsWith(F("TOUR")))
{
commandeNom = F("Tour");
messageDeveloppement;
}
else if (commande.startsWith(F("INIT")))
{
commandeNom = F("Init");
messageDeveloppement;
}
else
{
Serial.print(F("Commande inconnue!!! ")); Serial.println(commande);
}
if (commandeNom != "")
{
Serial.println(commandeNom + " " + String(cmdParamInt));
if(commande != F("?"))
{
cmdExecute(F("?"));
}
}
}
//------------------------------------- Moteur pas à pas (mpap)
void mpapRestart()
{
mpap.stop();
mpap.setCurrentPosition(0);
mpap.setMaxSpeed(mpapParam.maxSpeed);
mpap.setAcceleration(mpapParam.acceleration);
mpap.setEnablePin(driverEnaPin);
// DIR STEP ENA
mpap.setPinsInverted(driverReverseDirPin, driverReverseStepPin, driverReverseEnaPin);
mpap.moveTo(mpapParam.stepsNbr * mpapParam.microSteps);
}
//------------------------------------- Paramètres (param)
void paramList()
{
Serial.println(F("\nListe des parametres"));
Serial.print(F("On/Off\t")); Serial.println((mpapParam.isOn) ? "ON" : "OFF");
Serial.print(F("Pas\t")); Serial.println(mpapParam.stepsNbr);
Serial.print(F("MicroP\t")); Serial.println(mpapParam.microSteps);
Serial.print(F("Vitesse\t")); Serial.println(mpapParam.maxSpeed);
Serial.print(F("Accel.\t")); Serial.println(mpapParam.acceleration);
Serial.print(F("Driver\t")); Serial.println((digitalRead(driverEnaPin) == driverEnableOn) ? "ENABLE" : "DISABLE");
Serial.println("");
}
/*-----------------------------------------------------------------------
Réception de commandes depuis le moniteur
'*------------------------------------------------------------------------
*/
void serialEvent()
{
if (Serial.available())
{
cmdTexte = Serial.readString();
cmdTexte.replace("\n", "");
cmdTexte.replace("\r", "");
cmdNouvelle = true;
}
}
A ta disposition pour toutes questions.
Cordialement
jpbbricole
J'ai televersé ton programme en modifiant mes paramètres comme ci-dessous effectivement la vitesse est excellente et le couple aussi qui devrait satisfaire mon projet
Par contre étant quand même très novice en code le tiens est pour moi très compliqué je ne comprend pas du tout son fonctionnement
Je suis arrivé a faire faire 1/4 de tour au PAP mais bien sur en va et vient et non en alternance
//Name: Tool_ReglageMpapA4988.ino
// Created: 07.04.2022
// Author: jpbbricole
//Pour tester les paramètres d'un moteur pas à pas (MPAP)
//*/
#include <AccelStepper.h> // https://www.pjrc.com/teensy/td_libs_AccelStepper.html
//#define shieldGRBL
#ifdef shieldGRBL
const int driverDirPin = 2; // X = 5, Y = 6, Z = 7 Shield Nano X = 2, Y = 3, Z = 4
const int driverStepPin = 5; // X = 2, Y = 3, Z = 4 Shield Nano X = 5, Y = 6, Z = 7
const int driverEnaPin = 8; // A4988 pin ENABLE GRBL commun à X, Y et Z
const int driverMicroSteps = 1;
const int driverEnableOn = LOW; // Niveau du signal ENABLE actif
#else // Autre montage paramètres personnels
const int driverDirPin = 2; // A4988 pin DIR
const int driverStepPin = 5; // A4988 pin STEP
const int driverEnaPin = 8; // A4988 pin ENABLE
const int driverMicroSteps = 1;
const int driverEnableOn = LOW; // Niveau du signal ENABLE actif
#endif
struct mpapParamDef
{
boolean isOn = true;
float maxSpeed = 900.0;
float acceleration = 8000.0;
long stepsNbr = 250;
int microSteps = 1;
boolean driverIsEnabled = true;
};
mpapParamDef mpapParam;
AccelStepper mpap(1, driverStepPin, driverDirPin);
//------------------------------------- Ligne de commandes
bool cmdNouvelle = false; // Si une nouvelle commande a été reçue
String cmdTexte = ""; // Texte de la commande
void setup()
{
Serial.begin(115200);
Serial.setTimeout(50); // Pour fin des commandes depuis le moniteur
delay(500); //DELAI DEBUT DU PROGRAMME
pinMode(driverEnaPin, OUTPUT);
digitalWrite(driverEnaPin, driverEnableOn);
mpapRestart();
//paramList();
cmdExecute(F("ON")); // MPAP arrêté
}
void loop()
{
if (mpap.distanceToGo() == 0) // Si mouvement terminé
mpap.moveTo(-mpap.currentPosition()); // Va et vient, 2*PAS
if (mpapParam.isOn)
{
mpap.run();
}
Mon code n'est pas là comme "base de départ" d'un programme, il n'est qu'un outil qui permet de régler les divers paramètres qui régissent un moteur pas à pas, après il faut écrire ton propre programme à partir de ces paramètres.
Dis moi ce que ton moteur doit faire, je t'aiguillerai volontiers.
d'accord
en fait je m'occupe d'un club de tir et pour entrainer nos meilleurs avant les compets j'ai besoin de faire un système de retournement de cibles pour mieux comprendre voir le lien youtube surtout la deuxième partie qui nous intéresse le 3/7 secondes
En fait avec mon premier programme ça marche mais avec l'inertie du panneau le moteur se décale de quelque pas et du coup c'est mort