Si4735 ラジオモジュール、ダイソーのカードスタンドに付けてみた

2012-12-26 15.13.09

100円ショップのダイソーで購入した 「カードスタンド – V 3」でいいのかな、に先日作成したラジオモジュールの部品を付けてみました。このカードスタンドの材質はメタクリル樹脂と書いてありまして、ググるとアクリル材のことでした。今回の加工ではネジ穴などは数が少ないため、ピンバイスに 3mm の刃を付けてゆっくりと。タクトスイッチの四角穴はホットナイフで穴開けてヤスリで修正しました。

2012-12-26 15.06.40

とりあえずなんとか付けた状態です。液晶面とボタンの高さをあわせたら少しはスッキリするかなというのもありますが、液晶は上の返しに挟み込んでるだけの固定なので移動出来ず。今回はこれで良しとしておきましょう。

Si4735 ラジオモジュールのブレッドボードからユニバーサル基板へ組み換え

2012-12-21 17.09.33

先日まで、ブレッドボード上であれこれ確認しながら使用していましたが、仕様もほぼかたまったのでユニバーサル基板へのせかえしたいと思います。今回は多分シリコンハウスで買ったと思う正方形の両面スルーホールのユニバーサル基板です。普段はベークの基板使いますが、今回は緑色のレジストのを使いました。なんとなくちゃんとした基板に見えるという見た目で選択です。

まだ、タクトスイッチの結線はしていませんが、今日のところはラジオ本体のハンダ付けは終わりまして、放送受信出来るのを確認。ここまで出来たら、コネクタの線の長さを調整しつつプラ板の取り付け位置を決めたいと思います。

Si4735 ラジオモジュールのケース検討

2012-12-19 21.46.46

ラジオモジュールの基本的な動作は実装出来たので、ぼちぼちケースにでも思いつつも、アルミのケースをハンドニブラで穴開けする気力もなく。さりとて裸のままもどうしたものかという状態。ダイソーで「カードスタンド-V 3」というのを文具コーナーで見つけまして買ってきた次第。飲食店などで、予約席とかを表示するのによく使われてるやつですよね。

大きさは横幅約18センチ×たて6センチメートルのメタクリル樹脂という材質で出来ているようです。さわった感じはやわらかいのでカッターなどでもなんとか加工出来そうな雰囲気はあります。ということで、今回はこれをケース代りにしてしまおうと思います。

テスト的に、液晶モジュールを挟んでみたところ、ん~ちょっと微妙という感じはします。液晶を挟んでるところが黒くなるとかは無かったのでまぁいいかなと。右側にタクトスチッチの基板をネジ止めして底辺に本体の基板と電池ボックス付けたら終りという感じです。ちなみに、下のネオン管も長さ的にどうかなと思って置いてみただけなのですが、固定の方法は考えないといけませんがなかなか良い感じではあります。なお今回のラジオモジュールでは使用しません。

Si4735 ラジオモジュール、液晶の電源を変更してみました。

2012-12-16 15.42.24

I2C 液晶モジュールの電源を I/O ポートから取っていましたが、電源ラインからトランジスタ(2SA1015と2SC1815)のスイッチ回路経由で供給するように変更して動くか確認。とりあえずは問題なし、液晶に供給される電圧も電池の電圧になりますのでコントラストが濃くなりました。

ということで、液晶モジュール、Si4735ラジオモジュール、I2Cプルアップの電源をトランジスタスイッチ経由に配線を変更しました。プログラムは 0.0.2 のまま(液晶コントラストの値は修正必要ですが)変更していません。回路図が加筆修正されています。回路図は下記リンクより

Si4735 ラジオモジュールの回路図

Si4735 ラジオモジュールの更新を行ないました。

一連の Si4735 ラジオモジュールの記事を参考に製作チャレンジされた方から質問をいただきました。(Si4735 ラジオモジュール進捗と〆のコメントにて) 内容は、局の選択後に信号強度のSがリアルタイム更新されないけど対応はあるかというものです。今回その対応分のソースの zip を下のリンクに貼っておきます。また、以下は差分情報になります。

最新のソースは Si4735 ラジオモジュールの Blog 記事一覧 から取って下さい。

$ diff -p Si4735Radio_Ver0.01/ Si4735Radio_Ver0.02
diff -p Si4735Radio_Ver0.01/Si4735.cpp Si4735Radio_Ver0.02/Si4735.cpp
*** Si4735Radio_Ver0.01/Si4735.cpp 2012-12-15 09:31:55.671118400 +0900
— Si4735Radio_Ver0.02/Si4735.cpp 2012-12-15 09:32:02.617515700 +0900
*************** void Radio::updateFMTuneStatus() {
*** 163,168 ****
— 163,189 —-
}
}

