For my temporal demonstration, I created an arduino circuit that uses the input from a sonar sensor to modulate the frequency of a tone as well as the speed at which the tone is beeping. It augments human perception of time by allowing changes in distance to be heard as changes in pitch and rhythm. The basic idea for the demo was a proximity alarm that speeds up and increases in pitch as the object gets closer to the sensor.
References:
Technical Exercise Sequence: Read Sonar
Technical Exercise Sequence: Event Loop Programming
Code:
// pin assignments
const int speaker1 = 4;
const int speaker2 = 5;
const int Trigger = 8;
const int Echo = 7;
// The rated distance limit of the sensor, in cm.
const int MAX_DISTANCE = 450;
// A typical speed of sound, specified in cm/sec.
const long SOUND_SPEED = 34000;
const long Timing = (2 * MAX_DISTANCE * 1000000)/SOUND_SPEED;
void setup()
{
// Initialize speaker pins as outputs
pinMode( speaker1, OUTPUT );
pinMode( speaker2, OUTPUT );
// Initialize the trigger pin for output.
pinMode(Trigger, OUTPUT);
digitalWrite(Trigger, LOW);
// Initialize the echo pin for input.
pinMode(Echo, INPUT);
}
// Global variables.
long inputValue = 0;
long input_interval = 1000;
long nextTime_input = 0;
long nextTime1 = 0; // timestamp in microseconds for when next to update speaker1
long nextTime2 = 0; // timestamp in microseconds for when next to update speaker2
long restTime = 0; // timestamp in microseconds for when to rest
int state1 = LOW;
int state2 = LOW; // start both outputs at LOW
void loop()
{
// read the current time in microseconds
long now = micros();
if (now > nextTime_input) {
// reset timer
nextTime_input = now + input_interval;
// set inputValue to (duration of ping)*2
inputValue = ping_sonar()*2;
}
// resting interval to make the speaker beep
if (now > restTime) {
digitalWrite( speaker1, LOW);
digitalWrite( speaker2, LOW);
restTime = now + (inputValue*50); // scaled by 50 to make beeping interval slower than the pitch modulation interval
delay(10); // delay to make it possible to hear the beeping
}
else {
if (now > nextTime1) {
// reset timer
nextTime1 = now + inputValue;
// toggle the state1 variable
state1 = !state1;
// update the state of speaker1
digitalWrite( speaker1, state1 );
}
if (now > nextTime2) {
// reset timer
nextTime2 = now + inputValue;
// toggle the state2 variable
state2 = !state2;
// update the state of speaker2
digitalWrite( speaker2, state2 );
}
}
}
// ping_sonar function returns the time it takes for a ping to bounce back
long ping_sonar(void)
{
// Generate a short trigger pulse.
digitalWrite(Trigger, HIGH);
delayMicroseconds(10);
digitalWrite(Trigger, LOW);
// Measure the pulse length
return pulseIn(Echo, HIGH, Timing);
}
Leave a Reply
You must be logged in to post a comment.