Project

# How to Build an Arduino-Controlled AM/FM/SW Radio

May 26, 2016 by Raymond Genovese

The idea of a single chip radio is intriguing. The prospect is especially interesting to me because, frankly, I envy the analog skills I associate with building a radio receiver. When I browsed the circuit literature in the area, I came across the Silicon Labs collection. One of their chips, the Si4844-A10 caught my attention. This receiver has AM/FM/SW capability with all the bells and whistles and it is designed to work with a microprocessor. Best of all, the support components required are mainly associated with the microprocessor display and control functions with only a small amount of antenna support needed. I couldn’t resist taking the plunge.

### Reference Documents

Familiarity with the chip’s data and application information is strongly encouraged. The three documents linked below are highly recommended for understanding and building the project:

Si4844-A10 datasheet

Programming Guide

Design Guide

### The Basic Circuit

The schematic above presents the basic circuit for the receiver and the schematic is adapted from the Silicon Labs Si4844 datasheet and application notes. I used a reclaimed ferrite loop from a discarded portable AM/FM radio as the required AM antenna. I think that a higher quality and larger ferrite would be an improvement. Q1 is the amplifier for the SW/AM and I also used a reclaimed telescopic antenna in that section. It is notable that the design guide, linked above, gives several alternatives and different approaches for the antenna components.

The variable resistor (VR1) is a critical component since this will be used to adjust the receiver frequency – the tuning knob. It is recommended that a good quality linear potentiometer be used. For the audio out, I chose to use a set of “economical” amplified speakers that I had from a retired desktop PC. Certainly, a simple stereo amplifier could also be used. Everything on the board is 3.3v and all GNDs are connected.

The most difficult part of the construction is probably working with the chip’s SSOP-24 form factor. If you don’t have the experience and equipment to use SMT ICs, the use of a carrier board may be the easiest way to accomplish the task. I had an SSOP-28 carrier board and with a fine point soldering tip and a lot of patience (and some solder braid to undo bridges); I was able to mount the chip so that it could be accessed as a DIL package. The other potentially difficult components to work with are the couple of surface mount ferrite beads and capacitors. These components can also be hand soldered onto a carrier board and treated like a DIL package.

##### SMT components soldered onto carrier boards

Parts list for the main circuit:

Part Description
B1 ferrite bead 2.5 kOhm (100 mHz)
C1,C2,C5 4.7 uf non polarized capacitor
C3,C4 22 pf non polarized capacitor
C6,C7,C9 .1 uf non polarized capacitor
C8 47 uf non polarized capacitor
C10,C11 .47 uf non polarized capacitor
C12,C14 33 nf non polarized capacitor
C13 33 pf non polarized capacitor
C15 10 pf non polarized capacitor
Q1 SS9018 NPN transistor
R1, R2 2.2K
R3 1K
R4,R7 100K
R5 10
R6 120K
R8 100
L1 270 nH Inductor
VR1 100K linear potentiometer
Y1 32.768 kHz crystal
ANT1 ferrite antenna
ANT2 telescopic/whip antenna

### Connecting an Arduino

The other piece that needs to be considered before powering up the circuit for testing is the Arduino interface. For this component, I chose to use the Arduino Pro Mini, 3v/8Mhz board. This tiny Arduino is entirely 3.3v and is compatible with the Si4448-A10 and that is a chief advantage. The small size of the board is an additional convenience. Connection to the Si4844-A10 is through four lines as described below:

Arduino (3.3v) Si4844-A10

Arduino to Si4844-A10 connections:

A5/SCL SCLK
A4/SDA SDIO
D2 INT
D12 RST

Additionally, a standard USB/Serial interface is used to connect the Arduino to a PC for programming. The exact connections will depend a bit upon the serial board that you use, but will include the usual TX, RX and GND connections. In this manner, you can essentially program and test the Si4844-A10 “in circuit”, which facilitates development and experimentation. When completed, however, the connection can be eliminated for a stand-alone multiband radio. Powering both the radio board and the Arduino must be with an external 3.3v regulated power supply. Do not try to power them using the USB/serial board, even if it has a 3.3v output pin— these cannot be depended upon to have the capability to provide the necessary current to drive both the Arduino and the Si4844-A10.

### Testing the Basic Circuit

Once you have the circuit bread-boarded, the Arduino connected, and the amplified speakers attached, you can run a test program that is included in this article (Si4844_Quick_Test.ino). The program performs a simple test of the circuit that will power up the device, set the band to FM, and provide the chip’s version information. If all goes well, you should be able to tune the radio by turning VR1 and you will see the frequency dynamically displayed on the screen – and, of course, hear the radio output.

##### Screen capture of the test program

Once the basic circuit and Arduino connections are functional, construction of the full-featured radio can proceed.

### Arduino Programming

The Si radio chip in this project is an I2C slave device having a fixed address of 0x11, with the Arduino as the master device. The I2C communication speed of the chip, however, is relatively slow with 50 kHz as the maximum supported speed. Moreover, during a portion of the power up procedure, the speed must not exceed 10 kHz. To meet these requirements, we have to explicitly set the Arduino I2C speed, which is normally too fast for the Si4844-A10. Fortunately, aided by the wealth of documentation on Arduino I2C functions, we can easily accomplish the necessary changes.

