MODE 6 — METRONOM

Easy · 30 min · Fast kostenlos

Ziel & Anwendung

Ein mechanisches Metronom aus Servo und Karton: S1 schwingt als Pendel im einstellbaren Tempo (20–240 BPM), S2 gibt den Hauptschlag als kurzen Impuls, S3 markiert den Halbschlag. Der Encoder stellt das Tempo, der DC-Motor surrt taktgenau mit — perfekt zum Üben von Rhythmusgefühl.

  • Millis-basierten BPM-Generator mit Encoder (20–240 BPM) aufbauen.
  • S1 als Sinus-Pendel implementieren das genau im Takt schwingt.
  • S2 Hauptschlag-Impuls (30 ms) und S3 Halbschlag synchron mit BPM triggern.

Anschluss & Funktion

Motoren am Board

AnschlussMotorAufgabe
S1180°-ServoPendelarm schwingt im Takt
S2180°-ServoHauptschlag-Impuls
S3180°-ServoHalbschlag-Impuls
S4360°-ServoDreht im Grundtakt als zusätzliche Taktanzeige
S5360°-ServoGegenläufig zu S4
S6180°-ServoZeigt grob das eingestellte Tempo an
STEPPERSchrittmotorZählt volle Takte mechanisch mit
DCDC-MotorLeichte Vibration im Takt

Materialliste

  • Kartonstreifen ca. 12 × 1,5 cm als Pendelzeiger
  • Kleiner Gewichts-Punkt (Münze oder Büroklammer) am Zeigerende für Trägheitseffekt
  • Stabiler Karton-Sockel ca. 15 × 10 cm als Basis
  • Filzstift für Takt-Markierungen (links/Mitte/rechts)
  • Klebeband und Heißkleber

Step-by-Step Tutorial

  1. Pendel-Mechanik aufbauen

    Stabiler Karton-Sockel (15 × 10 cm). S1 senkrecht montiert mit Plastik-Horn. Karton-Zeiger (12 × 1,5 cm) auf Horn kleben. Gewichtspunkt (Münze, Büroklammer) am Ende ankleben — Sinus-Schwingung von S1 wirkt natürlicher. Takt-Markierungen links/Mitte/rechts auf Sockel.

    Check: S1 schwingt gleichmäßig hin und her. Pendelzeiger dreht frei ohne Klemmen.

    Tipp: Pendel-Arm maximal 12 cm — bei längerem Arm Gegengewicht oder Gummiband-Unterstützung nötig. Büroklammer am Zeigerende erhöht den Trägheitseffekt optisch.

  2. BPM per Encoder einstellen

    Encoder drehen: bpm zwischen 20 und 240 einstellen. Display zeigt 'BPM: 120'. S1 Sinusformel: 1500 + sin(millis() × 0.001 × bpm / 60 × π) × 400. Pendel-Ausschlag ±400 µs = voller Servo-Hub.

    Check: Encoder-Drehung ändert BPM (20–240). Display zeigt BPM. Pendel schwenkt schneller/langsamer.

    Tipp: Jeder Encoder-Klick = ±2 BPM. Bei 120 BPM: Pendel macht 2 Ausschläge pro Sekunde. Bei 60 BPM: 1 Ausschlag pro Sekunde.

  3. Hauptschlag S2 und Halbschlag S3 montieren

    S2 (Hauptschlag) mit kleinem Fähnchen auf Horn. Beim Takt: 30 ms auf 2000 µs, dann zurück auf 1500 µs — kurzer mechanischer Klick. S3 (Halbschlag) daneben: selbe Logik, aber bei halber Takt-Periode. DC-Motor surrt taktgenau: setMotorspeed(60) für 30 ms beim Hauptschlag.

    Check: S2 gibt bei jedem Takt kurzen 30 ms Ausschlag auf 2000 µs. S3 beim Halbschlag.

    Tipp: onBeat: millis() % beatMs < 30. halfBeat: millis() % (beatMs/2) < 30. beatMs = 60000/bpm.

  4. Leichtgängigkeits-Test ohne Strom

    S1 von Hand langsam von 1100 bis 1900 µs durchschwingen: kein Klemmen? Abstand zum Sockel prüfen. S2 und S3 von Hand klappen: frei? S4/S5-Rädchen und Stepper-Zähler ebenfalls prüfen. DC-Motor-Welle frei drehbar? Erst dann einschalten.

    Check: S1 Pendel dreht komplett frei. S2 und S3 Fähnchen klappen ohne Blockade.

    Tipp: Besonders S1 prüfen: Pendel-Arm darf nicht am Sockel schaben. Seitenabstand mindestens 2 cm.

  5. MODE 6 aktivieren — Metronom läuft

    Timer → MODE 6. Encoder auf 120 BPM. Pendel schwingt, S2 tickt, Buzzer klickt. DC-Motor surrt mit. Encoder schneller drehen: Pendel beschleunigt. Langsamer: Pendel verlangsamt. Perfekt zum Üben: Klatschen oder Trommeln zum Takt.

    Check: Pendel schwingt gleichmäßig. S2 tickt sichtbar. Buzzer tickt mit. DC-Motor surrt beim Schlag.

    Tipp: Bei 120 BPM: genau 2 Ticks pro Sekunde. Encoder langsam drehen und beobachten wie sich Pendel-Tempo ändert.

  6. Fein-Tuning: Amplitude und Buzzer-Lautstärke

    Code-Parameter anpassen: sin()-Amplitude (400 µs = voller Hub, 300 µs = ruhigeres Pendel). Buzzer.setValue(80) für 30 ms bei jedem Hauptschlag. Display zeigt BPM und 'Beat' als blinkende Anzeige.

    Check: Pendel-Ausschlag stimmt mit der Skala überein. Buzzer-Tick klar hörbar.

    Tipp: Wenn Pendel zu weit ausschlägt: sin()-Faktor von 400 auf 300 reduzieren. Buzzer-Wert für Tick: Buzzer.setValue(80) für kurze 30 ms.

  7. S4/S5-Taktrad und Stepper-Taktzähler ergänzen

    S4 und S5 mit kleinen Papprädchen bestücken: beide drehen bei jedem Hauptschlag kurz gegenläufig an. S6 (kleine Klappe) zeigt grob den eingestellten Tempobereich. Der Stepper rückt bei jedem vollen Takt ein kleines Stück weiter — ein mechanischer Taktzähler neben dem Pendel.

    Check: S4 und S5 drehen gegenläufig kurz an, sobald der Hauptschlag kommt. Stepper-Zeiger rückt bei jedem vollen Takt ein Stück weiter.

    Tipp: Kleine Papprädchen auf S4/S5 genügen — der kurze Gegendreh-Kick wirkt wie ein zusätzlicher visueller Taktgeber neben dem Pendel.

