conto alla rovescia impostabile con encoder

A tutti un buongiorno , dopo varie peripezie mi sono iscritto a questo forum inerente al solo programmare arduino.
Non sono giovane, io e l'inglese non vado d'accordo però cerco di applicarmi almeno nella programmazione (in parole semplici non frequento topic in inglese).
Voglio realizzare un countdown con tempo impostabile (1-99 secondi LED grandi) mediante un pulsante di SET e un encoder rotativo a 2 bit, alla fine del tempo aziona un semplice relè, tutto il sistema mi serve per dosare l'emulsione di un collante poliuretanico.
Ora in commercio si trova di tutto ma o sono semplici o sono sofisticati o poco pratici (deve essere azionato con guanti da lavoro robusti, ecco il perché dell'encoder) e poi ... vuoi mettere la soddisfazione di farlo con arduino ???
Ho fatto un breve corso giusto il classico led, timer, step motori e altro ma in questo caso ...

  • convertire 2 bit per impostare i tempi ... :o
  • solo per visualizzare i 2 LED (sono 14 uscite) e questo scarta arduino nano ... :confused:
    ho un pò le idee confuse ... avete suggerimenti per partire ?
    qualche Link dove poter "leggere" in italiano una possibile "infarinatura" ?
    Un grazie a tutti

Buongiorno,
essendo il tuo primo post, nel rispetto del regolamento, ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il su citato REGOLAMENTO ... Grazie.

Guglielmo

Chiedo scusa ma ho avuto non pochi problemi ad iscrivermi per via di password e nickname, un po' per la fretta ho saltato un passavggio obbligato , comunque ho fatto ...
Grazie a presto.

Vista la presentazione, grazie ... :slight_smile:

Guglielmo

Perchè scarta la nano ? ha le stesse porte di una Uno, anzi due analogiche in piu'.

e a te servono:
14 porte per i due Led ( anche se se ne possono usare quasi la metà se pilotati in multiplexer )
2 porte per l'encoder
1 porta per il pulsante di Start
1 porta per il Relay
Totale 18 porte
la Nano ne ha a disposizione 20 ( compreso le analogiche che possono essere usate come digitali )
Te ne avanzano due ( che poi sarebbero RX e TX, da lasciare libere per un eventuale debug )

Buongiorno Brunello ...
Manca un ingresso di SET ... non sono pratico più di tanto, usare l'ingresso RX o TX si può ?

Si, si possono usare, se non viene usata la seriale.
Ma Perchè il SET ?
Non basta l'encoder per selezionare il tempo e uno Start per avviare ?

Provo a descrivere la mia idea ammettiamo che il sistema sia costruito dunque:

  • accendo il timer la condizione iniziale può essere un numero casuale sempre se non è
    implementata la funzione di reset all'accensione
  • pigiando set definisco da quali secondi parte il countdown
  • l'ingresso start attiva l'uscita relay (attivata la valvola adesivo) e parte il countdown
  • il display visualizza lo scorrere del tempo
  • al termine (display OO) si l'uscita relay (valvola adesivo chiusa)
  • dopo pausa di 1 secondo (variabile) si ricarica il tempo precedentemente caricato
  • ciclo terminato
    al successivo ingresso di start si ripete il tutto
    in sostanza l'encoder serve per fissare il tempo di partenza tramite l'ingresso SET
    diversamente come fai a sapere lo scorrere del tempo ?
    accetto tutte le varianti in corso ... anche perché non sono condizioni obbligate.
    Per essere chiari voglio trovare una valida alternativa all'attuale sistema che è installato sul mio impianto
    ora queste funzioni sono gestite da un timer Crouzet TOP 48 C1 che funziona egregiamente ... se non per il fatto che è montato su barra DIN a giorno ... e i numeri dei tempi di lavoro non sono proprio "visibili" anche perché i tempi sono frequentemente variati in base al lavoro, conseguenza un po' l'usura del pomello, un po' il fatto che si usano guanti da lavoro non sempre puliti ... il risultato finale non è sempre conforme ai risultati richiesti.
    Sono stato un po' lungo ma il funzionamento andava chiarito.

E' vero anche che potendo fare a meno del SET ... una porta non serve ma con che "logica" vedo il tempo scorrere ?

per usare bene un encoder ti servono due ingressi irq.
comunque non vedo il problema... con l'encoder setti una variabile e quella variabile la "fissi" tramite il pulsante dell'encoder.
qui ci trovi un bel articolo che spiega molto bene....
https://www.pjrc.com/teensy/td_libs_Encoder.html

  • accendi il timer, la condizione iniziale può essere o un valore fisso o ad esempio l'ultimo inserito
  • Girando l'encoder definisci ( se il tempo impostato non va bene ) da quali secondi parte il countdown
  • l'ingresso start attiva l'uscita relay e parte il countdown
  • il display visualizza lo scorrere del tempo
    etc etc

Ci sto' guardando l'articolo ... ma come scritto nella presentazione ... io l'inglese non siamo affini, (devo ringraziare i nostri ministri di scuola se negli anni 70-80 non insistevano nell'insegnare una seconda lingua a differenza degli altri stati) ma NON voglio parlare dei problemi del passato ... (affari miei) ritorno al punto provo a convertirlo google traduttore ... anche se è un po' "spannometrica" ...

elpapais:
... due ingressi irq.

Veramente, ne basta uno :wink:

Un'encoder a passi, come quelli delle manopole (e credo a lui servano quelli, non uno a rotazione libera) ha i segnali sfasati di 90 gradi, per cui se con un'interrupt su un'uscita attivi una chiamata, ti basta controllare all'interno della chiamata in che condizione logica e' l'altra uscita ... se e' HIGH stai per forza girando in un senso, se e' LOW stai per forza girando nell'altro, non ci sono altre possibilita' :wink:

Etemenanki:
Veramente, ne basta uno :wink:

Un'encoder a passi, come quelli delle manopole (e credo a lui servano quelli, non uno a rotazione libera) ha i segnali sfasati di 90 gradi, per cui se con un'interrupt su un'uscita attivi una chiamata, ti basta controllare all'interno della chiamata in che condizione logica e' l'altra uscita ... se e' HIGH stai per forza girando in un senso, se e' LOW stai per forza girando nell'altro, non ci sono altre possibilita' :wink:

Certo puo anche non servire l'irq se è per quello ma senza irq perde passi... con un solo irq ne perdi meno ma con due sei certo al 100% che non perdi passi..... e non lo dico io che so di star sulle@@ a piu di qualcuno... lo dice anche nell'articolo...

Ma come fai a mantenere un valore fisso con un valore iniziale definito da un encoder ? gli esempi in rete si basano in buona parte con dei potenziometri e posso capire il valore resistivo convertito a 10 bit
ma poi arduino mantene una variabile in memoria ?

Un'encoder a passi, come quelli delle manopole (e credo a lui servano quelli, non uno a rotazione libera) ha i segnali sfasati di 90 gradi, per cui se con un'interrupt su un'uscita attivi una chiamata, ti basta controllare all'interno della chiamata in che condizione logica e' l'altra uscita ... se e' HIGH stai per forza girando in un senso, se e' LOW stai per forza girando nell'altro, non ci sono altre possibilita'

Io userò un'encoder della BOURNS ecw1j-b24-bc0024l a 2 bit ... ed è a rotazione libera appunto 24 passi = 24 secondi i piedini sono 1 comune a massa e 2 da polarizzare almeno secondo schema ... :o

... perche' dovresti stare sulle @@ a qualcuno ? ... se ti riferivi a me, no di certo :smiley:

Io intendo solo dire che, dato che usa un'encoder per manopole, e non uno "free-running" per motori, non ha senso che usi una procedura pensata per gli encoder da motore, che possono anche fermarsi e tornare indietro a meta' di un passo senza far cambiare la seconda uscita (per quello si, serviranno due interrupt)

L'encoder per manopole ha i passi "fissi", cioe' meccanicamente si ferma per forza dove gli scatti glie lo impongono, quindi non potra' mai succedere che rimanga fermo "in mezzo" a due serie di passi ... per cui ti basta un solo interrupt per non perdere neppure un passo ... se chiami la ISR con pin1 e poi nella ISR ci metti, ad esempio, una cosa tipo cosi

pseudocodice

if (contatore < 99) && (digitalRead(pin2) == HIGH) contatore++;
if (contatore > 1) && (digitalRead(pin2) == LOW) contatore--;

gia dovrebbe bastare senza che perda alcun passo ... :wink:

Walter130:
Ma come fai a mantenere un valore fisso con un valore iniziale definito da un encoder ...

il tuo sketch avra' bisogno di una variabile (chiamala contatore, se vuoi), per dirgli quanti secondi deve fare ... nel setup, metti quella variabile a zero (o alla cifra che preferisci), e ad ogni accensione partira da quella :wink:

Il tuo encoder non e' "free-running", quelli sono quelli da 400 e piu passi per motori o automazione ... il tuo e' un'encoder per manopole, con gli scatti, quindi quando e' fermo sara' sempre in una specifica posizione data dagli scatti (cioe' potra' essere in uno qualsiasi dei 24 punti in cui il meccanismo divide la circonferenza, ma sempre per forza in posizioni fisse, quindi sempre per forza con entrambe le uscite in un certo stato) ... free-running non vuol dire che ha un fermo che non lo fa girare piu di un giro, ma che puo girare liberamente senza scatti meccanici :wink:

si ma sai che spesso la teoria collide con la pratica?

a me diversi encoder a manopola perdono passi se non li gestisco con due irq... sopratutto se il micro è tirato per i capelli.

Che dire poi di chi lo sta usando...

Ad esempio manopolone per velocizzare o ridurre i giri di un lettore cd.... o uno laser show...
Andando avanti ed indietro a casaccio se tu porti la manopola a 0 il laser non è al suo posto oppure il cd viaggia con velocità diversa dalla nominale...

Userò encoder scadenti? o saranno gli arduini cinesi?

Se il micro e' tirato per i capelli, o se lo si fa girare troppo veloce, forse ... ma considera la sua applicazione ... mentre imposta il tempo, il micro non sta facendo assolutamente nulla, solo leggendo l'encoder ... considerato il tempo di esecuzione di una ISR, a meno che non si metta a girare la manopola con il blackedecker, hai voglia che perda passi :smiley:

(e se anche ne perdesse uno, poi, non gli causerebbe alcun problema, dato che il valore lo legge sul display mentre gira a mano la manopola, e non dipende dalla posizione dell'encoder, ne deve impostarlo contando a mente i click ;))

Etemenanki NON ho detto che DEVE per forza usare due irq. ho detto che con due irq NON si perde passi. Se deve usare l'encoder per impostare una variabile va benissimo un solo irq e se fa con calma nemmeno quello gli serve!