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