LoginSignup
0
2

More than 3 years have passed since last update.

KT0915をArduinoで制御 FM編 DSPラジオ

Posted at

はじめに

  • 電子工作の初心者としてDSPラジオに挑戦。
  • 今までFM放送に絞っていましたが、AM、短波も挑戦したかったので、今回はKT0915をチョイス。とりあえず最初はFM放送から。AM、短波は後ほど。
  • 本ICは裸で売っているので、モジュールつくりから始めました。
  • 本ICは、マイコンなしでボリューム、ボタンなどで制御することも可能なようですが、ここではArduinoで制御しています。

使用したもの

モジュールについて

  • DIP化。この変換基板(http://akizukidenshi.com/catalog/g/gP-13602/) を利用。裏面にGround、ジャンパーが用意してあり、便利そうなので使ってみました。
  • ICのはんだ付けは少し苦労しましたが、フラックス+ハンダ吸取線で何とかなりました。
  • 空中配線 データシートのp24を参考に以下の作業を行いました。
    • ICの2, 5, 13のジャンパーをGroundにつなげています。
    • 32.768Khzの水晶。Pin7 と Pin8に接続。
    • 24pF2個。Pin7 - Pin13、Pin8 - Pin2。
    • パスコン0.1μF(SMD)。Pin5 - Pin6。パスコンはこれだけ使いました。 KT0915_module.jpg KT0915.jpg

配線

  • データシートのp24を参考に配線。Pin9(ENABLE)については、+3.3vにつないでいます。
  • イヤフォンに直接出力可能です。出力コンデンサは不要。 KT0915.jpg

Slaveアドレス

  • I2C Scannerによるとアドレスは"0x35"でした。

I2C通信

  • 本ICの場合、I2Cは普通のコードで読み書きできます。
  • さらに、連続読出し、書き込みも可能。最初のレジスタは指定する必要がありますが、そのまま次のレジスタにアクセスできます。連続したアドレスに書き込むには便利ですが、使わなくても無問題だと思います。
  • コード例は割愛。

コード作成のポイント

  • FMTUNEビット1 他のDSPモジュールと同様に、特定周波数をレジスタに書き込む場合、FMTUNEビット(03h.15)を1にする。03hは周波数を設定するレジスタでもあるので、FMTUNEビット1と合わせて書き込むことになる。
  • CHANの計算は、50KHZで計算。80Mhz → 1600(640h)。
  • FM受信ならば、さわるレジスタは少ない。Default値がFM放送向けになっているので。

動作コード

  • 上記のポイントを考慮して作成した、特定の周波数を書き込むシンプルなコード。3つのレジスタだけ操作すれば、後はDefaultのままでOK。
  • 今回は、レジスタに書き込むのにwhile文を使ってみました。配列FM[]からレジスタ番号と書き込むデータを読みだしています。
  • FM[]には、関係ありそうだけど、FMでは操作する必要のなさそうなレジスタもコメントアウトして入れてあります。AM、SWでは必要になりそうなので。
#include <Wire.h>

const unsigned int FM[]=
{                     
//0x02,0x0007, // 100kh, RLmute dis
0x03,0x8640, // fmtune1, 80Mhz(1600*50khz)
//0x03,0x8672, // fmtune1, 82.5Mhz
0x04,0xe080, // SoftMute dis, Mute dis
0x05,0x1800, // stereo, DE50
//0x0a,0x0100, //
//0x0c,0x0024, // 64-110mh
//0x0f,0x881f, // standby0, vol 11111
//0x16,0x0002, // FM
0xff,0xffff,
};

void setup() {
  // put your setup code here, to run once:
Wire.begin();
int i=0;
while (FM[i] !=0xff) {
Wire.beginTransmission(0x35); // slave address 0x35
Wire.write(FM[i]);      // Register i
Wire.write(highByte(FM[i+1]));      // Register i H
Wire.write(lowByte(FM[i+1]));      // Register i L
Wire.endTransmission();     //
i+=2;
delay(100);
}
}

void loop() {
  // put your main code here, to run repeatedly:
}

おまけ

  • 上手くモジュール化できて楽しかった。データシート通りに作ればよい、ということがわかりました。
  • レジスタ操作も、データシートをちゃんと読めば何とか動作はさせられる感じになってきました。当たり前といえばそれまでですが、イヤホンから放送が聞こえてくると嬉しいものです。
0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2