I am an engineer and enthusiast in electronics DIY and radio listening. I have always enjoyed building my own receivers. In 2017 I started studying DSP radio circuits and discovered the Si4730/35, which is a chip that provides a receiver with very interesting features, only seen in high-cost commercial receivers. Since then I have been developing some DSP receivers, which can be seen on my Youtube channel.
I posted the initial part of this project on Hacksterio, where the basic source code and and very useful and complementary information about this project. It can be found here.
This is a new project version (firmware V3.0), with the goal of making the receiver easier to use, which makes radio listening more productive, when compared to the previous version. In addition, it has some new features and bugs have been fixed. Furthermore, the project is much better documented now.
Click here to download the new firmware V3.0 and the other files of this project.
- Receiver specifications: Stereo FM 76-108MHz with RDS, LW, MW, SW bands, covering from 150kHz to 30MHz and AM/SSB demodulation. Display TFT 1.8” ST7735 Color 128x160pix and Arduino Nano (Atmega328P).
- 18 reception bands, each band is automatically memorized in the EEPROM memory and the value is retained even if the band is changed or when the receiver is turned off.
- SSB (USB/LSB) reception, with fine value adjustment of the clarifier.
- Selectable receive filters for AM and SSB.
- RDS Program Service (PS) text displayed.
- New signal meter that can show a bargraph with maximum indicator or a moving point, remembering a mechanical needle of the old microammeters. The adjusted value is stored in the EEPROM.
- High quality audio with great volume.
- Tuning status indicator via 2 LEDs.
- Battery voltage indicator.
- Medium Wave Antenna can be selected to use ferrite magnet antenna or external antenna. The adjusted value is stored in the EEPROM.
- It is possible to turn on/off reading of RSSI & RDS data, thus eliminating interference and noise generated by Arduino activity. The adjusted value is stored in the EEPROM.
- Auto-sleep mode can be enabled/disabled, which puts the Arduino into sleep mode after 4 seconds, to reduce reception noise for DX listening and save battery. The adjusted value is stored in the EEPROM.
- The code received a new update: reduction of the tuning noise in SSB (that transiente sound "chuff chuff"), that annoying noise when turning the tuning encoder in SSB was greatly reduced.
- This project uses traditional electronic components with leads (non-SMD), also known as through-hole (except the Si4732 that is SMD), which facilitates assembly and modifications to the circuit. In addition, the printed circuit boards are single-sided and can be manufactured at home using the thermal transfer method.
To load the firmware (.hex format) on Arduino UNO / Nano it is necessary to use the AVRDUDESS app and the USBasp programmer, using the ISP programming. Other methods for transferring firmware can be tried, but since I haven't tested it, it's not guaranteed that it will work.
There are some tutorial videos on YouTube teaching how to use AVRDUDESS and USBASP to program Arduino, I recommend watching this VIDEO. Artificial intelligence can also be used, ChatGPT will help a lot in this activity.
Basically, it is necessary to install AVRDUDESS on the computer, make the electrical connections of the USBASP with the Arduino and with the computer's USB port, open the application, select the USBASP programmer, select the available COM port, in Flash select the firmware file (.hex) of this project and click on Program!, as shown in the image below.
-When the.hex firmware is loaded onto the Arduino, the bootloader is removed, so it will no longer work with the IDE application. If you need to return the Arduino to its original factory state to be used in another project, you will need to load the bootloader again. The bootloader can be recovered using this application AVRDUDESS to load the bootloader file "optiboot_atmega328.hex". The AVRDUDESS app and optiboot_atmega328.hex are included in the folder.
-AVRDUDESS also detects and identifies MCU used in Arduino, just click on Detect.
-What is ISP programming in Arduino? R: ISP allows you to program an ATmega (or similar) microcontroller directly using another Arduino board or an external programmer. This is commonly used for:
- Burning a new bootloader onto a microcontroller.
- Uploading sketches without a USB-to-serial converter.
- Recovering "bricked" microcontrollers.
- PB1: Used to navigate the radio reception bands, short press to go to the next reception band, long press to go to the previous reception band. In SSB mode, short press switches between clarifier (BFO fine tuning with steps of 10Hz) and the main 1kHz/5kHz tuning (FINE/TUNE).
- PB2: Short press to to select the reception filters in AM or SSB mode. Long press to enable/disable the reading of the RSSI/RDS data, thus eliminating the interference and noise generated by the Arduino activity.
- PB3: Short press to change the tuning steps (1/5/9/10k). Long press to to change the graphic style of the signal meter, switched from bargraph to moving point.
- PB4: Short press to select AM or SSB (LSB/USB) modes.
- Rotary Encoder: Used to tune frequencies, fine tune the clarifier in SSB and exit sleep mode.
- PB1: Used to to view the current version, load factory defaults and initialize memory.
- PB2: Enables or disables auto sleep mode. When activated, the Arduino enters sleep mode after 4 seconds and the buttons stop responding. To exit sleep mode, simply turn the rotary encoder, which will trigger for another 4 seconds. On the right side of the display a small purple square appears indicating that it is in sleep mode. When we turn the encoder a blue triangular arrow immediately appears indicating that it has exited sleep mode. Putting the microcontroller (uC) in sleep mode has advantages, the noise and interference generated by the digital circuit will be removed and battery consumption will be reduced.
- PB3: Selects the type of antenna for Medium Waves, alternating between the ferrite or external antenna, thus allowing the use of an external antenna for MW. When externa is activated, the VLNA pin will have 5 volts, otherwise it will have 0 volt, so an LED can be used to indicate this state.
- The first time you turn on the radio, hold down the PB1 button when turning on the power until the message appears on the screen that the default values have been loaded into memory. After this reset RSSI/RDS reading will be turned off, so just activate it via PB2.
- This version uses the Si473x I2C address 0x63, make sure to set it correctly on your hardware.
- The VLNA pin is used to control a switch composed of a diode, which is polarize (or not) by the 5 volts from pin D5 of Arduino. This allows to select if the ferrite magnetic antenna to act alone or to receive the signal coming from the external antenna as well, helping with reception in certain situations. When we do not have 5 volts on this pin, the diode is cut off and acts as an open switch, so the signal from the external antenna does not reach the MW magnetic antenna. Another function of the VLNA is the possibility of supplying a voltage of 5 volts to power an external RF preamplifier on the Shortwave bands or FM.
- Arduino pin A6 (A/D in) measures the battery voltage and displays the value on the display. The battery voltage is divided by 2 with 10k resistors divider and goes to pin A6, so it is important that the circuit is assembled this way for the reading to occur.
- Arduino pins D4, D5 and D6 can be connected to LEDs to indicate tuning and VNLA status, see connection details in the schematic.
- This circuit is originally powered by 2x 18650 batteries in series, which results in an approximate supply voltage of 7.4 volts, to ensure audio quality and volume. However lower voltages can be used.
- Speaking about the power supply of this circuit, the Arduino is powered with an approximate voltage of 7.4V (it could be up to 10V max) on the VIN pin and provides the circuit with all regulated voltages, as it has a 5V regulator that powers the TFT display and a 3.3V regulator that powers the Si4732, in this way we have a good simplification of the circuit, hence the nickname Minimalist. The total consumption of the circuit at low volume is 71mA, while at medium volume it can exceed 100mA.
- The schematics does not exactly reflect what is on the original printed circuit board, some simple adaptations will have to be made.
- I continue to make small updates and bug fixes to the code of this project, but I am not changing the version of the code. And I am always updating the download link with the most current version. That is why I recommend always downloading the code again because that way you will have the most updated version with improvements.
- Additional and complementary information can be found in my initial project, at this link.
The display model I used in this project is the ST7735 1.8in SPI 128x160 pixel, as shown in the photo below. Note that it is a very simple display, it has fewer pins, has an SD card reader (not used) but no touch screen and on the back it only has a 5v to 3.3v regulator and a jumper J1 to change the supply voltage from 5v to 3.3v. This display is known for tolerating the difference in Arduino's 5v logic level, since it works with a logic level of 3.3v and still works perfectly. There are variants of ST7735 displays on the market that are physically a little different from this one, they have more connection pins, a different back with other chips, the color of the board may be blue. These other display variants can be used, but as I have not tested these models I cannot guarantee the result. It is mandatory to use 2.2k OHM resistors on the data bus between the Arduino and the TFT display, as indicated in the schematic, to avoid white bars on display.
I used the low-cost EC11 - 15mm rotary encoder (photo below), which can be purchased on Aliexpress in batches of 5 units. Note that this encoder has a blue plastic base and has 5 pins, 3 for the encoder and 2 for the push switch. This worked perfectly with the project. If the encoder action is inverted (it decreases when turning clockwise), simply flip (invert) the connection of the pins that go to D2 and D3. There are other types of encoders, some come with a built-in board, which can be tested here, but I have not tested them. In some cases, it may be necessary to include 2x 10k OHMM pullup resistors between +5v and pins D2 and D3.
- This is a free project I did as a hobby, it's not a professional project and is not intended to “make money” with it. The prototypes I assembled for my use worked perfectly, however I cannot guarantee that what you assembled will work, as this will depend on factors such as your experience and knowledge, the quality / originality of the components used, variability of manufacturers and assembly errors. In no way can I be responsible for the expense or damage that you have in this assembly.
- This project requires some knowledge of how to load firmware onto the Arduino and how to use the USBASP programmer and the AVRDUDESS application. In addition, it requires some knowledge of electronics, experience in assembling electronic circuits, making printed circuit boards, and the ability to analyze and solve problems that arise. Therefore, I do not recommend it for beginners. But if you are curious, like to learn and don't give up, this is an opportunity!
Firmware version 3.0 – developed by JCR – CersarSound – Jan/2025
Comments
Please log in or sign up to comment.