Motore Nema 17 e giostra Carrousel

Buonasera, io ho questo problema: sto realizzando una giostra Carrousel. Arduino Uno, A4988 e motore Nema 17 17HS13-0404S. Come posso far girare il motore per almeno 10 minuti senza che si fermi? Scusate io ho qualche anno ed ho perso la terminologia . Grazie

@arenosub64

Buonasera 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:

Buongiorno Guglielmo, grazie per i tuoi messaggi. Volevo dirti che ho scritto ho fatto la presentazione. Un caro saluto e a presto.

1 Like

Non credo di aver capito, perdonami: cosa significa "senza che si fermi"?
Se il motore è controllato da Arduino lo fermi quando decidi tu, perché dovrebbe fermarsi da solo dopo 10 minuti? Mi sfugge qualcosa?
Hai collegato il tutto (posta un diagramma dei collegamenti, va bene anche un foglio fatto a mano e fotografato) e lo stai provando? Hai già un codice (in tal caso mostracelo, inserendolo nei tag "CODE" ovviamente) che si comporta male?


```cpp
/*Programma per Carousel
  scritto da Paolo Busonera
*/


//definisco il numero dei pin

const int stepPin = 3;
const int dirPin = 2;
const int enPin = 7;

//settaggio del motore Nema 17
int stepsPerRevolution = 200;

void setup() {
  // settaggio dei pin:

  Serial.begin(9600);
  pinMode(dirPin, OUTPUT);
  pinMode(stepPin, OUTPUT);
  //pinMode(enPin, OUTPUT);

  //Abilitare il driver
    //digitalWrite(enPin, LOW);
  
}

void loop() {
  //seleziona la direzione del senso dell'orologia 
  digitalWrite(dirPin, HIGH); //andare in senso orario
  
  //muovi il motore di 200 steps 1 rivoluzione
  for (int i =0; i < stepsPerRevolution; i++) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(500); //aggiustare per la velocita
    digitalWrite(stepPin, LOW);
    delayMicroseconds(500);
  }

  

}

Adesso il motore gira, ma non si ferma. Probabilmente manca qualcosa nel codice, ma non riesco a capire.

Bene, ma ti spiace modificare questo post, e mettere tutto il codice dentro ai tag "CODE", come richiesto dal forum? E' una questione di leggibilità (viene mantenuta l'indentazione) e di completezza (ci possono essere caratteri che il forum "interpreta" e renderizza male).
Apri l'IDE col tuo programma e premi Ctrl-maiusc-C (o dal menu Modifica, Copia per forum") quindi modifica il post col pulsantino della penna, poi seleziona l'attuale contenuto e cancellalo, quindi incolla il "nuovo" codice, che avrà già il tag CODE, e salva.

spero di aver capito bene quello che chiedi. :slightly_smiling_face:

Non si ferma perché la funzione loop termina e ricomincia e continua così all’infinito. Lo stesso ciclo for ma inserito solo all’interno della funzione setupfarà ciò che ti aspetti, cioè esegue 200 passi, poi la funzione setup termina e viene chiamata la funzione loop.

Ciao.

Ciao Maurotec. Secondo quanto detto da te in void setup() devo inserire il ciclo for e nel void loop la parte sotto al ciclo loop. Giusto? Grazie per il tuo gentile interesse :slightly_smiling_face:


```cpp
/*Programma per Carousel
  scritto da Paolo Busonera
*/


//definisco il numero dei pin

const int stepPin = 3;
const int dirPin = 2;


//settaggio del motore Nema 17
int stepsPerRevolution = 200;

void setup() {
  // settaggio dei pin:

  Serial.begin(9600);
  pinMode(dirPin, OUTPUT);
  pinMode(stepPin, OUTPUT);
  
  
  for (int i =0; i < stepsPerRevolution; i++);
  
}

void loop() {
  //seleziona la direzione del senso dell'orologia 
  digitalWrite(dirPin, HIGH); //andare in senso orario
  
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(1000); //aggiustare per la velocita
    digitalWrite(stepPin, LOW);
    delayMicroseconds(2000);
  
}