+ void Radio::updateFMRsqStatus() {
+ int i;
+
+ i2c.beginTransmission(SI4735ADR);
+ i2c.write(0x23);
+ i2c.write(0x20);
+ i2c.endTransmission();
+ _delay_ms(2);
+
+ i2c.requestFrom(SI4735ADR, 6);
+ for(int i = 0; i < 6; i++) { + switch(i) { + case 4: + FMrssi = i2c.read(); + break; + default: + i2c.read(); + } + } + } + void Radio::updateAMTuneStatus() { int i; *************** void Radio::updateAMTuneStatus() { *** 191,196 **** --- 212,237 ---- } } + void Radio::updateAMRsqStatus() { + int i; + + i2c.beginTransmission(SI4735ADR); + i2c.write(0x43); + i2c.write(0x00); + i2c.endTransmission(); + _delay_ms(2); + + i2c.requestFrom(SI4735ADR, 6); + for(int i = 0; i < 6; i++) { + switch(i) { + case 4: + AMrssi = i2c.read(); + break; + default: + i2c.read(); + } + } + } int Radio::getFMFreq() { return(FMfreq); diff -p Si4735Radio_Ver0.01/Si4735.h Si4735Radio_Ver0.02/Si4735.h *** Si4735Radio_Ver0.01/Si4735.h 2012-12-15 09:31:55.795125500 +0900 --- Si4735Radio_Ver0.02/Si4735.h 2012-12-15 09:32:02.628516300 +0900 *************** class Radio { *** 41,46 **** --- 41,48 ---- void seekDownAMFreq(); void updateFMTuneStatus(); void updateAMTuneStatus(); + void updateFMRsqStatus(); + void updateAMRsqStatus(); int getFMFreq(); int getAMFreq(); int getFMRssi(); diff -p Si4735Radio_Ver0.01/Si4735Radio.cpp Si4735Radio_Ver0.02/Si4735Radio.cpp *** Si4735Radio_Ver0.01/Si4735Radio.cpp 2012-12-15 09:31:55.816126700 +0900 --- Si4735Radio_Ver0.02/Si4735Radio.cpp 2012-12-15 09:32:02.638516900 +0900 *************** void loop() { *** 146,151 **** --- 146,152 ---- switch(mode) { case FM: radio.updateFMTuneStatus(); + radio.updateFMRsqStatus(); ffreq = radio.getFMFreq(); int tmp01, tmp02; tmp01 = radio.getFMFreq() / 100; *************** void loop() { *** 154,159 **** --- 155,161 ---- break; case AM: radio.updateAMTuneStatus(); + radio.updateAMRsqStatus(); afreq = radio.getAMFreq(); sprintf(msg, "AM %4dkHz S:%i", radio.getAMFreq(), radio.getAMRssi()); break; $ [/code]

あと、Atmel Studio6 のプロジェクト設定で、以下ハードコピーのように delay マクロ用の周波数定義を入れておくと良いです。

201212141958

Si4735 ラジオモジュール進捗と〆

11月30日の夕方に、Atmel Studio のプロジェクト作成したようですので 1週間経過です。まぁ全てこれに注力しているわけではなく、余裕のあるときにやっていますので工数的には少ないです。今の段階でインプリ出来ているのは

  • 受信周波数 AM 531kHz ~ 1602kHz, FM 76.0MHz ~ 90.0MHz
  • AM/FM 切り替えボタンによるバンド切り替え
  • 選局は、シーク UP/DOWN のボタンによるサーチ方式
  • アンテナは、AM/FM 共にロッドアンテナ
  • 液晶コントラスト調整(6段階)
  • 音量調整ボタン
  • アナログ音声出力 3.5φステレオジャック
  • 電源 ON 時以前の状態を復元
  • 電源 3.3V(電池可)
  • 電流 稼動時 20mA, 停止時 0.1~2μA(データシートより)

のようになってます。安物ラジオの条件達成なので個人的な目標も達成です。基板起しとケース入れるという作業は残ってますがね。

2012/12/8 追加開始: 上記機能までインプリしたソースと回路図を再掲します。

Si4735 ラジオモジュールの回路図
最新のソースは Si4735 ラジオモジュールの Blog 記事一覧 から取って下さい。

ソースファイルは、各種資料をもとを作成させていただいています。商用利用はお断り。二次配布もお断りします。
2012/12/8 追加おわり

このラジオモジュール使った短波受信ありのラジオも発売されているようですので、もうちょっと改良するところはありそうです。パット思いつくのは以下の点ですが、短波だけは試したいなと思います。

  • 短波(31mバンドあたり)が使いものになるのか動かしてみる。
  • フェライトアンテナでは AMが飽和して音声が出なくなる局がある。(ハリガネで結構受信出来る)
  • USB シリアル変換を付けて、ホストコントロール出来るようにする(普段ならデバック用に付けますが今回付けてないので)
  • アナログ出力のドライブ能力のせいか、音量上げるとクリップしてると一発でわかるのでバッファ用のアンプは付けたい。(↑の写真のように簡易アンプはさむと実用的にはなる)、ラジオチップのアナログ部分は 5V まで上げられるが、このモジュールは VDD と共用という仕様。
  • アンプ付けるとボリュームによる音量調整が出来るので、ボタン2個減らせる。→ だけど単三2本から4本くらいに電源変更したくなる。

個人的にはこのモジュールの基本的な使いかたはだいたいわかったので、妥協出来る切りのいいところでまとめてしまいたいなと思います。ほとんどこれにて終了状態ですけどね。

Si4735 ラジオモジュール構成検討中 その3

今日も少し構成変更しています。変更点は電源OFF/ONのボタンを着けた。ということです。AVR マイコンの PowerDown モードにするということです。電源 ON はあれこれ考えましたが結局リセットボタンとしました。これで初期化からいくので十分というやつです。(途中電源ディレイなども考えたけど…これが一番シンプルでした)

ただ、電源 OFF の課題は消費電流が減ってないことです。


動作時、20mA ,マイコン PowerDown モードで、10mA と。ただし、ラジオモジュールが動作時19mA 出てて、PowerDown 後はほぼ 0mA なので、この10mA はどこから出てきたのか不思議という状態。落す前にI/Oポートの処理せんといけないのかぁ。

あとは電源 OFF 時に周波数などを EEPROM に書いて、電源 ON 時に戻るようにしたいです。

電源 OFF/ON はタクトスイッチでいくとして、各ファンクションのタクトスイッチが多いので、I2C キーパッド使えるかなぁと思いつつちょっと悩み中なのと、シリアル I/F 付けて、デバック用も兼ねてホストからコマンド送れるようにするかどうか。むむ

Si4735 ラジオモジュールのプログラミングその3

本日は、FM / AM の基本処理追加とシーク動作出来るようにプログラムの修正をしました。とりあえずボタン2つ付けまして、周波数 Up/Down させるようにしました。あとはボリューム操作と AM/FM 切り替えを付けたら市販されているラジオキット相当になりそう。

		   text	   data	    bss	    dec	    hex	filename
		   5380	     34	     97	   5511	   1587	Si4735Radio.elf

AMもバーアナテナ無しで、NHK第一、第二は受信出来ているので動作確認終ってます。大半のプログラムは出来てるという状態です。これで↑のように5511バイト。余裕あります。気になるのは、電池が、3.3Vから3.0V まで電圧下がりましたが、液晶のコントラストがすごく変化して薄くなりました。こいつの調整も必要そうというところです。

Si4735 ラジオモジュール構成検討中 その2

ラジオモジュールのほうのプログラミングは FM だけですが、周波数のセットとステータス呼び出しが出来ていますので、AM のほうもすぐコーディング出来るようなところまでは来ています。この時点での変更点は

  • ATMEGA328P のクロックは内蔵 8MHz からデフォルトの 1MHz に戻した。
  • それに伴ない I2C のパラメタ設定修正
  • ブレッドボード上のパーツ整理

です。で、次考えないといけないがユーザーインタフェースです。これ悩み中ですが大雑把に以下の項目

  • 周波数のセットの仕方(直接入力・シーク・その他)
  • AM / FM の切り替え方法
  • 音量調整
  • 16×2 の液晶への表示内容(モード・周波数・信号強度(簡易Sメータ)など)
  • 液晶コントラストの設定(ボリュームでは出来ない)
  • スピーカー付けるか否か・とステレオかモノラルか

正直決まってないですね。すくないボタンでガンバルかどうするか検討してみましょう。

Si4735 ラジオモジュールのプログラミングその2

とりあえず、音出るまでを一区切りにしようと夕食後から少しモジュールいじり。Atmel Studio 6 の画面上もソースが増えてきました。まずは固定値で NHK FM にチューニングして音が出るかの確認です。いろいろシューティングで時間食いましたが結果 OK でした。これで一安心

問題点に伴なった変更点は

  • ラジオモジュールへの電源供給を ATMEGA328P の I/O PIN からしようとしたが駄目でした。(モジュール側のコマンドで Power Down 出来そうなので直接電源ラインに接続)

でした