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
| Anschluss | Motor | Aufgabe |
|---|---|---|
| S1 | 180°-Servo | Pendelarm schwingt im Takt |
| S2 | 180°-Servo | Hauptschlag-Impuls |
| S3 | 180°-Servo | Halbschlag-Impuls |
| S4 | 360°-Servo | Dreht im Grundtakt als zusätzliche Taktanzeige |
| S5 | 360°-Servo | Gegenläufig zu S4 |
| S6 | 180°-Servo | Zeigt grob das eingestellte Tempo an |
| STEPPER | Schrittmotor | Zählt volle Takte mechanisch mit |
| DC | DC-Motor | Leichte 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
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.
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.
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.
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.
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.
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.
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.