Basic tutorial of how to setup a FM Radio Module (tea5767) with the Raspberry Pi.
PARTS:
RPI 3 B+ – https://amzn.to/2DcfywB
4 Amp Power Adapter – https://amzn.to/2Q77KPL
16GB Micro SD – https://amzn.to/2DaPZMF
FM Module – https://ebay.to/2CUeUmL
(ALT) FM Module – https://amzn.to/2DfDShp
SCHEMATIC:
5V >> 5V
SDA >> GPIO2
SLC >> GPIO3
GND >> GND
SETUP:
Enable I2c interface:
Type
sudo raspi-config
Select “Interfacing Options”
Select “I2C”
Select “Yes”
Save and Exit
Verify Module is detected:
sudo i2cdetect -y 1
You should see 60 in column 0
CODE:
#!/usr/bin/python3 #Reference code obtained from "https://www.raspberrypi.org/forums/viewtopic.php?t=53680" by user: LinuxCircle import smbus as smbus import subprocess import curses import curses.textpad import time i2c = smbus.SMBus(1) # newer version RASP (512 megabytes) i2c_address = 0x60 def init_radio(address): """initialize hardware""" i2c.write_quick(address) time.sleep(0.1) def set_freq(address, freq): """set Radio to specific frequency""" freq14bit = int (4 * (freq * 1000000 + 225000) / 32768) # Frequency distribution for two bytes (according to the data sheet) freqH = freq14bit>>8 #int (freq14bit / 256) freqL = freq14bit & 0xFF data = [0 for i in range(4)] # Descriptions of individual bits in a byte - viz. catalog sheets init = freqH # freqH # 1.bajt (MUTE bit; Frequency H) // MUTE is 0x80 data[0] = freqL # 2.bajt (frequency L) data[1] = 0xB0 #0b10110000 # 3.bajt (SUD; SSL1, SSL2; HLSI, MS, MR, ML; SWP1) data[2] = 0x10 #0b00010000 # 4.bajt (SWP2; STBY, BL; XTAL; smut; HCC, SNC, SI) data[3] = 0x00 #0b00000000 # 5.bajt (PLREFF; DTC; 0; 0; 0; 0; 0; 0) try: i2c.write_i2c_block_data (address, init, data) # Setting a new frequency to the circuit print("Frequency set to: " + str(freq)) except IOError: subprocess.call(['i2cdetect', '-y', '1']) def mute(address): """"mute radio""" freq14bit = int(4 * (0 * 1000000 + 225000) / 32768) freqL = freq14bit & 0xFF data = [0 for i in range(4)] init = 0x80 data[0] = freqL data[1] = 0xB0 data[2] = 0x10 data[3] = 0x00 try: i2c.write_i2c_block_data(address, init, data) print("Radio Muted") except IOError: subprocess.call(['i2cdetect', '-y', '1']) if __name__ == '__main__': init_radio(i2c_address) frequency = 101.1 # sample starting frequency # terminal user input infinite loop stdscr = curses.initscr() curses.noecho() try: while True: c = stdscr.getch() if c == ord('f'): # set to 101.1 frequency = 101.1 set_freq(i2c_address, frequency) time.sleep(1) elif c == ord('v'): # set to 102.1 frequency = 102.1 set_freq(i2c_address, frequency) time.sleep(1) elif c == ord('w'): # increment by 1 frequency += 1 set_freq(i2c_address, frequency) time.sleep(1) elif c == ord('s'): # decrement by 1 frequency -= 1 set_freq(i2c_address, frequency) time.sleep(1) elif c == ord('e'): # increment by 0.1 frequency += 0.1 set_freq(i2c_address, frequency) time.sleep(1) elif c == ord('d'): # decrement by 0.1 frequency -= 0.1 set_freq(i2c_address, frequency) time.sleep(1) elif c == ord('m'): # mute mute(i2c_address) time.sleep(1) elif c == ord('u'): # unmute set_freq(i2c_address, frequency) time.sleep(1) elif c == ord('q'): # exit script and cleanup mute(i2c_address) curses.endwin() break except KeyboardInterrupt: mute(i2c_address) curses.endwin()
Oh! Really thanks for this post. I watched your video in Youtube.
I want to schedule recording a specific station using your python script. Is there any Python library for that? Of course I could find it by long googling, if you already know. I wanna take some help from you.
I think you could try plugging the 3.5mm output from the tea5767 into the RPI (possibly use a cheap RPI USB audio adapter). Then you could just record the input using the “arecord” command.