Basically, I2C speed, for our purposes, is determined by two dedicated variables in the Arduino software. Those dedicated variables are TWBR and TWSR. Bit 0 and 1 of TWSR control a prescaler that works with the value of TWBR to set the I2C speed. The speed (clock frequency) of the I2C transmissions is calculated by: Frequency = CPU Clock frequency / (16 + (2 * (TWBR) * (Prescaler)). The Arduino Pro mini 3.3v runs at 8 mHz. To set I2C speed to 10 kHz, we use a TWBR value of 98 and we set the prescaler to 4 (by setting only bit 0 of TWSR). Thus, 8,000,000 / (16+(2*98 [TWBR value]*4 [prescaler]))=10,000 or 10 kHz. To set the I2C speed to 50 kHz, we use a TWBR value of 18 and we set the prescaler to 4 (by setting only bit 0 of TWSR). Thus, 8,000,000 / (16+(2*18 [TWBR value]*4 [prescaler]))=50,000 or 50 kHz.

See Nick Gammon’s excellent repository of Arduino I2C information and the Arduino Library documentation for more information on this process. The bottom line, however, is that we can accomplish these I2C speed changes in just a couple of lines of code and you can see those in the test program.

Another important programming consideration is that we need to use an external interrupt service routine in our code. You can read some background on the use of external interrupts here. We use INT0 on the Arduino and, basically, when that pin is set high by the Si4844-A10, the program will execute a simple routine that has been “attached” to the interrupt. All the routine will do is set a flag variable that can be examined and changed in other parts of the code. The Si4844-A10 will issue interrupts (i.e., bring the INT pin high) under certain conditions, most notably when the tuning potentiometer has been changed. Therefore, the Si4844-A10 tells the Arduino that you have moved the tuning knob and that the frequency display should be updated.

### Si4844-A10 Programming

Essentially, the Arduino sends the radio chip commands over the I2C bus and the radio chip subsequently replies to the commands by performing the requested action and returning status information. The Si chip can operate in several modes and some make it possible to configure some very detailed radio bands and properties. In this project, we are using the Si4844-A10 chip in a mode that accepts pre-defined or default radio bands with default properties. This mode was chosen because it easily accommodates a great deal of basic functionality while still offering a degree of customization.

Rather than simply setting an AM/FM/SW “register”, the radio chip can be set to one of 41 different frequency bands. Bands 0-19 are FM, 87-109 mHz; bands 20-24 are AM, 504-1750 kHz; bands 25-40 are SW, 5.6-22.0 mHz. The bands, however, do not have simple equal-interval spacing, which might make tuning cumbersome. Instead, the frequency range of many of the bands are the same or differ only slightly, but with differing properties, such as de-emphasis (FM) or channel space (AM), stereo separation (FM) and RSSI thresholds. Consultation with the referenced datasheets and application notes is necessary to completely understand this scheme and you will see some clear tables for the bands as well as all of the modes, programming commands, and the status and reply formats.

In this project, the included software will enable access to all of the default bands as well as controlling basic properties including mode changes (AM/FM/SW), volume, tone, and mute.

To control the radio, we need an input device. A simple membrane keyboard as pictured is sufficient for our purposes. These have been around for a while and are easy to interface with an Arduino. While I have illustrated the row and column orientation for the one that I used, you should verify that yours is the same.

Row 1 D8
Row 2 D9
Row 3 D10
Row 4 D11
Col 1 D13
Col 2 D14
Col 3 D15

For keypad software, I used the library from Mark Stanley and Alexander Brevig which is released under the GNU General Public License. For the project, we will map functions to the keys as illustrated below.

• AM : Switch to AM mode, band 22
• FM : Switch to FM mode, band 8
• SW : Switch to SW mode, band 31

Note that the default bands under the mode changes are configured in software and are easy to modify. Additionally, the current volume and tone values will be carried over in the new mode.

• Vol+ / Vol- : Increase or decrease the volume by one step. There are 64 levels of volume. Because of the use of amplified speakers in the project, these are not so essential but are still nice to have.
• Band+/Band- : Increase or decrease the band by one step, but within the available bands in the current mode.
• B/T+ / B/T- : Increase or decrease the tone by one step. I admit that I am being somewhat liberal in my use of the term “tone”. For the FM mode, this will increase or decrease the bass / treble level from 0 (max bass) to 8 (max treble). For the AM/SW bands, this will set a channel filter from 1-7. The filters are at 1.0 kHz, 1.8 kHz, 2.0 kHz, 2.5 kHz, 2.83 kHz, 4.0 kHz, and 6.0 kHz, respectively. Note also that for simplicity and programming convenience (i.e., laziness), levels of 0/1 and 7/8 can be made in AM/SW mode, but do not differ.
• Mute: Toggles audio output on and off.

With the input device set up, we need to be able to display the settings of the radio. I can think of no better screen to use with this project than one from the old Nokia 5110/3310 cell phones. I had a well-used one of these around (see pictured) and their old-school charm seems particularly appropriate.

##### Nokia display

There are two important points to consider when interfacing this display. First, there are several varieties of these displays available and they can have different pinouts. You should verify the pin connections on yours to make certain that it is, in fact, a 3.3v device and that it is attached to the Arduino Pro Mini correctly. Second, because all of the I/O on the Arduino used in this project is 3.3v, I did not have to use the dropping resistors that you usually see when these screens are used with 5v flavors of Arduinos, like the UNO.

Display Pin / Function Arduino / Circuit
1-RST D3
2-CE D4
3-DC D5
4-DIN D6
5-CLK D7
6-VCC Vcc (3.3v)
7-LIGHT GND
8-GND GND

For software, I chose to use the LCD5110_Basic library available under the CreativeCommons license. This library is mature, very easy to use, and fast.

Pictured below is the populated radio display in use:

Starting from the top left, we display:

Row 1- Mode (AM/FM/SW) and the band number

Row 2- Band frequency range

Row 3- Volume and base/treble levels

Row 4- Current frequency (mHz or kHz)

Row 5- Stereo indicator (FM only) and mute (if on)

Of course, this information is constantly updated to represent changes from tuning or keyboard input.

Depicted below is the assembled project on a breadboard – perhaps not as neat as it could be (ok, it’s a mess), but completely functional. Certainly the performance can only improve by a more permanent layout.

The software to run the radio is available for download below. It is liberally commented and is, hopefully, both easy to understand and easy to modify, if desired. The main loop in the software is straightforward. It 1) checks and displays any change in the tuner frequency and 2) checks if a keypress has been made and, if so, executes the appropriate command. The rest of the program consists of all of the supporting functions.

I am very impressed by the reception that the circuit is able to achieve right on the breadboard. FM is very good. AM is good and I am able to get quite a few SW broadcasts. Nevertheless, reception can, undoubtedly, be increased through the use of specialized antennas.

### Closing Thoughts

This has been a challenging and enjoyable project. I am definitely impressed by the Si4844-A10 chip. There is a great deal of capability packed into a single chip and that always amazes me. I feel like I have only touched on the possibilities— but, hopefully, this project can serve as a foundation if you are interested in experimenting.

### Code

Si4844Software.rar

Give this project a try for yourself! Get the BOM.

### You May Also Like

{if error} {error_text}
• E
Erik Burman June 13, 2016

You BOM doesn’t specify which parts are SMT and which are through hole. It’s difficult to make out all the detail in your breadboarded circuit photo. There are two boards at the top of the photo each with SMT parts. I’m guessing that they are part of the antenna circuits?  Can you please clarify? Also, what crystal did you use for Y1? There’s lots of possible choices. Can you tell me which part number you used (Digikey or Mouser)? Thank you.

{if logged_in} Like.
• R
Raymond Genovese June 14, 2016
Hi, I used four SMTs on the project as follows (schematic name, description, Mouser part number): L1, 270 nH (.27uH) Inductor, 652-CS160808-R27K B1, ferrite bead 2.5 kOhm (100 mHz), 81-BLM18BD252SZ1D C12 and C14, 33 nf non polarized capacitor, 603-CC805KRX7R9BB333 The crystal I used: Y1, 32.768 kHz crystal, 732-C002RX32.76K-EPB Hope this helps and, if you do build the project or something similar, please let me know how it went for you - I always like to hear about that, including any improvements. - RFG
{if logged_in} Like.
• E
Erik Burman June 14, 2016
Thanks! That helps a lot! I'll let you know how it all works out. Although, now I'm considering just getting the SI4844-B-DEMO demo board through Digikey. It's not very expensive. Or maybe I'll try doing both. Silly me!
{if logged_in} Like.
• E
Erik Burman June 14, 2016
Thanks! That helps a lot! I'll let you know how it all works out. Although, now I'm considering just getting the SI4844-B-DEMO demo board through Digikey. It's not very expensive. Or maybe I'll try doing both. Silly me!
{if logged_in} Like.
• K
keepitsimplestupid June 14, 2016

Your units are a bit off 87.5 mHz is mill-Hertz.  MHz is Mega-Hertz.  Proper names generally capitalized.

m=milli, M=Mega

Cool though.

{if logged_in} Like.
• R
Raymond Genovese June 14, 2016
You are correct. Thanks for pointing that out.
{if logged_in} Like.
• Aviv Weinstein June 25, 2016

Hey Raymond,

I am attempting to re-create this project and I have a few questions I was hoping you could answer.

1) How did you make your whip and ferrite antennas? Is there an online guide you recommend following? I do not know what you mean/meant when you say you took an old antenna from an AM/FM radio.
2) From which vendor did you order the Si4844 A-10 from? All vendors I have found offering this chip have lead times of a month or longer.
3) Looking back at building this circuit, do you have any general tips to someone trying to rebuild it?

{if logged_in} Like.
• R
Raymond Genovese June 26, 2016
Hi, The telescopic/whip antenna that I used was from my junk box - usual kind of collapsible antenna that you find on so many radios. If you search for "telescopic antenna" you will see plenty of pictures of these. The one I am using has an extended length of maybe 20" or so. People do make their own ferrite antennas and if you search for "ferrite antenna" there is plenty of material. I reclaimed one from a "discarded" radio. The one I used that you see pictured is pretty cheap. If you look at Si's design guide that I linked to in the article, they provide information on the kinds of ferrites that they recommend (p. 29). I also saw these available online for sale, but I was able to get a very used, beat up radio at a thrift shop locally for only a few bucks, so I went that way on a gamble and it worked out. I purchased the chip from either Mouser or Digikey (I can't remember at the moment but it was definitely one of the two) and you are absolutely right, both are currently out of stock (I just looked), but they both say that they are on order. You might be able to find one somewhere else, but I don't know where, off hand. A general tip looking back? Well, if it interests you then go for it! I was amazed that it all works well and I was listening to it this morning. I am also confident that someone else can not only build it, but improve on the design. I'm also a little embarrassed to say that it is still on the breadboard :) Hope this helps.
{if logged_in} Like.
• Aviv Weinstein June 30, 2016
Hey Raymond, Thanks a million for the informational reply! I am interested in this project as it seems like a fun thing to try. I've ordered the parts you recommended in this article and I will attempt to get a "large scale" version of this radio put together and in working order. With a working system, I will then attempt to design as PCB for this circuit and its peripherals and see if I can make a portable version of this.
{if logged_in} Like.
• Safei Eldin Moustafa October 24, 2016

can i use Arduino Uno R3 with SI4448-A10 instead of Arduino Pro Mini ?

{if logged_in} Like.
• R
Raymond Genovese October 24, 2016
It is not impossible but not really advisable in my opinion. A big issue is that the UNO is a 5v board with 5v I2C. The SI4448-A10 is 2-3.6v.
{if logged_in} Like.
• V

It inspires me to start doing the similar board, but I have chosen SI4735-D60 chip. It has wider bandwidth and some other minor differences, but should work as well.
I would like to point to small mistake that you can fix—connection RST to Arduino uses D10 (pin 12). D12 you mentioned at the table does not exist.

{if logged_in} Like.
• R
Raymond Genovese January 11, 2017
Hi, thanks much for the kind words and best of luck with your SI4735-D60 chip. I think that table is correct. If you look here https://cdn.sparkfun.com/datasheets/Dev/Arduino/Boards/ProMini8MHzv1.pdf you will see D12 which connects to the SI RST as per the table and the program code.
{if logged_in} Like.
• T
Triki Dick January 31, 2017

I am a totally new, but I would love to build something like this.

Would this be a good place to start?  If I had the parts list, I would probably order parts and begin learning!

{if logged_in} Like.
• R
Raymond Genovese January 31, 2017
Hmmm, well everybody finds their own way, but I'm not sure that I would say that this is a good first project. If you are totally new then I guess it might be better if you started with a simpler Arduino project to gain some experience.
{if logged_in} Like.
• T
Triki Dick February 01, 2017
Perhaps your correct. I was looking at the bread board in more detail and there would need to be some more clarification. I have copied and pasted the information to work on it in the future. I was trying to find some of the parts on Mouser last night and that proved to be harder than I was expecting. I would love to attempt this when I get a little more comfortable.
{if logged_in} Like.
• Derek Fronek April 24, 2017

Are the SCLK and SDIO lines supposed to be connected as shown in the schematic? Near R2 on the schematic the two connect at a junction, is this intentional or are they supposed to remain as independent connections?

{if logged_in} Like.
• R
Raymond Genovese April 24, 2017
No, that is an error in the schematic. I apologize for not seeing it. Both SCLK and SDIO have pull-ups but there should be no connection *between* these two lines. Thank you for catching that. This article was a while ago but I will see if I can get it change and also see if I can post a new schematic here.
{if logged_in} Like.
• Derek Fronek April 25, 2017
Thank you for replying so quickly, i had nearly ordered a batch of PCBs containing this error before I noticed the issue. I appreciate the swift response and the informative as well as easy to follow nature of this project, Thank you
{if logged_in} Like.
• R
Raymond Genovese April 24, 2017

****** There is a small error in the schematic for the project *******
The SDIO and SDCLK lines each have pull-up resistors but there should be NO connection between them. There is an erroneous small wire connection on the schematic (near R2) that should not be there. You can get a corrected version of the schematic on my blog on this site https://forum.allaboutcircuits.com/xfa-blogs/raymond-genovese.327039/

{if logged_in} Like.
• tim yb April 25, 2017
The schematic should be updated now :)
{if logged_in} Like.
• R
Raymond Genovese April 26, 2017
The schematic in the article is now corrected, Thanks @tim yb
{if logged_in} Like.
• Thomas Mohr May 01, 2017

This is a great project and I dove into it head first after running through the Spark Fun Inventors Kit..  Learn Arduino, I2C, AND SMT soldering?  Great fun.  I’m running into a problem maybe some folks following this project might quickly see my error.  Band Mode, Band Index, and Frequency are not getting properly set and chip info requested just returns the same ASCII charchter..  See the serial print out below from the SI4844 Quick Test sketch.  I double checked wiring but think maybe my ancient XP machine might not be compiling the program correctly.  I had similar problems with some of the Spark Fun programs.  I could not get the program to compile after I uncommented the section to see response bytes.  But this change did compile if I set the processor to ATMega 5v 16 MHz.  I’m running all this on an XP PC, the Arduino is the SparkFun Pro Mini AT Mega 8 Mhz 3.3v.,  other settings info….Arduino 1.8.1, Board= Arduino Pro or Pro Mini,  Processor=ATMega 328 3.3v 8MHz.,  Programmer= Arduino ISP.org.
Any thoughts?  Please no need to take up a lot of your time but if there’s something obvious please let me know.  Meanwhile I’ll try this on a more recent machine and read up on I2C.  Thanks in advance.

SERIAL PRINT OUT
...sending ATDD_GET_STATUS
...completed - tuner information is ready
Band Mode is 3 [0=FM 1=AM 2=SW]
Band Index is 31 [0-19 FM / 20-24 AM / 25-40 SW]
Tuner Frequency (mHz)= 151515.15

Chip information…
Final two digits of part number: 255
Firmware revision: ÿ.ÿ
Component revision: ÿ.ÿ
Chip revision: ÿ

Entering tuning loop…
151515.15
151515.15
151515.15
this repeats and the tuning pot has no effect on this number.

{if logged_in} Like.
• R
Raymond Genovese May 01, 2017
{if logged_in} Like.
• Thomas Mohr May 02, 2017
Raymond, Thanks for the prompt reply. Problem solved. I was so proud of my SMT soldering of the 4844 on to a carrier board. I had gotten a new tip for my awesome Hakko 888D and practiced drag soldering. It all looked so good. Yes, 62 yo hands CAN solder SMT, I thought. I tested the continuity to most of the pins and the reassuring tone of the tester validated my soldering pride. But note I tested some, but not all, of the pins. Heck if one side is good the other side must be good also, right? With the problems I was experiencing, I began looking for solder bridges that I may have missed and the fillet on pins 13 and 14 did not look quite right. Re-testing I found there must be a gap between pin and board pad on pins 13, 14, and 16. That's "only" the data and common pins! Firing up the Hakko with a needle point tip with spots of flux established proper continuity. Now firing up the apparatus got great results. Band and Band Index are set and the display shows a changing FM freq. when adjusting the pot. My eventual goal is to get the 4844 and Arduino to drive a large LED display and put it all into a 1940's Philco Art Deco style floor model radio. I think that style might be called Dieselpunk. Now that I got the test program running, we'll see how it all goes. Thanks again for the great project. TM
{if logged_in} Like.
• R
Raymond Genovese May 02, 2017
{if logged_in} Like.
• Derek Fronek May 09, 2017

I have noticed the repeated mentions of wanting to get this project off the breadboard and onto something more permanent, so following the schematic, and adding an on board amplifier i created a pcb for this project. Hopefully this should help in the progression of this radio. I have not fully tested the design and any comments on the schematic would be helpful for improvement.  https://drive.google.com/open?id=0B2xxWqNXgGS0MW1oY09zZFlISEE

{if logged_in} Like.
• R
Raymond Genovese May 10, 2017
Nice! I was wondering about the amplifier chip....it looks like an AN7142. I have never used that chip. I looked it up and noticed that it has a tabbed heatsink. Is there enough room on the board to accommodate that heatsink? Did you use a different amplifier?
{if logged_in} Like.
• Derek Fronek May 10, 2017
Thank you for catching that mistake, i have not yet completed the board, and the file for Eagle did not include this heat-sink in the layout for the AN7142, i have changed this by adding more room to accommodate the heat-sink.
{if logged_in} Like.
• T
TimMcClymont May 10, 2017

Firstly great project Raymond, I was interested in it enough to head out and buy all the associated chips and SMD components. Initially I breadboarded the radio with next to no external components (read ferrites or RF chokes etc) with enormous success. Following this I decided to design a single sided SMD pcb for the full circuit.
Unfortunately that is where my issue arises.
Following re-programming of the arduino using the test program, the board flashes up perfectly and crisp FM audio is heard across the full spectrum all whilst the serial monitor delivers me tuning frequency updates.
If I attempt to program the arduino with the full code (the same version I used when the circuit including lcd was breadboarded) the SI4844 fails to flash up and produce audio. The only indication that the circuit is working is that the LCD displays ‘BAND, VOL:, B/T: 123.4MHz’ etc but with no data.
When compiling the full radio program I’m presented with a large number of::
“deprecated conversion from string constant to ‘char*’ [-Wwrite-string…..” type errors for all the LCD commands. However the program still compiles and uploads just fine?

I’m tearing my hair out here, obviously the SI4844 works fine based on the test program and producing audio, as does the LCD (as it displays basic text), but the combination doesn’t seem to have any joy.

Would love to hear your thoughts.

{if logged_in} Like.
• R
Raymond Genovese May 10, 2017
It makes no sense - which is, of course, how all these things appear before you figure them out :) If I understand, you never had the full version (all components) on the breadboard, you could have some kind of wiring error - that's one possibility but it would have to show up with the LCD and not the test program. I would suggest triple checking how the LCD is connected and make certain that some demo programs using the Arduino and the LCD are working as you expect. The deprecated conversion warnings should not be there in the sense that I never saw them. I used version 1.64 or 1.65 of the Arduino IDE. I don't know, but the warnings may be related to the to the LCD library. You can look up that conversion warning online. I used version 2.13 of the LCD driver and I don't think it has been updated, but I suspect that you are using a different version of the Arduino IDE. Can you go back to Arduino IDE 1.64 or 1.65 and try to recompile and see if that produces any changes at all? The test program, of course, does not use the LCD library. This is another reason to see if you get those warnings using the library with some other program not involving the hardware other than the LCD and the Arduino itself (maybe a demo program included with the library). Divide and conquer. Please keep me updated
{if logged_in} Like.
• T
TimMcClymont May 14, 2017
Crisis averted! On closer inspection, a simple error was made whereby pin 5 on the SI4844 was sent to ground rather than VCC causing issues when the full program was loaded. When compiling I still see the deprecated conversion warnings however the program runs just fine and uploads. I now have full functionality of the radio. A word of mention, I found that using a 3K7 resistor for R8 gave me a better sweep of frequencies between 87 - 108 MHz. Thanks again Raymond, I've enjoyed fiddling around with the SI4844 with the aid of your project. Its certainly been an interesting learning curve.
{if logged_in} Like.
• R
Raymond Genovese May 15, 2017
Good deal! Glad you got it working and thanks much for the kind words.
{if logged_in} Like.
• Amir B June 06, 2017

Hi Raymond, this project looks amazing. How do you rate the the reception quality, sensitivity and selectivity of the receiver?

{if logged_in} Like.
• R
Raymond Genovese June 07, 2017
Hi and thanks for the kind words, Having used it for a good while now, I remained impressed as I mentioned in the article. I know that these characteristics depend, to a large extent, on where you are but I would rate the FM reception as excellent and the AM as very good. At night, I can get several SW stations reliably - of course not as well as the FM stations (that would likely be improved with a specialized SW antenna). I would have preferred a multi-turn tuning potentiometer as small turns result in large tuning changes, but I got used to that quickly. In general, I much prefer this unit's performance to my preexisting table top set.
{if logged_in} Like.
• B
bparke June 22, 2017

I’m new to this, but I want to try and build your project.  I printed off your parts list, but I wonder if it would be possible for you to include part numbers of the components you used.  There seems to be so many options that I’m not sure if I’d be ordering the right part.  Thanks so much for posting this project.

{if logged_in} Like.
• R
Raymond Genovese June 22, 2017
Hi and thanks for reading the article. Earlier in this list of comments, I identified the part numbers for the surface mount components and the crystal. Apart from that, the rest are fairly standard parts that can be had from Digikey or Mouser - antennas aside (see comments and article text about them). Being new to this as you say, I guess it can be a little daunting. I don't have a list of product numbers for each part, but if you have a particular question about some specific part, let me know and I will try to answer.
{if logged_in} Like.
• KIKO Vava July 28, 2017

Hi Raymond,
This was a fun project building but I have run into a problem, when the run the quick test, I get the following;
...setting I2C speed to 10kHz
...resetting Si4844
Si4844 reset complete
...sending ATDD_POWER_UP with band set
Si4844 ATDD_POWER_UP completed
...setting I2C speed to 50kHz
...sending ATDD_GET_STATUS
...completed - tuner information is ready
Band Mode is 0 [0=FM 1=AM 2=SW]
Band Index is 0 [0-19 FM / 20-24 AM / 25-40 SW]
Tuner Frequency (mHz)= 108.0

Chip information…
Final two digits of part number: 44
Firmware revision: 1.0
Component revision: 1.0
Chip revision: A

Entering tuning loop…
108.0
108.0
108.0
108.0
108.0
108.0
108.0
108.0
108.0
108.0
108.0
108.0
107.7
108.0
108.0
108.0
108.0
108.0
108.0
And sometimes it gets stuck on 108.0, what could be the problem here?
Simon G.

{if logged_in} Like.
• R
Raymond Genovese July 28, 2017
Hi, I don't know. It is odd, because to get that far, it seems that a lot of things should be working ok. You might want to look at the potentiometer very carefully. If that is bad mechanically or the connection is bad, you might see something like that in the tuning loop. But once you enter the tuning loop, you should be able to turn the tuning potentiometer and see the frequency numbers change. You may even want to try a different potentiometer if you have one handy. Hope this helps.
{if logged_in} Like.
• Derek Fronek August 14, 2017

{if logged_in} Like.
• R
Raymond Genovese August 14, 2017
My radio has been used almost daily for the last 15 months or so and it has never stopped working or locked up or anything like that. So, I'm not sure what approach to take in the way of advice. That being said, here are some thoughts. You mentioned that you had the code working, so, as an observer, I am immediately thinking - well what is different now? Did you rewrite any code? Did you test using the original archive version. I am using the code as I originally compiled it using Arduino 1.6.4 or maybe 1.6.5. Is it possible that something has changed in that regard - assuming you are using a newer version. You might want to recompile with an older version and test that. I am using a "genuine" Arduino Pro Mini 328 - 3.3V/8MHz from Sparkfun. Are you using the same or a clone. If the latter, can you test with a real Pro Mini? If it is stopping at Wire.endTransmission, that is a real clue. Wire.write() does not actually write the data, it cues the data and it gets written with Wire.endTransmission. If it is stuck there, then an I2C transmission error is what you may be seeing. Is your power clean? The section you are suspecting is bring the radio up at the slowest I2C speed (10khz) and then sets it to 50khz. Those speeds are accomplished by changing timer values in the Arduino. I think my calculations are correct, but they are based on an 8Mhz speed, so small difference could potentially cause some problems. The Quick Test code and the full radio code is essentially the same at the point you are talking about. So why a problem in one and not the other? It's strange, but then these always are. If you have a scope, it would be helpful to see the I2C signals at that point. There are some alternatives to Wire and you might try one of those. Wire.endTransmission returns a value and you might want to print that out in the program at that point - see https://www.arduino.cc/en/Reference/WireEndTransmission. R1 and R2 are the pullup resistors for the I2c lines. I used 2.2K - you could try 4.7k. If you search for "wire.endTransmission hangs" you will see a lot of hits - check through those and see if any sound like they could be going on. I'm just throwing things out there, but again, I haven't seen this behavior. Something is going on, now we have to find out what.
{if logged_in} Like.
• Derek Fronek August 16, 2017
I appreciate the quick response, but after unsuccessfully testing the code on arduino 1.64 i was able to get the original sketch to work with the modification of having the response byte displayed from the SiGetBand section. unfortunately, i was unable to reproduce this on the other arduino radio setup that i have(which is also the original setup. I am not sure why this seemed to fix the problem on only one of the radios, as both still work with the test script. I have also tested an I2c scanner, and both radios to show up on the same address. Any ideas would be appreciated. Thanks
{if logged_in} Like.
• R
Raymond Genovese August 16, 2017
I don’t know. What you are describing is, indeed, odd. You said, “i was able to get the original sketch to work with the modification of having the response byte displayed from the SiGetBand section”. You mean the response byte from Wire.endTransmission()? Was the response byte a 0 for ok? My gut is telling me that it is I2C related. BTW, when I mentioned changing the pull-up resistors, I think I was going the wrong way – changing to 1.5K makes more sense than going to 4.7K. After I saw your last message, I did some playing around. I have a second Sparkfun Arduino Pro Mini, 3v/8Mhz and also a DIY clone. Both were unused. I recompiled the original code with the original libraries for keypad and display, but using 1.82. Both compiled fine and both ran fine. The only thing that I noticed was that the display for the AM band had a minor issue – it did not do display a leading space and instead displayed a graphic. Everything else was fine. These boards do not use a crystal, but instead use a ceramic resonator that is not as accurate. If the resonator gets too far from 8Mhz, you could, potentially, have I2C communication problems. Slowing I2C speed to 10kHz and 50kHz is needed and you can see those routines and the text in the article shows exactly how I am setting the speeds. It’s a long shot, but you could try moving the divider values up or down by a few counts. Beyond that, I just don’t know. As I recall, you made a board and I guess you have to consider that something is flakey there – bad component, cold solder joint, something like that – or, something neither one of us has thought of, yet.
{if logged_in} Like.
• YuM mo September 20, 2017

Great project - do you have a rough price list of how much it cost you ?

{if logged_in} Like.
• R
Raymond Genovese September 20, 2017
Thanks, it's still work very well. Sorry, I don't have the prices of the BOM. The Arduino Pro Mini 3V is ~US$10. The Si chip was about$12 or so when I bought it as I recall, but it is getting hard to find. The display is, maybe \$5. You have to scrounge up the ferrite, but they are around. The rest are basically low-priced, nothing special, components.
{if logged_in} Like.
• William Watkins March 05, 2018

Hey Raymond, I’m trying to just make an AM radio. Do I only have to have the AM antenna with the capacitor? That is, do I have to have the circuit that connects the FM radio antenna as well?

{if logged_in} Like.
• R
Raymond Genovese March 06, 2018
Hi William, I don't know for sure. My thinking is that you could probably leave out the FM antenna section and it will still work hardware-wise. Software-wise, however, there would be problems as written since all three bands are used. You could also probably write your own specialized software. Is there no other AM only chip with a simpler design? Si does make a AM-FM chips Si4822/27 that might be easier to use. Good luck and please let us know how it works out for you.
{if logged_in} Like.
• R
rocketbob November 22, 2018

Hi Raymond,

Curious if the Si4844 will tune outside its published frequencies, like AM aircraft or 2m ham bands.

{if logged_in} Like.
• R
Raymond Genovese November 22, 2018
Hi. AFAIK, no.
{if logged_in} Like.
• N
nkp1215 December 03, 2018

Hello, I’m attempting to remake your circuit for a project in a radio lab. (No rush its just the night before my presentation) and I’m having some problems. So I’m only running the Test code, ideally, this should work with just the circuit correct, no keypad or LCD? Well, When I run this program the serial monitor only prints out until “resetting si4844” nothing else happens, no tunes being amplified.

Ok so background, We made a 120nh inductor, we are using two 8kohm speakers, an Arduino Mega, and two pizza box antennas.

{if logged_in} Like.
• R
Raymond Genovese December 03, 2018
Well, since you typed in all caps, I will try to help you :) I also just finished eating two expertly prepared toasted Ham and Cheese sandwiches when I got the notice. But I am not sure that will be of much help to you. You are using a 5V Arduino where I used a 3.3V Arduino and, of course, the Si chip is 3.3V. So, how have you dealt with that issue? I used an 8MHz Arduino and the Mega is a 16Mhz Arduino. That means that you can't use the same math (see the detailed calculations) to achieve the very slow I2C clock to communicate with the chip. I'm too lazy to check if the Mega I2C clock works the same way, but if it does, you have to adjust those calculations. , How have you dealt with that issue? Please reply fast, I may have to take a nap soon :)
{if logged_in} Like.
• N
nkp1215 December 04, 2018
Thank you for responding. I'm not sure when you replied to this because I didnt get a notification but I hope I'm responding in a timely manner. The Mega has a 3.3V supply and a 5V so I used the former for that problem. I will redo the math calculations for the 16Mhz. Is there anything else I need to consider? Again, Thank you so much!!
{if logged_in} Like.
• R
Raymond Genovese December 04, 2018
Hi. Although the Mega has a 3V supply pin, the GPIO (which connect to the RST and INT) and the I2C lines (SDA and SCL) are 5V and that is a problem that needs to be addressed in my opinion...as stated previously. An additional consideration concerns the audio output of the Si chip. You stated that you are using two "8kohm" speakers. I think you are probably using 8 ohm speakers, but I don't think that the Si chip can be expected to drive those speakers directly. Note that I used an amplified set of speakers. You likely will need to send the audio out of the Si chip to an amplifier and then to the speakers. There certainly can be other issues as you are using a different microcomputer board, but those are the ones that jump out. Even if you miss your presentation deadline, I do hope you stay with it and get your radio up and working. Good luck with the project.
{if logged_in} Like.
• N
nkp1215 December 04, 2018
I will consider and try to account for the things you mentioned and hopefully, I'll see improvement. I plan to continue working on this after my project deadline as I would like to see it finished. -Thank you
{if logged_in} Like.
• T
talexander February 19, 2019

I am working on this project with an Arduino Uno. I am using a logic level converter (5v to 3.3v) for the SDA, SCL, INT, and RST pins (Sparkfun). I also converted TWBR=198 for 10kHz and TWBR=38 kHz for 50kHz to accommodate for the kHz vs 8kHz difference. I went over the updated circuit three times and it is exactly the same as the picture (updated). In addition, every solder joint has continuity. I saw a previous comment with a similar issue and made sure that the pins were properly soldered. Please help ASAP!! I am pulling my heir out and getting the following message:

*** Si4844 Quick Test **
...setting I2C speed to 10kHz
...resetting Si4844
Si4844 reset complete
...sending ATDD_POWER_UP with band set
Si4844 ATDD_POWER_UP completed
...setting I2C speed to 50kHz
...sending ATDD_GET_STATUS
...completed - tuner information is ready
Band Mode is 3 [0=FM 1=AM 2=SW]
Band Index is 31 [0-19 FM / 20-24 AM / 25-40 SW]
Tuner Frequency (mHz)= 151515.15

Chip information…
Final two digits of part number: 255
Firmware revision: ⸮.⸮
Component revision: ⸮.⸮
Chip revision: ⸮

Entering tuning loop…
151515.15
151515.15
151515.15
151515.15
151515.15
151515.15
151515.15
151515.15
151515.15
151515.15
151515.15

{if logged_in} Like.
• R
Raymond Genovese February 20, 2019
Hi, I can't see how your hookup looks and that is very challenging. If you have or can get a ProMini 3.3V, use it instead of the UNO. The project was designed with the ProMini and this would at least tell us whether there is something about your board or something different about the UNO that we are missing. Failing that, I think that you are close, but it does not look to me like you have been able to establish I2C communications with the chip. If you have an O-scope, you may want to look at whether the Si is responding. There is a Forum associated with the site. If you want, you can start a topic there and include (attach) your modified program listing and some good pictures of your layout, including the level shifting. I can take a look and maybe we can get this up and working.
{if logged_in} Like.
• T
talexander February 20, 2019
{if logged_in} Like.
• 凌飞云 July 14, 2019
Hi, I have the same problem. Have you solved it?If so, can you tell me how you did it?
{if logged_in} Like.
• T
tarbear2468 May 16, 2019

can you make this using a arduino Nano?

{if logged_in} Like.
• T
tarbear2468 May 16, 2019
can you use a 5v pro mini?
{if logged_in} Like.
• R
Raymond Genovese May 17, 2019
If you understand the code well and you are able to understand the differences between the 3.3V used in the project and any 5V processors, you might. If you do not understand all of the changes necessary, you are better off using what is used in the project.
{if logged_in} Like.
• 凌飞云 May 30, 2019

Why doesn’t my window monitor go down here？And how do I choose FM？

*** Si4844 Quick T…setting I2C speed to 10kHz
17:49:04.452 -> ...resetting Si4844
17:49:04.452 -> Si4844 reset complete
17:49:04.452 -> ...sending ATDD_POWER_UP with band set
17:49:04.452 -> *** Si4844 Quick Test **
17:49:04.452 -> ...setting I2C speed to 10kHz
17:49:04.452 -> ...resetting Si4844
17:49:04.452 -> Si4844 reset complete
17:49:04.452 -> ...sending ATDD_POWER_UP with band set

{if logged_in} Like.
• R
Raymond Genovese May 30, 2019
I don't know. Assuming that I understand what you are asking and that you have 'Autoscroll' checked (in the monitor window), it does not appear that you are able to run the testing program successfully. If that is the case, you would have to solve that issue first and the first place I would look to do that is a wiring error. As for how you go to FM, the testing program does that. In the main program, you go to FM via the keypad as clearly explained. You can also see how I am doing this in the source code and of course, some understanding of the data sheets for the chip.
{if logged_in} Like.
• 凌飞云 July 14, 2019
Thanks for your help. I solved the problem by repeatedly disconnecting and reconnecting to the SDIO port, but I don't know the reason for the success of this.AND a new one has arisen.I have the same problem as talexander. *** Si4844 Quick Test ** ...setting I2C speed to 10kHz ...resetting Si4844 Si4844 reset complete ...sending ATDD_POWER_UP with band set Si4844 ATDD_POWER_UP completed ...setting I2C speed to 50kHz ...sending ATDD_GET_STATUS ...completed - tuner information is ready Band Mode is 3 [0=FM 1=AM 2=SW] Band Index is 31 [0-19 FM / 20-24 AM / 25-40 SW] Tuner Frequency (mHz)= 151515.15 Chip information… Final two digits of part number: 255 Firmware revision: ⸮.⸮ Component revision: ⸮.⸮ Chip revision: ⸮ Entering tuning loop… 151515.15 151515.15 151515.15 151515.15 151515.15 151515.15 151515.15 151515.15 151515.15 151515.15 151515.15 And the microcontroller that I use is arduino pro mini.Can you give me some advice?
Like.
• O
obulut August 29, 2019

Merhaba
Raymond Genovese,
col2 14 ? col3 15 ?

Like.
• O
obulut October 29, 2019

merhaba.si4844 yerine si4840 kullanıır mı?

Like.
• WJ6C May 31, 2020

Hi
I am very exciting after discover your work with this SiLab IC, but now I have more doubt than answer. I am amateur radio guy (WJ6C) and my priority is the HF SSB (High Frequency Single Side Band).Here is my question: Please let me know if I can use this chip to do an SDR SSB for the amateur radio band, ex.7.0-7.3 MHz. For my searching only the Si4826 and Si4824 can be used for HF(1-30 MHz).And add a little more I have found the pcb evaluation board with the https://www.semiconductorstore.com/,(BOARD DEMO SI4822-A10 SI4826-A10).Thank you in advance,73 JuanCarlos…

Like.