Codice per soft start e soft stop

buongiorno a tutti
ho un problema che non riesco a risolvere
tramite chatgpt ho inserito il seguente codice:

#include <AccelStepper.h>

// Configurazione del motore passo-passo------pulse400 con pulsante di start e stop

const int stepsPerRevolution = 200;  // Il numero di passi per una rotazione completa
const int pinPUL = 8;   // Colleghiamo PUL+ del driver a questo pin
const int pinDIR = 9;   // Colleghiamo DIR+ del driver a questo pin

// Pulsanti per cambiare direzione
const int pinPulsanteOrario = 2;   // Collega il pulsante orario a questo pin
const int pinPulsanteAntiorario = 3;   // Collega il pulsante antiorario a questo pin

// Pulsanti per avvio e stop
const int pinPulsanteAvvio = 4;   // Collega il pulsante di avvio a questo pin
const int pinPulsanteStop = 5;   // Collega il pulsante di stop a questo pin

// Pin del potenziometro
const int pinPotenziometro = A0;  // Collega il potenziometro a questo pin analogico

// Variabile di stato per il controllo del motore
boolean motoreAbilitato = false;

// Variabile booleana per il cambio di direzione
boolean cambioDirezione = false;

// Variabile per memorizzare la direzione attuale del motore
int direzione = 1; // 1 per orario, -1 per antiorario

// Variabili per il debounce dei pulsanti
unsigned long ultimoTempoPremutoOrario = 0;
unsigned long ultimoTempoPremutoAntiorario = 0;
unsigned long ultimoTempoPremutoAvvio = 0;
unsigned long ultimoTempoPremutoStop = 0;
unsigned long debounceInterval = 700;

// Inizializzazione dell'oggetto stepper
AccelStepper mioMotore(AccelStepper::DRIVER, pinPUL, pinDIR);

void setup() {
  // Configura i pin dei pulsanti e del potenziometro come input
  pinMode(pinPulsanteOrario, INPUT);
  pinMode(pinPulsanteAntiorario, INPUT);
  pinMode(pinPulsanteAvvio, INPUT);
  pinMode(pinPulsanteStop, INPUT);

  mioMotore.setMaxSpeed(2500); // Imposta la velocità massima in step/secondo
  mioMotore.setSpeed(0); // Inizialmente, la velocità del motore è impostata a 0
}

void loop() {
  // Leggi lo stato dei pulsanti di avvio e stop
  int statoPulsanteAvvio = digitalRead(pinPulsanteAvvio);
  int statoPulsanteStop = digitalRead(pinPulsanteStop);

  // Se il pulsante di avvio è premuto, abilita il motore
  if (statoPulsanteAvvio == HIGH) {
    motoreAbilitato = true;
  }

  // Se il pulsante di stop è premuto, disabilita il motore
  if (statoPulsanteStop == HIGH) {
    motoreAbilitato = false;
    mioMotore.setSpeed(0); // Imposta la velocità a 0 quando si preme il pulsante di stop
  }

  // Se il motore è abilitato, controlla il motore normalmente
  if (motoreAbilitato) {
    // Leggi lo stato dei pulsanti di inversione
    int statoPulsanteOrario = digitalRead(pinPulsanteOrario);
    int statoPulsanteAntiorario = digitalRead(pinPulsanteAntiorario);

    // Inverti la direzione se viene premuto uno qualsiasi dei pulsanti
    if (statoPulsanteOrario == HIGH) {
      if (millis() - ultimoTempoPremutoOrario > debounceInterval) {
        cambioDirezione = !cambioDirezione;
        ultimoTempoPremutoOrario = millis();
      }
    }

    if (statoPulsanteAntiorario == HIGH) {
      if (millis() - ultimoTempoPremutoAntiorario > debounceInterval) {
        cambioDirezione = !cambioDirezione;
        ultimoTempoPremutoAntiorario = millis();
      }
    }

    // Utilizza la variabile booleana per impostare la direzione
    direzione = cambioDirezione ? 1 : -1;

    // Leggi il valore del potenziometro (da 0 a 1023)
    int valorePotenziometro = analogRead(pinPotenziometro);

    // Mappa il valore del potenziometro sulla velocità del motore (da 0 a 2500)
    int velocita = map(valorePotenziometro, 0, 1023, 900, 2500);

    // Imposta la velocità del motore con il valore del potenziometro
    mioMotore.setSpeed(velocita * direzione);

    // Fai ruotare il motore nella direzione attuale con accelerazione e decelerazione
    mioMotore.runSpeed();
  }

  // Puoi aggiungere un piccolo ritardo se necessario
  delay(0);
}

