ESP32やRaspberry Pi PicoなどのマイコンでFMラジオを受信したいと思ったことはありませんか?今回は、I2C接続のFMラジオチップ「RDA5807M」をマイクロパイソンで制御するライブラリーを作成し、保存・インポートして実際に活用する方法を紹介します。
RDA5807M
RDA5807Mは、低消費電力で高性能なFMラジオ受信チップです。I2Cインターフェースを使用してマイコンと通信し、周波数設定や音量調整、オートスキャンなどの操作が可能です。小型で使いやすいため、ESP32やRaspberry Pi Picoなどのマイコンと組み合わせてラジオプロジェクトに活用できます。
基本仕様
- 動作電圧: 2.7V ~ 3.6V
- 周波数範囲: 50MHz ~ 115MHz(地域による)
- 通信方式: I2C(7ビットアドレス:
0x10
または0x11
) - 内蔵機能: ステレオデコーダー、RDS(Radio Data System)対応、オートチューニング
- オーディオ出力: L/R ステレオ出力(ダイレクト接続可能)
- 消費電流: 約20mA(低消費電力設計)
ライブラリの作成
既存のライブラリーもありますが、今回機能を絞って自作のライブラリーを作ってみました。
from machine import Pin,I2C
import time
class RDA5807M:
RANDOM_ADDRESS = 0x11
sequential_AD = 0x10
def __init__(self, id1=0,scl_pin = 1,sda_pin = 0):
self.i2c = I2C(id1,scl=Pin(scl_pin),sda=Pin(sda_pin),freq=200000)
def send_data(self,reg,data):
""" 2バイトのデータを書き込み """
data_h = data >> 8
data_l = data & 0xff
data1 = bytes([reg,data_h,data_l])
self.i2c.writeto(self.RANDOM_ADDRESS, data1)
""" イニシャライズ ステレオ 日本仕様 """
def init(self):
set_rda = bytes([0xc0,0x01,0x00,0x00,0x0c,0x00,0x88,0x8b])
self.i2c.writeto(self.sequential_AD, set_rda)
def set_freq(self,freq):
""" 周波数書き込み """
if(freq > 76 and freq < 108):
chan = int(freq * 10 - 760)
h3 = chan >> 2
l3 = chan & 0b00000011
l3 = l3 << 6
l3 = l3 | 0b00011000
fdata=(h3<<8) + l3
self.send_data(0x03,fdata)
# ボリュームの設定(05h)
def set_volume(self,vol):
if(vol >= 0 and vol < 16):
vm = vol | 0b10000000;
vdata = (0x88 << 8) + vm
self.send_data(0x05,vdata)
# 設定周波数取得(0x0A)
def get_freq(self):
time.sleep_ms(200)
status = bytearray(2)
self.i2c.readfrom_mem_into(self.RANDOM_ADDRESS, 0x0A, status)
frequency_b = ((status[0] & 0x03) << 8) | status[1]
frequency_mhz = (frequency_b * 0.1) + 76.0
return frequency_mhz
プログラムを説明します。
def init(self, id1=0,scl_pin = 1,sda_pin = 0):
self.i2c = I2C(id1,scl=Pin(scl_pin),sda=Pin(sda_pin),freq=200000)
デフォルトでラズベリーパイピコ仕様になります。
set_rda = bytes([0xc0,0x01,0x00,0x00,0x0c,0x00,0x88,0x8b])
self.i2c.writeto(self.sequential_AD, set_rda)
ステレオモード日本仕様にイニシャライズします。
周波数設定
ボリュームの設定
設定周波数取得(0x0A)のアドレスより。
作成したライブラリーの保存とインポート
今回はファイル名LIB_RDA5807M.pyとしてラズベリーパイピコあるいはSeeed XIAOのフォルダーに保存しまし。
このライブラリーをインポートするには下記のようにします。
from LIB_RDA5807M import RDA5807M
実際に使ってみる
Seeed XIAOを使ったサンプル回路です

使い方
以下のように呼び出して使います。
from LIB_RDA5807M import RDA5807M # ライブラリー インポート
Rjio = RDA5807M(1,7,6) # Seeed XIAO i2cモードでインスタンス作成
#Rjio = RDA5807M() pico i2c モード
Rjio.init() # RDA5807M イニシャライズ
Rjio.set_volume(1) # volme set
Rjio.set_freq(81.3) # 選局
print(Rjio.get_freq()) # 周波数 取得 プリント
まとめ
RDA5807Mは、I2C経由で簡単に制御できるFMラジオチップで、高品質なFM受信が可能です。
外部部品がほとんど不要で、マイコンとの組み合わせで柔軟な制御ができるため、自作ラジオや音響プロジェクトに最適なデバイスです。
皆さんも試してみてはいかがでしょうか。