Lichtgesteuertes "Theremin" mit LDR

Durch eine Inspiration aus dem WWW (Quelle leider nicht mehr auffindbar) habe ich dieses "Musikinstrument" zusammengebaut und programmiert, welches Töne bzw. Klänge anhand des gerade einfallenden Lichts produziert.

Fotowiderstand LDR
Abb.: Fotowiderstand (LDR) der GL55xx-Serie

Verwendete Bauteile

Aufbau

Schaltplan des LDR-Theremins

Funktionsweise

Als lichtempfindlicher Sensor wird hier ein Fotowiderstand der GL55x-Serie (R2) verwendet. Wir bereit in LDR GL55xx beschrieben, wir der Sensor mit einem Spannungsteiler (mit R1) verbaut. Der Piezo wird auch wie zuvor beschrieben verschaltet; dieser soll später die Töne wiedergeben. Im Sketch wird die gemessenen Helligkeit eine minimale und eine maximale Ton-Frequenz zugeordnet (pitchMin und pitchMax). Diese Werte können jedoch mit zwei Trimm-Potentiometer (R3 und R4) noch zur Laufzeit verändert werden. Ein zusätzlicher Mikrotaster (S1) schaltet zwischen 4 verschiedenen Modi nacheinander durch: "kein Ton" » "fließende Töne" » "kurz abgehackte Töne" » "länger abgehackte Töne".
Beim Start des Programms wird zunächst ein 440Hz-Ton für 5 Sekunden ausgegeben. Während dieser Zeit wird der LDR kalibriert, d.h. der minimale und maximale Lichteinfall gemessen. Sobald der Kalibrierungsvorgang beendet ist, wird mit dem "kein Ton"-Modus gestartet und man hört erst Töne, sobald man den Taster betätigt hat.

Sketch

#define PIN_PIEZO    9
#define PIN_BUTTON   2
#define PIN_LDR      A0
#define PIN_POTI_MIN A1
#define PIN_POTI_MAX A2

#define CALIBRATION_DURATION 5 // in seconds

// Pitch definitions in Hz
#define PITCH_MIN_LOWER 25
#define PITCH_MIN_UPPER 170
#define PITCH_MAX_LOWER 200
#define PITCH_MAX_UPPER 1000

int sensorValue = 0, sensorMin = 1023, sensorMax = 0;
int pitchMin = PITCH_MIN_LOWER, pitchMax = PITCH_MAX_LOWER;
unsigned long lastPressedButton = 0;
byte buttonState = 0;

void setup()
{
    pinMode(PIN_PIEZO, OUTPUT);
    pinMode(PIN_BUTTON, INPUT_PULLUP);
    pinMode(PIN_POTI_MIN, INPUT);
    pinMode(PIN_POTI_MAX, INPUT);

    tone(PIN_PIEZO, 440);
    while (millis() < (CALIBRATION_DURATION * 1000)) {
        sensorValue = analogRead(PIN_LDR);
        sensorMax = max(sensorValue, sensorMax);
        sensorMin = min(sensorValue, sensorMin);
    }
    noTone(PIN_PIEZO);
}

void loop()
{
    if ((millis() - lastPressedButton > 250) && digitalRead(PIN_BUTTON) == LOW) {
        lastPressedButton = millis();
        buttonState++;
        buttonState %= 4;
    }

    pitchMin = PITCH_MIN_LOWER + map(analogRead(PIN_POTI_MIN), 0, 1023, 0, PITCH_MIN_UPPER);
    pitchMin = constrain(pitchMin, PITCH_MIN_LOWER, PITCH_MIN_UPPER);
    pitchMax = PITCH_MAX_LOWER + map(analogRead(PIN_POTI_MAX), 0, 1023, 0, PITCH_MAX_UPPER);
    pitchMax = constrain(pitchMax, PITCH_MAX_LOWER, PITCH_MAX_UPPER);

    if (buttonState > 0) {
        sensorValue = analogRead(PIN_LDR);

        // apply the calibration to the sensor reading
        sensorValue = map(sensorValue, sensorMin, sensorMax, pitchMin, pitchMax);

        // in case the sensor value is outside the range seen during calibration
        sensorValue = constrain(sensorValue, pitchMin, pitchMax);

        tone(PIN_PIEZO, sensorValue);

        if (buttonState == 2) {
            delay(60);
        } else if (buttonState == 3) {
            delay(150);
        }
    } else {
        noTone(PIN_PIEZO);
    }
}

Klang-Resultat

Das folgende (ziemlich chaotische) Klang-Beispiel stellt den obigen Aufbau angeschlossen an einen E-Gitarren-Verstärker vom Typ Line6 Spider IV 15. Dazu wurde der Piezo mit einer Klinkenbuchse ausgetauscht, damit die Verbindung zum Verstärker hergestellt werden konnte. Als zusätzliche Effekte wurden ein Verzerrer, Chorus und etwas Echo verwendet. Die sehr abgehackten Klänge werden mit einer Taschenlampe erzeugt. (aufgenommen wurde das Ganze mit einem Zoom H1 Handy Recorder)

Weiterführende Ideen

Denkbar wäre ein Aufbau von mehreren dieser LDR-Theremin in einem Raum, indem automatische Disko-Lichter installiert sind oder auch Menschen mit Lampen herumgehen und die Klänge beeinflussen können.

zurück