Skip to content

Tuning Capability for 76-108MHz FM Frequencies #6

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 12 additions & 5 deletions examples/rda5807m_simpletest.py
Original file line number Diff line number Diff line change
@@ -1,26 +1,31 @@
# SPDX-FileCopyrightText: Copyright (c) 2022 tinkeringtech for TinkeringTech LLC
# SPDX-FileCopyrightText: 2024 Norihiko Nakabayashi, modified for Japanese and World users
#
# SPDX-License-Identifier: Unlicense

# pylint: disable=global-statement, too-many-branches, too-many-statements
import time
import board
import busio
import supervisor
from adafruit_bus_device.i2c_device import I2CDevice
import tinkeringtech_rda5807m

# Preset stations. 8930 means 89.3 MHz, etc.
presets = [8930, 9510, 9710, 9950, 10100, 10110, 10650]
# presets = [8930, 9510, 9710, 9950, 10100, 10110, 10650]
# Preset stations for Tokyo, Japan.
presets = [7800, 7950, 8000, 8130, 8250, 8470, 8970, 9050, 9160, 9240, 9300]
i_sidx = 3 # Starting at station with index 3

# Initialize i2c bus
# If your board does not have STEMMA_I2C(), change as appropriate.
i2c = board.STEMMA_I2C()
# i2c = board.STEMMA_I2C()
i2c = busio.I2C(board.GP1, board.GP0)

# Receiver i2c communication
address = 0x11
vol = 3 # Default volume
band = "FM"
band = "FMWORLD" # "FM" or "FMWORLD

rds = tinkeringtech_rda5807m.RDSParser()

Expand All @@ -31,6 +36,7 @@

rdstext = "No rds data"


# RDS text handle
def textHandle(rdsText):
global rdstext
Expand All @@ -42,8 +48,9 @@ def textHandle(rdsText):

# Initialize the radio classes for use.
radio_i2c = I2CDevice(i2c, address)
radio = tinkeringtech_rda5807m.Radio(radio_i2c, rds, presets[i_sidx], vol)
radio.set_band(band) # Minimum frequency - 87 Mhz, max - 108 Mhz
radio = tinkeringtech_rda5807m.Radio(radio_i2c, rds, band, presets[i_sidx], vol)
# radio.set_band(band) # Minimum frequency - 87 Mhz, max - 108 Mhz


# Read input from serial
def serial_read():
Expand Down
42 changes: 28 additions & 14 deletions tinkeringtech_rda5807m.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries
# SPDX-FileCopyrightText: Copyright (c) 2022 tinkeringtech for TinkeringTech LLC
# SPDX-FileCopyrightText: 2024 Norihiko Nakabayashi, modified for Japanese and World users
#
# SPDX-License-Identifier: MIT
"""
Expand Down Expand Up @@ -100,14 +101,8 @@ class Radio:
address = 0x11
maxvolume = 15

# FMWORLD Band
freq_low = 8700
freq_high = 10800
freq_steps = 10
rssi = 0

# Set default frequency and volume
def __init__(self, board, rds_parser, frequency=10000, volume=1):
def __init__(self, board, rds_parser, band="FM", frequency=10000, volume=1):
self.board = board
self.frequency = frequency

Expand All @@ -130,10 +125,18 @@ def __init__(self, board, rds_parser, frequency=10000, volume=1):
self.interval = 10 # Used for timing rssi checks - in seconds
self.initial = time.monotonic() # Time since boot

# Band - Default FMWORLD
# Band - Default FM
# 1. FM
# 2. FMWORLD
self.band = "FM"
self.band = band
# FMWORLD Band
if band == "FM":
self.freq_low = 8700
else:
self.freq_low = 7600
self.freq_high = 10800
self.freq_steps = 10
self.rssi = 0

# Functions saves register values to virtual registers, sets the basic frequency and volume
self.setup()
Expand Down Expand Up @@ -186,7 +189,15 @@ def set_freq(self, freq):
self.frequency = freq
new_channel = (freq - self.freq_low) // 10

reg_channel = RADIO_REG_CHAN_TUNE # Enable tuning
# Changes bands to FM or FMWORLD
band = self.band
if band == "FM":
r = RADIO_REG_CHAN_BAND_FM
else:
r = RADIO_REG_CHAN_BAND_FMWORLD
reg_channel = (
r | RADIO_REG_CHAN_SPACE_100 | RADIO_REG_CHAN_TUNE
) # Enable tuning
reg_channel = reg_channel | (new_channel << 6)

# Enable output, unmute
Expand All @@ -200,6 +211,7 @@ def set_freq(self, freq):

# Save frequency to register
self.registers[RADIO_REG_CHAN] = reg_channel

self.save_register(RADIO_REG_CHAN)
time.sleep(0.2)

Expand Down Expand Up @@ -230,14 +242,16 @@ def format_freq(self):
"""docstring."""
# Formats the current frequency for better readabilitiy
freq = self.frequency

"""
sfreq = str(freq)
sfreq = list(sfreq)
last_two = sfreq[-2:]
sfreq[-2] = "."
sfreq[-1] = last_two[0]
sfreq.append(last_two[1])
return ("".join(sfreq)) + " Mhz"
return ("".join(sfreq)) + " MHz"
"""
return "{:.1f} MHz".format(freq / 100)

def set_band(self, band):
"""docstring."""
Expand Down Expand Up @@ -434,7 +448,7 @@ def get_rssi(self):
# Get the current signal strength
self.write_bytes(bytes([RADIO_REG_RB]))
self.registers[RADIO_REG_RB] = self.read16()
self.rssi = self.registers[RADIO_REG_RB] >> 10
self.rssi = self.registers[RADIO_REG_RB] >> 9 # 10 -> 9
return self.rssi

def get_radio_info(self):
Expand All @@ -443,7 +457,7 @@ def get_radio_info(self):
self.read_registers()
if self.registers[RADIO_REG_RA] & RADIO_REG_RA_RDS:
self.rds = True
self.rssi = self.registers[RADIO_REG_RB] >> 10
self.rssi = self.registers[RADIO_REG_RB] >> 9 # 10 -> 9
if self.registers[RADIO_REG_RB] & RADIO_REG_RB_FMTRUE:
self.tuned = True
if self.registers[RADIO_REG_CTRL] & RADIO_REG_CTRL_MONO:
Expand Down