Combine the Si4844-A10 analog-tuned radio receiver with an Arduino to make a full-featured multiband radio.

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

Radio receiver schematic

Figure 1. The radio receiver schematic (Full sized schematic here)

 

Figure 1 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 on carrier board

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
IC1 Si4844-A10 radio receiver
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

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.

 

Add a Keypad

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.

 

Membrane Keypad

Simple membrane keypad

 

Keypad Arduino

Keypad to Arduino connections:

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.

 

Keypad mapping

Keypad mapping for the radio functions

Keypad Function Definitions:

  • 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.

 

Add a Display

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.

 

Nolia Display

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:

 

Radio display

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.

 

The Completed Radio

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.

 

Project Breadboard

The completed radio on a breadboard

 

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

Download the software for the project here:

 

  Download Code  


Comments

42 Comments


  • Erik Burman 2016-06-13

    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.

    • Raymond Genovese 2016-06-14

      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

      • Erik Burman 2016-06-14

        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!

  • keepitsimplestupid 2016-06-14

    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.

  • Aviv Weinstein 2016-06-25

    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?

    • Raymond Genovese 2016-06-26

      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 smile

      Hope this helps.

      • Aviv Weinstein 2016-06-30

        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.

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

    • Raymond Genovese 2016-10-24

      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.

  • vadimk 2017-01-11

    Raymond, thank you for this article!
    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.

  • Triki Dick 2017-01-31

    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!

    • Raymond Genovese 2017-01-31

      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.

      • Triki Dick 2017-02-01

        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.

  • Derek Fronek 2017-04-24

    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?

    • Raymond Genovese 2017-04-24

      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.

      • Derek Fronek 2017-04-25

        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

  • Raymond Genovese 2017-04-24

    ****** 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/

  • Thomas Mohr 2017-05-01

    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.

    • Raymond Genovese 2017-05-01

      I’m not sure what is going but it does not look like the I2C communications between the Arduino and the sound chip are working and that has to be resolved.

      When I originally wrote the article, I had a small error in the schematic that has since been corrected. That error resulted in a connection *between* the I2C data and clock lines. If that connection is on your board, the I2C will definitely not work. See an earlier post about this and check those two lines from the Arduino to the radio chip. Both lines have pullup resistors but they should not be connected together. The current schematic is the correct one.

      I don’t know what to think about the XP problems. I have encountered Arduino/XP issues probably related to the linker that XP uses and these have been known for a while and they are a big headache.  But, as I understand you, it doesn’t give you any compile errors at some point? - did you look at verbose mode to see if there are any relevant messages?

      As I recall, I used an XP machine to write those programs and the Board selected was “Arduino Pro or Pro Mini and the Processor selected should be ATmega 328 (3.3v, 8 Mhz). BTW: I am listening to that radio as I type and, yes, sadly, it is still on the breadboard as pictured smile

      Check the I2C lines and get back to us - Ok?  If that isn’t the problem, then, I would like to know the specifics of what you commented out to get it to compile, if that is the case.

      • Thomas Mohr 2017-05-02

        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


      • Raymond Genovese 2017-05-02

        @Thomas Mohr

        Terrific!

        Two things:
        I was also *very* proud of soldering the chip. I even forced two millennials to examine it under a magnifier, ostensibly to to check for shorts, but really so I could boast about how good of a job I did smile. I know exactly what you mean by “drag soldering” and, truthfully, it is nerve-racking and I think I am going to move to a hot air gun https://www.allaboutcircuits.com/projects/tools-techniques-hot-air-soldering-surface-mount-components/ or a toaster oven https://www.allaboutcircuits.com/technical-articles/introduction-to-manually-controlled-toaster-oven-reflow/ .

        The second part concerns your idea of putting it into an old Philco. VERY cool I think. I also had some vision of getting one of those old radio cabinets and building shelves inside with only one small part housing the radio (I say this with absolutely no woodworking skills). If you do get that far, please send a link to some pictures.

        Don’t know if I will ever get that far. First, I have to move it off of a breadboard and I tell ya, I’m running out of breadboards over here!

  • Derek Fronek 2017-05-09

    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

    • Raymond Genovese 2017-05-10

      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?

      • Derek Fronek 2017-05-10

        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.

  • TimMcClymont 2017-05-10

    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.

    • Raymond Genovese 2017-05-10

      It makes no sense - which is, of course, how all these things appear before you figure them out smile

      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

      • TimMcClymont 2017-05-14

        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.

      • Raymond Genovese 2017-05-15

        Good deal! Glad you got it working and thanks much for the kind words.

  • Amir B 2017-06-06

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

    • Raymond Genovese 2017-06-07

      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.

  • bparke 2017-06-22

    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.

    • Raymond Genovese 2017-06-22

      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.

  • KIKO Vava 2017-07-28

    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?
    Thanks in advance.
    Simon G.

    • Raymond Genovese 2017-07-28

      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.

  • Derek Fronek 2017-08-14

    Love this project and have been working to add my own touch for awhile now, but recently I have run into a problem where when i upload the full radio code, the radio refuses to work. I have had this code working in the past and have even made a second full radio circuit to see if something was wrong with the first, but alas both radios will not work with the full radio code now, but will function with the quick test. I have also tested with different arduinos, with similar results. To my knowledge the code seems to stop functioning at SiSetBand and will not finish the wire.endtransmission. Any advice would be appreciated, and i can give more information if it will help, thanks

    • Raymond Genovese 2017-08-14

      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.

      • Derek Fronek 2017-08-16

        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

        • Raymond Genovese 2017-08-16

          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.