Progetto per sensore di velocità :-)

Salve a tutti ragazzi :slight_smile: è da un pò che avevo in mente di fare questo progettino del sensore di velocità per poi far visualizzare
i dati letti su un display a matrice 16 x 2...
Ora vorrei capire un paio di cose, spero mi potiate aiutare >_<
Per la visualizzazione del display ecc sono ok... I due sensori che utilizzo per poter costruire ciò non sono 2 accoppiamenti fototransistor ecc ma sono 2 fotoresistenze che possonop tranquillamente svolgere la stessa funzione.
Vorrei sapere una cosa.. Avevo pensato di far avviare un timer ad arduino ed ad ogni rilevamento compiuto prima su una Fotor. e poi sull'altra mi faceva la differenza di questi due tempi diversi in modo tale da mandarmi il risultato sulla seriale.. potreste dirmi come fare??

Se le fotoresistenze possano essere valide come alternativa non lo so, il loro valore letto in analogico cambia continuamente quindi dovrai creare un caso di test dove qualcosa interrompe un fascio luminoso del quale tu conosci il valore preciso...

Per il resto e' tutto abbastanza facile, leggi il valore istantaneo in analogico, lo salvi in variabile, fai la differenza tra le due variabili e col Serial.print(); stampi i valori.

F

j84c3:
Per la visualizzazione del display ecc sono ok... I due sensori che utilizzo per poter costruire ciò non sono 2 accoppiamenti fototransistor ecc ma sono 2 fotoresistenze che possonop tranquillamente svolgere la stessa funzione.
Vorrei sapere una cosa.. Avevo pensato di far avviare un timer ad arduino ed ad ogni rilevamento compiuto prima su una Fotor. e poi sull'altra mi faceva la differenza di questi due tempi diversi in modo tale da mandarmi il risultato sulla seriale.. potreste dirmi come fare??

Io sono meccanico e percio' non ne capisco molto .. cmq. secondo me basta anche uno semplice switch che ad ogni pressione faccia la differenza tra il tempo attuale e quello della pressione precedente.
da li si calcola la velocita'.
Naturalmente dopo bisogna registrare il tempo attuale come tempo di pressione per aspettare la prossima pressione dello tasto e vedere la differenza di tempo.

Due t

Ciaoooo

Federico:
Se le fotoresistenze possano essere valide come alternativa non lo so, il loro valore letto in analogico cambia continuamente quindi dovrai creare un caso di test dove qualcosa interrompe un fascio luminoso del quale tu conosci il valore preciso...

Per il resto e' tutto abbastanza facile, leggi il valore istantaneo in analogico, lo salvi in variabile, fai la differenza tra le due variabili e col Serial.print(); stampi i valori.

F

Si, iper la storia dei valori non ho problemi, sò come fare :wink: io voglio solo sapere come far partire un timer di arduino e ke quando glielo diko io legge quel valore di timer, lo memorizza, legge l'altro valore del prossimo ordine che gli dò e fà la differenza col precedente, solo questo... Il valore in analogico non centra niente, quello mi dà solo un unità d misura letto dalla fotoresistenza...