Purtroppo non funziona. Io ho modificato, ma il motore continua a funzionare e non si ferma. Scusa, ma sono di nuovo fermo con questo problema. :slightly_smiling_face: :nerd_face:
sono nerd

Si si è capito, per iniziare dovresti almeno acquisire almeno le fondamentali.

Comunque intendevo così:

void setup() {
  Serial.begin(9600);
  pinMode(dirPin, OUTPUT);
  pinMode(stepPin, OUTPUT);
//seleziona la direzione del senso dell'orologia 
  digitalWrite(dirPin, HIGH); //andare in senso orario
  
  //muovi il motore di 200 steps 1 rivoluzione
  for (int i =0; i < stepsPerRevolution; i++) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(500); //aggiustare per la velocita
    digitalWrite(stepPin, LOW);
    delayMicroseconds(500);
  }
} // end setup

void loop() {
  // vuoto
}

Trovi dei link di aiuto almeno per le fondamentali.

Ciao.

adesso provo e vedrò. Il motore deve partire e piano piano andare a piena velocità. Dopo di ciò deve fermarsi. Questo è il problema che mi assilla. Grazie Maurotec e scusa ma io ho avuto due ictus e ho perso molto di quello che sapevo.

1 Like

La struttura dei programmi dell'ambiente Arduino funziona così: ciò che si trova nel setup() viene eseguito una volta all'accensione; ciò che sta nel loop(), invece, viene eseguito continuamente. E' un'impostazione dell'ambiente Arduino. In C puro, lo stesso risultato si ottiene mettendo all'inizio ciò che sta nella funzione setup() e poi, di seguito, un for infinito

for(;;)
  {
  }

oppure, per esempio:

for(int n=1; n>0; n++)
  {
  }

oppure

while(1)
  {
  }

con dentro ciò che sta nella funzione loop().

Buonasera Datman. In base a quanto scritto nei miei messaggi, secondo lei è maglio un ciclo For o While e magari inserirllo dentro ad un if? Grazie per l'aiuto

Non mettetelo in confusione con troppa carne al fuoco

Inutile elencargli alternative per un’applicazione che già non comprende bene così

@arenosub64 non prendertela, non è una cosa personale

Per capire bastano poche regole (per iniziare)

La prima legge del debug dice:

Scorri il programma dall'inizio con il dito indice e comprendi ogni singola riga

Tieni conto che la funzione setup viene eseguita una sola volta mentre la loop quando termina ricomincia

Non serve che tu comprenda appieno ogni singola riga, ma va bene che tu ti faccia una ragionevole ipotesi del suo significato

Arrivato ad un certo punto se le tue ragionevoli ipotesi sono (ragionevolmente) corrette vedrai che l'idea che ti sei fatta del funzionamento del programma corrisponde (ragionevolmente) con il funzionamento reale che vedi

A questo punto hai già capito “perché" il programma fa quello che fa

La parte difficile viene adesso:

Capire come invece fargli fare quello che vuoi

Ma comincia ad arrivare lì, poi si vede

1 Like

Grazie Salvorhardin. :slightly_smiling_face:

Buongiorno Salvorhardin. Ho fatto quello che tu mi hai detto ed ho capito bene quello che mi hai scritto, o meglio ho capito bene la differenza tra setup e loop. Per questo ho anche modificato le istruzione sia in setup che in loop e quindi mi sono reso conto della differenza. Ora io dovrei far partire il motore piano, raggiungere la piena velocità per circa 5 minuti e poi fermarlo. Secondo quanto tu mi dici dovrei fare una routine in setup per la partenza una in loop per farlo girare? Giusto? Aspetto, quando potrai una tua risposta Grazie :slightly_smiling_face:

Buongiorno, Paolo

Puoi anche mettere tutto nel setup(). Fai prima una funzione che accelera; poi, trascorsi 5 minuti, fermi. Probabilmente devi anche rallentarlo, prima di fermarlo.