Vai al contenuto
PLC Forum


esegui tutto anche se il vero nel frattempo viene a mancare


kym

Messaggi consigliati

Ho una chiamata dal loop principale che diventa VERO se ci sono delle condizioni (IF xxxx && XXX && digitalRead(HIGH) etc.)

 

La fase in cui diventa vera dura molto meno di un secondo (un impulso), i comandi che deve eseguire, tra cui un fade e dei lampeggi asincroni durano di più, anche perchè devo mettere necessariamente dei delay altrimenti le luci non si vedono o non si sincronizzano.

 

Il problema non è tanto il delay ma quanto che dopo il delay di alcuni comandi la condizione è diventata FALSE e quindi le altre istruzioni non vengono più eseguite.

 

Come posso fare per farsì che TUTTO il void venga eseguito una volta partito anche se la condizione iniziale di VERO è nel frattempo venuta a mancare?

Proprio della serie condizione VERA esegui tutto fino alla fine indipendentemente da ciò che diventa la condizione IF di partenza.

 

Ci sto picchiando da ore ma non trovo niente per farlo.

 

Ho provato anche a togliere il delay e ad usare i millis per i lampeggi a parte il casino di sincronizzarli con i tempi, non ho risolto niente, il resto del listato non fa in tempo ad essere eseguito che la funzione VERO è diventatata FALSE e quindi il VOID non parte più.

 

Stessa cosa per i delay non bloccanti di looper, non fa in tempo.

Link al commento
Condividi su altri siti


Allora il risultato dello "if" sarà un flag alto.

Nel main loop testi ilflag e se è alto chiami una funzione che esegue le operazioni che ti interessano.

Le operazioni le esegui in un ciclo di while che ha come condizione lo stato alto del flag

Al termine della esecuzione di tutte le abbassi il flag, quindi il programma esce dal ciclo di while e ritorna al main loop.

Link al commento
Condividi su altri siti

kym ....studiare qualche bel libro sui microcontrollori e su arduino con magari un contorno di automazione e linguaggi di programmazione  ?

Cosa ne pensi? 

Pensa , potrei anche aiutarti nel percorso .

A mio parare , postare tutti i giorni miriadi di articoli dove si richiedono interventi specifici lo trovo abbastanza frustrante .

Perchè non ti specializzi un po , guarda che è una bella cosa saper lavorare o quanto meno sapere da che parte iniziare.

Lo dico per te....

Link al commento
Condividi su altri siti

Walter, il tuo intervento (come molti altri che ho letto anche e non solo indirizzati a me personalmente) è veramente poco simpatico.

 

Un forum, è composto da persone che per passione si scambiano idee ed opionioni, si aiutano a vicenda in cose banali e non.

L'automazione non è il mio lavoro, non lo sarà mai e nemmeno mi interessa che lo sia.

Specializzarmi o studiare qualcosa a suon di libri per un passatempo creativo e divertente quale è penso per molti non è un consiglio, perchè gli hobby si possono imparare a poco a poco, leggendo qualche esempio e facendo frutto dell'esperienza di chi con buona volontà la condivide ed ha piacere di farlo, altimenti, non sarebbe qui e i forum sarebbero l'elite per chi dimostra carte alla mano di aver studiato.

 

Devi sapere che c'è chi prova piacere ed accresce la propria autostima aiutando gli altri, anche i più ignoranti ed allo stesso tempo, dalle cose che vengono chieste accresce il suo sapere e la sua esperienza.

 

Qui come in ogni forum è la medesima cosa, c'è sempre qualcuno molto esperto che dispensa consigli a chi non ne capisce niente, ma di certo non gli risponde studiati i libri e specializzati o impara a lavorare, se tutti facessero così, i forum sarebbero deserti e con 4 espertoni che si litigano il ruolo su chi ha studiato di più o di meno.

 

