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.
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.
#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);
}
}
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)
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