Intanto saluto tutti.
Ho giocherellato con chat GPT e guidata opportunamente l'IA (ho fatto solo pochissimi aggiustamenti) mi dato questo.
Nel codice che ti ho fornito, la velocità del motore passo-passo viene regolata in base alla velocità di rotazione dello spindle. Questo significa che se la velocità di rotazione dello spindle cambia durante una passata (ad esempio aumenta o diminuisce), la velocità del motore passo-passo verrà regolata di conseguenza per adattarsi alla nuova velocità di rotazione dello spindle. Di conseguenza, il motore passo-passo potrebbe accelerare o decelerare durante una passata per adattarsi alle variazioni della velocità di rotazione dello spindle. Inoltre, il codice esegue più passate per completare la filettatura. Durante ogni passata, il motore passo-passo si muove avanti e indietro per creare la filettatura. Dopo ogni passata, il codice attende che l’utente prema il pulsante di reset prima di iniziare la passata successiva. In questo modo, l’utente può sincronizzare manualmente l’inizio di ogni passata con la posizione dello spindle.
#include <AccelStepper.h>
// Definisci i pin per il driver stepper #define dirPin 4 #define stepPin 5 #define enablePin 6
// Definisci i pin per l'encoder #define encoderAPin 2 #define encoderBPin 3
// Definisci i pin per i pulsanti #define startButtonPin 7 #define resetButtonPin 8
// Crea un'istanza di AccelStepper AccelStepper stepper(AccelStepper::DRIVER, stepPin, dirPin);
// Variabili per tenere traccia della posizione dell'encoder volatile long encoderPosition = 0; long lastEncoderPosition = 0; float ENCODER_COUNTS_PER_REVOLUTION = 360;
// Variabili per calcolare la velocità di rotazione dello spindle unsigned long lastTime = 0; float spindleSpeed = 0; // Variabili per la filettatura float threadPitch = 1.0; // Passo della filettatura in mm (da 0.5 a 2.0 con incrementi di 0.5) float leadScrewPitch = 5.0; // Passo della vite associata allo stepper in mm int stepsPerRevolution = 800; // Numero di passi del motore passo-passo per una rivoluzione completa float threadLength = 20.0; // Lunghezza della filettatura in mm int numPasses = 4; // Numero di passate
// Costanti per la regolazione della velocità del motore passo-passo in base alla velocità di rotazione dello spindle #define MIN_SPINDLE_SPEED 200 #define MAX_SPINDLE_SPEED 500 #define MIN_STEPPER_SPEED 100 #define MAX_STEPPER_SPEED 1000
// Funzione di interrupt per il pin A dell'encoder void encoderA() { // Leggi lo stato dei pin A e B dell'encoder int a = digitalRead(encoderAPin); int b = digitalRead(encoderBPin);
// Aggiorna la posizione dell'encoder in base allo stato dei pin if (a == b) { encoderPosition++; } else { encoderPosition--; } }
// Funzione di interrupt per il pin B dell'encoder void encoderB() { // Leggi lo stato dei pin A e B dell'encoder int a = digitalRead(encoderAPin); int b = digitalRead(encoderBPin);
// Aggiorna la posizione dell'encoder in base allo stato dei pin if (a == b) { encoderPosition--; } else { encoderPosition++; } }
void setup() { // Imposta i pin del driver come OUTPUT pinMode(dirPin, OUTPUT); pinMode(stepPin, OUTPUT); pinMode(enablePin, OUTPUT);
// Imposta i pin dell'encoder come INPUT pinMode(encoderAPin, INPUT); pinMode(encoderBPin, INPUT);
// Imposta i pin dei pulsanti come INPUT pinMode(startButtonPin, INPUT); pinMode(resetButtonPin, INPUT);
// Abilita gli interrupt sui pin dell'encoder attachInterrupt(digitalPinToInterrupt(encoderAPin), encoderA, CHANGE); attachInterrupt(digitalPinToInterrupt(encoderBPin), encoderB, CHANGE);
// Imposta la velocità massima e l'accelerazione del motore passo-passo stepper.setMaxSpeed(1000); stepper.setAcceleration(1000);
// Abilita il driver del motore passo-passo digitalWrite(enablePin, LOW);
// Memorizza il tempo corrente lastTime = micros(); }
void loop() { // Calcola il tempo trascorso dall'ultima lettura della posizione dell'encoder unsigned long currentTime = micros(); unsigned long deltaTime = currentTime - lastTime; lastTime = currentTime;
// Calcola la variazione della posizione dell'encoder long deltaPosition = encoderPosition - lastEncoderPosition; lastEncoderPosition = encoderPosition;
// Calcola la velocità di rotazione dello spindle in giri al minuto (RPM) float spindleSpeed = (deltaPosition / (float) ENCODER_COUNTS_PER_REVOLUTION) / (deltaTime / 60000000.0);
// Regola la velocità del motore passo-passo in base alla velocità di rotazione dello spindle stepper.setMaxSpeed(map(spindleSpeed, MIN_SPINDLE_SPEED, MAX_SPINDLE_SPEED, MIN_STEPPER_SPEED, MAX_STEPPER_SPEED));
// Leggi lo stato dei pulsanti int startButtonState = digitalRead(startButtonPin); int resetButtonState = digitalRead(resetButtonPin);
// Se il pulsante di partenza/ripartenza è premuto if (startButtonState == HIGH) { // Esegui il codice per la filettatura for (int pass = 0; pass < numPasses; pass++) { // Calcola il numero di passi del motore passo-passo necessari per fare una filettatura di lunghezza threadLength con il passo impostato da threadPitch e leadScrewPitch int stepsToMove = (threadLength / threadPitch) * (leadScrewPitch / threadPitch) * stepsPerRevolution;
// Muovi il motore passo-passo alla posizione desiderata stepper.moveTo(stepsToMove); while (stepper.distanceToGo() != 0) { stepper.run(); }
// Attendi che lo spindle completi un giro completo long initialEncoderPosition = encoderPosition; while (abs(encoderPosition - initialEncoderPosition) < ENCODER_COUNTS_PER_REVOLUTION) { // Non fare nulla, attendi che lo spindle completi un giro completo }
// Attendi che il pulsante di reset venga premuto while (digitalRead(resetButtonPin) == LOW) { // Non fare nulla, attendi che il pulsante di reset venga premuto // Attendi che il pulsante di partenza/ripartenza venga premuto while (digitalRead(startButtonPin) == LOW) { // Non fare nulla, attendi che il pulsante di partenza/ripartenza venga premuto } } } }
// Se il pulsante di reset è premuto if (resetButtonState == HIGH) { // Muovi il motore passo-passo alla posizione di partenza stepper.moveTo(0); while (stepper.distanceToGo() != 0) { stepper.run(); } } }
------------------------------------- I valori di MIN_SPINDLE_SPEED, MAX_SPINDLE_SPEED, MIN_STEPPER_SPEED e MAX_STEPPER_SPEED dipendono dalle specifiche del tuo motore passo-passo e dello spindle. Questi valori vengono utilizzati per mappare la velocità di rotazione dello spindle (in giri al minuto) alla velocità del motore passo-passo (in passi al secondo).
MIN_SPINDLE_SPEED e MAX_SPINDLE_SPEED rappresentano il range di velocità di rotazione dello spindle che vuoi utilizzare per la filettatura. Ad esempio, se vuoi che lo spindle ruoti ad una velocità compresa tra 500 e 2000 giri al minuto durante la filettatura, puoi impostare MIN_SPINDLE_SPEED a 500 e MAX_SPINDLE_SPEED a 2000.
MIN_STEPPER_SPEED e MAX_STEPPER_SPEED rappresentano il range di velocità del motore passo-passo che vuoi utilizzare per la filettatura. Questi valori dipendono dalle specifiche del tuo motore passo-passo e dal driver che stai utilizzando. Ad esempio, se il tuo motore passo-passo può muoversi ad una velocità compresa tra 100 e 1000 passi al secondo, puoi impostare MIN_STEPPER_SPEED a 100 e MAX_STEPPER_SPEED a 1000.
ENCODER_COUNTS_PER_REVOLUTION è una costante che rappresenta il numero di impulsi generati dall’encoder per ogni giro completo dello spindle. Questo valore dipende dalle specifiche dell’encoder che stai utilizzando. Ad esempio, se il tuo encoder genera 1000 impulsi per ogni giro completo dello spindle, puoi impostare ENCODER_COUNTS_PER_REVOLUTION a 1000.
Questa costante viene utilizzata per calcolare la velocità di rotazione dello spindle in giri al minuto (RPM) . Il codice calcola la variazione della posizione dell’encoder (in impulsi) e la divide per ENCODER_COUNTS_PER_REVOLUTION per ottenere il numero di giri completi dello spindle. Questo valore viene quindi diviso per il tempo trascorso (in minuti) per ottenere la velocità di rotazione dello spindle in giri al minuto (RPM).
--------------------------------------------- Spero possa interessare
|