sitemap link mailform link home

Drehzahlmesser

Beitrag vom 17.12.2019

Eigentlich gehört dieses kleine Projekt ja in die Arduino-"Ecke". Aber ich finde, es ist mehr als ein Arduino-Experiment. Man kann das Ganze natürlich auch in ein Gehäuse einbauen und dann sehr elegant Drehzahlen messen.

Drehzahlmessung

Der Auslöser zu dieser kleinen "Entwicklung" war Folgendes:
Mir ist vor ein paar Tagen aufgefallen, dass Johson-Kleinmotore aus einer einzigen Charge manchmal unterschiedlich schnell laufen. Das wollte ich gerne mal messtechnisch abklären.

Dazu benötigt man lediglich einen Arduino UNO, ein LC-Display und einen Reflexkoppler.
Ein Reflexkoppler besteht aus einer Infrarot-Leuchtdiode (Lichtsender) und einem Fototransistor (Lichtempfänger).

Verwendung findet ein Reflexkoppler vom Typ CNY70. Dieser hat eine Wirkweite von ca. 5 mm.

CNY70  CNY70

Abbildung: Anschlüsse des Reflexkopplers CNY 70

Auf den zu messenden Motor stecke ich ein Holzklötzchen mit einem passenden Loch für die Motorwelle. Vorne auf das Hölzchen kommt ein schwarz-weiß bedrucktes Papier.

Motor  Motor

Durch die Rotation des Holzklötzchens wechselt bei jeder Umdrehung schwarz und weiß und erzeugt elektrische Impulse im Fototransistor des Reflexkopplers. Diese Impulse müssen nun gezählt werden...

     Motor

Eine kleine runde Scheibe wäre sicher schöner... also hier die Quick-and-dirty-Methode. Kiss 

 

Schaltplan fritzing

Abbildung: Schaltplan mit Arduino UNO, LC-Display und Reflexkoppler

Der Emitter des Fototransistors (2) ist direkt mit Pin 2 des Arduino verbunden. Ein 10kΩ-Widerstand muss aber zusätzlich von Pin 2 nach GND verbunden werden. Ansonsten wird kein "echter" LOW-Pegel bei Schwarz erreicht.

Der Anodenanschluss der IR-LED (3) und der Kollektor des Fototransistors (1) werden direkt mit +5 V verbunden. Der Kathodenanschluss der IR-LED (4) wird über einen 2,2kΩ-Widerstand mit GND verbunden.

Bei der Rotation wechselt nun fortlaufend Schwarz und Weiß und es entstehen 2 Impulse pro Umdrehung.

Der Arduino-Sketch zählt nun diese Impulse exakt eine Sekunde LANG -> (delay(1000))

Das eigentliche Zählen geschieht in einer ISR (interrupt service routine), die auch während des Delays unbehelligt weiter läuft. Der Fototransistor (Emitter) des Reflexkopplers liegt hier an Pin 2. Als Interrupt-Pins beim Arduino UNO gibt es nur Pin 2 und Pin 3.

Das Ergebnis der Zählung wird dann in Umdrehungen pro Minute auf dem LC-Display ausgegeben. Deshalb die folgende Umrechnung: varImpulsZaehler*60/2.
Die Division durch 2 ist erforderlich, da eine Umdrehung der Scheibe 2 ISR-Impulse auslöst.
Ich hätte also auch gleich varImpulsZaehler*30 schreiben können - aber so sind die 60 Sekunden im Skletch besser erkennbar.

Arduino-Sketch:

// Drehzahlmesser für SPURT-Motoren
// Version 2: Erkennung der Zählimpulse via Interrupt
// Quelle: https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/

// Kollektor des Fototransistors liegt direkt an +5V
// An PIN 7: Emitter des Fototransistors + Pulldown 10kOhm gegen GND
#define LIGHT_IN 7
#define LEDPIN 13
#define INTERRUPT_PIN 2 // nur Pin 2 und 3 sind Interrupt-Pins beim Arduino UNO
#define ZAEHLDAUER 1000 // in Millisekunden

// include the library code:
#include <LiquidCrystal.h>

// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 6;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

// Globale Variablen für die Impulsmessung
volatile int varImpulsZaehler = 0;
volatile byte state = LOW; // Globale Variable

void setup() {
  pinMode(LEDPIN, OUTPUT);
  pinMode(INTERRUPT_PIN, INPUT);
  attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), count, CHANGE);
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("Drehzahlmesser");
  delay(500);
}

void loop() {
  lcd.setCursor(0, 1); // X = Position 0; Y = Zeile2
  lcd.print("Drehzahl = ");
  delay(ZAEHLDAUER);
  int varAnzeigeWert=varImpulsZaehler*60/2; // Umrechnen in U/min
  if (varAnzeigeWert < 1000) lcd.print(" ");
  if (varAnzeigeWert < 100) lcd.print(" ");
  if (varAnzeigeWert < 10) lcd.print(" ");
  lcd.print(varAnzeigeWert);
  varImpulsZaehler=0;
}

void count() {
  varImpulsZaehler++;
  state = !state;
  digitalWrite(LEDPIN, state);
}

.

Letzte Änderung:
November 25. 2020 17:01:17
«    top    »