Lab 2 - Had some problems with this one (and LDRs in general), but I think I was using wrong resistors due to my colour blindness.

My idea was to create a sound art installation involving the ultrasonic Theremin proposed in my previous post, that I have since prototyped on a breadboard with a piezo and a quick attempt data smoothing (as I was getting weird spikes).
A motor would control a surface/obstacle that moves around the Theremin's ultrasonic field (apparently hard surfaces work better than soft), thus changing the sound - the obstacle's movement could be controlled by a delayed version of the ultrasonic readings (with a small element of randomness to avoid being potentially stuck in a repetitive loop). Mapping values to musical notes also an option.
Human interaction could be using a potentiometer (or several) to change things such as the wave shape / the speed of the motor, or potentially using IR control from a modified TV remote to effect parameters, such as speed, musical scale etc.
Planning to use wavetable synth library next and connect up to actual speakers to get a wider range of audio.
Code with smoothing:
const int pingPin = 7; // Trigger Pin of Ultrasonic Sensor
const int echoPin = 6; // Echo Pin of Ultrasonic Sensor
int sensorLow = 1023;
int sensorHigh = 0;
int sensorValue = 0;
const int numReadings = 10;
int readings[numReadings]; // the readings from the analog input
int readIndex = 0; // the index of the current reading
int total = 0; // the running total
int average = 0; // the average
int index = 0;
void setup()
{
Serial.begin(9600); // Starting Serial Terminal
for (int thisReading = 0; thisReading < numReadings; thisReading++)
{
readings[thisReading] = 0;
}
}
void loop()
{
long duration, cm;
pinMode(pingPin, OUTPUT);
digitalWrite(pingPin, LOW);
delayMicroseconds(2);
digitalWrite(pingPin, HIGH);
delayMicroseconds(10);
digitalWrite(pingPin, LOW);
pinMode(echoPin, INPUT);
duration = pulseIn(echoPin, HIGH);
cm = microsecondsToCentimeters(duration);
// Serial.print(cm);
//Serial.print("cm");
// Serial.println();
delay(1);
total = total + cm;
index = index + 1;
if (index >= numReadings)
{
index = 0;
average = total / numReadings;
Serial.print("Dist_avg = ");
Serial.print(average);
Serial.println("mm");
delay(1);
total = 0;
}
int pitch = average * 5;
tone(8,pitch,20);
delay(10);
delay(10);
}
long microsecondsToCentimeters(long microseconds)
{
return microseconds / 29 / 2;
}
コメント