Drehzahlmesser mit Arduino bauen: RPM messen mit IR-Sensor, Interrupts & OLED-Anzeige

Auf dem N20-Getriebemotor steht 40 U/min. Unter Last sind es 27. Am Netzteil mit 5 V statt 3 V sind es 61. Welcher Wert stimmt? Der, den du misst. Ein Drehzahlmesser ist eines der lehrreichsten Arduino-Projekte überhaupt: Du lernst Interrupts, Entprellen, Zeitmessung und Mittelwertbildung an einem Aufbau, den du in zwanzig Minuten stehen hast. Und am Ende hast du ein Werkzeug, das dir bei jedem künftigen Motorprojekt echte Zahlen liefert statt Datenblatt-Versprechen.

Wie man eine Drehzahl überhaupt misst

Das Prinzip ist immer dasselbe: An der drehenden Welle sitzt eine Markierung, ein Sensor erkennt sie einmal pro Umdrehung, und der Mikrocontroller zählt die Impulse oder misst den Abstand zwischen zweien. Der Unterschied liegt nur im Sensor:

Verfahren Sensor Markierung Stärke / Schwäche
IR-Reflexion FC-51 weißer oder schwarzer Streifen auf der Welle berührungslos, sehr einfach / empfindlich gegen Fremdlicht
IR-Lichtschranke FC-51 quer zur Scheibe Schlitzscheibe oder Propellerblatt sehr sauberes Signal / Aufbau nötig
Optischer Encoder KY-040 / EC11 eingebaut, 20 Rastungen Richtung erkennbar / nur für langsame Wellen
Ultraschall / ToF VL53L0X Nocke an der Welle großer Abstand möglich / viel zu langsam für RPM

Für Maker-Projekte gewinnt der FC-51: kostet fast nichts, liefert ein sauberes Digitalsignal (kein Analogwert, den du selbst schwellen musst) und funktioniert bis in den Bereich von einigen tausend Umdrehungen pro Minute.

ℹ️ Die Grundformel: RPM = (Impulse / Impulse_pro_Umdrehung) × (60000 / Messdauer_in_ms). Wenn dein Rad in einer Sekunde 12 Impulse liefert und pro Umdrehung 2 Markierungen hat, sind das 6 Umdrehungen pro Sekunde oder 360 U/min. Der ganze Rest dieses Tutorials besteht darin, die Impulse zuverlässig zu zählen.

Das brauchst du

FC-51 IR-Hindernissensor – der eigentliche Impulsgeber, digital und schnell
Nano V3 (ATmega328, USB-C) oder UNO R3 – D2 und D3 sind hier echte Interrupt-Pins
0,96 Zoll OLED SSD1306 – Zahl, Balken und Verlauf auf einen Blick
N20 Getriebemotor 3V 40 U/min – langsam genug, um die Umdrehungen mitzählen zu können
130 Micro DC Motor (bis 20.000 U/min) – der Stresstest für die Messroutine
SG90 Servo 360 Grad – alternative Drehquelle mit einstellbarer Geschwindigkeit
Rotary Encoder KY-040 – zum Einstellen von Sollwert und Impulszahl
LM2596S Step-Down-Wandler – saubere Motorspannung, unabhängig vom USB-Port
3 mm LED-Sortiment – Impuls-Anzeige beim Justieren des Sensors

Dazu ein Streifen weißes Papier oder Klebeband für die Markierung – und schwarzer Edding für den Rest der Welle.

1Verkabelung

Bauteil Pin am Modul Nano / UNO Hinweis
FC-51 OUT D2 Interrupt 0 – zwingend D2 oder D3
FC-51 VCC / GND 5V / GND Modul arbeitet auch mit 3,3 V
OLED SSD1306 SDA / SCL A4 / A5 I2C, Adresse 0x3C
Rotary Encoder CLK / DT / SW D5 / D6 / D7 optional, für Sollwert
Impuls-LED Anode D8 über 220 Ω nach GND
Motor-PWM Gate / IN D9 PWM-Ausgang zur Regelung

⚠️ Nur D2 und D3 können auf Nano und UNO externe Interrupts. Hängst du den FC-51 an D4, liefert attachInterrupt(digitalPinToInterrupt(4), ...) stillschweigend gar nichts – der Sketch läuft, zählt aber nie. Auf einem ESP32 ist das anders: Dort kann fast jeder GPIO Interrupts, und die ISR muss zusätzlich mit IRAM_ATTR markiert werden.

