Drehzahlmesser

Drehzahlmesser Arduino

Drehzahl mit einem Arduino messen.

Heute möchte ich euch kurz zeigen, wie Ihr euch recht simpel einen Drehzahlmesser bauen könnt.
Ich brauchte für ein Projekt von mir die Drehzahl eines Motor und damit konnte ich mir helfen. Hier im Bild ist der Testaufbau zu sehen.
Drehzahlmessung mit Arduino

Wie bin ich vorgegangen?

1. Aus einem Stück Pappe habe ich mir einen Scheibe ausgeschnitten.
2. Ein Stück am Rand rausgeschnitten, damit hier die Lichtschranke was zum Zählen hat.
3. Das Stück Pappe auf die Motorwelle geklebt.
4. Die Lichtschranke am Rand der Scheibe ausgerichtet, siehe Bild.

Beschaltung

Als Vorwiederstand für die Lichtschranke, wurde ein 200Ohm Widerstand verwendet, da die Diode mit 1.2 Volt arbeitet.
Drehzahlmesser Arduino

Funktionsweise

Hier der Aufbau der Lichtschranke:
Eine LED (links) sendet Licht an eine Fotodiode (rechts) und wenn die Scheibe sich dreht, entstehen hier immer dann wenn die Lücke kommt, ein Impuls den man mit dem Arduino auswerten (Zählen) kann.

Der Programmcode:

Die Bibliothek U8g2lib.h muss separat installiert werden, wie das geht seht Ihr hier.

#include <Arduino.h>
#include <U8g2lib.h>

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);

byte DZM_InputPin = 2;
volatile unsigned long RPM_T2, RPM_Count;
unsigned long RPM , RPM_T1;

void setup() {
  u8g2.begin();
  pinMode(DZM_InputPin, INPUT_PULLUP);
  RPM_T1 = 0;
  RPM_T2 = 0;
  RPM_Count = 0;

  attachInterrupt(0, RPM_Meter, FALLING);    // Interrupt0 wird bei fallender Flanke auf Pin2

}

void loop() {
  char RPMStr[5];
  u8g2.clearBuffer();         // löschen des Interen Speicher
  u8g2.setFont(u8g2_font_ncenB14_tr); // auswahl der Schriftart
  if (RPM_T2 > RPM_T1) {
    RPM = (unsigned)(long)(60000 * RPM_Count / (RPM_T2 - RPM_T1));
    RPM_T1 = RPM_T2;
    RPM_Count = 0;
  }
  else {
    RPM = 0;
  }
  sprintf(RPMStr, "%4u", RPM);

  u8g2.drawStr(0, 20, RPMStr); 
  u8g2.sendBuffer();
}

void RPM_Meter () {

  RPM_Count++;
  RPM_T2 = millis();

}

Folgende Bauteile wurde verwendet:

1x Arduino Uno http://amzn.to/2qOZfyl *
1x OLED 0.96 Zoll Display http://amzn.to/2qVJl3J *
1x Lichtschranke http://amzn.to/2rTxYbS *