Il tuo intervento a parer mio è decisamente a sproposito, come in uno sempre dove c'eravamo io e Livio a mio parere sei andato decisamente sull'offensivo verso un'altra persona, poi te ne sei reso conto ed hai modificato o hanno censurato parte del messaggio.

 

Tornando alla discussione e per favore, chiudendo la polemica, perchè qui vorrei passare del tempo imparando, divertendomi e confrontandomi senza provocazioni o rinvii a studiare anche di cose che non conosco, semplici idee che poi si potrà o meno mettere in pratica con la voglia di condividerle.

 

Il codice in questione, pur nella mia ignoranza fa una marea di cose mi sono solo arenato su un punto dove devo usare funzioni visive con delay insieme a funzioni senza che utilizzano una libreria che a quanto pare, insieme non c'è verso di farli andare o va una parte (quella del delay) e non va l'altra parte, oppure vanno insieme nello stesso tempo. Ho provato con i mills, con diverse librerie di timer già fatte, a farlo ritardare a schedularlo, a richiamarlo con variabile o a fare due chiamate distinte con partenza in false cambio in true con riporto come ultima istruzione in false per spegnerle, niente da fare, ed è l'unico punto delle molteplici funzioni/controlli che gli faccio fare che non va come vorrei, e probabilmente quello che voglio fare non è fattibile così come l'ho pensato senza usare dell'elettronica esterna al micro o un'altro micro anche un tiny13 come penso di fare giusto perchè ne ho a disposizione e non devo aggiungere altri componenti a contorno come per un 555.

 

Il consiglio di Livio è giusto, io l'avevo fatto diversamente con IF e ultimo comando manda in FALSE e il gruppo nel LOOP non viene eseguito, ma in ogni caso non funziona se uso la libreria fadeled se tolgo la libreria e sostituisco l'accensione con un banale analogwrite PWM a valore crescente o digitalwrite ad accensione totale ed immediata funziona.

 

In pratica all'ultimo delay(75) che gli do dove poi subito un digitalwrite LOW segue l'istruzione fadeled che non accende più il led nel tempo e partendo dal duty che voglio io.

La prima volta non avevo fatto i conti giusti con il watchdog e mi si resettava per 25ms e me ne sono accorto usando per la prima volta il monitor seriale funzione dopo funzione per capire dove diavolo si ferma e mettendo un digitalwrite parallelo prima e dopo la funzione da li ho scoperto il problema.

 

Ora mi è venuta in mente un ultima prova da fare se non va così l'alternativa è il fade senza la libreria ma fatto uno ad uno viene un codice troppo complicato, lungo da scrivere e sincronizzare uno ad uno i led è un lavoro spaventoso, quindi tiny13 che fa la parte con il delay in ritardo rispetto alle prime accensioni sincronizzate con delay.

Link al commento
Condividi su altri siti

Probabilmente stai o usando male la libreria o c'è qualche cosa della libreria che non conosci. Io non la conosco per niente, anche perchè non mi sembra il caso di usare una libreria per realizzare quello che si può fare con 4-5 istruzione ben fatte.

Dovresti imparare a non usare i delay() se in casi particolari. Sono temporizzatori che bloccano il sistema. Timbasta usare un timer (1 o 2) ed il relativo interrupt.

Il consiglio di Walter, anche se espresso nei soliti modi rozzi e scostanti che gli sono soliti, è comunque valido.

Ad un certo punto bisogna fermarsi con la sperimentazione e bisogna iniziare a studiare seriamente, se si vogliono fare le cose bene. Altrimenti rischi di trasformarti in un facilone come il Luigi di nostra conoscenza.:smile:

Link al commento
Condividi su altri siti

Tutto vero Livio, infatti io evito di usare il delay anche perchè usare i millis con quattro istruzioni è facile.

Il problema è sincronizzare 128 lampeggi ......... utilizzando per ognuno una partenza differente con un fade-in differente ed un fade-out differente.

Con una libreria già fatta è un attimo, uno ad uno con ognuno quelle "quattro" righe di codice diventa un codice enorme e complicato.

 