in sostanza tramite arduino e driver dm542t con motore passo passo sanyo 3.5 A 1.8 gradi, 2.9 v con annesso potenziometro per regolare la velocita',mi gestisce un va e vieni in sostituzione di una grossa camma, non ho ancora preso la guida lineare perche' prima mi piacerebbe risolvere questo problema.
non riesco ad implementare tramite i pulsanti start e stop rispettivamente una accellerazione e decellerazione. vorrei che con il pulsante start iniziasse da fermo e arrivasse alla velocita' impostata gradualmente , in modo dolce , e la stessa cosa con il pulsante stop ovviamente dalla velocita' impostata fino al fermo motore. il tutto modificando (penso 2 variabili) all' interno dello sketch.
Grazie a chi vorra' darmi una mano

Buongiorno e benvenuto nella sezione Italiana del forum,

cortesemente, come prima cosa, leggi attentamente il REGOLAMENTO di detta sezione, (... e, per evitare future possibili discussioni/incomprensioni, prestando molta attenzione al punto 15), dopo di che, come da suddetto regolamento (punto 16.7), fai la tua presentazione NELL'APPOSITA DISCUSSIONE spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Grazie,

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione, nel rispetto del succitato regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto. :wink:

Gia', scusate. ho fatto le dovute presentazione nel' area dedicata

1 Like

ciao beppe,

tu vuoi una rampa al solo avvio del motore, o stop che sia, o ad ogni cambio velocità?

una rampa solo allo start ascendente e ovviamente solo allo stop discendente con possibilita' di cambio valori all' interno del codice.

il potenziometro e' solo come test per vedere a che velocita devo mettere il motorino per andare in avanti e indietro, poi una volta trovato il valore, rimane quello, anzi probabilmente lo togliero' in favore di una resistenza (leggero con il tester a che valore si e' impostato)

ho trovato inutile metterci un encoder, non mi serve alla partenza se stava andando da dx a sx o viceversa, ho preferito intervenire sui pulsanti di inversione

facendo in modo che qualunque esso venga premuto in partenza, il motorino cambi direzione(oppure lasciare sempre alimentato l' arduino, vedro')

mi sono dimenticato nel primo post che uso arduino uno e il motorino pp e' un bel sanyo 2,9 v 3.05A 1.8deg/step modello 103-807-0615

in allegato foto. non badate al disordine. ho usato cavo telefonico rigido perche' non ho i suoi cavetti

Tempo fa feci qualcosa del genere per il focheggiatore di un telescopio.
Siccome volevo qualcosa che fosse poco "influenzato" nel posizionamento dal resto del codice, ho quindi deciso di usare il Timer1 del microcontrollore per generare la base tempi degli step.

Questo è lo sketch di test che avevo messo su wokwi per provare velocemente tutte le modifiche, anche se ad essere sincero non ricordo da dove avevo recuperato le equazioni per calcolare l'accelerazione (da qualche parte online di sicuro).

Il codice che gestisce lo stepper, l'ho messo in forma di classe per poter essere facilmente riutilizzato in altri progetti (trovi tutto su wokwi).

grazie per la risposta, ma e' ben oltre le mie capatica'.
ci vorrebbe il comando set acceleration della libreria accelstepper, ma non so come si mette nel void loop sia nel start che nello stop.
ho provato a mettere in void setup stepper.setAcceleration(5000)
ho tentato, ma non ci riesco, non funziona.

  // Se il pulsante di avvio è premuto, abilita il motore
  if (statoPulsanteAvvio == HIGH) {
    motoreAbilitato = true;
  }

  // Se il pulsante di stop è premuto, disabilita il motore
  if (statoPulsanteStop == HIGH) {
    motoreAbilitato = false;
    mioMotore.setSpeed(0); // Imposta la velocità a 0 quando si preme il pulsante di stop
  }

se hai usato la libreria "ufficiale" il metodo riporta:

    /// Sets the acceleration/deceleration rate.
    /// \param[in] acceleration The desired acceleration in steps per second
    /// per second. Must be > 0.0. This is an expensive call since it requires a square 
    /// root to be calculated. Dont call more ofthen than needed
    void    setAcceleration(float acceleration);

quindi se a te va bene una rampa fissa....lo metti nel setup()
se invece vuoi una rampa dinamica che si adatti a un "qualche cosa" a metti nel loop() all'interno di una verifica...

Due o tre cose:

5000 di accelerazione per un motore che va al massimo a 2500 (le unità di misura te le cerchi tu) mi sembra eccessiva, anche se l'accelerazione fosse attiva sembrerebbe più una partenza brusca

E comunque la documentazione della accelstepper ti spiga che differenza c'è tra run () e runspeed()

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.