Ho immaginato di si, perche' in fondo parla di un'oggetto da collegare alla volata della carabina, probabilmente in poligono o su un campo di tiro sportivo, dove non e' che ti mettano a disposizione tante prese di corrente ![]()
gpb01:
Io collegherei i due fotodiodi a due pin INT facendo si, come hai detto, che scatti solo su uno dei due fronti (se normalmente il segnale è HIGH e va LOW al passaggio del pallino, lo farei sul fronte di discesa, in caso contrario sul fronte di salita).La parte software è molto semplice, quella più delicata è quella hardware ... :
Guglielmo
P.S.: Convermo che su un AVR a 16MHz la risoluzione di micros() è 4 μsec.
Comincerei a stabilire qualche punto fermo:
HARDWARE:
utilizzare due led IR e due fotodiodi PIN (int 0 ed int 1). A livello elettrico i led IR alimentati continuamente magari con una resistenza verso il positivo per limitare l'assorbimento..diciamo 100ohm.
Per i fotodiodi posso provare il collegamento a polarizzazione inversa suggerito da etemenanki ((catodi dei diodi al +5V, anodi ai pin di arduino, resistenze fra i pin e massa come pull-down e per polarizzare inversamente il diodo). Io credo che il segnale sia sufficente altrimenti amplifico con un BC337 o simile.
Ricordate che sono cmq in attesa di ricevere i laser tx e rx. Provo a buttare giù uno schema elettrico
SOFTWARE:
qui vi chiedo di farmi comprendere le vostre osservazioni perchè non mi sono del tutto chiare laddove Guglielmo recita:
In entrambe la ISR farei solo l'assegnazione di una variabile volatile (intendo una diversa variabile per ogni ISR) al valore di micros() al momento dello scatto dell'interrupt.
Nel loop() se trovo entrambe le variabili diverse da zero, faccio la differenza per calcolare il tempo e le azzero di nuovo in attesa della nuova misura.
vince59:
SOFTWARE:
qui vi chiedo di farmi comprendere le vostre osservazioni perchè non mi sono del tutto chiare ...
... cosa non ti è chiaro ? ? ?
Guglielmo
il discorso dell'ISR:
in entrambe la ISR farei solo l'assegnazione di una variabile volatile (intendo una diversa variabile per ogni ISR)
qual'è l'ISR ![]()
e il concetto successivo:
Nel loop() se trovo entrambe le variabili diverse da zero, faccio la differenza per calcolare il tempo e le azzero di nuovo in attesa della nuova misura.
PS: sto provando il codice con due tastini o facendo variare lo stato degli interrupt ma funziona strano...il primo valore è un valore coerente poi salta ad un numero a 8 cifre come se si stranisse
Molto grossolanamente, giusto per dare un'idea:
volatile unsigned long t1, t2;
unsigned long deltaT;
...
...
void ISR1(void) {
t1 = micros();
}
void ISR2(void) {
t2 = micros();
}
...
...
void setup () {
...
...
t1 = 0;
t2 = 0;
...
...
}
void loop() {
...
...
if ((t1 != 0) && (t2 != 0)) {
deltaT = t2 - t1;
t1 = 0;
t2 = 0;
}
...
...
}
Nel caso di uso di pulsanti, per provare, DEVI necessariamente prevdere un debounce hardware (rete R/C in ingresso) o non funzionerà mai.
Guglielmo
Ok grazie Guglielmo come al solito cercherò di decriptare le tue informazioni ed integrarle nel codice.
SI avevo pensato al debounce...mi tocca farlo.
Lato hardware ... 100 ohm sono troppi per i led ... calcola la resistenza per i led in modo da dargli circa 5mA, e sei a posto ... ricorda che sono a pochi millimetri dai fotodiodi, non serve che illuminino la stanza
... VCC, meno la VF del led, diviso 0.005 ... se usi una batteria da 9V, ad esempio, 7.7/0.005=1540 ohm, il valore piu vicino e' 1500 (1k5), che va bene lo stesso ... ![]()
Per il debounce (che pero' con i fotodiodi NON dovrai usare, solo con i pulsanti nei test), metti 100n fra il pin e la massa, ed una resistenza da 100 ohm in serie ai pulsanti, e sei a posto ... quanto al numero alto, ricordati che stai lavorando con micros(), non con millis() ... significa un milione al secondo, non mille ![]()
vince59:
Ok grazie Guglielmo come al solito cercherò di decriptare le tue informazioni ed integrarle nel codice.
Lo scopo dei miei post è esattamente quello ... REGOLAMENTO, punto 16.13 ![]()
Guglielmo
Gugliemo...ti odio lo sai...semmai tu dovessi avere bisogno delle mie competenze saranno volatili per diabetici
![]()
...cmq ho già messo il debounce e funziona. Devo solo variare un pò il menù e cercare di aggiungere qualcosina oltre che implemetare la variante Guglielmo-uno.
Appena arrivano gli SFH ed i laser passo a prove pratiche
vince59:
Gugliemo...ti odio lo sai...semmai tu dovessi avere bisogno delle mie competenze saranno volatili per diabetici![]()
![]()
![]()
![]()
![]()
![]()
Guglielmo
P.S.: Di che ti occupi esattamente? ... non lo hai messo nella presentazione ![]()
![]()
tra le tante cose ..so usare molto bene gli esplosivi.
Non mi distrarre che sto studiando...ed ho tante domande cui rispondere
Gugliemo ed Etemenanki se potete dare un occhiata...l'ho ripulito un pò e cercato di implementare quanto suggerito da Guglielmo. Devo verificare però sia la sequenza codice che gli algoritimi di calcolo che sono i valori sono incoerenti".
PS: ho sostituito il post precedente
Perché non fai le cose per passi piccoli ? ? ?
Perché cercare già di implementare tutta la parte LCD e di calcolo senza sapere prima se funziona bene la parte delle ISR e la rilevazione dei dati ? ? ?
Limitati al mometo alla gestione delle due ISR e alla visualizzazione dei risultati sulla seriale e poi, mano mano, implementi tutto il resto che servirà ... verdai che farai qualche cosa di più modulare e semplice. ![]()
Detto questo, intanto ...
- perché deltaT l'hai messa tra le volatili ? Non viene mica aggiornata/usata in una ISR ...
- perché continui a fare l'attachInterrupt sul CHANGE ?
Guglielmo
...sono alto 1,85 faccio passi lunghi. Battute a parte grazie e sono al momento contento.
Prendo atto delle tue obiezioni.
deltaT: L'avevo messa nelle volatile per raggruppare le variabili...magari non ha senso farlo.
CHANGE mi sembrava più flessibile. Ora sto provando con pulsanti (debounced) ed anche con FALLING gira bene.
Si le ISR non mi sono chiare concettualmente.
Vi aggiorno.
Potresti farmi comprendere la differenze (miglioramnti) tra i due codici? ---il mio primo e quest'ultimo?
Se guardi il perché si usa la parolina "volatile" (ti ho messo apposta il link) scopri perchè, per deltaT, non serve ![]()
Con CHANGE hai due interrupt per ogni LED per ogni passaggio, invece a te ne serve uno, quindi, verifica in condiziioni di riposo come è il segnale e scegli quello opportuno che indica la variazione del segnale.
ISR sono funzioni che vengono automaticamente richiamate, interrompendo qualsiasi cosa la MCU stia facendo, allo scatenarsi di un certo evento. Al termine della ISR il controllo ritorna al programma nel punto in cui era stato interrotto. Servono per "servire" eventi che richiedo immediata attenzione senza aspettare che il programma vada a verificare (nel loop()) se un certo pin è in un modo o in un altro.
Guglielmo
...nella struttura del codice è importante la posizione del blocco ISR?...questo:
}
void ISR1(void) {
t1 = micros();
}
void ISR2(void) {
t2 = micros();
}
void loop()
{
...ho provato a spostarlo prima e dopo il void setup e sembra nulla cambi.
No, nell'IDE di Arduino NON ha importanza, tanto poi lui fa come gli pare
![]()
Nella pratica è buona norma dichiare le funzioni prima di usarle (... o, quantomeno, dichiarare i loro "prototipi").
Le ISR sono poi dei casi particolari ed è buona cosa, metterle sempre in testa la codice, prima del programma vero e prioprio (se tu scrivessi fuori dell'IDE, in 'C', ti direi che è bene metterle prima del main(), nel caso del IDE, se le metti prima del setup(), in testa, va benone).
Guglielmo
P.S.: Nota che le ISR sono solo delle funzioni che vengono richiamate in un modo particolare, ma sempre come funzioni le devi pensare.
Guglielmo ed Etemenanki grazie per i consigli che seguirò.
Attendo ora alcuni componenti hardware per vedere se tutto funzionerà come pensato.
Se tutto andrà bene vorrei inserire una lettura media dopo 10 tiri...immagino dovrò lavorare di array in cui immagazzinare i valori da mediare;
Un menu per inserire il peso del piombino...qui diventa più complessa
Attendo vostre indicazioni per procedere.
vince59:
Se tutto andrà bene vorrei inserire una lettura media dopo 10 tiri...immagino dovrò lavorare di array in cui immagazzinare i valori da mediare
Perchè? Salvo che non ti interessi avere i singoli valori separati, puoi semplicemente sommare le 10 letture ed alla fine dividere per 10. Ovviamnete la somma deve rientrare in un unsigned long, ma non credo che con 10 misure valide ci siano problemi ![]()
vince59:
Un menu per inserire il peso del piombino...qui diventa più complessa
Prevederei una serie di valori fissi e permetterei solo la selezione tra quelli previsti.
Guglielmo
...provo ad aggiornare il codice.