Die Markierung anbringen

Der FC-51 erkennt Reflexion. Er meldet LOW, wenn viel Licht zurückkommt (helle Fläche nah), und HIGH bei dunkel oder weit weg. Praktisch heißt das:

  • Welle oder Radscheibe mit schwarzem Edding einfärben – mattes Schwarz reflektiert kaum.
  • Einen schmalen Streifen weißes Klebeband längs aufkleben. Ein Streifen = 1 Impuls pro Umdrehung.
  • Sensor auf 5 bis 15 mm Abstand bringen, senkrecht auf die Fläche.
  • Am blauen Poti drehen, bis die Modul-LED beim langsamen Vorbeidrehen sauber ein- und ausschaltet.

💡 Mehr Markierungen = feinere Auflösung bei niedrigen Drehzahlen. Bei 40 U/min und einem Streifen bekommst du nur alle 1,5 Sekunden einen Impuls – die Anzeige zuckt. Mit vier Streifen (kreuzförmig auf einer Scheibe) ist es alle 375 ms. Wichtig: IMPULSE_PRO_UMDREHUNG im Code entsprechend setzen, sonst zeigt der Tacho das Vierfache an.

2Erste Version: Impulse zählen

Der einfachste funktionierende Drehzahlmesser zählt Impulse in einem festen Zeitfenster. Robust, leicht zu verstehen, gut für mittlere und hohe Drehzahlen:

#define SENSOR_PIN   2
#define LED_PIN      8

const uint8_t  IMPULSE_PRO_UMDREHUNG = 1;
const uint16_t MESSFENSTER_MS        = 1000;

// volatile: wird in der ISR geaendert, der Compiler darf nichts wegoptimieren
volatile uint32_t impulsZaehler = 0;

unsigned long letzteAuswertung = 0;
float rpm = 0;

// Interrupt-Routine: so kurz wie irgend moeglich
void impulsErkannt() {
  impulsZaehler++;
}

void setup() {
  Serial.begin(115200);
  pinMode(SENSOR_PIN, INPUT_PULLUP);
  pinMode(LED_PIN, OUTPUT);

  // FALLING: nur die abfallende Flanke zaehlt -> ein Impuls pro Streifen
  attachInterrupt(digitalPinToInterrupt(SENSOR_PIN), impulsErkannt, FALLING);

  Serial.println(F("Drehzahlmesser bereit"));
}

void loop() {
  if (millis() - letzteAuswertung >= MESSFENSTER_MS) {
    letzteAuswertung = millis();

    // Zaehler atomar auslesen und zuruecksetzen:
    // ohne noInterrupts() koennte genau dazwischen ein Impuls verlorengehen
    noInterrupts();
    uint32_t impulse = impulsZaehler;
    impulsZaehler = 0;
    interrupts();

    rpm = (impulse / (float)IMPULSE_PRO_UMDREHUNG)
          * (60000.0 / MESSFENSTER_MS);

    Serial.print(F("Impulse: "));
    Serial.print(impulse);
    Serial.print(F("   RPM: "));
    Serial.println(rpm, 1);

    digitalWrite(LED_PIN, impulse > 0 ? HIGH : LOW);
  }
}

⚠️ volatile ist keine Formsache. Ohne dieses Schlüsselwort darf der Compiler annehmen, dass sich impulsZaehler zwischen zwei Zeilen nicht ändert – und den Wert in einem Register zwischenspeichern statt ihn neu zu lesen. Ergebnis: Die Anzeige bleibt bei null stehen, obwohl der Interrupt feuert. Ein Fehler, der beim Debuggen mit Serial.print oft verschwindet und deshalb besonders quaelend ist.

ℹ️ Warum noInterrupts() beim Auslesen? impulsZaehler ist 32 Bit breit, der ATmega rechnet aber in 8-Bit-Schritten. Das Kopieren dauert also vier Maschinenbefehle. Feuert der Interrupt genau dazwischen, liest du eine halb alte, halb neue Zahl – ein Wert, den es nie gab. Die drei Zeilen mit noInterrupts() kosten wenige Mikrosekunden und verhindern genau das. Mehr dazu im Artikel Arduino Interrupts verstehen.

