届いたプリント基板の動作確認です。写真撮りながらハンダ付けしましたがすぐ完成。動作も OK です。とりあえず、発光パターンはランダムよりかは規則性あるのが良いかな? とも思うようになりましたが、マイコンの容量と相談ですかね。
あとは簡単な資料を作成で区切りですかね。追加するとしたら基板赤色変更と、フラッシュの容量少し多い目のマイコンに変更してタクトスイッチ押したらルーレットぽい動きを実装して、これは後日てな感じか。
このサイトは楠 昌浩が興味をもったことに対して広く浅くネタ集めしております。
届いたプリント基板の動作確認です。写真撮りながらハンダ付けしましたがすぐ完成。動作も OK です。とりあえず、発光パターンはランダムよりかは規則性あるのが良いかな? とも思うようになりましたが、マイコンの容量と相談ですかね。
あとは簡単な資料を作成で区切りですかね。追加するとしたら基板赤色変更と、フラッシュの容量少し多い目のマイコンに変更してタクトスイッチ押したらルーレットぽい動きを実装して、これは後日てな感じか。
先日、6LED 駆動回路のプリント板を Fusion PCB サービスに依頼 という記事で、 KiCad で作成した基板データを Fusion PCB に依頼したというのを書きました。あれから 2週間経過しまして手元に届きました。
基板の導通チェックはサービスで10枚全部やってくれたようです。ありがとうございます。
Fusion PCB 側で入れられるシルク印刷の番号はコイン電池ホルダーのところになったようです。これなら最終的に隠れるので問題ありませんね。
目視では、穴とランドのズレがわかるのと、DIP や抵抗のパッドの大きさは手でハンダ付けするならもうちょい広めがいいかなと、いくつか注意点も出てきました。今後のライブラリ修正時には忘れないようにしましょう。
後はハンダ付けして確認ですが、なにぶん非常に目が痒いのでちょっと落ち着いてからにします。
今回の基板はテストで作成してみましたが LED のところが500円玉サイズで余裕あります。次は 5 ポート使って 20LED ドライブの基板も作成しておきたいと思います。
ラジオモジュールの基本的な動作は実装出来たので、ぼちぼちケースにでも思いつつも、アルミのケースをハンドニブラで穴開けする気力もなく。さりとて裸のままもどうしたものかという状態。ダイソーで「カードスタンド-V 3」というのを文具コーナーで見つけまして買ってきた次第。飲食店などで、予約席とかを表示するのによく使われてるやつですよね。
大きさは横幅約18センチ×たて6センチメートルのメタクリル樹脂という材質で出来ているようです。さわった感じはやわらかいのでカッターなどでもなんとか加工出来そうな雰囲気はあります。ということで、今回はこれをケース代りにしてしまおうと思います。
テスト的に、液晶モジュールを挟んでみたところ、ん~ちょっと微妙という感じはします。液晶を挟んでるところが黒くなるとかは無かったのでまぁいいかなと。右側にタクトスチッチの基板をネジ止めして底辺に本体の基板と電池ボックス付けたら終りという感じです。ちなみに、下のネオン管も長さ的にどうかなと思って置いてみただけなのですが、固定の方法は考えないといけませんがなかなか良い感じではあります。なお今回のラジオモジュールでは使用しません。
I2C 液晶モジュールの電源を I/O ポートから取っていましたが、電源ラインからトランジスタ(2SA1015と2SC1815)のスイッチ回路経由で供給するように変更して動くか確認。とりあえずは問題なし、液晶に供給される電圧も電池の電圧になりますのでコントラストが濃くなりました。
ということで、液晶モジュール、Si4735ラジオモジュール、I2Cプルアップの電源をトランジスタスイッチ経由に配線を変更しました。プログラムは 0.0.2 のまま(液晶コントラストの値は修正必要ですが)変更していません。回路図が加筆修正されています。回路図は下記リンクより
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 マクロ用の周波数定義を入れておくと良いです。
11月30日の夕方に、Atmel Studio のプロジェクト作成したようですので 1週間経過です。まぁ全てこれに注力しているわけではなく、余裕のあるときにやっていますので工数的には少ないです。今の段階でインプリ出来ているのは
のようになってます。安物ラジオの条件達成なので個人的な目標も達成です。基板起しとケース入れるという作業は残ってますがね。
2012/12/8 追加開始: 上記機能までインプリしたソースと回路図を再掲します。
Si4735 ラジオモジュールの回路図
最新のソースは Si4735 ラジオモジュールの Blog 記事一覧 から取って下さい。
ソースファイルは、各種資料をもとを作成させていただいています。商用利用はお断り。二次配布もお断りします。
2012/12/8 追加おわり
このラジオモジュール使った短波受信ありのラジオも発売されているようですので、もうちょっと改良するところはありそうです。パット思いつくのは以下の点ですが、短波だけは試したいなと思います。
個人的にはこのモジュールの基本的な使いかたはだいたいわかったので、妥協出来る切りのいいところでまとめてしまいたいなと思います。ほとんどこれにて終了状態ですけどね。
今日も少し構成変更しています。変更点は電源OFF/ONのボタンを着けた。ということです。AVR マイコンの PowerDown モードにするということです。電源 ON はあれこれ考えましたが結局リセットボタンとしました。これで初期化からいくので十分というやつです。(途中電源ディレイなども考えたけど…これが一番シンプルでした)
ただ、電源 OFF の課題は消費電流が減ってないことです。
動作時、20mA ,マイコン PowerDown モードで、10mA と。ただし、ラジオモジュールが動作時19mA 出てて、PowerDown 後はほぼ 0mA なので、この10mA はどこから出てきたのか不思議という状態。落す前にI/Oポートの処理せんといけないのかぁ。
あとは電源 OFF 時に周波数などを EEPROM に書いて、電源 ON 時に戻るようにしたいです。
電源 OFF/ON はタクトスイッチでいくとして、各ファンクションのタクトスイッチが多いので、I2C キーパッド使えるかなぁと思いつつちょっと悩み中なのと、シリアル I/F 付けて、デバック用も兼ねてホストからコマンド送れるようにするかどうか。むむ
本日は、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 まで電圧下がりましたが、液晶のコントラストがすごく変化して薄くなりました。こいつの調整も必要そうというところです。