Delphiでラジオワンチップを制御する(1)
0.はじめに
先日、真空管ラジオのキットを組み立てました(真空管ラジオを作ってみる)が、今回は前から興味のある「ラジオワンチップ」と呼ばれるラジオ用ICを制御してみたいと思います。
まず、ラジオについて少し語ります。
ラジオを構成する素子としては、真空管からトランジスタ、ICへと移ってきました。その中で、処理しやすいように受信周波数を一旦IF(FMは10.7MHz、AMは450kHzとか455kHz)に落として信号処理するスーパーヘテロダイン方式が現在も考え方として残っているんだと思っています。
真空管では"高一中二スーパー"の製作記事などがありますが、これは高周波増幅一段、中間周波増幅二段のスーパーヘテロダイン方式のことです。
そのスーパーヘテロダイン方式ですが、同調のさせ方がマニュアルチューナーから電子同調チューナーへと移り、現在はIFからデジタル信号に変換するのが一般的になってきています。
私がいた業界では、40年くらい前にマニュアルチューナーがなくなって、全て電子同調チューナーへと移行しました。その当時のAM/FMラジオの構成はIC別に表記すると下記となります。
懐かしいですが、PLLはDTSマイコン(Digital Tuning System)と呼ばれる4bitマイコンに内蔵されていて、それ以外はすべて三洋のICでした。ちなみにDTSマイコンはNECが主流で、たった2KByteのROMで、ラジオだけでなくKey、表示処理をしつつ、カセットメカの機能もコントロールするなど、テクニックが要求されるプログラミング(もちろんアッセンブラ)がされていたようです。その後DTSマイコンでは容量不足で汎用マイコン75Xなどへ移行した際、PLLは単独チップになりましたが、やはり三洋製でした。
6チップでの構成でしたが徐々に集約化されていき、2000年頃にワンチップ化されたり、IF段以降をデジタル化したりと過渡期を経て、2000年代後半ですかね、IFからデジタル化された「デジタルチューナー」が主流となりました(今であればSoftware Defined Radioですか)。初期はオーディオ信号処理機能も含まれていて、派生でラジオ機能だけに特化した「ラジオワンチップ」が生まれています。
ポータブル向けなどではもっと早くワンチップ化されていたかもしれませんが、移動しながらの受信という環境のため、集約化は遅かったです。
蛇足ですが、FMのIFは日本向けだけが-10.7MHzで、海外は+10.7MHzだったので、コイルなどが違ってしまいハード的に別物でした。原因はTVへの影響で、+10.7MHzにした場合OSCが86.7~100.7MHzとなって、TVのch1,2に影響を与えるために-10.7MHzとなったそうです。
現在は「デジタルチューナー」でIFが数百kHzになっているので、日本も海外も共通となっています。
移動体受信という事で、色々なノイズが課題となります。主なものとしてマルチパス妨害と隣接妨害があげられると思います。
対応方法としては以下のようになります。
日本では隣接妨害は殆ど問題になりませんが、放送局の多い欧州では特に問題となり、解決のために色々な方式が開発されてきました。私の知っている限りですが、DYNAS社のDYNAS(フィルターを回路化して切り替える、その後ICが日立から発売された)、東芝が実用化した通常帯域(180kHz)と狭帯域(80kHz)の2個のセラミックフィルターを切り替える方式、フィルターをICに内蔵して細かく切り替えるNXPのPACS、などです。
そういえば、アルパインが1990年代後半に東芝のICを使って、Hi-Fiラジオとしてアメリカで発売していました。これは妨害対策を逆手にとって、広帯域(280kHz)と通常帯域(180kHz)の切り替えを行いながら、S/N80dBを達成したもので、ホーム用では普通でしょうが車載では当時のS/Nは66dBくらいが一般的でした。
マルチパス妨害は前にも書いたようにハイカットやブレンドで対応するのが一般的ですが、2本のアンテナを切り替えて、良い信号の方を受信する"ダイバーシティ"という方式を併用するモデルもありました。日産車に多く採用されていたように記憶していますし、BMWは4本のアンテナでしたね。
現在は2本のアンテナから入力された信号をデジタル信号処理をして、マルチパス妨害を排除する”Phase Diversity”と呼ばれる方式が主流です。欧州の高級車にはほとんど採用されていますが、日本車にはあまり採用されていないようです。こういうところから既にドイツ車に負けていますよね。
前置きが長くなりましたので、実際の作業に移ります。
1.事前準備
さすがの秋月電子さんでも「ラジオワンチップ」は入手できないようなので、搭載されているであろう某社のCD Tunerをヤフオクで入手しました。
製品を分解すると、オーディオ機能を持たない「ラジオワンチップ」が予想通り使用されていました。
まず、I2Cラインを探す必要があります。
あるルートで入手したICの仕様書によると、I2Cは42,43番ピンなのでその近くを老眼の目で探すと、マニュアル通りに100Ωが2個ありました。
ここに、I2C信号をセットから出すためのワイヤーをはんだ付けします。
抵抗R6、R7を削除した方が良いでしょうが、電源ON時にラジオワンチップに対する各種設定をセットのマイコンから行ってもらった方がやりやすいと思い、以下のように接続しています。I2Cなので、とりあえず支障はありません。
次はDevice addressの確認です。
仕様書によるとDA1/2で何パターンか選べるようですが、コスト面からプルダウンやプルアップの抵抗をわざわざつけるはずはありませんので、ここはオープンになっていると予想され、そうなると0xC6(Write)or C7(Read)となります。
USB-I2C変換モジュールは簡単なコマンドでI2C BUS上のデバイスの存在を確認できますので、やってみます。
コマンドは、
$58 $C6
で、デバイスが存在している返信(01)がありました。
これで事前準備は終了です。
//送信
Hader:=$58;
TX:=AnsiChar(Header)+AnsiChar($C6);
ApdComPort1.Output := AnsiString(TX);
//受信
RXbuf:='';
ApdComPort1.GetBlock(RX, Count);
for i := 0 to Count -1 do
begin
RXbuf :=RXbuf+inttohex(RX[i],2)+' '; //見やすくするために空白を追加
end;
if RXbuf='00 ' then //空白に注意
MemoRX.Lines.Add('Ack : '+RXbuf+'-->NG')
else
MemoRX.Lines.Add('Ack : '+RXbuf+'-->OK');
2.送受信してみる
最初に言い訳をしますが、コマンドを詳しく説明すると色々と問題になるかもしれませんので、コマンドの説明は最低限にします。
まず、FMの受信周波数を変更するコマンドを送信してみます。
受信周波数f(RF)は次式で求められます。
f(RF) = 受信周波数(MHz)/ 10kHz
例えばFM東京の80MHzの場合は、f(RF)=8000=0x1F40となります。
受信周波数を変更する場合、下記の3Byteを送信する必要があります。
PCからの送信コマンドは以下のようになります。
Header:=$55;
TX:=AnsiChar(Header)+AnsiChar($C6)+AnsiChar($00)+AnsiChar($03)+AnsiChar($10)
+AnsiChar($1F)+AnsiChar($40);
ApdComPort1.Output := AnsiString(TX);
東京ではないので実際は80MHzではありませんが、この場所で受信可能な周波数を設定して送信すると、切り替えノイズも発生せずに受信できました。昔のICであれば、最初にミュートをONして、受信周波数を変更して、PLLが安定する時間を待ってミュートをOFFする、という処理が必要でしたが、ラジオワンチップ内で、ミュート処理も実行されているようです。
次はラジオワンチップからの読み込みです。
何を読み込むか、ですが、ここは電界強度を読み込んでみたいと思います。電界強度は受信している放送波の強さを表していて、Sメーター(Signal Meter)という表現をすることもあります。また、ラジオワンチップの仕様書の中ではLevelという表現がされています。
Header:=$55;
TX:=AnsiChar(Header)+AnsiChar($C7)+AnsiChar($00)+AnsiChar($07);
ApdComPort1.Output := AnsiString(TX);
LevelはSub address0x01の値となりますので、0x65が読み込めています。放送局を受信していない状態では0x44近辺となりますので、差が小さい気がしますが、何とか読めているようです。
3.ラジオの基本操作
これで基本動作の確認は終了となりますので、ラジオ操作画面を作りました。画面右上が空いていますが、ここには受信性能を決める各種パラメータの設定ボタンを設置します。
なお、あえて90.2MHzとして、Wide FMにも対応していることを確認しました。
BAND、Up/Down、プリセットは受信周波数変更のコマンドで処理できます。なお、AMの場合の受信周波数f(RF)は次式で求められます。
f(RF) = 受信周波数(kHz)
例えばTBSの954kHzの場合はf(RF)=954=0x03BAとなりますので、下記の3Byteを送信します。
次回は、動的な処理が必要になるSEEKを処理してみます。
この記事が気に入ったらサポートをしてみませんか?