In order to make the Arduino digital Fm radio, we need:
- An Arduino Uno board
- A TEA5767 IC based Fm receiver module
- The printed circuit board especially designed for this project (provided below) or a breadboard instead
- A classic parallel interface 2x16 alphanumeric display (2 lines x 16 characters per line)
- The source code together and the necessary external libraries (provided below)
- The Arduino programming environment
- Some electronic components i.e resistors, capacitors, push buttons (see electronic schematic)
This is a stereo radio and includes an audio - headphone output. The radio displays information regarding the received frequency, the type of demodulation (monaural or stereo), and the received signal strength. It has a memory capacity of 10 radio frequencies and an additional default frequency definition.
The default frequency range is from 87.5 to 108MHz (US / Europe). The band can be changed to 76 -91 MHz (Japan) (instructions provided) from code. The default de-emphasis filter constant is 50us (Europe), and can be changed to 75us (US) from code.
Image 1. The display of the Digital FM radio
Making the digital radio:
The design is quite simple. The electronic schematic is shown in Figure 2. It contains an Arduino Uno board, a TEA5767 FM radio module, an LCD , four push-buttons and some electronic components (resistors, capacitors). The user interface is implemented via the 4 push buttons. The basic radio functions supported by this buttons include auto frequency scanning, manual frequency selection, storing and retrieving frequencies, and setting a default radio frequency.
Figure 2. The electronic schematic of the digital FM radio
The audio output is provided from a standard stereo audio jack, located on the TEA5767 module board. You may plug headphones in this jack or you may connect this plug to the input of an audio amplifier. There is no audio volume adjustment potentiometer in the radio and the volume adjustment procedure it is up to any amplifier stage is used in conjunction to this radio. Therefore, it is purely up to your choice what kind of amplifier you will use, the speakers and anything that has to do with adjusting the volume. You may use any commercial amplifier or you could easily make your own according to some designs listed in the audio circuits section.
You may assemble the unit on the circuit board provided below or in any breadboard. All the necessary files for the circuit board as well as for the assembly procedure are provided in a series of Kicad software files. You may use these files as they are or you may modify the design according to your own preferences or choices.
Image 3. The Arduino radio- from KiCad 3D viewer
The radio antenna has to be connected on an antenna plug, marked accordinally, located on the TEA5767 module board.
The radio is powered via the Arduino board from either a power adapter or from a computer's USB port. Off course, you may modify the design in order to use separate power supply units for the Arduino and the receiver module, respectively. You can also make any changes you wish to the code in order to make your own version of the radio. Making any changes require to consult the TEA5767 datasheet and guide throughout the code by consulting the apropriate comments.
Regarding the source code:
In the code, we use five libraries (see include statements in the code):
- TEA5767.h for controlling the TEA5767 IC. This library includes all the necessary objects and functions that control the TEA5767
- Wire.h library, for connecting the TEA5767 IC to the Arduino via an I2C bus
- The Button.h library, to control and debounce the push buttons
- The EEPROM.h library for the for the use of the internal EEPROM memory of the Arduino
- The LiquidCrystal.h for the Display interface
The last two libraries in this order are usually pre-installed in the programming environment and we do not need to do anything to use them in the code. The rest of the libraries are provided below in three file folders. These folders (after unziped) must be saved in the “... / Arduino / libraries/” path located in the place where the Arduino programming environment (usually in Program files (x86)) has been installed. This action should be performed before any try to compile the code, otherwise you will receive an error message from the compiler.
The operation of the radio:
The receiver has a memory capacity of 10 radio frequencies and an additional default frequency definition memory palce. The first line of the Display provides information about the tuning frequency and the current selected memory index, while the second line provides information about the received signal strength (on a bar graph) and the type of reception (mono or stereo).
- When the receiver is initially powered on, it switches to the default frequency. If no default frequency is set, the receiver switches to 98MHz (this is a software set).
- Tuning is done automatically or manually via the up-down keys. Switching between automatic and manual tuning mode is done by pressing the enter key.
- The current memory index is selected via the mode key. Each time you press the mode key, the receiver switches to the next memory index. The current selected memory index is displayed on the top left of the Display and the receiver switches to the frequency of the station stored in the respective memory position. An empty memory position correspond to an invalid frequency outside the band.
- A frequency can be stored in a current memory position index by pressing and holding the mode key.
- Defining a default frequency, ie the frequency to which the receiver switches after a reset, is done by pressing and holding the enter key.
In more detail:
1) To tune by using auto scanning:
Press the up or down key to switch the receiver to the next available station at a higher or a lower frequency than the current one, respectively.
2) To tune manually:
Briefly press the enter key to display the - ’- character at the top right of the display. Then press the up or down keys to increase or decrease the receiver frequency based on a default step (the step is predefined on software).
3) To recall a memory index:
Press the mode key. Each time you press the mode key, the receiver switches to the next memory index.
4) Save in memory:
Recall the desired memory index based on the previous step. Tune on any frequency based on steps 1 or 2. Press and hold the mode key until the frequency indicator goes out. Release the mode key.
5) To set the default frequency:
Switch to a desired frequency. Press and hold the enter key until - FM # - appears in the upper left of the display. Release the enter key.
Attached files:
KiCad files in a zipped folder (schematics and board layout)
Arduino FM radio source code (ino type file)
External libraries files (in a zipped folder)