Ho fatto questo esperimento esatto durante il fine settimana - descrizione dettagliata di seguito. Fondamentalmente ha coinvolto un puntatore laser, un fotodiodo, due resistenze, un transistor e un Arduino. Imposta il timer di Arduino per funzionare a 10 kHz, e l'uscita del fotodiodo (nell'ingresso di interrupt di Arduino) innesca una "lettura" del timer. Quando è trascorso almeno un secondo, si stampa il rapporto, si azzerano i contatori e si ricomincia. Funziona davvero bene su un'ampia gamma di RPM. In realtà l'ho usato per misurare lo spindown di un fidget spinner, per dimostrare che il processo non è lineare, il che dimostra che la resistenza dell'aria gioca un ruolo.
Ecco una foto del "setup" (sulla scrivania disordinata nella mia "tana"):
Una semplice scatola di cartone conteneva un fotodiodo a sinistra (20 pezzi per \ $ 4,99 su Amazon * ) e un piccolo diodo laser a destra (10 per \ $ 6,99 su Amazon). Potrei tenere uno spinner rotante nel raggio e Arduino farebbe il resto.
E una traccia dell'oscilloscopio del segnale: (un po 'sfocata - la scala è di 20 ms per divisione, quindi ci sono circa 30 interruzioni al secondo mentre ho scattato la foto)
Ovviamente è utile avere un mirino per impostare correttamente qualcosa del genere, ma se hai un puntatore laser puntato verso il tuo fotodiodo e un modo per interrompere correttamente il raggio mentre la ruota gira, hai un bel molto margine di manovra.
AGGIORNAMENTO
Ecco il codice Arduino che ho usato per creare il misuratore RPM:
// codice per creare un misuratore RPM basato su un raggio ottico interrotto
tempo lungo = 0; // tempo dall'ultima misurazione
clic lunghi = 0; // interruzioni ottiche dall'ultima misurazione
tempo totale lungo = 0; // tempo totale trascorso dal ripristino
void setup () {
// configura il pin 2 per l'ingresso:
pinMode (2, INPUT_PULLUP);
attachInterrupt (0, reportTime, FALLING);
// setup timer:
cli (); // ferma gli interrupt
// imposta l'interrupt del timer1 a 10 kHz
TCCR1A = 0; // imposta l'intero registro TCCR1A a 0
TCCR1B = 0; // lo stesso per TCCR1B
TCNT1 = 0; // inizializza il valore del contatore a 0;
// imposta il conteggio del timer per incrementi di 10 khz
OCR1A = 199; // = (16 * 10 ^ 6) / (10000 * 8) - 1
// attiva la modalità CTC
TCCR1B | = (1 << WGM12);
// Imposta bit CS11 per 8 prescaler
TCCR1B | = (1 << CS11);
// abilita l'interrupt di confronto del timer
TIMSK1 | = (1 << OCIE1A);
sei (); // consenti interruzioni
// FINE IMPOSTAZIONE TIMER
// attiva la porta seriale a 9600 baud:
Serial.begin (9600);
}
void loop () {
// niente qui - tutto è interrotto
}
void reportTime () {
click ++;
if (time > 10000) {
// è trascorso almeno un secondo intero
totaltime + = tempo;
Serial.print (totaltime);
Serial.print ("\ t: \ t");
Serial.print (600000 * click / float (time));
Serial.write ("rpm \ r \ n");
tempo = 0;
clic = 0;
}
}
ISR (TIMER1_COMPA_vect) {
// Interrompi alla frequenza di 10 kHz
time ++;
}
Lo schema del circuito è semplicissimo. Ho collegato un'alimentazione a 5 V al modulo del diodo laser (che ha il proprio regolatore di corrente interno); è possibile che possa funzionare con Arduino 5 V (ci vogliono solo 10 mA) ma non l'ho provato. Il pickup ottico è stato realizzato con questo circuito:
Quando il diodo è illuminato, la corrente viene suddivisa tra R1 e la base del transistor. Una volta che la tensione su R1 raggiunge 0,6 volt, il transistor si "accenderà" e trarrà corrente dal collettore. Questo abbassa il segnale che è collegato al pin 2 (utilizzando il pullup interno di Arduino). Quando il raggio viene interrotto, la corrente viene ridotta e il transistor si spegne. Attivare "on" (tirare verso il basso) è molto più veloce che "disattivare" con questo circuito, quindi attiviamo il fronte di discesa. Puoi rendere il circuito più sensibile aumentando R1: più è grande, minore è il livello di luce necessario per l'attivazione. Ma diventa anche più sensibile alla luce ambientale e la risposta è più lenta. Con il diodo laser, ho scoperto che 420 Ohm era un buon valore: risposta rapida, insensibile alla luce ambientale. Ma questo è sicuramente un valore con cui giocare.
Ho testato il circuito a frequenze fino a 1 MHz (pilotando il laser con un generatore di segnali con un'onda quadra), ed è andato tutto bene, quindi il tempo di risposta è ben al di sotto di 1 us. Questo dovrebbe renderlo abbastanza veloce per molte applicazioni.
Un esempio di utilizzo di questo per misurare l'RPM di un fidget spinner:
Ci sono 3 interruzioni per giro sullo spinner e non ho problemi a misurare 1200 giri / min (3600 interruzioni al minuto = 60 al secondo). Guidando il laser con un generatore di segnali, sono stato in grado di andare molto più veloce ... fino a 30 kHz. A quel punto, c'è un po 'di overflow nel programma ei numeri non hanno senso (sospetto che Arduino non sia abbastanza veloce da gestire 10.000 interruzioni di clock e 30.000 interruzioni ottiche; alcune modifiche al ridimensionamento potrebbero estendere l'intervallo, ma tu non ne avrà bisogno per la maggior parte degli scopi).
Facendo funzionare il laser a 1 kHz, vedevo 59988 rpm - che ovviamente è "60.000" con qualche errore di arrotondamento numerico (o l'orologio di Arduino non è esattamente 16 MHz, o ...), quindi va bene.Quando spingi troppo il circuito, le interruzioni si ostacoleranno a vicenda.La lettura "corretta" più alta che ho ottenuto è stata con 3 kHz in ingresso, 179904 rpm in uscita.Dovrebbe essere abbastanza buono per la maggior parte delle applicazioni ... Anche una ruota di bicicletta (con 32 raggi) che fa 100 giri al secondo (circa 2/3 della velocità del suono) potrebbe essere cronometrata con questo.Ovviamente la ruota si spezzerebbe molto prima di raggiungere quella velocità ...
* Non sono affiliato con Amazon o le società che producono questi componenti;volevo solo aiutarti a trovare queste parti