loading
This little project is an example of a simple audio application using a PIC micro-controller. 
We decided to use the PIC18F4550 micro-controller for memory purposes.

Using only digital inputs and outputs, we developed this simple piano/synthesizer with an 8 bit kind of style:


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.

To make the circuit we used a double sided PCB. The circuit was printed in magazine paper using a laser printer, then it was transferred 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. 

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)
{
     audio=1; 
     delay_us(1136);
     audio=0;
     delay_us(1136);
}

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.

Here’s the .hex file and the PCB layout: pianopic hex+pcb.zip
And the code as well: https://www.dropbox.com/s/nw5wv7xpbzb42je/code%20-%20pianopic.c

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

Project: here.
<p>thanks it's cool.....but..what PIC compiler use?,....(i change song's code)...how to great (.hex) file from (.c) file</p>
<p>Thanks! This project was done using the MikroC IDE/compiler. So that's probably the one you should use. Also because it uses some functions that are part of MikroC libraries. </p>
<p>HEllo!! <br>Nice project :)</p><p>I have a little doubt. What to do if I want to play multiple keys at a time? Will I have to use more than PIC?</p>
<p>Thank you! Well that is an interesting question indeed! This is a very simple and basic project so it does not support multiple keys at once, however I supposed it could be possible to detect which keys are being pressed, and create an output frequency that would be the equivalent of having all those sounds in simultaneous. </p>
<p>I want to implement this using arduino....</p><p>Can someone help me convert the code?</p>
<p>Sorry, with Arduino the code will be very different. It's a different IDE.</p>
Cool sounds :D
<p>Thank you !</p>
Awesome project! Congrats! :)
<p>Thanks!</p>

About This Instructable

6,091views

34favorites

License:

Bio: eLab Hackerspace
More by eLab:3D Printed DNA Lamp eLab Hackerspace GSM Access Control System Dual Boot Ubuntu and Windows 8 UEFI 
Add instructable to: