Pausa stepper con sensore di prossimita

Salve ,ho fatto delle ricerche ma non riesco a mettere in pausa uno stepper con un solo sensore di prossimita, pratticamente ho una ruota con sei spinotti che gira ,e un sensore , il motore si deve fermare per 3 secondi ogni volta che uno spinotto passa davanti al sensore ,potete aiutarmi ? grazieee.

Adesso uso questo

#define stepPin 9
#define dirPin 8
#define sensor1 2


void setup()
{
  Serial.begin(9600);
  Serial.print("Counter Start");

  pinMode(stepPin , OUTPUT);
  pinMode(dirPin , OUTPUT);

  pinMode(sensor1, INPUT);

  digitalWrite(dirPin , HIGH);
}



void loop()
{
  if (digitalRead(sensor1) == HIGH)
  {
    digitalWrite(stepPin , LOW);
    delayMicroseconds(700);
    digitalWrite(stepPin , HIGH);
    delayMicroseconds(700);
  }
}

Buonasera e benvenuto :slight_smile: ,

essendo il tuo primo post nella sezione Italiana del forum, nel rispetto del regolamento di detta sezione (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione … possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO

… poi, in conformità al suddetto regolamento, punto 7, devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone a forma di piccola matita che si trova in basso del tuo post) e racchiudere il codice all’interno dei tag CODE.

In pratica, devi selezionare il tuo codice e poi usare il bottone </> per metterlo nell’apposita area dedicata al codice. Grazie.

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread e sistemato il codice come da regolamento, nessuno ti potrà rispondere, quindi ti consiglio di fare il tutto al più presto. :wink:

Ho scritto due volte nel thread di presentazione, per errore, ho modificato il codice, spero sia tutto a posto adesso, grazie.

Purtroppo io ne ho cancllato uno e, credo, tu hai cancellato il secondo …
… una cortesia … verifica e rimetti UNA singola presentazione, GRAZIE :slight_smile:

Guglielmo

Gia, heheh , dai un occhiata , spero che sia tutto a posto ,devo attualizzare il mio problema ? Grazie.

Cambia il tuo loop vocale per quello successivo per vedere se è quello che vuoi.

