Dopo aver risolto il problema posto in questo topic:
http://forum.arduino.cc/index.php?topic=241622.0
Vi spiego in poche parole cosa dovrebbe fare questo semplice progettino:
Arduino utilizzato: Arduino Uno Rev3
Ho due fotocellule irraggiate da due fasci laser, quando la prima si chiude prendo il tempo così:
start = micros();
E quando si chiude la seconda fotocellula prendo il tempo così:
end = micros();
La distanza delle fotocellule la conosco, quindi non mi rimane che stampare la velocità media di passaggio calcolata in questo modo:
Serial.print ( distance / ( ( (double)(timeEnd - timeStart) ) / 1000000 ) );
Serial.println ( " m/s" );
La velocita' naturalmente e' in metri al secondo ( per i km/h basta moltiplicarla per 3.6 ).
Arrivato a questo punto tutto sembra funzionare molto bene, però mi pongo un dubbio, siccome la distanza delle 2 fotocellule sarà abbastanza corta ( 10 - 20 cm ) e la velocità di passaggio può essere abbastanza alta ( 60 Km/h ~= 18m/s ) mi chiedo se Arduino fa in tempo a verificare entrambi i passaggi e calcola un valore con non molta approssimazione, perchè nel caso migliore ho:
Distanza = 0.20m;
Velocità = 18 m/s;
Tempo di passaggio che dovrà controllare Arduino ~= 11ms;
Ho buttato giu un po di codice ancora da ottimizzare per poter calcolare il tempo trascorso dal passaggio dalla prima fotocellula alla seconda fotocellula e data la distanza delle fotocellule calcolarne la velocità media di passaggio.
Questo è il codice che ho scritto per ora:
int sensorPin1 = 3;
int sensorPin2 = 2;
boolean _start = false, _stop = false;
long timeStart, timeEnd;
const double distance = 0.07;
void setup ( ) {
pinMode ( sensorPin1, INPUT );
pinMode ( sensorPin2, INPUT );
Serial.begin ( 9600 );
}
void loop ( ) {
int value1 = digitalRead ( sensorPin1 );
int value2 = digitalRead ( sensorPin2 );
if ( value1 == HIGH && _start == false && _stop == false && value2 == LOW ) {
_start = true;
timeStart = micros ( );
Serial.println ( "Start!" );
}
value1 = digitalRead ( sensorPin1 );
value2 = digitalRead ( sensorPin2 );
if ( value2 == HIGH && _start == true && _stop == false && value1 == LOW ) {
_stop = true;
timeEnd = micros ( );
Serial.println ( "Stop!" );
}
if ( _start == true && _stop == true ) {
Serial.print ( "Tempo trascorso: " );
Serial.print ( distance / ( ( (double)(timeEnd - timeStart) ) / 1000000 ) );
Serial.println ( " m/s" );
_start = false;
_stop = false;
}
delay ( 1 );
}
Ora vi chiedo, secondo voi è più veloce utilizzare la funzione loop come ho fatto in questo primo test per prendere i vari tempi, oppure sarebbe molto più ottimizzato usare una callback legata a un Interrupt, dato che utilizzo Arduino Uno e ho a disposizione 2 PIN di interrupt ?
Ciao e grazie