Concept
The Digital Piano with Distance-Sensing Percussions is an innovative musical instrument that blends traditional piano elements with modern sensor technology to create a unique and interactive musical experience. This project utilizes an array of digital push buttons connected to an Arduino board to simulate a piano keyboard, where each button triggers a distinct musical note. In addition to the conventional keyboard setup, the instrument incorporates an ultrasonic distance sensor, which introduces a dynamic layer of percussion sounds. These sounds vary depending on the distance of the player’s hand. Furthermore, a potentiometer is integrated to alter the pitch of the notes dynamically, offering musicians the ability to manipulate the sound palette expressively.
Images
Components Used
- Arduino Uno
- Breadboard (x2)
- Jumper Wires
- Piezo Buzzer (x2)
- Push Buttons (x8)
- Potentiometer
- 10k ohm resistors (x8)
- Ultrasonic Sensor
Circuit Setup
Power Connections
-
-
- Arduino 5V to Breadboard positive rail
- Arduino GND to Breadboard negative rail
-
Piezo Buzzers
-
- Piezo Buzzer 1:
- Positive connection to Arduino digital pin 12
- Negative connection to Breadboard negative rail
- Piezo Buzzer 2:
- Positive connection to Arduino digital pin 13
- Negative connection to Breadboard negative rail
- Piezo Buzzer 1:
Push Buttons
-
-
- One side of each button connected to the Breadboard positive rail
- The other side of each button is connected through a 10k ohm resistor to the Breadboard negative rail and also connected to Arduino digital pins 2 through 9.
-
Potentiometer
-
-
- One outer pin is connected to the Breadboard positive rail.
- Another outer pin is connected to the Breadboard negative rail.
- Middle pin connected to Arduino analog pin A0.
-
Ultrasonic Sensor
-
-
- VCC pin is connected to the Breadboard positive rail.
- GND pin is connected to the Breadboard negative rail.
- TRIG pin is connected to Arduino digital pin 10.
- ECHO pin is connected to Arduino digital pin 11.
-
Video
Code
int buzzerPin = 12; int buzzer2 = 13; int potPin = A0; int keys[] = {2, 3, 4, 5, 6, 7, 8, 9}; // Frequencies for notes (C4 to C5) int notes[] = {262, 294, 330, 349, 392, 440, 494, 523}; int trigPin = 10; int echoPin = 11; int bassDrum = 200; int snare = 250; int hiHat = 300; void setup() { pinMode(buzzerPin, OUTPUT); pinMode(buzzer2,OUTPUT); pinMode(2,INPUT); pinMode(3,INPUT); pinMode(4,INPUT); pinMode(5,INPUT); pinMode(6,INPUT); pinMode(7,INPUT); pinMode(8,INPUT); pinMode(9,INPUT); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); Serial.begin(9600); } void loop() { int potValue = analogRead(potPin); int volume = map(potValue, 0, 1023, 0, 255); // Map the potentiometer value to a volume range // Measure distance using the ultrasonic sensor digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); long duration = pulseIn(echoPin, HIGH); int distance = duration * 0.034 / 2; // Calculate the distance Serial.print(distance); Serial.println(" cm"); bool isAnyButtonPressed = false; for (int i = 0; i < 8; i++) { int modifiedNote = map(potValue, 0, 1023, notes[i] / 2, notes[i] * 2); if (digitalRead(keys[i]) == HIGH) { tone(buzzerPin, modifiedNote, 100); isAnyButtonPressed = true; break; // Stop the loop once a button is found pressed } } if (!isAnyButtonPressed) { noTone(buzzerPin); } if (distance < 10) { tone(buzzer2, bassDrum, 100); } else if (distance >= 10 && distance < 20) { tone(buzzer2, snare, 100); } else if (distance >= 20 && distance < 30) { tone(buzzer2, hiHat, 100); } else { noTone(buzzer2); } delay(100); }
In the loop, the program first reads the potentiometer value and uses it to modify the frequency of the piano notes. Depending on the button pressed, it plays a modified note frequency. If no buttons are pressed, it stops any ongoing tone. Depending on the distance detected, it chooses a percussion sound to play, simulating a drum kit with different sounds for different ranges.