3Zweite Version: Periodenmessung für langsame Wellen

Bei 40 U/min und einem Impuls pro Umdrehung zählt das Fenster-Verfahren pro Sekunde entweder 0 oder 1 Impuls – die Anzeige springt zwischen 0 und 60 U/min hin und her. Die Lösung: nicht Impulse pro Zeit zählen, sondern die Zeit zwischen zwei Impulsen messen. Das gibt selbst bei einer Umdrehung pro Minute noch einen brauchbaren Wert.

#define SENSOR_PIN   2

const uint8_t  IMPULSE_PRO_UMDREHUNG = 1;
const uint32_t ENTPRELL_US           = 2000;    // 2 ms Mindestabstand
const uint32_t TIMEOUT_MS            = 3000;    // danach gilt: steht still

volatile uint32_t letzteFlankeUs = 0;
volatile uint32_t periodeUs      = 0;
volatile bool     neuerWert      = false;

void impulsErkannt() {
  uint32_t jetzt = micros();
  uint32_t delta = jetzt - letzteFlankeUs;   // ueberlaufsicher

  // Prellen und Stoerimpulse ausfiltern
  if (delta < ENTPRELL_US) return;

  periodeUs      = delta;
  letzteFlankeUs = jetzt;
  neuerWert      = true;
}

float rpm = 0;
unsigned long letzteAnzeige = 0;

void setup() {
  Serial.begin(115200);
  pinMode(SENSOR_PIN, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(SENSOR_PIN), impulsErkannt, FALLING);
}

void loop() {
  // Neuen Messwert uebernehmen
  if (neuerWert) {
    noInterrupts();
    uint32_t p = periodeUs;
    neuerWert = false;
    interrupts();

    if (p > 0) {
      // 60 Sekunden = 60.000.000 Mikrosekunden
      float roh = 60000000.0 / ((float)p * IMPULSE_PRO_UMDREHUNG);

      // Exponentiell gleitender Mittelwert glaettet das Zittern
      rpm = (rpm == 0) ? roh : (rpm * 0.8 + roh * 0.2);
    }
  }

  // Stillstand erkennen: seit TIMEOUT_MS kein Impuls mehr
  noInterrupts();
  uint32_t alterMs = (micros() - letzteFlankeUs) / 1000UL;
  interrupts();

  if (alterMs > TIMEOUT_MS) rpm = 0;

  if (millis() - letzteAnzeige >= 250) {
    letzteAnzeige = millis();
    Serial.print(F("RPM: "));
    Serial.println(rpm, 1);
  }
}
Verfahren Gut bei Schwach bei Reaktionszeit
Impulse pro Zeitfenster hohen Drehzahlen (> 500 U/min) langsamen Wellen – Anzeige springt Fensterlänge, z. B. 1 s
Periodenmessung langsamen Wellen, N20-Getriebemotoren sehr hohen Drehzahlen – ISR-Last steigt eine Umdrehung
Beides kombiniert großem Drehzahlbereich etwas mehr Code adaptiv

💡 Der Faustwert für die Umschaltgrenze: Unter 600 U/min die Periodenmessung, darüber das Zeitfenster. Bei 600 U/min und einem Impuls liegen genau 100 ms zwischen zwei Flanken – kurz genug für eine flüssige Anzeige, lang genug, dass Jitter nicht durchschlägt. Wenn du beide Verfahren im selben Sketch hast, kannst du je nach aktuellem Wert automatisch umschalten.

4Anzeige auf dem OLED

Zahl allein reicht nicht – ein Balken zeigt auf einen Blick, ob der Motor schneller oder langsamer wird:

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

Adafruit_SSD1306 display(128, 64, &Wire, -1);

const uint16_t RPM_MAX = 300;    // Skalenendwert fuer den Balken

// Ringpuffer fuer den Verlauf: 64 Werte, ein Pixel pro Wert
uint8_t verlauf[64];
uint8_t verlaufIndex = 0;

void displayStarten() {
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("OLED nicht gefunden"));
    while (true) { delay(1000); }
  }
  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
  display.display();
}

void verlaufSchreiben(float wert) {
  uint16_t begrenzt = (uint16_t) constrain(wert, 0, RPM_MAX);
  verlauf[verlaufIndex] = map(begrenzt, 0, RPM_MAX, 0, 20);
  verlaufIndex = (verlaufIndex + 1) % 64;
}

