icon
    A Simple Raspberry Pi Electronic Organ Based on MPR121

    I am a big fan of TwoSetViolin, they bring me a lot of fun and I start to appreciate the joy of music since I followed their channel last year. They have a program called LINGLING40HOURS, in which there are many linglings (talented fans) showing their music memes. Well, I know nothing about instruments, so it’s hard for me to come up with any good music memes. Okay, at last, I decided to utilize my expertise to DIY an electronic organ to join them.

     

    Hardware

    Raspberry Pi 4B X1

    Raspberry Pi IO Expansion Board X1

    Capacitive Touch Kit For Arduino X1

    Gravity: Digital Speaker Module X1

    Ice Cream Sticks (3*7)

    Double Side Adhesive

    Copper Foil Tape with Double-Sided Conductive

    Conductor WireCardboard

    Type-C power cable

    Ethernet Cable X1 (Can be replaced by WiFi)

     

    projectImage

    Electronic Organ Key Connection

    1. First, we have to figure out the logic before soldering: MPR121 can output 12 signals, but we need 3*7=21 signals. So here I am gonna divide the 12 signals into two groups: X (0-4), Y(5-11), then we can get 35 signal combinations.

    Solder conductor wires onto the touch board(21 in total). I soldered the green and yellow points.

    projectImage
    projectImage

    2. Prepare the organ plate

    Cut cardboard of three layers and prepare some small cardboard strips for fix the organ keys.

    projectImage
    projectImage

    Stick the touch board onto the middle layer of the cardboard. And drill holes on the boards, then pull out the conductor wires.

    projectImage
    projectImage

    Organize the wires and cut out the extra parts.

    projectImage
    projectImage

    3. Prepare the organ keys

    Wrap the copper tapes around the ice cream sticks.

     

    projectImage

    Stick them onto the cardboard.

    projectImage
    projectImage

    Software Preparation

    I used the MobaXterm here.

    Operation

    1. Hardware Connection

    Connect the speaker module to P22 of the expansion board, the touch board to IIC port.

    projectImage
    projectImage

    You can also select other pins, but please make sure it is a GPIO port.

    At last, plug in the power cable and Ethernet cable.

    2. Programming

    1) Download libraries files. I have placed them into a zip, click the link to download them to your PC.

    The unzipped files should be like that in the image below. 
    projectImage

    Drag the files to mobaxterm. (Please select Desktop path)

    projectImage

    Create a python file in your computer and name it as 36.py.

    projectImage

    Once a button is pressed, the speaker will play the corresponding note. The touch function in MPR121 library can only output 0~11, and we have to extend the 12 signals. So here I take 0~4 as X, 5~11 as Y, so there will be 5*7=35 combinations. I only set the G clef (treble clef), the F clef (bass clef), the C clef (alto clef). When x=1, bass clef, the frequency will be determined by the value of Y. When x=2, alto clef, the frequency will be determined by the value of Y, and so on.

    Copy the following codes into 36.py file.

    CODE
    import sys
    sys.path.append('../')
    import time
     
     
    import Adafruit_MPR121.MPR121 as MPR121
     
    import RPi.GPIO as GPIO
    Buzzer = 22
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(Buzzer,GPIO.OUT)
    Buzz = GPIO.PWM(Buzzer,440)
    Buzz.start(0)
     
    print('Adafruit MPR121 Capacitive Touch Sensor Test')
     
    # Create MPR121 instance.
    cap = MPR121.MPR121()
    CL = [131, 147, 165, 175, 196, 211, 248]
    CM = [262, 294, 330, 350, 393, 441, 495]
    CH = [523, 587, 659, 698, 784, 880, 988]
     
    if not cap.begin():
        print('Error initializing MPR121.  Check your wiring!')
        sys.exit(1)
         
    print('Press Ctrl-C to quit.')
    last_touched = cap.touched()
    print(last_touched)
    x = 0
    y = 0
    while True:
        global Buzz
        touch = []
        current_touched = cap.touched()
        n=current_touched
        print(n)
         
        #y=current_touched[1]
        for i in range(12):
            if n&1:
                touch.append(i)
            n = n >> 1
        if len(touch) == 2:
            x=touch[0]
            y=touch[1]-5
        print(x)
        print(y)
        if x==1:
            Buzz.start(50)
            Buzz.ChangeFrequency(CL[y])
        elif x==2:
            Buzz.start(50)
            Buzz.ChangeFrequency(CM[y])
        elif x==3:
            Buzz.start(50)
            Buzz.ChangeFrequency(CH[y])
        else:
            Buzz.stop()
        x = 0
        y = 0
        #last_touched = current_touched
     
        time.sleep(0.5)
         
        #GPIO.cleanup()

    Drag the 36.py file into the examples of mobaxterm.

    projectImage

    Effect Display

    As shown below, I pressed the sixth note of the bass clef. That's all for my work, thanks for reading!

    projectImage
    icon Adafruit_Python_MPR121.rar 101KB Download(0)
    License
    All Rights
    Reserved
    licensBg
    0