This tutorial is sponsored by Seeed Studio, Thanks. Products used:
- Seeeduino Nano (Arduino compatible board, similar to Nano)
- Grove – FM Receiver
Seeed is the IoT hardware enabler providing services over 10 years that empower makers to realize their projects and products. Seeed offers a wide array of hardware platforms and sensor modules ready to be integrated with existing IoT platforms and one-stop PCB manufacturing and Prototype PCB Assembly. Seeed Studio provides a wide selection of electronic parts including Arduino, Raspberry Pi and many different development board platforms. Especially the Grove Sytsem help engineers and makers to avoid jumper wires problems. Seeed Studio has developed more than 280 Grove modules covering a wide range of applications that can fulfill a variety of needs.
Hello and welcome to another simple tutorial by SurtrTech, this one is about radio stations receiving using Grove FM Receiver, the module is straight forward, it needs only power and some speaker/headphones to function and of course a good radio reception, it spares you all the demodulations, amplifications, oscillator stuffs…
It’s based on one single chip SX6119 with a tuning range of 64 MHz to 108 MHz, and it has one button that can turn it On/Off, tuning and volume control. and it comes with a grove cable.
Grove – FM Receiver Seeed Wiki

Test 1
Well, the test 1 is straight forward, just power the module using some DC power source 3.3V to 5V which makes it compatible with most boards, hook up some speaker/headphones and it’s ready to tune (Check the video for the test).
No special wiring is required, and no single code is needed.
Test 2
Now, if you turn the module you’re going to notice D1 and D2 pins next to Vcc/GND ones, those pins will give you the possibility to control externally the On/Off and tuning button, unfortunately there’s no volume control ones.

And this is where your Arduino board can intervene to control the radio as you want, add it to any project, like alarm clocks…. and basically any board that can generate a LOW level signal can control the module.
For our project I’ll be using Seeeduino Nano board, (if you don’t know how to install Seeeduino boards them check the video on this article), and you can of course use any Arduino compatible board with the following wiring and codes.
Wiring

The wiring is very simple 5V/Gnd to power the module, and D1/D2 just wired with digital pins, the buttons are also wired with Gnd/digital pins.
N.B: I’m using “INPUT_PULLUP” as pinMode for both push buttons, which means they are constantly on HIGH LEVEL and when I press the button it goes to LOW LEVEL, you can of course wire them with 5V/3.3V add some pull down resistors and set the pinMode as “INPUT”.
Code
P.S: I tried to read the buttons states and put it directly on D1/D2 (if the button is on High level –> High level will be on D1/D2 FM digital pins; same thing for low level), and so when I press it sends low level to the module to activate the function but it didn’t work !!
So in the code you’ll notice a function that deal with that. And here you can download the code or check below.
/* This code works with Grove FM Receiver * It permits to control the On/Off and tunning functions via the Arduino board * Refer to www.SurtrTech.com for more details */ #define B1 2 //D2 and D3 are used as push button inputs #define B2 3 #define DIFM1 4 //D4 and D5 are used as outputs to be wired with the module "D1" "D2" #define DIFM2 5 bool B1_state, B2_state; //To read the button current state, 0 or 1 void setup() { pinMode(DIFM1, OUTPUT); //pinMode setting pinMode(DIFM2, OUTPUT); pinMode(B1, INPUT_PULLUP); //The push button are wired with their pins as above and with GND, so here they are always on high level pinMode(B2, INPUT_PULLUP); //When you press it goes low digitalWrite(DIFM1, HIGH); //FM module pins are set on HIGH, otherwise a low level signal will be sent it will start the module at the beginning digitalWrite(DIFM2, HIGH); } void loop() { B1_state=digitalRead(B1); //Constantly reading the Button 1 and 2 state B2_state=digitalRead(B2); if(B1_state == LOW) //if one of them is pushed it calls the function below ButtonP(DIFM1); if(B2_state == LOW) ButtonP(DIFM2); } void ButtonP(int x){ //The function takes the name of the pin to activate as argument digitalWrite(x, LOW); //Sends LOW level signal for 3s then put it to high level delay(3000); //This was the simple and functionning way to simulate a long press //The low level signal couldn't be sent directly from the button --> Arduino --> module digitalWrite(x, HIGH); }
Result
This is a small preview, you can of course turn On and Off the module using the “red button” and tune using “blue” one. Now it’s easy to integrate it in any projects.
Big thanks to Seeed Studio for their sponsorship.