Ci ho provato, senza la libreria e con delay funziona perfettamente senza il delay pure usando i millis e il controllo del tempo ma dopo 6 lampeggi con il codice per mills mi son venute fuori più di 40 righe.

 

Troppo, troppo complicato, menoso e forse stupido farlo, non dico non fattibile, anzi, ci son riuscito senza usare la libreria (che già non permetteva di usarne più di 4 ad istruzione/gruppo) ma è un lavoro immane che non ha nessun senso quando con 25 centesimi gli affianco un tiny13 che a sua volta mi fa l'istruzione per il delay con il fade e gli altri li faccio con il delay ed una decina di copia incolla.

 

Ho persino scritto su un forum straniero dove ho visto usare la libreria per questi giochi di luce e mi han risposto che si son appoggiati ad elettronica esterna e divisori di clock quando volevano creare gruppi di luci numerose o funzioni particolari: della serie mi sto complicando la vita inutilmente, ma son testardo.... stasera prima di andare a letto ci riprovo ancora, mi piacerebbe riuscirci, al limite lo metto su un 64 ne ho presi una decina per 5 euro tanto oramai fare i PCB tsop è normale amministrazione per me (il bidone di pcb che non mi son venute bene l'hanno fatto sparire gli alieni!)  mi manca il pogo e poi miniaturizzo pure la connessione tra pc e micro.

 

Ti ricordi la questione del bluetooh per gli sketch con arduino? ho trovato un sito dove c'è il prototipo del programmatore per riprogrammare l'unità bluetooth aggiungendo la funzione del DTR in uno dei pin liberi.... ci voglio provare me lo son fatto ora aspetto il modulino HC05 e provo.... per alcune applicazioni avere la possibilità di variare il codice via BT è una cannonata.....   anche ovviamente controllare l'arduino via seriale è bello, devo vedere se mi riesce una cosa carina come entri in raggio BT e fa la connessione con il cell e mi accende qualcosa come esco dal campo me la spegne tipo le card della renault che chiude l'auto.

Link al commento
Condividi su altri siti

Guarda che le tue righe di codice son forse meno di quelle che usa lalibreria e che tu non vedi. Le librerie devono gestire casi universali, invece un ccodice dedicato è ottimizzato per quella situazione.

Comunque se la libreria non funziona significa che la funzione non è chiamata correttamente.

in genere alle librerie sono allegati esempi, prova a lavorare con qualcje esempio allegato per verificare se e come funziona.

 

Ci sono librerie LCD in I2C che danno problemi, io ne uso una che è stata testata dal forum ufficiale di arduino e non ho problemi, con altre invece secondo le applicazioni funzionavano più o meno bene.

Link al commento
Condividi su altri siti

caro kym....

ti sembra normale un titolo come 

Quote

esegui tutto anche se il vero nel frattempo viene a mancare

 

Prova a riflettere ....

Nell'altro chiedevi se si potevano implementare fisicamente due protocolli seriali su una stessa linea , poi senza nemmeno cerca su google ti diamo i link che ovviamente non guardi e continui a modo tuo .

Credi che la tecnologia nel corso del tempo si sia sviluppata con metodi tipo il tuo ? 

Impara le cose e un minimo di teoria e vedrai che sarà più facile anche postare una domanda .

Poi per il simpatico o antipatico sai che cosa me ne frega ?  ....lascio a te la risposta 

Io a 45 anni quello che dovevo fare , quello che faccio e quello che farò lo so bene , e gia molto tempo.

Anche io chiedo sui forum , ma con un minimo di conoscenza che apprendo sul web o sui libri. In molti siti stranieri nemmeno ti rispondono a domande insulse.

Tu non stai imparando , tu stai realizzando un qualcosa di tuo , un tuo progetto , e stai continuamente rivoltando la minestra per i risolvere i tuoi problemi , non stai condividendo niente con il prossimo. Questa è la mia impressione , e spero di sbagliarmi . ;)

Link al commento
Condividi su altri siti

