Lo stepper é in grado di fare un passo alla volta? La risposta é si, lentamente ma si. Quindibsi, puoi farlo
e per dirgli che deve girare fin quando non sente un microsw alto uso la funzione while?
che cicla fin quando la condizione è vera e quando è falsa si ferma no?
Concentrati hai un'altra possibilità, c'è qualcosa che ciclo ciclo ciclo ciclo ciclo in continuo o no, e se in quella cosa che cicla in continuo io potessi dirgli soltanto se la condizione è falsa fai un passo cosa otterrai
penso sia il ciclo for >:(
... E se fosse la loop() contenente un if()?
e scusami come faccio a dirgli che ad esempio
premo il pulsante 1 il motore deve cominciare a roteare in senso orario fino a che il microsw no diventi alto
Gli dici che se il pulsante che si ricorda é maggiore del microswitch che sibricorda deve fare un passo in basso. Hai scelto dibusare uno stepper che é cpsì facile da usare, e non te ne sei neanche accorto.
simonsdec:
bool PULS_0=2;
bool PULS_1=3;
bool PULS_2=4;
bool MICROSW_0=5;
bool MICROSW_1=6;
bool MICROSW_2=7;
Io dal programma ancora non riesco a capire in modo semplice quali sono i livelli dei pulsanti e finecorsa quando sono premuti o quando sono rilasciati. A fatica si può intuire qualcosa confrontando le varie digitalRead con i commenti, ma questo porta sicuramente ad errori, tra cui non riuscire a correggere gli errori esistenti e magari a commetterne altri ad ogni modifica (tradotto: "non ho nessuna voglia di dover intuire a fatica e con il rischio di sbagliarmi cose che dovrebbero già essere scritte esplicitamente nelle definizioni iniziali").
Poi perché dichiarare delle variabili tipo bool per contenere il numero dei pin? (Le variabili bool dovrebbero contenere solo true/false, o al massimo 1/0, e i loro nomi dovrebbero essere delle domande a cui si può rispondere solo si o no, ad esempio: finito? acceso? primogiro? ecc).
E, a maggior ragione, visto che lo scopo di quelle definizioni è esclusivamente quello di dare dei nomi di comodo ai pin (per non cospargere il codice di numeri tra cui ci si confonde facilmente), allora perché definire dei nomi di comodo, se poi nel programma dove servirebbe non vengono usati? Ok, sono usati nelle funzioni pinMode, ma in tutti gli altri punti?
Queste cose secondo me rendono difficilissimo seguire la logica (soprattutto a chi non l'ha scritta), mentre mi aspetterei (come ipotetico insegnante/valutatore) di trovare istruzioni che non lasciano spazio all'interpretazione, tipo la seguente, in cui non c'è dubbio che stiamo leggendo il pulsante1 e che stiamo controllando se è premuto, non serve neppure mettere un commento:
if(digitalRead(PULS_1) == PULS_PRESSED_LEVEL) ....
...se i valori corretti di PULS_1 e PULS_PRESSED_LEVEL li abbiamo definiti prima, restano corretti e usabili in tutto il programma, permettendo anche a chi lo legge per la prima volta di concentrarsi solo sulla logica, e non sui dettagli hardware come numeri di pin o HIGH/LOW da andare continuamente in cerca di cosa significano.
e' stata considerata la possibilità di guasto con fermata tra due piani, sarebbe bello poter mandare l'ascensore a fianco alla stessa quota per trasferire i presenti
Se mi metti il codice attuale magari ci do uno sguardo....
#include <Stepper.h>
//---------------------------------------------------COLLEGAMENTI-----------------------------------------------//
bool PULS_0=2;
bool PULS_1=3;
bool PULS_2=4;
bool MICROSW_0=5;
bool MICROSW_1=6;
bool MICROSW_2=7;
int Stepsdafare;
#define StepsPerMotorRevolution 32
#define StepsdaZeroaDue 94*94
#define StepsdaZeroaUno 68*68
#define StepsdaUnoaDue 64*64
Stepper small_stepper(StepsPerMotorRevolution,9,11,10,12);
void setup() {
pinMode(PULS_0,INPUT);
pinMode(PULS_1,INPUT);
pinMode(PULS_2,INPUT);
pinMode(MICROSW_0,INPUT);
pinMode(MICROSW_1,INPUT);
pinMode(MICROSW_2,INPUT);
}
void loop() {
if (digitalRead(5) == HIGH and digitalRead (3) == LOW) { //STA AL PIANO 0 VA AL PIAN1
Stepsdafare = StepsdaZeroaUno;
small_stepper.setSpeed (700);
small_stepper.step(Stepsdafare);
}
if (digitalRead(6) == HIGH and digitalRead(4) == LOW) {//STA AL PIANO 1 VA AL PIANO 2
Stepsdafare = StepsdaUnoaDue;
small_stepper.setSpeed (700);
small_stepper.step(Stepsdafare);
}
if (digitalRead(7) == HIGH and digitalRead(3) == LOW) {//STA AL PIANO 2 VA AL PIANO 1
Stepsdafare = - StepsdaUnoaDue;
small_stepper.setSpeed (700);
small_stepper.step(Stepsdafare);
} if (digitalRead(6) == HIGH and digitalRead(2) == LOW){ // STA AL PIANO 1 VA AL PIANO 0
Stepsdafare = - StepsdaZeroaUno;
small_stepper.setSpeed (700);
small_stepper.step(Stepsdafare);
}
}
il codice attuale è questo
ed in poche parole vado a verificare i microsw ed un eventuale pressione del pulsante
faccio il caso 1 il microsw si trova a 0 quindi suppongo che si trovi al piano 0
bene nel momento in cui premo il pulsante 1 mi si avverano le due condizioni che ho messo nel if
premetto che il pulsante è normalmente HIGH e quando lo spingo LOW
dal momento in cui queste due condizioni sono vere che sono esattamente questa linea di testo
if (digitalRead(5) == HIGH and digitalRead (3) == LOW) {
gli dico che deve fare i suoi step contati in precedenza da 0 a 1
a velocità 700
STOP
il problema come ho già detto in precedenza è il seguente
- capita che quando dovrebbe cambiare senso dal piano 2 al piano 1 capita che fa salita.... senza motivo, non so da cosa dipende è successo che ogni tanto in fase di testing mi facesse salita da solo...mentre se lo rilanciava funzionava tranquillamente facendo la discesa dal 2 al 1
- altro problema che voglio eliminare è quello che il mio deve essere un'ascensore semplice che faccia 0-1-2 2-1-0 e vorrei che nel momento in cui spingo il pulsante 0 e sta a 0 non faccia niente
stessa cosa se sta a 0 e spingo il pulsante 2
ho provato ad aggiungere nuovi if..... etc
ma non funziona come se non rispettasse esattamente il pulsante che sente premuto
come posso fare?
ma questa riga (come tutte le altre)
if (digitalRead(5) == HIGH and digitalRead (3) == LOW)
visto che hai definito dei nomi per i pin, why, perchè non li usi e la trasformi così
che così anche tu capisci che cosa dovrebbe fare!
if (digitalRead(MICROSW_0) == HIGH and digitalRead (PULS_1) == LOW)
a parte il fatto che
bool PULS_0=2;
bool PULS_1=3;
bool PULS_2=4;
bool MICROSW_0=5;
bool MICROSW_1=6;
bool MICROSW_2=7;
vanno definiti come byte e non boolean. Boolean lo usi per definire una variabile che ha due (2) stati e cioè vero o falso e numericamente falso=0 vero >0 (quindi 1, 2, 3 ...)
mancano sicuramente tutti i debounce sui pulsanti e soprattutto manca il controllo che dopo aver fatto x step in un senso o nell'altro il miscroswitch sia effettivamente premuto
tra l'altro invece di fare esattamente x passi perchè non ti muovi nella direzione alto o basso fino a quando non senti il micro che ti serve, a quel punto sei arrivato e ti fermi
Patrick_M:
ma questa riga (come tutte le altre)if (digitalRead(5) == HIGH and digitalRead (3) == LOW)visto che hai definito dei nomi per i pin, why, perchè non li usi e la trasformi così
che così anche tu capisci che cosa dovrebbe fare!if (digitalRead(MICROSW_0) == HIGH and digitalRead (PULS_1) == LOW)a parte il fatto che
bool PULS_0=2;
bool PULS_1=3;
bool PULS_2=4;
bool MICROSW_0=5;
bool MICROSW_1=6;
bool MICROSW_2=7;
vanno definiti come byte e non boolean. Boolean lo usi per definire una variabile che ha due (2) stati e cioè vero o falso e numericamente falso=0 vero >0 (quindi 1, 2, 3 ...)
scusa l'ignoranza ma non hanno due stati ?
o sono HIGH O LOW sbaglio?
Patrick_M:
mancano sicuramente tutti i debounce sui pulsanti e soprattutto manca il controllo che dopo aver fatto x step in un senso o nell'altro il miscroswitch sia effettivamente premutotra l'altro invece di fare esattamente x passi perchè non ti muovi nella direzione alto o basso fino a quando non senti il micro che ti serve, a quel punto sei arrivato e ti fermi
che intendi con il "controllare se sia effettivamente premuto"?
per quanto riguarda l'altro metodo che hai descritto è sicuramente più efficiente ma non so realizzarlo
non so come dirgli che deve continuare ad andare avanti fin quando non sente il microsw alto
e come mettere in mezzo anche i pulsanti
allora..
non ti mettero' il codice, non lo faccio più, in particolare nno per gli studenti
ma ti segnalo qualche incongruenza, alcune anche grosse
primo: da marzo (meta') non hai ancora deciso se i pulsanti che hai sono NC o NO?
stai usando i micro di piano come se fossero NC, ma li dichiari input, non input_pullup, sono perplesso
secondo: ma possibile che non riesci (nessuno di voi ci riesce) a formattare decentemente il programma?
Che idea bizzarra è quella di chiudere una graffa di un if e aprire una nuova if sulla stessa riga?
che leggibilità speri di ottenere?
cosa credi che pensi chi legge il tuo programma?
in due mesi e mezzo almeno un passo in questa direzion lo potevi fare
parliamo di passi:
Claudio_FF te lo ha detto all'una e un quarto che avevi sbagliato i tipi dati
e tu otto ore dopo sei ancora qui a giocare coi tipi dati sbagliati?, cosa non ti è chiaro del concetto "Bool NON è Int"?, se non metti a posto gli errori nemmeno quando te li mostrano come credi di poter ottenere qualcosa di funzionante?
ora, se un bool NON è un Int scrivere una bizzarria del genere:
bool PULS_0=2;
e tutte le rige sue sorelle
significa assegnare 1 (ovvero true) alle variabili, e non altri valori
che se poi le usi per le pinmode significa che hai fatto molte volte la pinmode del piedino 1, ma MAI le pinmode che ti servono
e unito al fatto che non sai bene se i tuoi tasti sono NC o NO significa che non sai se i pin "vanno" oppure "non vanno", a posto siamo.......
poi, lungi da te l'idea di seguire il consiglio di steve_cr di un paio di settimane fa: fai le cose una per volta, e quando va aggiungi
no, tu devi (tuo post 48) prevedere per i tre pulsanti i casi che siano premuti i piani.....
che sarebbe già lavoro improbo e facile ad errori SE fosse fatto, peccato che NON lo hai fatto
tre piani con tre pulsanti possibili e tre posizioni possibili fanno nove (in cifra: 9 ovvero 3*3) casi da considerare, tu hai scritto 4 if
e gli altri 5 casi?
certo che tra mancate pinmode, pullup forse presenti, tasti che non sono come si crede e casi non previsti l'ascensore fa quello che vuole, mi avrebbe meravigliato il contrario
da ultimo le stranezze minori
perchè non hai seguito i varii (si' varii, con due i, è il plurale di variO, che diventa variI, e se il mio correttore ortografico non è daccordo la cosa non mi interessa)
dicevo: perchè non hai seguito i varii consigli di fermare l'ascensore quando arriva a premere il micro, non contare i passi? se il motore col tempo perdesse qualche passo tra sei mesi ti trovi la cabina che si ferma a mezzo piano? vabbe' che devi solo passare l'esame, ma un minimo di pensiero ci vuole....
dulcis in fundo il numero dei passi: ma sei sicuro che la distanza tra i piani sia proprio così come indichi?
no, perchè se la distanza tra il piano 0 e il piano 2 è di 8836 passi mi sembra difficile credere che la somma delle distanze 0-1 e 1-2 sia 8270, forse abbiamo già cominciato a fermare l'ascensore in mezzo ai piani, senza nemmeno bisogno di aspettare un guasto hardware, comodo per avere inquilini incaxati alla grande ed esaminatori che sanno cosa pensare dell'esaminando..........
Un consiglio te lo posso lasciare
progetti zoppi sono duri da raddrizzare, riparti da capo che fai prima
ma tieni presente i suggerimenti che ti sono stati dati
grazie della risposta apprezzo molto
sicuramente ho capito degli errori enormi che ho fatto forse data la mia nulla esperienza e anche poca informazione
i pulsanti sono sicuramente nc e spingendoli no
I microswitch l'inverso
però li alimento con i 3.3v di Arduino e mi è stato detto che non dovevano essere usate le resistenze di pullup per questo ho pensato se non le uso fisicamente le resistenze non le dovrò dichiarare neanche su Arduino giusto ?sbagliato?
per quanto riguarda il fatto degli altri 5 casi che mi mancano hai ragione, diciamo questa era una bozza di programma un testing e l'ascensore sembrava aver risposto correttamente, faceva molte cose come veniva scritto da programma me ne mancavano delle altre che sicuramente con l'aggiunta dei vari if e di tutte le cose che mi hai consigliato si aggiusteranno.
L'ultimo consiglio che mi hai dato quello di mandare avanti il motore fin quando non sentisse il cambio di stato del microsw l'avevo bocciato perché non sapevo come fare a livello di progetto .... avevo optato per una cosa semplice e basilare come andare a confrontare due variabili con l'if e dirgli in caso fossero vere cosa dovesse fare....
separa il programma in unità funzionali
che poi vuol dire funzioni che fanno una cosa specifica ed entrocontenuta
leggi i pulsanti e definisci il piano prenotato (se c'è pulsante)
leggi i micro e definisci il piano presente (se l'ascensore è fermo)
se prenotato <> presente in C sarebbe if (prenotato!=presente)
se prenotato > presente motoresale
se prenotato < presente motorescende
motoresale è una fonzione che fa un tot di passi e poi controlla se il micro di presente segna presente uguale a prenotato, se si si ferma, altrimenti ricomincia, suggerimento: guarda la documentazione di while
simonsdec:
però li alimento con i 3.3v di Arduino e mi è stato detto che non dovevano essere usate le resistenze di pullup
Per leggere dei contatti isolati le resistenze di pull-up (oppure pull-down), esterne o interne che siano, servono sempre. Non si usano solo se la cosa da leggere genera già da sola i corretti livelli di tensione riconoscibili dall'ingresso.
simonsdec:
i pulsanti sono sicuramente nc e spingendoli no
Provato elettricamente (con tester, minicircuito con LED, ecc) o dedotto in altro modo?
Lo chiedo perché entrambi questi circuiti danno LOW quando premuto e HIGH quando non premuto, ma solo quello di sinistra (con resistenza di pull-down) ha un pulsante di tipo NC.
I tuoi collegamenti sono quelli di sinistra o di destra?

Comunque l'importanza è relativa, una volta stabilito con sicurezza che pulsante premuto corrisponde a lettura LOW basta scriverlo chiaramente come commento nella sezione dichiarazioni.
standardoil:
significa assegnare 1 (ovvero true) alle variabili, e non altri valori
Vero, credevo che il tipo boolean fosse solo un alias di byte, invece effettivamente assume solo 0 o 1:
bool x = 12;
void setup() {
Serial.begin(9600);
delay(1000);
Serial.println(sizeof(x));
Serial.println(x);
Serial.println((byte)x);
}
void loop() {}
In questo caso, nonostante i pinMode errati, "funziona" tutto solo perché i pin sono già ingressi all'accensione, il pin 1 è già un'uscita (ma magari si blocca la seriale), e le uscite probabilmente vengono impostate dalla libreria stepper.