ton-hoehe-einstellen
Bauteil: EC11 Rotary Encoder · Kategorie: input
Kombiniert Drehen und Druck: am Knopf drehen aendert die Tonhoehe eines Dauertons (200..2000 Hz), auf den Knopf druecken schaltet den Ton an oder aus.
Material
| Anzahl | Bauteil |
|---|---|
| 1 | micro:bit V2.2 |
| 1 | Rotary Encoder EC11 (mit Push) |
| 1 | Steckbrett |
| 5 | Jumperkabel |
Verkabelung
Identisch zu drehen-und-druck:
P0 -> A (CLK) GND -> C (COM) P1 -> B (DT)
P2 -> SW 1 GND -> SW 2
Ton laeuft ueber den eingebauten Lautsprecher (pin=None), P0 bleibt frei.
CLK und DT (Pin A/B) sind vertauschbar - Details siehe
Bauteil-README. Falsch herum:
P0 und P1 tauschen.
Foto der Verkabelung
Nach dem Test ein Foto in wiring/ ablegen und hier einbinden:
Wie der Code funktioniert
| Teil | Aufgabe |
|---|---|
| Drehen | frequenz +/- 20 Hz pro Raste, begrenzt auf 200..2000 Hz |
| Druck (Flanke) | ton_an umschalten |
ton_aktualisieren() |
setzt den Dauerton neu (music.pitch(f, -1, pin=None, wait=False)) oder music.stop() |
Programm
Ganzer Code, Quelle main.py (hier automatisch eingefuegt):
# Sample: ton-hoehe-einstellen (EC11 Rotary Encoder mit Push)
# Board: BBC micro:bit V2.2
# Sprache: MicroPython
#
# Ziel: Drehen aendert die Tonhoehe eines Dauertons (200..2000 Hz).
# Auf den Knopf druecken -> Ton an / aus (Umschalter).
# Kombiniert Drehen + Druck aus den vorherigen Samples.
#
# --------------------------------------------------------------------------
# Verkabelung (EC11, Standard-Bauform) - wie "drehen-und-druck"
# --------------------------------------------------------------------------
# Pin A (CLK) -> P0 Pin C (COM) -> GND Pin B (DT) -> P1
# SW 1 -> P2 SW 2 -> GND
#
# Interne Pull-ups fuer P0, P1, P2 per Code.
# Pin A (CLK) und Pin B (DT) sind gleichwertig - vertauschen dreht nur die
# Richtung um (dann wird die Tonhoehe andersherum eingestellt).
# Ton laeuft ueber den eingebauten Lautsprecher (pin=None), P0 bleibt frei.
# --------------------------------------------------------------------------
from microbit import *
import music
pin0.set_pull(pin0.PULL_UP) # CLK
pin1.set_pull(pin1.PULL_UP) # DT
pin2.set_pull(pin2.PULL_UP) # SW
frequenz = 440 # Start-Tonhoehe in Hz
SCHRITT = 20 # Hz pro Raste
ton_an = False
letzter_clk = pin0.read_digital()
war_gedrueckt = False
def ton_aktualisieren():
# Ton neu setzen, wenn er an ist; sonst Stille.
if ton_an:
music.pitch(frequenz, -1, pin=None, wait=False)
else:
music.stop()
while True:
# ----- Drehen: Tonhoehe aendern -----
clk = pin0.read_digital()
if clk != letzter_clk and clk == 0:
if pin1.read_digital() == 1:
frequenz = frequenz + SCHRITT
else:
frequenz = frequenz - SCHRITT
frequenz = max(200, min(2000, frequenz))
print("Frequenz:", frequenz, "Hz")
ton_aktualisieren()
letzter_clk = clk
# ----- Druck: Ton an / aus -----
gedrueckt = (pin2.read_digital() == 0)
if gedrueckt and not war_gedrueckt:
ton_an = not ton_an
display.show(Image.MUSIC_QUAVER if ton_an else Image.NO)
sleep(150)
display.clear()
ton_aktualisieren()
war_gedrueckt = gedrueckt
sleep(1)
Auf den micro:bit uebertragen
https://python.microbit.org/v/3 -> Code einfuegen -> Connect -> Send to micro:bit. Details: ../../../../docs/setup.md.
Erwartetes Verhalten
- Knopf druecken -> Ton startet (Note-Symbol), nochmal druecken -> Ton aus (X-Symbol)
- Waehrend der Ton laeuft: drehen aendert hoerbar die Tonhoehe
Moegliche Erweiterungen
- Frequenz in eine Tonleiter “einrasten” (nur echte Noten)
- Zweiter Encoder fuer die Lautstaerke (
volume()) - Aktuelle Frequenz als Balken auf der LED-Matrix