Lesson 13 Button Piano

Share for us

Introduction

In our past lesson, we learned how to use PWM waves to drive a passive buzzer to ring. In this lesson, we make a simple keyboard by applying a passive buzzer. Let’s get started!

Newly AddedComponents

Schematic Diagram

Build the Circuit

  • For C Language Users

Command

1.Go to the folder of the code.

cd /home/pi/electronic-kit/for-raspberry-pi/c/Lesson_13_Button_Piano

2. Compile the code.

gcc 13_ButtonPiano.c -lwiringPi 

3. Run the executable file.

sudo ./a.out

Now press the seven buttons, and the buzzer will emit the notes: DO, RE, MI, FA, SO, LA, TI. You can play a song with these seven buttons.

Code

1.#include <wiringPi.h>  
2.#include <softTone.h>  
3.#include <stdio.h>  
4.  
5.#define BuzPin    0  
6.  
7.const int Tone[] = {262,294,330,350,393,441,495};//define DO, RE, MI, FA, SO, LA, TI  
8.int beat[] = {1,1,1,1,1,1,1};  
9.const int Btn[] = {2,3,4,5,6,10,11};//define 7 buttons  
10.  
11.int main(void)  
12.{  
13.    int i, j;  
14.  
15.    if(wiringPiSetup() == -1){ //when initialize wiring failed,print message to screen  
16.        printf("setup wiringPi failed !");  
17.        return 1;   
18.    }  
19.  
20.    if(softToneCreate(BuzPin) == -1){  
21.        printf("setup softTone failed !");  
22.        return 1;   
23.    }  
24.  
25.    //set the buttons mode  
26.    for(int j=0;j<7;j++)  
27.    {  
28.        pinMode(Btn[j], INPUT);  
29.    }  
30.          
31.    while(1){  
32.        //printf("Please press button to play the piano\n");  
33.        // Indicate that button has pressed down      
34.        for(i=0;i<7;i++)  
35.        {  
36.            if(digitalRead(Btn[i])==1)  
37.            {  
38.                delay(10);//Prevent the button' s vibration  
39.                if(digitalRead(Btn[i])==1)  
40.                {  
41.                    softToneWrite(BuzPin, Tone[i]);   
42.                    delay(beat[i]*250);  
43.                    printf("1");  
44.                }  
45.            }  
46.            else  
47.            softToneWrite(BuzPin, 0);  
48.            if(i==7)  
49.            i=0;  
50.        }             
51.    }  
52.    return 0;  
53.}  

Code Explanation7.const int Tone[] = {262,294,330,350,393,441,495}; 8.int beat[] = {1,1,1,1,1,1,1};  

In the array Tone[], define the frequencies of DO, RE, MI, FA, SO, LA, TI and the number in beat[] refers to the beat of each note in this song(0.5s for each beat).26.for(int j=0;j<7;j++)  
27.{  
28.pinMode(Btn[j], INPUT);  
29.}  

Set the mode of all buttons to input mode in the for loop.34.for(i=0;i<7;i++)  
35.{  
36.if(digitalRead(Btn[i])==1)  
37.{  
38.delay(10);//Prevent the button’ s vibration  
39.if(digitalRead(Btn[i])==1)  
40.{  
41.softToneWrite(BuzPin, Tone[i]);   
42.delay(beat[i]*250);  
43.printf(“1”);  
44.}  
45.}  

Use a for loop to check all the buttons. When one button in array Btn[i] is detected to be pressed, the buzzer will respond to the corresponding note in array Tone[i].
46.else  
47.softToneWrite(BuzPin, 0);  
48.if(i==7)  
49.i=0;  
50.}

If no button is pressed, turn off the buzzer.

  • For Python Language Users

Command

1.Go to the folder of the code.

cd /home/pi/electronic-kit/for-raspberry-pi/python

2. Run the code.

sudo python3 13_ButtonPiano.py

Now press the seven buttons, and the buzzer will emit the notes: DO, RE, MI, FA, SO, LA, TI. You can play a song with these seven buttons.

Code

1.import RPi.GPIO as GPIO  
2.import time  
3.  
4.Buzzer = 17  
5.BtnPin = [18,27,22,23,24,25,8,7]  
6.  
7.CL = [0, 131, 147, 165, 175, 196, 211, 248]        # Frequency of Low C notes  
8.CM = [0, 262, 294, 330, 350, 393, 441, 495]        # Frequency of Middle C notes  
9.CH = [1, 525, 589, 661, 700, 786, 882, 990]        # Frequency of High C notes  
10.  
11.song = [     0,CM[1],CM[2],CM[3],CM[4],CM[5],CM[6],CM[7]    ]  
12.beat = [    1,1, 1, 1, 1, 1, 1,  1]  
13.  
14.def setup():  
15.    GPIO.setmode(GPIO.BCM)          
16.    for i in range(1, len(BtnPin)):  
17.        GPIO.setup(BtnPin[i],GPIO.IN)  
18.    GPIO.setup(Buzzer, GPIO.OUT)      
19.  
20.def loop():  
21.    global Buzz    
22.    while True:  
23.        #print ('\n    Please playing piano...')  
24.        for i in range(1, len(BtnPin)):          
25.            if GPIO.input(BtnPin[i]) == 1:  
26.                Buzz = GPIO.PWM(Buzzer, song[i])      
27.                Buzz.start(50)  
28.                time.sleep(beat[i] * 0.25)          
29.                Buzz.stop()      
30.                     
31.def destory():  
32.    Buzz.stop()                      
33.    GPIO.output(Buzzer, 0)          
34.    GPIO.cleanup()                  
35.  
36.if __name__ == '__main__':        # Program start from here  
37.    setup()  
38.    try:  
39.        loop()  
40.    except KeyboardInterrupt:      # When 'Ctrl+C' is pressed, the child program destroy() will be  executed.  
41.        destory() 

Code Explanation7.CL = [0, 131, 147, 165, 175, 196, 211, 248]        # Frequency of Low C notes  
8.CM = [0, 262, 294, 330, 350, 393, 441, 495]        # Frequency of Middle C notes  
9.CH = [1, 525, 589, 661, 700, 786, 882, 990]        # Frequency of High C notes  

These are the frequencies of each note. The first 0 is to skip CL[0] so that the number CL[1]CL[7] corresponds to the CDEFGAB of the note.10.song = [     0,CM[1],CM[2],CM[3],CM[4],CM[5],CM[6],CM[7]    ]  11.beat = [    1,1, 1, 1, 1, 1, 1,  1]  

Define a section of music and the corresponding beats. The number in beat[] refers to the beat of each note in the song(0.5s for each beat).16.for i in range(1, len(BtnPin)):  
17.GPIO.setup(BtnPin[i],GPIO.IN)  

Set the mode of all buttons to input mode in the for loop.24.for i in range(1, len(BtnPin)):       
25.if GPIO.input(BtnPin[i]) == 1:  
26.Buzz = GPIO.PWM(Buzzer, song[i])      
27.Buzz.start(50)  
28.time.sleep(beat[i] * 0.25)       
29.Buzz.stop()  

Use a for loop to check all the buttons. When one button in array button[i] is detected to be pressed, the buzzer will respond to the corresponding note in array song[i].