13 Thoughts to “Drehzahlmesser”

  1. Christian

    Hallo, ich baue zur Zeit eine Gasstrahlturbine zusammen mit meinen Azubis und ich suche nach einer Möglichkeit die Drehzahl zu ermitteln.. bis zu welcher Drehzahl funktioniert dieses System? Wir erwarten Drehzahlen zwischen 30.000 rpm und 120000rpm. Danke im voraus

    1. Arduino Projekte

      Hallo,
      das ist eine Gute Frage. Leider kann ich es nicht genau sagen, da ich keinen Motor habe mit dem ich solche Drehzahlen Testen könnte.
      Gruß
      Tobias

  2. Manuel

    hi, kommt darauf an welchen Sensor du verwendest. Ich habe einen mit einer Einschaltzeit von 10us. Damit komme ich ca auf 100000 u/s <= also so viele Umdrehungen wären möglich. Korrigiert mich wenn ich falsch liege.
    LG Manuel

  3. […] frage kam auf, nachdem ich einen Drehzahlmesser für jemanden gebaut hatte und dieser ab einer bestimmten Drehzahl nicht mehr den Korrekten Wert […]

  4. Johannes Müller

    Sind Sie sicher dass das genau ist?

    RPM = (unsigned)(long)(60000 * RPM_Count / (RPM_T2 – RPM_T1));

    Ich erwarte von meinem Motor irgendwas um die 5000 Min-1 aber mit Ihrem Programm kommt mir immer um die 10000 raus. Es geht um ein Projekt an meiner Uni und wollte nur sicher gehen dass Ihr Code akkurat ist. Vielen Dank.

    1. Arduino Projekte

      Hallo Johannes, ja der Code sollte richtig sein, guck dir mal den Artikel an https://arduino-projekte.info/wie-viele-impulse-kann-ein-eingang-am-arduino-auswerten/ hier geht es auch um das Thema.

      Gruß
      Tobias

  5. Johannes Müller

    Danke für deine Antwort. Was muss ich am Code ändern wenn ich mehr Schlitze an meiner Scheibe habe? Wenn ich 2 Schlitze habe dann multipliziere ich mit 30.000 statt 60.000?

    1. Arduino Projekte

      Hallo Johannes,
      an dieser stelle. >>>>> Das X da trägst du ein wieviele Schlitze du hast also 2.
      void showRPM() {

      char RPMStr[5];
      u8g2.clearBuffer(); // löschen des Interen Speicher
      u8g2.setFont(u8g2_font_7Segments_26x42_mn); // auswahl der Schriftart
      if (RPM_T2 > RPM_T1) {
      RPM = (unsigned)(long)(60000 * RPM_Count / (RPM_T2 – RPM_T1));
      >>>> RPM=RPM/X;
      RPM_T1 = RPM_T2;
      RPM_Count = 0;

  6. Volker

    “Wer misst, misst Mist”

    Für Drehzahlen kleiner 60.000 U/min misst dieses Programm die Zeit zwischen zwei Impulsen in ms. Der Impuls kann am Anfang oder Ende der Millisekunde eintreten. Daraus ergibt sich eine Messungenauigkeit von 1 ms. Ab 6.000 U/min steigt die Messungenauigkeit somit über 10%.

    Für Drehzahlen größer 60.000 U/min zählt dieses Programm die Anzahl der Impulse in einer Millisekunde. Ab 600.000 U/min – wenn der Arduino das mitmacht – sinkt die Messungenauigkeit dann wieder unter 10%.

    Für meinen Drehzahlmesser habe ich das Programm auf micros() umgestellt, kämpfe dann aber mit ganz anderen Problemen. Ich muss das Ergebnis quasi “glätten” um es überhaupt ablesbar zu machen.

  7. Hari

    Führt folgendes nicht zum selben Ergebnis?
    if (RPM_T2 > RPM_T1) {
    RPM = (unsigned)(long)(60000 * 1 / (RPM_T2 – RPM_T1));
    RPM_T1 = RPM_T2;
    }

    RPM_Count kann doch immer nur 1 sein in diesem Programm (also in dem Fall wenn die Bedingung “RPM_T2 > RPM_T1” zutrifft.

    BG

  8. Sven

    Würde das nicht auch mit einem Laser und LDR funktionieren?

    1. Arduino Projekte

      Hallo Sven, ja das sollte auch funktionieren.

  9. Andi

    Hi all!
    Feine Sache!
    Aber eine Frage zur Änderung im Messaufbau.
    Kann anstelle des Schlitzes in der Scheibe genau das Gegenteil, also auch ein Zapfen verwendet werden? Beeinträchtigt das die Messgenauigkeit?
    Danke für die Hilfe und schönen Abend
    Andi

Leave a Comment