This Instructable will be about designing a music player from using various building blocks. You will understand the communication between the microcontroller, memory, computer, LCD display, RTC, IR remote, and the music file decoder. I will try my best to to teach you in a way so that you can design your own projects using the skills you learn, without blindly following instructions.
I know most of you will simply glance at this first page and maybe skim through the rest. This Instructable has 18 steps and 5 appendices, with about 90 files and pictures. I sincerely hope you explore all my efforts.
Every step will be accompanied by a demonstration of that particular building block working. The source code will be provided. I will post the debug output, pictures, screenshots, USB device and packet analysis, and logic analyzer waveforms. NOTE: if the images look too compressed, don't worry, they are included inside my .ZIP files too.
To start off the project, set your goals. This will be a simple proof-of-concept music player. It will allow the user to load music as through USB as though it is a mass storage device, display the current song to the user, display the current time, set custom alarms for every day of the week, and allow the user to control it through a remote control. To accomplish these goals, you need:
* USB capable microcontroller
* LCD display
* Storage
* Sound output
* IR receiver and remote control (any)
This is the obvious overview, however, we also need a RTC (real time clock) to keep track of time using a backup battery, just in case the power goes out.
Note that with my collection of supplies, budget, and skills, I've decided to use a VS1033D decoder IC from VLSI Solutions, which integrates music file decoding and digital-to-analog output. So the item "sound output" in the above list expands into "decoder" and "speaker"
I will be using the following components during this Instructable (this is not a full part list, not even close, but these are major):
AT90USB1286 microcontroller (on a Teensy++ http://www.pjrc.com/store/teensypp.html ), datasheet is here: http://www.atmel.com/dyn/products/product_card.asp?part_id=3874
VS1033D music decoder http://www.vlsi.fi/en/products/vs1033.html on a breakout board http://www.sparkfun.com/products/8792
16x2 character LCD display, ST7066/HD44780 compatible, using 3.3V instead of 5V
DS1307 real time clock
Note that the entire circuit will run off 3.3V, if you are buying a Teensy or Teensy++, please buy http://www.pjrc.com/store/mcp1825.html and follow the correct procedures to solder it and use it (it involves a jumper). Please also note that you must also run the Teensy at 8 MHz instead of 16 MHz because of the reduced voltage.
I also hope that once you are done, you'll be able to apply the skills you learn here with other microcontrollers and devices.
Remove these ads by
Signing UpStep 1: Before You Begin
To get you started, I will make sure you know how to compile and upload a "hello world" program to the Teensy++. This code will show you how to output debug messages, which will be useful later.
Obviously you need an AT90USB1286 microcontroller for this, and since it's hard to solder by hand, I choose to buy a Teensy++. http://www.pjrc.com/store/teensypp.html
This example is based on "USB Serial" on PJRC
http://www.pjrc.com/teensy/usb_serial.html
If you wish to learn more about communication with USB, please refer to my appendix "step" about USB.
Please refer to my appendix "step" about AVRs to figure out how to use makefiles and the GNU AVR toolchain.
Download the files attached. Run "make" to generate the .hex file. Upload the .hex file to the microcontroller. Open up a serial terminal to see the output. The baud rate shouldn't matter since this is a fake serial port.
Provided below is the USB analyzer dump of the device and a sample packet of data, for those of you who wish to learn more about USB.
Note: I personally REALLY like using RealTerm as a serial terminal http://realterm.sourceforge.net/ , I will be posting screenshots of the terminal output whenever I can. I will also post logic analyzer screenshots, .logicsession files (can be opened with the Saleae Logic software http://www.saleae.com/logic/ ), and exported files whenever I can.
Some people have asked me about how to use stdio.h and printf (and similar streaming and formatting functions) on AVR microcontrollers, the following links are in the code comments:
http://www.nongnu.org/avr-libc/user-manual/modules.html
http://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html
Also since this is "before you begin", go download Saleae Logic's software, if I ever attach .logicdata files, you need the software to view it. http://www.saleae.com/logic/ , it's in the downloads (version 1.1.14 is what I used) page, you can use it even if you do not own a Saleae logic analyzer. I will also try to include screenshots.


























































Visit Our Store »
Go Pro Today »




i am currently using a mbed to program the alarm clock, and I have successfully decode one song from sd card. Just wondering how can you decode the name of the song so the mbed can decode any song that I put in through USB. Currently I am using code like ' fopen("/sd/mp3/test1.mp3","rb");' so the title of the song must be test1. Thank you very much:)
Please help. Your help is highly appreciated.
Best regards,
Ankush
You are supposed to try it out, and if it doesn't work, figure out why it doesn't work, and fix the problem. So what is the problem? What do you expect to see? What do you see instead?
I am using codes given by my remote controls in IRCodeInterpret module but not matching with and just displaying message Checking .... on Realterm.
As described by you, remote control should display same pattern that's what not happening.
Any other ways to overcome this problem ?
Please help.
Best Regards,
Ankush
Thanks for your response. I am getting codes with IRCodeCapture module but each time for same button pressed on remote control codes displayed are different.
I put these codes in IRCodeInterpret module and check it. I get output on RealTerm screen as checking..
When I put ircodes in header file and check interpret module then I should get which button is pressed on remote control. But it is not showing due to codes not matching.
Hope the problem is resolved with your help.
Regards,
Ankush
Secondly, how do u decide what size of RAM and frequency u need]?
Thirdly, is sd card originated formatted in fat16 and what does fatfs do exactly (the difference between it and fat16) ?
Lastly,why do you choose ADR instead of ARM? Is 8 bits AVR gonna be fast enough for playing mp3 file?
Cheers and look forward to hear from u
I did not really make a decision on RAM and frequency, I just knew what I had will work.
FAT16 is the format, FatFs is the software used to read the FAT16 format.
I simply like using AVR chips. It works... Developing for them is comfortable.
The frequency required can be determined by calculations using the MP3 file bitrate, and the maximum SPI bus transfer rate
I can use ARM if I wanted to, I have worked with AT91SAM7X, mbed, and STM32F4. Most ARM chip requires a custom designed PCB because they do not typically come in DIP form, and I didn't really want to spend the money on the custom PCB.
Thanks :)
You can use almost any AVR microcontroller you want, if you want the USB mass storage capability then obviously you need one that features USB. Just make sure it has enough memory to do what you want, enough pins for everything, and a SPI bus to do the talking between the SD card and MP3 decoder.
I posted rough wiring schematics in the instructable, I'm sure you can adapt the circuit to whatever you are doing
You should always use a file system, unless you have some sort of weird requirement
can i ask what other micro-controller and music decoder that i can use which would have the same functions but cheaper? Many thanks :)
Most ARM processors can probably decode the MP3 file without external help, the mbed already have an example program available for it, it also have a built in DAC. The mbed is kind of expensive at $60-ish but it's awesome, and the only people who say bad things about it are too stupid/lazy to compile offline for it.
A few weeks ago, STMicroelectronics were giving out free STM32F4Discovery kits, now they cost some money, but not too expensive, this board has a ton of audio features, it has a microphone built right in, and a I2S sound output thing with a headphone jack. The processor itself have DSP and FPU. It's a good candidate.
I highly doubt a 8 bit AVR at 8 MHz can use MAD.
Also, you are not being a USB host, you are being USB device, NOT host
You cannot communicate between SD card with MCU and SD card with computer at the same time
The function that plays out the data runs in a loop, just increase a variable in that loop and repeatedly set the volume using that variable
If you are using the ATmega644 then you need a USB-to-serial cable, which also will have a COM port number
I like your custom character tool