Vorrei misurare la velocità delle ruote di una monoposto (prototipo).
Attualmente sono montati dei sensori di prossimità induttivi di tipo NPN.
La ruota fonica ha 30 fori.
Considerata una velocità massima di 100 km/h e un diametro di rotolamento di 0,5 m, mi aspetto una frequenza del segnale di circa 530 Hz.
Ho utilizzato il seguente codice:
const int pin = 2;
volatile byte rpmcount;
unsigned int rpm;
unsigned int v;
unsigned long timeold;
void contaImpulsi()
{
rpmcount++;
}
void setup() {
pinMode(pin, INPUT_PULLUP);
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(pin), contaImpulsi, FALLING);
rpmcount = 0;
rpm = 0;
timeold = 0;
}
void loop() {
delay(1000);
detachInterrupt(0);
rpm = (60/30)*1000/(millis() - timeold)*rpmcount;
v = ((rpm*6.28*0.25)/60)*3.6;
timeold = millis();
rpmcount = 0;
Serial.print(v);
attachInterrupt(0, contaImpulsi, FALLING);
}
Il delay l'ho messo per poter leggere il valore sul monitor seriale.
Il valore letto (ruota destra condotta) l'ho confrontato con quello visualizzato sul monitor di un sistema di acquisizione dati professionale (ruota sinistra condotta). I due valori paiono comparabili anche se per confrontarli sarebbe opportuno salvarli. Non ho idea di come farlo per i valori letti da arduino.
Quello che ho riscontrato è che a volte, tra una lettura e l'altra, con arduino si nota una variazione di velocità non congruente.
Esempio: a velocità costante in un istante il valore è 12 km/h, quello successivo 6 e quello dopo ancora 12. Potrebbe essere un problema di campionamento?
Non ho capito come si setta quest'ultimo per acquisire correttamente il segnale.
Ho letto che arduino ha una velocità di clock di 16 MHz e che ha tre timer. Che la funzione millis() è gestita col timer0 che è a 8 bit e che ci sono dei registri nei quali sono settati dei prescaler. Dopo aver letto diverse discussioni ho ancora le idee confuse.
millis() - timeold dovrebbe darmi già un'idea del tempo intercorso tra due esecuzioni consecutive delle istruzioni nel blocco loop. E' corretto?