Piano PIC


As an application of our previous post, here is a project where we used our PicPgm to program a PIC18F4550 micro-controller.

This little project is an example of a simple audio application using a PIC micro-controller. Using only digital inputs and outputs, we developed this simple piano/synthesizer with an 8 bit kind of style:

We decided to use the PIC18F4550 micro-controller for memory purposes.

First, the following functions were assigned to each port:


The green terminals are assigned as inputs while the red terminals are assigned as outputs.

Then the pins were associated:


Inputs from b1 to b11 are the push buttons in the circuit while the mode input is the switch responsible for selecting the working mode. Outputs from l1 to l11 correspond to the LED indicators. Each LED is located right above its corresponding push button and it will light up when the respective musical note is played. The audio output is the pin that will connect to the speaker.

The circuit schematic was designed using the KiCad open-source software:


Then the PCB layout:


And here’s how it looks in 3D:

dsc02104.png pcb.png

To make the circuit we used a double sided PCB. The circuit was printed in magazine paper using a laser printer, then it was transfered to the PCB using the toner transfer method. First on one side, then a few drills were made to align the designs on the other side:



Then the PCB was put on an iron perchlorate solution to remove the copper from unprotected areas:



To remove the toner we used a sponge under warm water:



Then we made all the drills and placed all the components. The used components are mostly from old electronic devices, the push buttons are from an old VCR, the LED’s are from a modem and the speaker from an old clock alarm.

We have now our finished PCB:



How it works:


In the Playing mode, when mode=0, the push buttons b1 to b11 correspond to “piano” keys:

b1 – A (440 Hz)

b2 – B (494 Hz)

b3 – C2 (261×2 Hz)

b4 – D2 (293×2 Hz)

b5 – E2 (329×2 Hz)

b6 – F2 (349×2 Hz

b7 – G2 (392×2 Hz)

b8 – A2 (440×2 Hz)

b9 – B2 (494×2 Hz)

b10 – C4 (261×4 Hz)

b11 – D4 (293×4 Hz)

We chose to use the second octave as main scale and then added two more musical notes up and down. It is also possible to reproduce sharps and flats by pressing two adjacent buttons.

When each button is pressed, a square wave is sent to the speaker with the respective frequency.

For instance, when b1 is pressed the note A must be played. So to create this sound, a square wave with 440Hz is sent to the audio output. To do that we know that the wave period is 1/440 = 2272 µs approximately, so the audio output is placed at high level during half this time (1136 µs) and then at low level during the other half.

if (b1)







Also, besides the sound, when the note A is reproduced, the l1 LED lights up.

In Memory mode each button is associated with a particular music that is played when the button is pressed.

Each music in memory is made with two vectors, one for frequencies or musical notes, and other for timings. These vectors are later read through the function Sound_Play(x,y) from the used compiler (mikroC).

At last, b0 is the reset button in our circuit.

And that’s how to make another simple and fun application with a micro-controller.

Here’s the .hex file and the PCB layout: pianopic hex+pcb.zip

15 thoughts on “PianoPIC”

  1. Hi! Nice project, but I don’t see HEX-file and KiCAD source’s… Can you attach this?

    1. Hey there! Unfortunately no. I actually started this project with a PIC16F88 though, however it didn’t have enough memory for storing all the musics and not enough I/O pins for my needs.

Leave a Reply