Non usare i timer é piú semplice milli() oppure micros() ( a secondo dei tempi che devi misurare).
Le fotoresistenze sono lente nella risposta. Meglio dei fototransistori. Basta metterli in serie con una resistenza da 10kOhm (l'emetitore va verso massa) e una programmazione interuppt.
Ciao Uwe

Magari ad averceli... Stavo pensando di smantellare un vekkio mouse a pallina xD QUà dove abito io c'è il monopolio di un unico negozio d elettronica e per ordinarmi delle cose da internet c metto molto... Ma comunque sono abbastanza veloci :slight_smile:

// spegni con 250 o < e accendi con 420 o >
void setup() {
Serial.begin(9600);
pinMode(3, OUTPUT);
}

void loop() {
int FotoResistenza = analogRead(A6); // il valore è un numero intero che sarebbe uguale
Serial.println(FotoResistenza, DEC);//alla lettura del valore sul pin A6 analogico
//Scrivi sulal seriale il valore della fotoresistenza in esadecimale
if (FotoResistenza <= 250) {

}
else if (FotoResistenza >= 420) {

}
else {

}
}

ad esmepio.. quì come potrei implementare quella funzione? infondo sono delay.. ma non capisco che mi centri...(nel code c'è solo una fotor. imamgina ce ne siano 2

Ciao j84c3, a me sembra di aver capito che ti basta sapere quanti giri compie un asse.
Intanto dovresti dire quanti sono i giri minimo e massimo.
Es. 1000 giri minuto sono 16.66... al secondo, se campioni al secondo leggi il valore di un contatore agni secondo, se il contatore ha valore 33.33...
moltiplichi 33.33 per 60 secondi ed hai circa 2000 giri minuto.

Con un solo sensore il minimo è un giro al secondo, per incrementare un contatore ad ogni giro puoi usare le funzioni di Arduino che abilitano gli interrupts se non sbaglio attachInterrupt(pin, funzione).
Ogni volta che pin cambia stato funzione viene chiamata e all'interno incrementi un contatore che salvi in una variabile ogni secondo poi azzeri.
Se la velocità è moderata e usi un solo sensore per questo puoi usare una fotoresistenza, con l'inconveniente che questa è influenzata dalla luce ambiente e fornisce valori analogici non digitali.

Ciao.

No che mi centra..? Facciamo finta che io ho 2 fototransistor che mi danno o 0 o 1 benissimo.. ora ke voglio fare? voglio che quando c passo la mano mi dice a che velocità l'ho passata (2 fototransistor non uno) nel mio caso uso le fotoresistenze, non è un problema, sò come gestirmele.

ma devi misurare la velocità di rotazione nei due sensi o in uno solo?

Non capisco cosa mi centri la rotazione O_O io devo fare un sensore d velocità che mi misuri la velocità con cui un corpo passa, che ne sò passa an makkina? benissimo cn questo misuro la velocità del mezzo...

Avevo capito male, ho fatto 2+2 tu hai detto "Io sono meccanico" allora ho pensato deve misurare la velocità di un asse.

Allora con il primo impulso devi salvare il tempo del timer "save_time = micros()", al secondo impulso devi sottrarre save_time al valore ritornato da micros().

Qualcosa del tipo:
PseudoCode:
int count;
void loop() {

if (Pin_fotor == HIGH) && (0 == count)
{
save_time = micros(); // salva il tempo
count++;
}
if (Pin_fotor_1 == HIGH) && (count > 0)
{
count = 0;
time = micros() - save_time;
}

Al posto di if (Pin..ecc crei una funzione che ritorna vero o falso a secondo se il fotoresitore ha rilevato o no interruzione.
Peccato solo che funziona solo in un senso.

Ciao.

In pratica è il principio dell'Autovelox: hai 2 sensori, quando un oggetto attraversa prima un sensore e poi l'altro, la macchinetta calcola il tempo intercorso e, conoscendo la distanza fra i 2 rilevatori, con un semplice calcolo matematico (V=S/t) calcola la velocità del mezzo che è passato.

Quindi a te non serve sapere cosa ha stimolato il sensore o di quanto ma solo se è stato fatto.

Però tieni presente che la logica dovrebbe essere del tipo:

  1. osservo il 2° sensore;
  2. il 1° sensore era già in stato "attivato"? Sì: vai a 3); no: vai a 5);
  3. calcolo la velocità;
  4. resetto i sensori;
  5. osservo il 1° sensore;
  6. c'è un rilevamento? no: torna ad 1);
  7. memorizzo il tempo;
  8. imposto il 1° sensore su "attivato";
  9. torno ad 1);

Questa è una prima bozza. Poi devi lavorarci sopra. L'ho buttata lì, magari non funziona :grin:

facile :slight_smile:
devi sapere con esattezza la distanza tra i 2 sensori. mettiamo 10cm?
allora 10cm/(microsAttivazioneSensore2-microsAttivazioneSensore1) = velocità in cm/microsecondi
velocità in cm/micros * (100/1.000.000) = velocità in metri al secondo
100= da cm a m
1.000.000 = da micros a secondi

Ora il problema sta in QUANDO prendere microsAttivazioneSensore2 e microsAttivazioneSensore1. Allora, immagino che normalmente il tuo sensore dia valori introno a 300, e quando passa qualcosa intorno al 900, giusto?
Allora possiamo sfruttare un trucco: quando il sensore supera 512, da 0 logico diventa 1 logico per arduino (giusto? controlla!)
allora a questo punto puoi sfruttare:
1: una lettura digitale, che impiega qualcosa come 100micros, quindi la tua lettura sarebbe sfasata di +-200 micros
2: gli interrupt, con attivazione su fronte di salita, che dovrebbero dare un'errore di 4 micros dettato dalla natura del timer

poi in realtà a questi errori c'è anche l'errore dato dal tempo di esecuzione della funzione micros(), assegnazioni ecc... ma dando per scontato che il tempo sia fisso si annulla da solo.

sinceramente ti consiglio di fregartene e usare una lettura digitale, ovviamente vale la regola che più è grande la distanza, più precisa è la lettura

Molto dipende anche da quanto veloce l'oggetto da misurare può passare. Se passa a 200 Km/h una distanza di 10 cm è insufficiente.

Consideriamo, per capirci qualcosa, che un oggetto che viaggia a 100 Km/h percorre quasi 28 metri al secondo, quindi 10 cm li attraversa in 1/280 di secondo, 3,5 ms. Che velocità hanno i sensori? Quanto impiega l'Arduino a leggere il valore? Sono tutti dati da sapere bene.

Molto dipende anche da quanto veloce l'oggetto da misurare può passare. Se passa a 200 Km/h una distanza di 10 cm è insufficiente.

Appunto, anche se credo che nel suo caso non supererà i 30 km/h, ammeno che non deve misurare la velocià di un proiettile.

Allora possiamo sfruttare un trucco: quando il sensore supera 512, da 0 logico diventa 1 logico per arduino (giusto? controlla!)

Ottimo trucco, era proprio a quello che pensavo quando ho detto crea un funzione che ritorna vero o falso.

Se non si vuole fare in pooling si dovrebbe poter fare con i due interrupt di aurduino che è più preciso.

Ciao.

si ok ma non sò come fare.. per i valori da attribuire a v o f c'ero già... ma come posso fare? non lo sò T_T

cmq i sensori sn molto veloci ma non vado a fare del calcoli precisi perkè quel che devo fare non mi serve per una velocità pazzeska, quindi posso usarli anche a distanze brevi..

lesto:
facile :slight_smile:
devi sapere con esattezza la distanza tra i 2 sensori. mettiamo 10cm?
allora 10cm/(microsAttivazioneSensore2-microsAttivazioneSensore1) = velocità in cm/microsecondi
velocità in cm/micros * (100/1.000.000) = velocità in metri al secondo
100= da cm a m
1.000.000 = da micros a secondi

Ora il problema sta in QUANDO prendere microsAttivazioneSensore2 e microsAttivazioneSensore1. Allora, immagino che normalmente il tuo sensore dia valori introno a 300, e quando passa qualcosa intorno al 900, giusto?
Allora possiamo sfruttare un trucco: quando il sensore supera 512, da 0 logico diventa 1 logico per arduino (giusto? controlla!)
allora a questo punto puoi sfruttare:
1: una lettura digitale, che impiega qualcosa come 100micros, quindi la tua lettura sarebbe sfasata di +-200 micros
2: gli interrupt, con attivazione su fronte di salita, che dovrebbero dare un'errore di 4 micros dettato dalla natura del timer

poi in realtà a questi errori c'è anche l'errore dato dal tempo di esecuzione della funzione micros(), assegnazioni ecc... ma dando per scontato che il tempo sia fisso si annulla da solo.

sinceramente ti consiglio di fregartene e usare una lettura digitale, ovviamente vale la regola che più è grande la distanza, più precisa è la lettura

skusa, non avevo letto questo messaggio.. Comunque iof accio una lettura analogica da 0 a 1024
non mi serve un qualcosa di preciso, Solo capire come poter fare per poter realizzare tutto ciò.
Una volta fatto poi potrei pensare di completare il codice migliorandolo soprattutto sulle tempistiche :slight_smile:

Non ho capito io, allora: non sai farlo o chiedi consigli su come farlo?
Se non sai farlo, forse ti conviene prima esercitarti con qualcosa di più semplice per poi aumentare il grado di difficoltà.

Considera che non si tratta solo di mettere insieme dei sensori, ma anche di scrivere il codice per gestire il tutto.

Io sono un principiante in queste cose, ed ho iniziato anch'io con le classiche cose da principianti. Non prenderla come un'offesa personale, ma non stai forse facendo il passo più lungo della gamba? :grin:

Io ho l'idea, sò come leggere le fotoresistenze sò come assegnare vero e falso e tutto.. tutto ciò che chiedo è sapere come fare
a far partire un timer, leggere il valore del timer nel momento in cui dico io , poi leggere in un secondo momento un altro valore e fare la differenza fra i due.
Il gioco è fatto, Solo questo mi serve.

@leo72: io sapevo già programmare bene quando ho iniziato con arduino (da meno di un anno) ma questo mi sembra un buon programma da cui iniziare...

Consideriamo, per capirci qualcosa, che un oggetto che viaggia a 100 Km/h percorre quasi 28 metri al secondo, quindi 10 cm li attraversa in 1/280 di secondo, 3,5 ms. Che velocità hanno i sensori? Quanto impiega l'Arduino a leggere il valore? Sono tutti dati da sapere bene.

ottima osservazione. se entrambi i sensori hanno un ritardo simile, non ci sono problemi. Il problema nasce quando il sensore proprio non si accorge del passaggio.
se non erro per leggere in digitale l'arduino impiega 100microsecondi (=0.1 millisecondi o 0.00001 secondi), quindi se l'oggetto supera il raggio di azione del sensore in meno tempo, arduino probabilmente non se ne accorge (salvo condensatore che "allunga" l'1 logico). Invece il calcolo rimane preciso perché il tempo impiegato dalla funzione è uguale per entrambe le letture, e quindi perdi 100microsec al via, ma li guadagni allo stop :slight_smile:

@j84c3: Tu ora stai leggendo il sensore in analogico, ovvero ottieni un valore da 0 a 1023. però potresti leggerlo anche in digitale: ottieni 0 se il valore analogico sarebbe < 512, altrimenti 1...
fai qualche prova leggendolo in analogico: se il sensore legge valori < 512 e quando passa ciò che vuoi misurare SOLO allora ottieni valori > 512, allora la lettura digitale ti conviene, è molto più veloce di una analogica.

Altrimenti ti devi adeguare a una lettura analogica, "normalizzando" l'input: io per i giroscopi faccio una media sugli ultimi 20 valori letti, e poi li confronti con un valore che sai che viene superato solo quando passa l'oggetto :slight_smile:

A questo punto implementare la parte matematica è uno scherzo, fai attenzione! non mischiare interi e float o fai solo macelli.
se fai
float a=5;
int b=2;
float ris = a/b;
otterrai 2! per il calcolo corretto devi fare
float ris = a/(float)b;
b viene trasformato in float e poi viene eseguita la matematica: ottieni 2,5!

edit: la logica è semplice: leggi il primo sensore fichè non rileva il passaggio, leggi il tempo, leggi il secondo sensore finchè non rileva il passaggio, leggi il secondo tempo, esegui la matematica e spara fuori il valore di output.