F
fraiddy
Nouveau
Bonjour a tous
Pour etre plus précis je recherche a asservir un moteur pas a pas (qui lui fera tourner la vis mére d'un tour) pour fileter .
pour cela je me suis beaucoup inspirer de cette discussion :
'* Name : USIN_RotencToStepMotor *
'* Author : jpbbricole *
'* *
'* Date : 01.04.2020 *
'* Version : projectVersion *
'* Notes : Un codeur incrémental commande un moteur pas à pas *
'* *
'* *
'**************************************************************************************************
*/
//------------------------------------- Codeur rotatif
#define rotencInpQuadApin 2 // 2 pin pour A et B du CR
#define rotencInpQuadBpin 3 // Ces 2 pin sont des entrees avec interrupt sur le UNO ou Nano
struct rotaryEncoderDef
{volatile word stepsCounter; int mpapRatio;};
rotaryEncoderDef rotEnc;
//------------------------------------- Moteur pas à pas (MPAP)
#define mpapEnaPin 8 // Pin pour A4988 ENA*
#define mpapStepPin 7 // Pin pour impulsions
#define mpapDirPin 4 // Pin pour Direction
struct stepmotorDef
{byte stepLevel; byte dirCwLevel; uint16_t pulseLowUsec; uint16_t pulseHighUsec; int freqHz;};
stepmotorDef mpap;
void setup()
{
Serial.begin(115200);
delay(500);
//--------------------------------- Codeur rotatif
rotEnc.stepsCounter = 0; // Compteur de pas du codeur
rotEnc.mpapRatio = 3; // Rapport entre les pas du codeur et les pas du MPAP
// Nema17 = 200 pas, codeur = 600 pas
//--------------------------------- MPAP
mpap.stepLevel = 1; // Niveau logique pour commander un pas (Step A4988)
mpap.dirCwLevel = 1; // Niveau logique pour le sens de rotation (DIR A4988)
mpap.freqHz = 80; // Frequence des pas
mpap.pulseHighUsec = 5; // Durée du niveau HAUT l'impulsion
mpap.pulseLowUsec = 10000/mpap.freqHz - mpap.pulseHighUsec; // Calcul du niveau BAS l'impulsion
//--------------------------------- Initialisation des ports
pinMode(mpapEnaPin, OUTPUT);
pinMode(mpapStepPin, OUTPUT);
pinMode(mpapDirPin, OUTPUT);
digitalWrite(mpapEnaPin, LOW);
digitalWrite(mpapStepPin, !mpap.stepLevel);
digitalWrite(mpapDirPin, mpap.dirCwLevel);
//--------------------------------- Interruptions
pinMode(rotencInpQuadApin, INPUT_PULLUP); // Pin d'entrée A codeur
pinMode(rotencInpQuadBpin, INPUT_PULLUP); // Pin d'entrée B codeur
attachInterrupt(digitalPinToInterrupt(rotencInpQuadApin), quadraAchangeHandling, FALLING); // Interrupt traitement
Serial.println("MPAP Frequence\t" + String(mpap.freqHz));
Serial.println("MPAP Puls.H\t" + String(mpap.pulseHighUsec));
Serial.println("MPAP Puls.L\t" + String(mpap.pulseLowUsec));
Serial.println("MPAP/Rotenc\t" + String(rotEnc.mpapRatio));
}
void loop()
{
Serial.println(rotEnc.stepsCounter);
}
/*-----------------------------------------------------------------------------
'* Routine d'interruption réagit à chaque flanc descendant de l'entrée A
'* du codeur rotatif
'*-----------------------------------------------------------------------------
*/
void quadraAchangeHandling()
{
byte mpapDir;
if (digitalRead(rotencInpQuadApin) == digitalRead(rotencInpQuadBpin)) // Si A = B
{mpapDir = mpap.dirCwLevel; rotEnc.stepsCounter ++;} // Incrémenter + direction
else
{mpapDir = !mpap.dirCwLevel; rotEnc.stepsCounter --;}
if (rotEnc.stepsCounter % rotEnc.mpapRatio == 0) // Rapport de division rotenc MPAP (rotEnc.mpapRatio)
{
digitalWrite(mpapDirPin, mpapDir); // Direction moteur
digitalWrite(mpapStepPin, mpap.stepLevel); // Impulsion moteur
delayMicroseconds(mpap.pulseHighUsec); // Impulsion moteur durée
digitalWrite(mpapStepPin, !mpap.stepLevel); // Fin mpulsion moteur
delayMicroseconds(mpap.pulseLowUsec); // Pause fin periode
}
}
ET ça marche vidéo:
mais voila dans mon projet j'aurai aimer qu' avec le clavier pouvoir y mettre la pas désiré et qu'en plus il s'affiche sur l'écran.
pour cela j'ai un oler 128x128 monochrome qui marche avec la bibliotheque U8g2lib.h (il est en i2C)
et le clavier serie touche sensitive capacitive (j'ai trouvé que ce serait mieux pour éviter que des copeaux ne s'y mettent) microcontroleur ATtiny1616
Si quelqu'un pouvait m'aider ce serait sympa
au plaisir de vous lire
Pour etre plus précis je recherche a asservir un moteur pas a pas (qui lui fera tourner la vis mére d'un tour) pour fileter .
pour cela je me suis beaucoup inspirer de cette discussion :
- asservir un moteur en position pour piloter un diviseur crée par Fauxjetons et bien aidé par Jpbbricole donc j'ai repris le code
'* Name : USIN_RotencToStepMotor *
'* Author : jpbbricole *
'* *
'* Date : 01.04.2020 *
'* Version : projectVersion *
'* Notes : Un codeur incrémental commande un moteur pas à pas *
'* *
'* *
'**************************************************************************************************
*/
//------------------------------------- Codeur rotatif
#define rotencInpQuadApin 2 // 2 pin pour A et B du CR
#define rotencInpQuadBpin 3 // Ces 2 pin sont des entrees avec interrupt sur le UNO ou Nano
struct rotaryEncoderDef
{volatile word stepsCounter; int mpapRatio;};
rotaryEncoderDef rotEnc;
//------------------------------------- Moteur pas à pas (MPAP)
#define mpapEnaPin 8 // Pin pour A4988 ENA*
#define mpapStepPin 7 // Pin pour impulsions
#define mpapDirPin 4 // Pin pour Direction
struct stepmotorDef
{byte stepLevel; byte dirCwLevel; uint16_t pulseLowUsec; uint16_t pulseHighUsec; int freqHz;};
stepmotorDef mpap;
void setup()
{
Serial.begin(115200);
delay(500);
//--------------------------------- Codeur rotatif
rotEnc.stepsCounter = 0; // Compteur de pas du codeur
rotEnc.mpapRatio = 3; // Rapport entre les pas du codeur et les pas du MPAP
// Nema17 = 200 pas, codeur = 600 pas
//--------------------------------- MPAP
mpap.stepLevel = 1; // Niveau logique pour commander un pas (Step A4988)
mpap.dirCwLevel = 1; // Niveau logique pour le sens de rotation (DIR A4988)
mpap.freqHz = 80; // Frequence des pas
mpap.pulseHighUsec = 5; // Durée du niveau HAUT l'impulsion
mpap.pulseLowUsec = 10000/mpap.freqHz - mpap.pulseHighUsec; // Calcul du niveau BAS l'impulsion
//--------------------------------- Initialisation des ports
pinMode(mpapEnaPin, OUTPUT);
pinMode(mpapStepPin, OUTPUT);
pinMode(mpapDirPin, OUTPUT);
digitalWrite(mpapEnaPin, LOW);
digitalWrite(mpapStepPin, !mpap.stepLevel);
digitalWrite(mpapDirPin, mpap.dirCwLevel);
//--------------------------------- Interruptions
pinMode(rotencInpQuadApin, INPUT_PULLUP); // Pin d'entrée A codeur
pinMode(rotencInpQuadBpin, INPUT_PULLUP); // Pin d'entrée B codeur
attachInterrupt(digitalPinToInterrupt(rotencInpQuadApin), quadraAchangeHandling, FALLING); // Interrupt traitement
Serial.println("MPAP Frequence\t" + String(mpap.freqHz));
Serial.println("MPAP Puls.H\t" + String(mpap.pulseHighUsec));
Serial.println("MPAP Puls.L\t" + String(mpap.pulseLowUsec));
Serial.println("MPAP/Rotenc\t" + String(rotEnc.mpapRatio));
}
void loop()
{
Serial.println(rotEnc.stepsCounter);
}
/*-----------------------------------------------------------------------------
'* Routine d'interruption réagit à chaque flanc descendant de l'entrée A
'* du codeur rotatif
'*-----------------------------------------------------------------------------
*/
void quadraAchangeHandling()
{
byte mpapDir;
if (digitalRead(rotencInpQuadApin) == digitalRead(rotencInpQuadBpin)) // Si A = B
{mpapDir = mpap.dirCwLevel; rotEnc.stepsCounter ++;} // Incrémenter + direction
else
{mpapDir = !mpap.dirCwLevel; rotEnc.stepsCounter --;}
if (rotEnc.stepsCounter % rotEnc.mpapRatio == 0) // Rapport de division rotenc MPAP (rotEnc.mpapRatio)
{
digitalWrite(mpapDirPin, mpapDir); // Direction moteur
digitalWrite(mpapStepPin, mpap.stepLevel); // Impulsion moteur
delayMicroseconds(mpap.pulseHighUsec); // Impulsion moteur durée
digitalWrite(mpapStepPin, !mpap.stepLevel); // Fin mpulsion moteur
delayMicroseconds(mpap.pulseLowUsec); // Pause fin periode
}
}
ET ça marche vidéo:
mais voila dans mon projet j'aurai aimer qu' avec le clavier pouvoir y mettre la pas désiré et qu'en plus il s'affiche sur l'écran.
pour cela j'ai un oler 128x128 monochrome qui marche avec la bibliotheque U8g2lib.h (il est en i2C)
et le clavier serie touche sensitive capacitive (j'ai trouvé que ce serait mieux pour éviter que des copeaux ne s'y mettent) microcontroleur ATtiny1616
Si quelqu'un pouvait m'aider ce serait sympa
au plaisir de vous lire
Dernière édition par un modérateur: