Il se trouve que j'ai fait cette expérience exacte au cours du week-end - description détaillée ci-dessous. Fondamentalement, il s'agissait d'un pointeur laser, d'une photodiode, de deux résistances, d'un transistor et d'un Arduino. Réglez la minuterie Arduino pour qu'elle fonctionne à 10 kHz, et la sortie de la photodiode (dans l'entrée d'interruption de l'Arduino) déclenche une «lecture» de la minuterie. Lorsqu'au moins une seconde s'est écoulée, vous imprimez le rapport, réinitialisez les compteurs et recommencez. Fonctionne très bien sur une large plage de régime. Je l'ai en fait utilisé pour mesurer la rotation d'un spinner fidget - pour démontrer que le processus est non linéaire, ce qui prouve que la traînée de l'air joue un rôle.
Voici une image de la "configuration" (sur le bureau en désordre dans ma "tanière"):
Une simple boîte en carton contenait une diode photo à gauche (20 pièces pour \ 4,99 $ sur Amazon * ), et une petite diode laser à droite (10 pour \ 6,99 $ sur Amazon). Je pourrais tenir un spinner fidget rotatif dans le faisceau, et l'Arduino ferait le reste.
Et une trace de portée du signal: (un peu floue - l'échelle est de 20 ms par division, donc il y a environ 30 interruptions par seconde lorsque j'ai pris la photo)
De toute évidence, il est utile d'avoir une lunette pour régler correctement quelque chose comme ça - mais si vous avez un pointeur laser pointé vers votre photodiode et un moyen d'interrompre correctement le faisceau lorsque la roue tourne, vous avez tout à fait un beaucoup de marge de manœuvre.
MISE À JOUR
Voici le code Arduino que j'ai utilisé pour créer le compteur RPM:
// code pour créer un compteur RPM basé sur un faisceau optique interrompu
longue durée = 0; // temps depuis la dernière mesure
clics longs = 0; // interruptions optiques depuis la dernière mesure
temps total long = 0; // temps total écoulé depuis la réinitialisation
void setup() {
// configurer la broche 2 pour l'entrée:
pinMode (2, INPUT_PULLUP);
attachInterrupt (0, reportTime, FALLING);
// configuration de la minuterie:
cli (); // arrêter les interruptions
// règle l'interruption du timer1 à 10 kHz
TCCR1A = 0; // met tout le registre TCCR1A à 0
TCCR1B = 0; // idem pour TCCR1B
TCNT1 = 0; // initialise la valeur du compteur à 0;
// définir le compte de la minuterie pour des incréments de 10 kHz
OCR1A = 199; // = (16 * 10 ^ 6) / (10000 * 8) - 1
// activer le mode CTC
TCCR1B | = (1 << WGM12);
// Définit le bit CS11 pour 8 prescaler
TCCR1B | = (1 << CS11);
// activer la minuterie de comparaison d'interruption
TIMSK1 | = (1 << OCIE1A);
sei (); // autorise les interruptions
// FIN DE LA CONFIGURATION DE LA MINUTERIE
// activer le port série à 9600 bauds:
Serial.begin (9600);
}
boucle void () {
// rien ici - tout est interrompu
}
void reportTime () {
clics ++;
if (heure > 10000) {
// au moins une seconde complète s'est écoulée
totaltime + = temps;
Serial.print (temps total);
Serial.print ("\ t: \ t");
Serial.print (600000 * clics / float (temps));
Serial.write ("rpm \ r \ n");
temps = 0;
clics = 0;
}
}
ISR (TIMER1_COMPA_vect) {
// Interruption à une fréquence de 10 kHz
time ++;
}
Le schéma de circuit est super simple. J'ai connecté une alimentation 5 V au module de diode laser (qui a son propre régulateur de courant interne); il est possible qu'il puisse fonctionner avec l'Arduino 5 V (cela ne prend que 10 mA) mais je n'ai pas essayé cela. Le capteur optique a été fait avec ce circuit:
Lorsque la diode est allumée, le courant est partagé entre R1 et la base du transistor. Une fois que la tension aux bornes de R1 atteint 0,6 volts, le transistor «s'allumera» et tirera le courant du collecteur. Cela réduit le signal connecté à la broche 2 (en utilisant le pullup interne de l'Arduino). Lorsque le faisceau est interrompu, le courant est réduit et le transistor se bloque. Mettre "on" (tirer vers le bas) est beaucoup plus rapide que "off" avec ce circuit, donc nous déclenchons le front descendant. Vous pouvez rendre le circuit plus sensible en augmentant R1 - plus il est grand, plus le niveau de lumière nécessaire au déclenchement est petit. Mais il devient également plus sensible à la lumière ambiante et la réponse est plus lente. Avec la diode laser, j'ai trouvé que 420 Ohm était une bonne valeur: réponse rapide, insensible à la lumière ambiante. Mais c'est définitivement une valeur avec laquelle jouer.
J'ai testé le circuit à des fréquences allant jusqu'à 1 MHz (pilotant le laser avec un générateur de signal avec une onde carrée), et tout allait bien - le temps de réponse est donc bien inférieur à 1 us. Cela devrait le rendre assez rapide pour de nombreuses applications.
Un exemple d'utilisation de ceci pour mesurer le RPM d'un spinner fidget:
Il y a 3 interruptions par tour sur le spinner - et je n'ai aucun problème à mesurer 1200 tr / min (3600 interruptions par minute = 60 par seconde). En pilotant le laser avec un générateur de signaux, j'ai pu aller beaucoup plus vite ... jusqu'à 30 kHz. À ce stade, il y a un certain débordement dans le programme et les chiffres sont absurdes (je soupçonne que l'Arduino n'est pas assez rapide pour traiter 10000 interruptions d'horloge et 30000 interruptions optiques; certaines modifications de la mise à l'échelle peuvent étendre la plage, mais vous n'en aura pas besoin dans la plupart des cas).
En exécutant le laser à 1 kHz, je voyais 59988 tr / min - c'est évidemment "60 000" avec une erreur d'arrondi numérique (ou l'horloge sur l'Arduino n'est pas exactement 16 MHz, ou ...), donc c'est bien.Lorsque vous poussez le circuit trop fort, les interruptions se gênent mutuellement.La lecture "correcte" la plus élevée que j'ai obtenue était avec une entrée de 3 kHz, une sortie de 179904 tr / min.Cela devrait suffire pour la plupart des applications ... Même une roue de vélo (avec 32 rayons) faisant 100 tours par seconde (environ 2/3 de la vitesse du son) pourrait être chronométrée avec cela.Bien sûr, la roue se déchirerait bien avant d'atteindre cette vitesse ...
* Je ne suis pas affilié à Amazon ou aux sociétés fabriquant ces composants;je voulais juste vous faciliter la recherche de telles pièces