void zeigeDrehzahl(float wert, uint32_t umdrehungenGesamt) {
  display.clearDisplay();

  // Grosse Zahl
  display.setTextSize(3);
  display.setCursor(0, 0);
  display.print((int) round(wert));

  display.setTextSize(1);
  display.setCursor(92, 14);
  display.print(F("U/min"));

  // Balken 0 bis RPM_MAX
  uint8_t breite = map((uint16_t) constrain(wert, 0, RPM_MAX),
                       0, RPM_MAX, 0, 126);
  display.drawRect(0, 28, 128, 10, SSD1306_WHITE);
  display.fillRect(1, 29, breite, 8, SSD1306_WHITE);

  // Verlaufskurve der letzten 64 Messungen
  for (uint8_t x = 0; x < 64; x++) {
    uint8_t i = (verlaufIndex + x) % 64;
    uint8_t h = verlauf[i];
    if (h > 0) display.drawFastVLine(x * 2, 62 - h, h, SSD1306_WHITE);
  }

  // Gesamtzahl der Umdrehungen rechts unten
  display.setCursor(74, 42);
  display.print(F("Ges: "));
  display.print(umdrehungenGesamt);

  display.display();
}

ℹ️ Das OLED nicht schneller als vier Mal pro Sekunde aktualisieren. Ein voller Bildaufbau schiebt 1024 Bytes über den I2C-Bus und dauert bei 400 kHz rund 25 ms. Bei zehn Aktualisierungen pro Sekunde ist ein Viertel deiner Rechenzeit weg – und die Anzeige flimmert nur mehr, statt lesbarer zu werden. 250 ms sind der gute Kompromiss. Wenn dir der Framebuffer zu viel RAM frisst, hilft der Artikel Arduino Speicher voll?.

5Vom Messen zum Regeln: konstante Drehzahl halten

Jetzt wird es interessant. Wenn du die Drehzahl kennst, kannst du sie auch halten – unabhängig von Last und Batteriespannung. Ein einfacher PI-Regler reicht dafür völlig:

#define MOTOR_PWM_PIN  9

float sollRpm = 120.0;
float istRpm  = 0.0;

// Reglerparameter - experimentell ermitteln
float kP = 0.35;      // Proportionalanteil: reagiert auf die aktuelle Abweichung
float kI = 0.08;      // Integralanteil: beseitigt die bleibende Restabweichung

float integral = 0.0;
uint8_t stellwert = 0;

unsigned long letzteRegelung = 0;
const uint16_t REGEL_INTERVALL_MS = 100;

void regele() {
  if (millis() - letzteRegelung < REGEL_INTERVALL_MS) return;

  float dt = (millis() - letzteRegelung) / 1000.0;
  letzteRegelung = millis();

  float fehler = sollRpm - istRpm;

  integral += fehler * dt;

  // Anti-Windup: Integral begrenzen, sonst laeuft er beim Blockieren voll
  integral = constrain(integral, -400.0, 400.0);

  float ausgang = kP * fehler + kI * integral;
  ausgang = constrain(ausgang, 0, 255);

  stellwert = (uint8_t) ausgang;
  analogWrite(MOTOR_PWM_PIN, stellwert);
}

void setup() {
  Serial.begin(115200);
  pinMode(MOTOR_PWM_PIN, OUTPUT);
  analogWrite(MOTOR_PWM_PIN, 0);

  pinMode(SENSOR_PIN, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(SENSOR_PIN), impulsErkannt, FALLING);

  letzteRegelung = millis();
}

void loop() {
  istRpm = aktuelleDrehzahl();   // aus Schritt 2 oder 3
  regele();

  static unsigned long letzteAusgabe = 0;
  if (millis() - letzteAusgabe >= 500) {
    letzteAusgabe = millis();
    Serial.print(F("Soll: "));  Serial.print(sollRpm, 0);
    Serial.print(F("  Ist: ")); Serial.print(istRpm, 0);
    Serial.print(F("  PWM: ")); Serial.println(stellwert);
  }
}

