きっかけは?
とある知り合いから「こんなの買ったんだけど使い方わかんねー」と話があったから。
調べてみると確かに情報が少ない……世界を代表する秋月電子が販売する商品で情報が少ないのは良くあることなので調査がてら動かしてみることに。
参考サイト
以下のサイトがめちゃめちゃ役に立った。
① https://www.electronicsblog.net/arduino-fm-receiver-with-tea5767/
② https://www.sparkfun.com/datasheets/Wireless/General/TEA5767.pdf
秋月電子が公開しているデータシートは参考程度に…
③ https://akizukidenshi.com/goodsaffix/rda5807.pdf
準備
何がともあれ以下の品を揃えてみた。(秋月電子の回し者ではないですよ)
品名 | 価格 | 購入先 |
---|---|---|
FMラジオモジュール RDA5807H | 300円 | 秋月電子 |
raspberry pi pico w | 1,358円 | amazon |
ブレッドボード用ダイナミックスピーカー | 190円 | 秋月電子 |
4.7μFコンデンサ | ?円 | 家にあったやつ |
101セラミックコンデンサ(100pF) | ?円 | 家にあったやつ |
ケーブル少々 | ?円 | 家にあったやつ |
ピンヘッダ少々 | ?円 | 家にあったやつ |
片面ユニバーサル基盤 | ?円 | 家にあったやつ |
作ってみよう
参考サイトとあまり役に立たないデータシートを元に以下の回路を構成。
コードを組み立てよう
参考サイトをベースに以下のコードを作成。
pythonなのでThonnyとやらで書いて、raspbrry pi pico wに流し込む。
import radio.py
import time
import machine
i2c=machine.I2C(0,sda=machine.Pin(4), scl=machine.Pin(5), freq=10000)
print(i2c.scan())
def radio_frequency(freq):
freqB = 4 * (freq * 1000000 + 225000) / 32768
i2c.writeto(0x60, bytearray([int(freqB) >> 8, int(freqB) & 0XFF, 0XB0, 0X32, 0X00]))
print(freq)
radio_frequency(79.51)
コードの解説
厄介なのがi2c通信で流すパラーメータがなんなのか全然情報が掴めなかったこと。
RDA5807Hで検索しても情報が少なすぎる。
調べていくうちにRDA5807≒TEA5767であると判明し、NXPのデータシートに辿り着いた。
PLL値の計算
freqB = 4 * (freq * 1000000 + 225000) / 32768
PLLとは?詳しくはこちら
・https://ie.u-ryukyu.ac.jp/~wada/design05/spec_j.html
i2cコマンド
i2c.writeto(①0x60, bytearray([②int(freqB) >> 8, ③int(freqB) & 0XFF, ④0XB0, ⑤0X32, ⑥0X00]))
①0x60
参考サイト①の通り、「TEA5767 書き込み時の IC2 アドレスは 0x60」とあるのでそのまま流用。回路構成後、試しにi2c.scanするとシェルに90(DEC)が返ってきたのでこれをHEXに変換すると60、ドンピシャ正解。
②int(freqB) >> 8
計算したPLL値 freqB の上位8ビットだけ取り出す
③int(freqB) & 0XFF
計算したPLL値 freqB の下位8ビットだけ取り出す
④0XB0
⑤0X32
⑥0X00
与太話
何故79.5ではなく79.51なのか?
PLL回路の精度が悪いのか希望周波数ピッタリでは完璧なチューニングにはならない模様。