For this assignment, my point of departure was to experiment with creating a sense of range and tonality with the buzzer as opposed to producing singular notes. I feel that the easiest two options would have been to do so by linking the frequency (pitch) produced by the buzzer to either a light sensor or an ultrasonic sensor. As we’ve seen in class, light is very difficult to control, so I opted for the latter.
As the input taken from the ultrasonic sensor updates quickly and at small increments, the sound produced by the buzzer becomes interestingly distorted and non-standard. To me, it suited the aesthetic of a suspenseful scene in a Sci-Fi thriller film. This led me to consider adding a more mechanical sound to complement the buzzer and create an almost chaotic result. To do this, I incorporated the use of a servo motor which varies the BPM of its 180 degree movement based on the same input taken from the ultrasonic sensor.
Ultimately, I enjoyed this assignment as it acts as an example that ideas can come naturally through experimentation. One aspect I feel could be developed is the application of the servo itself as I could potentially vary the surfaces that it rotates on (as briefly shown in the video) to produce different results.
Below is the code, a video of the circuit with just the buzzer and a video of the complete circuit.
#include <Servo.h>
const int trigPin = 9;
const int echoPin = 10;
const int buzzerPin = 11;
const int servoPin = 6;
Servo servoMotor;
int servoAngle = 0;
unsigned long previousServoTime = 0;
unsigned long servoInterval = 0;
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(buzzerPin, OUTPUT);
servoMotor.attach(servoPin);
Serial.begin(9600);
}
void loop() {
// Send ultrasonic pulse
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Measure the time it takes for the pulse to return
long duration = pulseIn(echoPin, HIGH);
// Calculate distance in centimeters
float distance = duration * 0.034 / 2;
// Map distance to BPM (Beats Per Minute)
int bpm = map(distance, 0, 100, 100, 200);
// Move the servo motor back and forth
unsigned long currentMillis = millis();
if (currentMillis - previousServoTime >= servoInterval) {
servoMotor.write(servoAngle);
previousServoTime = currentMillis;
servoInterval = 60000 / bpm; // Convert BPM to interval in milliseconds
// Increment or decrement the servo angle
if (servoAngle == 0) {
servoAngle = 180;
} else {
servoAngle = 0;
}
}
// Output distance and BPM to the serial monitor
Serial.print("Distance: ");
Serial.print(distance);
Serial.print(" cm, BPM: ");
Serial.print(bpm);
Serial.println(" beats per minute");
// Generate buzzer tone based on frequency
int frequency = map(distance, 0, 100, 100, 500);
tone(buzzerPin, frequency);
}