⚠️ Anti-Windup nicht weglassen. Hältst du den Motor mit dem Finger fest, bleibt der Fehler groß und das Integral wächst ungebremst weiter – auf Werte von mehreren tausend. Lässt du dann los, gibt der Regler minutenlang Vollgas, bis das Integral wieder abgebaut ist. Die eine Zeile constrain(integral, ...) verhindert genau dieses Überschwingen.

💡 So findest du kP und kI: Setze kI zuerst auf 0 und erhöhe kP, bis der Motor anfängt zu schwingen. Dann halbiere kP. Jetzt kI langsam erhöhen, bis die bleibende Abweichung zum Sollwert verschwindet – aber ohne dass das System wieder pendelt. Bei einem N20-Getriebemotor liegen typische Werte bei kP zwischen 0,2 und 0,6. Wie du den Motor überhaupt sauber ansteuerst, zeigt der Artikel DC-Motor & N20 Getriebemotor mit Arduino ansteuern.

6Hohe Drehzahlen: der 130er Motor als Stresstest

Ein 130 Micro DC Motor dreht bis 20.000 U/min. Bei einem Impuls pro Umdrehung sind das 333 Impulse pro Sekunde – alle 3 ms eine ISR. Das schafft der ATmega locker. Kritisch wird es erst bei mehreren Markierungen oder wenn du zusätzlich mit Reflexionen kämpfst.

// Fuer hohe Drehzahlen: Fenster kuerzen und ISR minimal halten
const uint16_t MESSFENSTER_MS = 200;    // 5 Aktualisierungen pro Sekunde

volatile uint16_t impulse16 = 0;        // 16 Bit reicht: max 65535 pro Fenster

void impulsErkannt() {
  impulse16++;                          // ein einziger Befehl in der ISR
}

float messeSchnell() {
  static unsigned long letzte = 0;
  static float wert = 0;

  if (millis() - letzte >= MESSFENSTER_MS) {
    letzte = millis();

    noInterrupts();
    uint16_t n = impulse16;
    impulse16 = 0;
    interrupts();

    float roh = (n / (float)IMPULSE_PRO_UMDREHUNG)
                * (60000.0 / MESSFENSTER_MS);

    // Bei hohen Drehzahlen staerker glaetten, sonst tanzt die Anzeige
    wert = wert * 0.7 + roh * 0.3;
  }
  return wert;
}

// Plausibilitaetspruefung: unrealistische Spruenge verwerfen
float pruefePlausibel(float neu, float alt) {
  const float MAX_SPRUNG = 3000.0;   // U/min pro Messintervall

  if (alt > 0 && fabs(neu - alt) > MAX_SPRUNG) {
    return alt;                      // Ausreisser ignorieren
  }
  return neu;
}

ℹ️ Grenze des FC-51: Das Modul arbeitet mit einem LM393-Komparator und schafft in der Praxis rund 1 bis 3 kHz Schaltfrequenz – das entspricht 60.000 bis 180.000 Impulsen pro Minute. Für fast jeden Hobbymotor reicht das. Wird es schneller, brauchst du eine echte Gabellichtschranke mit Schmitt-Trigger. Ein guter Test: Vergleiche deine Messung mit einer Handy-Zeitlupenaufnahme bei 240 fps – wenn beide übereinstimmen, misst du richtig.

Troubleshooting

⚠️ Die Anzeige zeigt konstant 0, obwohl sich alles dreht: Drei häufige Ursachen. Erstens: Sensor nicht an D2 oder D3. Zweitens: volatile beim Zähler vergessen. Drittens: Poti am FC-51 so eingestellt, dass die Modul-LED gar nicht mehr schaltet. Prüfe zuerst mit dem Auge, ob die LED auf dem Modul beim langsamen Drehen blinkt – tut sie das nicht, ist es kein Software-Problem.

⚠️ Die Drehzahl ist exakt doppelt oder dreifach so hoch wie erwartet: Entweder hast du mehr Markierungen angebracht als in IMPULSE_PRO_UMDREHUNG steht, oder du nutzt CHANGE statt FALLING als Interrupt-Modus – CHANGE feuert bei jeder Flanke, also zweimal pro Streifen.

⚠️ Werte springen wild, obwohl der Motor gleichmäßig läuft: Prellen an der Kante der Markierung. Erhöhe ENTPRELL_US schrittweise – aber nie über die kürzeste erwartete Periode. Bei 3000 U/min und einem Impuls liegen 20 ms zwischen zwei Flanken, da darf die Entprellzeit maximal 5 ms betragen.

⚠️ Die Messung stimmt drinnen, draußen zeigt sie Unsinn: Sonnenlicht enthält viel Infrarot und übersteuert den Empfänger. Baue eine Blende aus schwarzem Schrumpfschlauch um den Sensor oder verlege die Messung auf eine abgeschattete Stelle.

⚠️ Der Sketch hängt, sobald der Motor läuft: Klassische Rückwirkung über die Stromversorgung. Bürstenmotoren erzeugen kräftige Störimpulse. Trenne Motor- und Logikversorgung, setze einen 100 nF Keramikkondensator direkt an die Motorklemmen und einen 470 µF Elko an die 5V-Schiene. Ein LM2596S mit eigener Quelle für den Motor löst das Problem dauerhaft.

⚠️ Nach etwa 71 Minuten spinnt die Periodenmessung: micros() läuft nach 4.294.967.295 Mikrosekunden über – das sind rund 71,6 Minuten. Solange du mit jetzt - letzteFlanke auf vorzeichenlosen Variablen rechnest, ist das kein Problem. Rechne aber nie letzteFlanke + X < jetzt, das bricht genau dort.

⚠️ Auf dem ESP32 stürzt das Board beim ersten Impuls ab: Die ISR muss dort mit IRAM_ATTR deklariert sein: void IRAM_ATTR impulsErkannt() { ... }. Und keine Serial.print-Aufrufe in der ISR – das führt zuverlässig zum Guru-Meditation-Error.

Praxistipps

  • Erst die LED, dann der Code. Die kleine LED auf dem FC-51-Modul zeigt dir beim Justieren sofort, ob der Sensor die Markierung sieht. Wer das überspringt, sucht den Fehler danach stundenlang in der Software.
  • Markierung so groß wie nötig, so klein wie möglich. Ein 5 mm breiter Streifen wird bei hoher Drehzahl zu einem sehr kurzen Impuls. Bei schnellen Motoren lieber breiter kleben, bei langsamen schmaler für präzisere Flanken.
  • Immer gegen eine zweite Quelle prüfen. Filme die Welle mit dem Handy in Zeitlupe und zähle die Umdrehungen über fünf Sekunden. Stimmt das mit deiner Anzeige überein, kannst du dem Aufbau vertrauen.
  • Gesamtzähler mitlaufen lassen. Ein uint32_t mit allen bisherigen Umdrehungen macht aus dem Tacho nebenbei einen Betriebsstundenzähler – nützlich für Wartungsintervalle bei Pumpen und Lüftern.
  • ISR so kurz wie irgend möglich. Ein Inkrement, eine Zeitmessung – mehr nicht. Keine Serial.print, kein delay(), keine Display-Ausgabe. Alles andere gehört in die loop().
  • Messwerte protokollieren. Mit einem Micro-SD-Modul schreibst du die Drehzahl über Stunden mit und siehst Lastspitzen, die du live nie bemerkt hättest – siehe Arduino Datenlogger mit Micro-SD-Karte.
  • Auf dem ESP32 wird der Tacho drahtlos. Derselbe Aufbau schickt seine Werte per WebSocket ins Browser-Diagramm – dann brauchst du am Motor gar kein Display mehr.

🚀 Bauteile für deinen Drehzahlmesser

Fazit

Ein Drehzahlmesser ist ein kleines Projekt mit großem Lerneffekt: Interrupt-Routinen, volatile, atomares Auslesen, Entprellen, gleitende Mittelwerte und am Ende sogar ein echter Regelkreis – alles an einem Aufbau, der aus einem Sensor, einem Streifen Klebeband und einem Motor besteht.

Zwei Entscheidungen bestimmen das Ergebnis: Zeitfenster oder Periodenmessung – unter 600 U/min gewinnt fast immer die Periode. Und eine ISR, die nur zählt, sonst nichts. Wer diese beiden Punkte richtig macht, hat einen Tacho, der von der handgedrehten Kurbel bis zum 20.000-Touren-Motor dieselben verlässlichen Zahlen liefert. Und der nächste Motor im Regal wird nicht mehr nach Datenblatt gekauft, sondern nachgemessen.

Zurück zum Blog