void loop()
{
  if (digitalRead(sensor1) == HIGH)
  {
    digitalWrite(stepPin , LOW);
    delay(3000);
    digitalWrite(stepPin , HIGH);
    delay(Abbastanza a lungo da far passare la spina, se non l'hai già fatto.)
  }}

Saluti

Grazie ,ma il motore resta fermo. Mi devo spiegare meglio , la ruota si deve fermare sul sensore ma deve ripartire dopo 3 secondi ,siccome sono 6 spinotti di metallo sulla ruote si deve fermare ogni volta per 3 secondi e ripartire. Non riesco a capire come far ripartire il motore , o cambiare lo stato del sensore oppure far ripartire il motore con lo stato del sensore HIGH . Grazie.

Ti rammento che, da regolamento, è permesso sollecitare risposte (fare “up”) solo dopo almeno 48 ore dall’ultimo post. Quindi attendi con pazienza. Grazie.

Guglielmo

P.S.: Ho cancellato io il tuo sollecito, per di più scritto in Inglese nella sezione di lingua Italiana.

Posso scrivere lo stesso problema anche in inglese nella sezione internazionale ?

Lo hai letto il REGOLAMENTO ? Si chiama “Cross Posting” e c’è anche il BAN per chi lo fa …
… devi semplicemente attendere ed avere pazienza … prima o poi qualcuno ti risponderà :slight_smile:

Guglielmo

Visto l’uso del delay per fare il timing dello stepper (approccio che comunque è sconsigliabile, ma per ora lasciamolo pure cosi per non complicare troppo le cose), direi che un possibile modo è “vincolare” l’esecuzione dello stepping ad una variabile bool ed usare un [interrupt].(attachInterrupt() - Arduino Reference) per intercettare il sensore (necessario a causa del delay, che seppur breve è sempre un delay) e far partire contemporaneamente un “contatore” con l’uso di millis()

Una cosa tipo cosi (mancano pezzi ovviamente, controlla il link per vedere come impostare l’interrupt)

bool runMotor = true;
unsigned long stopTime;

// funzione ISR (interrupt Service Routine)
void proximity() {
  runMotor = false;
  stopTime = millis();
}

void loop() {
  if (runMotor ==  true)
  {
     digitalWrite(stepPin , LOW);
     delayMicroseconds(700);
     digitalWrite(stepPin , HIGH);
     delayMicroseconds(700);
  }

  if (millis() - stopTime > 3000) 
  {
     runMotor = true;
  }

  // etc etc 
}

Non ci riesco, sono alle prime armi con arduino, premetto che uso una mega 2560 , stepper nema 34 ,servo driver DM860H , ringrazio per qualsiasi piccolo aiutino.

Ma il motore inizlamente gira e poi si ferma?
Perchè credo che manchi qualcosa, lo step dovrebbe essere nel tuo caso tipo un pwm, o comunque una sequenza di impulsi, il dir sceglie il verso di rotazione, ma poi il mema se non erro ha bisogno anche del pin enable, che serve proprio per stoppare e avviare il motore, almeno che il pin enable sia direttamente collegato a vcc, e quindi fermi il motore non mandando più impulsi al pin stepPin.

         void loop()
        {
          if (digitalRead(sensor1) == HIGH) // se il sensore non è attivo ..
          {
        digitalWrite(stepPin , LOW);
        delayMicroseconds(700);
        digitalWrite(stepPin , HIGH);
        delayMicroseconds(700);
          }
        else // se invece è attivo
        {
        delay(3000) // attendo 3 secondi
// il motore riparte ma prima di ritornare a controllare il sensore
      // deve fare un cero numero di step sufficienti  a liberare il sensore, ho messo 100, ma vedi te.
    for (int i=0; i <= 100; i++) 
  
        {
        digitalWrite(stepPin , LOW);
        delayMicroseconds(700);
        digitalWrite(stepPin , HIGH);
        delayMicroseconds(700);

        }

        }
        }

Ora con lo schema credo di averlo capito bene, vediamo se questo è ciò di cui avevi bisogno:

#define stepPin 9
#define dirPin 8
#define sensor1 2


void setup()
{
  Serial.begin(9600);
  Serial.print("Counter Start");

  pinMode(stepPin , OUTPUT);
  pinMode(dirPin , OUTPUT);

  pinMode(sensor1, INPUT);

  digitalWrite(dirPin , HIGH);
}



void loop(){
//----------------------------------------------------------------------------------------------------------
  While (digitalRead(sensor1) == LOW){//questo while viene eseguito (il motore gira a passi di 1400 microsecondi),
  passo();                            //mentre il sensore è a zero´no spinotti di metallo, 
  }                                   //davanti al sensore 
//-----------------------------------------------------------------------------------------------------------
//È uscito dal while: è arrivata una spina metallica, il motore esce dalla routine di passo fermo 
  delay (3000)//abbiamo aspettato i 3 secondi. 
//Poiché il sensore può essere HIGH, spostiamo leggermente il motore senza guardare lo stato del sensore. 
//per un certo periodo il numero "??" è questo numero di passi, sarà calcolato attraverso diversi test 
  for (int x=0; x<??; x++){passo();}
//salimos del for, nos hemos alejado del sensor entra otra vez el while a esperar otro HIGH  
}

void passo():{
    digitalWrite(stepPin , HIGH);
    delayMicroseconds(700);
    digitalWrite(stepPin , LOW);
    delayMicroseconds(700);
  }

Questo codice funzionerà bene per testare, quando complichi il programma dovresti assolutamente seguire i consigli di @cotestatnt o questi delays ritarderanno molto il resto del codice.
Saluti.

PS quando sono riuscito a collegarmi ho visto che ti avevo già postato @GianlucaB. Il tuo codice funzionerà anche per te.

Perfetto ! Siete grandi,funzionano tutti e due ! Grazie mille ragazzi. Questo progetto lo devo portare avanti , sara da aggiungere delle valvole aria e qualche fotocellula di presenza, se qualcuno ha del tempo a disposizione sono disposto a pagare . Io sono vicino Siena , ma penso anche online si puo fare. Per ora vi ringrazio .