Quote

Guarda che le tue righe di codice son forse meno di quelle che usa lalibreria e che tu non vedi.

 

In questo caso sono diverse righe al posto di una sola della libreria.

io imposto il led partenza tra 0-255 (pwm) e il tempo che deve scorrere tra 0-255 o tra 255-0 o tra il valore che scegli tu.

farlo senza libreria sono un sacco di righe di codice, moltiplicato per molti led, ho provato, visto che va ma viene un codice enorme.

La richiamo correttamente, gli esempi coincidono, solo nel mio caso sono decine di chiamate.

Evidentemente se c'è un delay il codice scritto dalla libreria che forse continua a girare si impalla non lo so cosa succede ma non va.

Link al commento
Condividi su altri siti

Caro Walter, scendi dal piedistallo per prima cosa.

 

Il titolo è quanto di più semplice (e altri l'hanno capito) per descrivere il problema in una sezione dove si discute di programmazione non di cucina, quindi non poteva certo dare adito a fraintendimenti.

 

Secondo:  mi indichi per cortesia dove avrei detto:

 

Quote

Nell'altro chiedevi se si potevano implementare fisicamente due protocolli seriali su una stessa linea , poi senza nemmeno cerca su google ti diamo i link che ovviamente non guardi e continui a modo tuo .

 

https://www.plcforum.it/f/topic/202096-creare-un-bus-di-più-segnali-con-arduino-si-può/#comment-1480760

 

TI linko la discussione così che si possa vedere chiaramente che non ho mai detto una castronata simile ma che te la stai inventando tu di sana pianta per farmi passare per il più fesso e stupido del mondo che non sa cosa sta facendo o che non ha voglia di leggere perchè fidati, leggo molto e mi documento e quando ho dubbi vengo qui per scambiare idee o chiedere aiuto e trovo persone disponibili che per passione fanno questo senza averne nulla in cambio.

 

Ah, anche i link li devi ancora mettere visto che gli unici link sono due codici che mi ha dato Livio già fatti.

 

Quote

Poi per il simpatico o antipatico sai che cosa me ne frega ?  ....lascio a te la risposta 

Io a 45 anni quello che dovevo fare , quello che faccio e quello che farò lo so bene , e gia molto tempo.

 

La risposta me la son già data, tranquillo.

Comunque, chi è troppo sicuro di se, poi finisce a far figure degne dell'antipatia che sprigiona.

 

Quote

Tu non stai imparando , tu stai realizzando un qualcosa di tuo , un tuo progetto , e stai continuamente rivoltando la minestra per i risolvere i tuoi problemi , non stai condividendo niente con il prossimo. Questa è la mia impressione , e spero di sbagliarmi .

 

Vero io non sto imparando, sono un progettatore che sta facendo un progetto che poi rivenderà alla nasa per simulare piccoli ufo e vengo qui a rivoltare le minestre (come al contrario fai tu dicendo stupidaggini che non ho mai chiesto) per farmi i cavoli miei... sviluppando una sorta di applicativo con cui poi fare business senza condividerlo (sempre che a qualcuno possa interessare) è questo che pensi? 

 

Ebbene sei penoso, anche perchè, se guardi le mie discussioni ho realizzato poco tempo fa degli adattatori difficili da trovare sul mercato, ne ho postato le foto ed ho detto a chiunque che se lo voleva di scrivermi che gli passavo il file di eagle già fatto.

 

Mi hai catalogato male, hai sbagliato, ma non mi interessa io catalogo te coma una persona supponente e saccente con cui non avere per niente a che fare, oltre che decisamente maleducato ed arrogante, magari ne sai tante, ma questo non ti farà mai un SIGNORE.

 

Io fossi in te invece di appuntare me creando scompiglio con stupide provocazioni, e non è la prima volta, dicendo di non venire qui a perdere tempo (e se per te venire qui equivale a perdere tempo hai male inteso il concetto di "forum" di appassionati) chiederei scusa al "vecchio che non da nessuno schetk o che pensa di portarseli all'altro mondo" perchè come sai i messaggi arrivano via mail e rimangono nelle caselle email anche se subito dopo modifichi il messaggio sul forum, io al suo posto ti avrei mandato a quel paese per ciò che meriti ma lui è un signore e lo si è visto in tante altre discussioni ed ha ignorato.

 

 

Link al commento
Condividi su altri siti

Prima cosa: NIENTE DIATRIBE altrimenti devo prendere provvedimenti antipatici per tutti.

 

Kym, probabilmente non sai come si preogamma.

per prima cosa usando una libreria tu credi di scrivere 2 righe di codice, invece è come ne scrivessi decine e decine. Al momento della compilazione il compilatore trova tutta una serie di rimandi esterni che va a risolvere linkando al codice generato il codice delle librerie. Alla fine il file eseguibile risulta sempre un po' più lungo di uno costruito appositamente, ed è sicuramente più lento.

l'uso di librerie è conveniente quando si devono eseguire funzioni standard, molto comuni, come pilotare un display, stampare un file, leggere/scrivere una EEPROM o una SCard e via elencando.

 

Nel tuo caso hai già fatto tutto perchè mi dici che:

Quote

io imposto il led partenza tra 0-255 (pwm) e il tempo che deve scorrere tra 0-255 o tra 255-0 o tra il valore che scegli tu.

 

L'hai fatta e provata questa funzione e, da quello che scrivi, funziona regolarmente.

Devi solo trasformarla in una funzione paramentrica a cui passi i valori di tempo e di inizio e fine. In pratica è una funzione rampa. Se invece di LEDs usassi motori sarebbe la stessa cosa .

Fai una fonzione così:

 

void rampa (int inizio, int fine, int passo, int tempo).

 

Dove inizio, fine e passo sono i valori interi che determino il valore iniziale, il valore finale, il gradino di incremento/decremento ed il tempo intercorrente tra un passo e l'altro.

Poi la richiami per ogni LED che piloti.

In pratica ti sei fatto la tua libreria ottimizzata per il tuo lavoro.

Se vuoi ti metto un esempio di rampa che ho fatto per pilotare dei motorini.

Link al commento
Condividi su altri siti

Ciao Livio, si è semplice come funzione il problema è che ne dovrei fare una per ogni led perchè l'accensione (inizio) e durata tra un valore ed un'altro nella luminosità è differente, in pratica dovrei farne una per ogni singolo led, questo è il motivo percui mi sono impuntato con la libreria e alla fine ...... ci son riuscito!

 

guarda queste due righe, tieni presente che nel loop c'è il richiamo a door:

 

void door() {
  if ((digitalRead(OPEN) == LOW) && (last_door == false && last_light == false && digitalRead(ACC) == LOW)) {
    stat = false;
    led.fade(lum, fadein);
    last_door = true;
  }

  if ((digitalRead(OPEN) == HIGH) && (last_door == true)) {
    led.fade(0, fadeout);
    last_door = false;
    stat = true;
  }
}

 

questa è la nativa come OPEN da high diventa low fa il fade-in come diventa nuovamente high inizia il fade-out.

Il contatto se è un impulso e dura meno del fade-in (che è 300 in una variabile) non raggiunge il valore 255 o quello che è in quel momento la variabile lum che è legata ad una fotoresistenza che da il valore prima del fade-in a seconda della luce esterna. Quindi se il contatto OPEN è low si arriva alla piena luminosità di un singolo led (XXX.fade(pwm,T).

 

void fotores() {
  if ((last_light == false) && (last_door == false)) {
    int lux = analogRead(SENSOR);
    lum = map(lux, 900, 1023, 255, 15);
    lum = constrain(lum, 15, 255);

 

E questa istruzione che è dentro tutto il programma funziona, collaudata; Ripeto, può essere l'open anche un impulso di brevissima durata che il led si accende.

 

Ora veniamo al casino, la parte è per un solo lampeggio ma è semplicemente ripetitiva cambiando i tempi/partenze etc (o le istruzioni al fade):

 

void door() {
  if ((digitalRead(OPEN) == LOW) && (last_door == false && last_light == false && digitalRead(ACC) == LOW)) {
    previousStrobe = millis();
    stat = false;
    strob = true;
    // led.fade(lum, fadein);   (devono partire dopo il lampeggio sotto)
    // last_door = true;           (fa partire il fade-out quindi ....)
  }

 

 

  if ((ledState == HIGH) && (strob == true) && (millis() - previousMillis >= OnTime))
  {
    ledState = LOW;
    previousMillis = millis();
    digitalWrite(LEFT, ledState);
  }
  else if ((ledState == LOW) && (strob == true) && (millis() - previousMillis >= OffTime))
  {
    ledState = HIGH;
    previousMillis = millis();
    digitalWrite(LEFT, ledState);
  }

  if ((millis() - previousStrobe >= durStrob) && strob == true)
  {
    strob = false;
    digitalWrite(LEFT, LOW);

    digitalWrite(RIGHT, LOW);
    led.fade(lum, 100);    (accorciato perchè la chiamata dentro il codice se è a 300 non fa in tempo a raggiungere la max lum)
    last_door = true;
    fine = millis();
  }

  if ((digitalRead(OPEN) == HIGH) && (last_door == true))
  {
    if (millis() - fine >= 100)
    {
      stat = true;
      led.fade(0, fadeout);
      last_door = false;
    }
  }
}

 

Ecco, ora funziona, essere testardi alla fine ripaga, nella parte che deve fare il fade-out (lo spegnimento) ci voleva una pausa di 100ms (che funziona anche solo con istruzioni da librerie:P) altrimenti, cosa che non mi spiego, NON funziona il fader in spegnimento, ma qualunque altra istruzione manuale SI.

 

Ora, visto che nel codice che ho fatto in precedenza, diciamo quello nativo non c'è nessuna pausa tra fade-in e fade-out e il passaggio è praticamente immediato, non capisco come sia possibile che se in mezzo ci aggiungi un lampeggio senza delay (potevo capire con i delay) se non gli metti una pausa l'istruzione non parte o si impalla, e che potrebbe essere pure giusto che ci voglia la pausa in alcuni esempi di fade senza librerie c'è, ma allora perchè non avviene in egual maniera nella prima versione nativa?  Mistero della libreria.

 

Poi, il bello è che son finito a analizzare la libreria ed in una versione modificata ho trovato il file keyword (quello che da il colore ai comandi) ed ho scoperto pure dei comandi che non erano indicati ne negli esempi ne nelle istruzioni, esempio il controllo sul fade e la possibilità di chiedere al led che valore ha in quel momento ed in caso cambiarlo o fare altro.

 

(dalle 23 alle 4,40 per arrivarci dopo non so quante prove, Tiny84  clock 1 Mhz).

 

ps:  però è bello perchè sto imparando parecchie cose che fino a 2 mesi fa mi sembravano per me che non ne capisco niente irrealizzabili. Appena ho finito con questo (mi mancano altre cose da aggiungere) ritorno al dimmer con lo zerocroxing e al menù del generatore onda quadra lo voglio usare senza computer tutto da display. Mi è venuta un'altra idea sul menù trafficando con il codice sopra che forse fanno venire fuori un bel lavoro:

 

due encoder con pulsante uno per freq ed uno per d/c

girandoli aumenti o diminuisci, premendoli cambi la lo step

quindi se premo quello della freq nella riga sopra mi verrà X1 - X5 - X10 - X100 - X1000 ad ogni pressione verranno in sequenza.

idem per quello del d/c  senza premere basta girare se premi X1 - X5 - X10

 

Che ne dici?

Link al commento
Condividi su altri siti

Quasi certamente è necessario un ritatdo tra la chiamata delle 2 funzioni di libreria. Il motivo lo puoi socprire analizzando i srgenti (quelli scritti in "C/C++"), oppure se han fatto le cose ben lo spiegan nei commenti del file ".h" o nei sorgenti. Poi il minimo ritardo lo puo scoprire per tentativi, però se non è specificato c'è il rischio che un ritardo sufficiente per un'applicazione non lo sia più per un'altra.

 

C'è sempre la domanda di base: come conti gli impulsi dei 2 encoders? come ne discrimini il verso?

Link al commento
Condividi su altri siti

Si probabilmente è un adattamento, per altri codici non serve o magari si... non saprei, ho dato un occhiata ma non ho capito granchè perchè lo fa, ho trovato la soluzione, son contento :P

 

Per l'encoder non lo so non ce l'ho ancora in mano.

ma ho visto degli esempi di menù fatti così se ci son riusciti loro .........

 

finchè non ce l'ho in mano non posso provare però guarda qui: https://www.youtube.com/watch?v=ns1iqNInzG8

 

A vedere li è fattibile abbastanza facilmente.

 

Link al commento
Condividi su altri siti

Anche dai video del nostro Luigi sembravan tutte applicazioni meravigliose e perfettamente funzionanti, sembrava avesse scoperto la quadratura del cerchio.:smile:

 

Per contare gli impulsi di un ecodere devi....contare gli impulsi. Poi se devi fare il conteggio ed il deconteggio devi prima di tutto discriminare il senso di marcia.

Ci sono essenzialmente 2 metodi:

  1. Usare un contatore Up/down Hw ed un discirminatore di fase che stabilisce se attivari il clock up o quello down.
  2. Contare gli impulsi a mezzo software e discriminare il verso sempre tramite Sw.

In entrambi i casi il limite è la frequanza degli impulsi di encoder; nel primo caso il limite è elevatissimo perchè dipende solo dalla logica impiegata dai contatori, comunque è sempre parecchie decine di MHz.

Nel caso del conteggio Sw di pende dalla velocità del micro e dal numero di istruzioni impiegate per discriminare il verso. Puoi fare in modo di avere un ibrido. metti in OR  2 canali dei 2 encoders e li mandi ad un ingresso di inerrupt. Poi fai 2 discriminatori di fase Hw e con questi determini il senso di rotazione. Poi via software decidi se sommare o sottrarre da un registo in funzione del senso di rotazione che leggerai su 2 appositi ingressi.

Questa è solo l'idea di base da rifinire nei particolari.

 

Il micro di arduino ha solo 2 contatori con clock esterno, se selezionato; sono il timer0 ed il timer1. Il timer0 è intoccabile se usi le temporizzazzioni di delay(). Rimane il timer1 che arriva a 16 MHZ tranquillo, però è uniderezionale.

Io ho provato a farci un frequanzimetro con ottimi risultati, ma questa è un'altra cosa.

Link al commento
Condividi su altri siti

Finchè non proviamo non si può capire quanto sia valido o meno quel che si vede nel video.

Appena mi arrivano gli encoder provo, sono curioso, penso che comunque in qualche modo riusciremo nell'intento, almeno spero, altrimenti si ripiega sui bottoni come avevamo già pensato.

Link al commento
Condividi su altri siti

Io ho visto un video dove parla di encoders assoluti.

Poi ho visto anche l'altro per gli incrementali. E' il caso 2 che ti ho descritto. Il discriminatore di fase con 4013 èun classico, l'uso di "D" flip-flop risale ad almeno 40 anni fa o più. hai 2 segnali: 1 il clock come interrupt e l'alto la direzione da testare l'ingresso quando ti arriva il clock.

Se risovi la routine in 0.2 ms e ti tieni altri 0.2 ms per il resto del programma puoi contare sino a 2500; se gli encoders sono 2 scendi a 1250 Hz.

Attenzione che questo modo di contare non ti salva dai conteggi spuri dovuti all'oscillazione dell'albero sul fronte dell'impulso.

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...