Troubleshooting

  • Pendel schwingt ungleichmäßig — mal schneller, mal langsamer — Servo-Geschwindigkeit kann bei großen Pulsänderungen ruckeln. sin()-Formel erzeugt fließende Werte. Wenn Ruckeln: Pendel-Arm kürzen (weniger Trägheit). Servo braucht Zeit für große Ausschläge.
  • S2 und S3 ticken nicht synchron mit BPM — millis() % beatMs: beatMs muss als uint32_t berechnet werden (kein float-Modulo). Bei float-Division entsteht Rundungsfehler. beatMs = (uint32_t)(60000.0f / bpm) sichert Ganzzahl-Modulo.

Modifikationen & Sicherheit

  • Pro-Tipp: BPM im EEPROM speichern — Metronom startet nach Neustart mit letzter Einstellung.
  • Erweiterung: JoystickButton als Tap-Tempo — BPM aus Tipp-Intervall berechnen statt Encoder.
  • Sicherheit: Servo nicht dauerhaft mit hoher Frequenz betreiben (>180 BPM) — nach 10 Minuten kurze Pause, Servo kann sich erwärmen.

Wichtige Code-Teile

// BPM per Encoder einstellen
bpm = constrain(bpm + EncoderPos * 2.0f, 20.0f, 240.0f);
EncoderPos = 0;
float beatMs = 60000.0f / bpm;
// S1: Sinus-Pendel
servocontroller.setServoPulse(1, 1500 + (int)(sin(millis() * 0.001f * bpm / 60.0f * PI) * 400));
// S2: Hauptschlag (30 ms Impuls)
bool onBeat = ((uint32_t)millis() % (uint32_t)beatMs) < 30;
servocontroller.setServoPulse(2, onBeat ? 2000 : 1500);
// S3: Halbschlag
bool halfBeat = ((uint32_t)millis() % (uint32_t)(beatMs / 2)) < 30;
servocontroller.setServoPulse(3, halfBeat ? 2000 : 1500);
// DC und Buzzer im Takt
if(onBeat) { setMotorspeed(60); Buzzer.setValue(80); }
else        { setMotorspeed(0);  Buzzer.setValue(0);  }
// S4/S5: Taktrad, S6: Tempo-Anzeige
servocontroller.setServoPulse(4, onBeat ? 1700 : 1500);
servocontroller.setServoPulse(5, onBeat ? 1300 : 1500);
servocontroller.setServoPulse(6, map((int)bpm, 20, 240, 1000, 2000));
// Stepper: zählt volle Takte
if(onBeat && !lastOnBeat) stepper.move(5);

Ähnliche Projekte

  • MODE 5 — COUNTER — Ein mechanischer Ereigniszähler: PIR-Sensor und kapazitiver Touch zählen jede Bewegung oder Berührung. S1 zeigt den Fortschritt als Zeiger, S2 klappt als Zielflagge aus wenn der einstellbare Zielwert erreicht ist. Perfekt als Fitness-Wiederholungszähler oder automatische Besucher-Zählung.
  • MODE 2 — STOPWATCH — Eine analoge Stoppuhr mit drei Servo-Zeigern: S1 zeigt Sekunden (0–60 s zyklisch), S2 Minuten (0–60 min) und S3 die gespeicherte Rundenzeit. JoystickButton startet/stoppt, EncoderButton speichert die Runden-Zeit. touch1 und touch2 gleichzeitig: Gesamt-Reset auf 0. Unbegrenzte Laufzeit.
  • MODE 9 — WORK/REST — Ein mechanischer Kurz-Pomodoro-Timer: S1 zeigt den Arbeitsphase-Fortschritt, S2 die Pause-Phase. Arbeitszeit (bis zu 2 Minuten) und Pausenzeit (bis zu 1 Minute) werden separat per Encoder und Touch eingestellt — DC-Motor läuft nur in der Arbeitsphase, BREATHING-Buzzer in der Pause für ruhiges Atemrhythmus-Signal.