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
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. ![]()
Buongiorno Guglielmo, grazie per i tuoi messaggi. Volevo dirti che ho scritto ho fatto la presentazione. Un caro saluto e a presto.
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. ![]()
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 ![]()
```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.
![]()
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.
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
Grazie Salvorhardin. ![]()
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 ![]()
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.