ATS_EX(goshante氏版のATS-20ファームウェア)のissuesを見ていたら、改良版があった。diqezit氏による「LGT8F328P vs ATmega328P – potential processor upgrade & replacement in ATS-20 – question/discussion. Upgraes in firmware and mods #42」というスレッドの中の「Firmware Modification to Eliminate Audio Pops in ATS-20 Receiver」というタイトルの記事。
今のところ、このファームウェアが最も気に入っている。 残念ながら、このファームウェアは(少なくとも現状では)ダメ。SSBが復調できない。それ以外はいいのだけど…。 SSB復調問題は解消され、ちゃんと復調できるようになった。
新機能
かなりたくさん改変しているようだが、タイトルにあるものが最大のものなのだろう。つまり、起動時やモード変更時になどに発生する「ボコッ、ボコッ」というノイズ音の対策。アンプICのミュート機能を活用して、そのようなノイズが出るときにはアンプをミュートしようというもの。力技と言えば力技。
ミュート機能を使うためには、ハードウェアの改造が必要。アンプICのミュートピンを制御できるようにArduino Nanoのピンに接続する。下の写真が改造したもの。アンプICの8002Aの1ピンをArduino NanoのA3ピンにジャンパ線でつなぐ。これだけ。

そのノイズ音の違いはこちらのビデオで。前半が非対策版(diqezit氏版でミュート機能が動かないように改造したもの)で、後半が対策版(コンパイル済みのバイナリはこのページの下の方に置いてある)。
ミュート機能が動かないようにしたものでもgoshante氏版とはノイズの出方がちょっと違う気がする。また、対策版でも完璧にノイズが消えるわけではないし、いじっているうちに変なノイズが出ることがある(ビデオの最後の方にその変なノイズの例 ― 電源を入れ直せば消える)。
なお、このノイズ対策はスピーカ用のアンプICにミュート機能があるのでできる話で、ヘッドフォンアンプにはそのような機能はないのでミュートできない(ノイズがあまり気にならなければ、ハードウェアの改造まではする必要はない。改造と言っても、ジャンパ線一本だけだけど)。
このノイズ対策以外にも嬉しい機能がある。それは、FMでステレオ受信時のインジケータが追加された。また、同じくFM受信時にRSSI(Received Signal Strength Indicator)で信号強度が表示される。下の写真で左上の「FM *」のアスタリスクがステレオインジケータ(モノラル時には点灯しない)。また、右上の「42|60」の左側、つまり、この例では42がRSSI(60は元々ある音量表示)。

さらにもっとあって、FM局のメモリ機能が付いた(ただし、FMだけ)。なお、これを実現するために、RDS機能が削られている。と言っても、RDSは日本では使われていないのであってもしょうがない。
インストール(MW 9kHzステップスキャン対応改造)
このdiqezit氏版はかなりたくさんの改善がなされているが、残念ながらMWでの9kHzステップでのスキャンの問題はそのまま残っていた。なので、以前行った改造をここでも行う。
globals.hのg_bandList[]のMWの定義を変更。バンド下限とデフォルトの周波数を9と10の公倍数に変える(450と1080)。
Band g_bandList[] =
{
/* LW */ { LW_LIMIT_LOW, 520, 300, 0, 4 },
///* MW */ { 520, 1710, 1476, 3, 4 },
/* MW */ { 450, 1710, 1080, 3, 4 },
/* SW */ { SW_LIMIT_LOW, SW_LIMIT_HIGH, SW_LIMIT_LOW, 0, 4 },
/* FM */ { 6400, 10800, 8400, 1, 0 },
};
※SSB復調問題への対応の際に、この9kHzステップの対応も取り込まれたので、変更不要。
defs.hのBATTERY_VOLTAGE_PINをA1に(ATS-20+で実装されているものを活用)。
//Battery charge monitoring analog pin (Voltage divider 10-10 KOhm directly from battery)
//#define BATTERY_VOLTAGE_PIN A2
#define BATTERY_VOLTAGE_PIN A1
ついでに、改造版であることがわかるように起動メッセージを変更(ATS_EX.ino)。 ※SSB復調対応版ではメモリサイズが厳しいので、このメッセージ変更は行わない。
oled.setCursor(0, 0);
oled.print(F("ATS-20 RECEIVER"));
oled.setCursor(16, 2);
oled.print(F("ATS_EX v1.18"));
oled.setCursor(12, 4);
oled.print(F("Goshante 2025"));
//oled.setCursor(12, 6);
//oled.print(F("Modified +"));
oled.setCursor(0, 6);
oled.print(F("Modified + MW450"));
コンパイル済みのバイナリを置いておく(SSB復調対応版、バッテリモニタはA1ピン)。
書き込み方はこちらの記事と同じ。
AVRDUDESSで書き込んだ様子。新し目のArduino Nanoなら、「プリセット」で「Arduino Uno(ATmega328P)」を選ぶのがミソ(古いArduino Nanoなら「Arduino Nano」を選ばないと書き込めないが)。

まずは、初期化。ロータリエンコーダを押したまま電源スイッチを入れる。

電源を入れ直して起動画面を確認。

使い方
操作方法はgoshante氏版とほぼ変わらない。
FMステレオインジケータとRSSI表示は上に書いたとおり。
FM局のメモリ方法はしばらく悩んだ。diqezit氏の説明ではメモリ機能の使い方から説明されているが、あれはメモリされていることが前提の説明になっている。まずは、メモリする方法から説明したほうがわかりやすいと思うので、その順で。
わかってしまえば実にシンプル。まずは、普通に選局する。

この状態でMODEボタンを長押しして離すとメモリに保存される。

(いくつか)保存した後で、MODEボタンを短押しするとメモリの一覧が表示される。

メモリした順に記録されるだけで、周波数順にソートされたりはしない。
選曲は、ロータリエンコーダを回して局を選び、ロータリエンコーダを押す。
メモリを消すには、局を選んでBWボタン。
なお、何も登録されていない状態でMODEボタンを短押しすると下のように表示される。

初期状態がこれで、ここからどうやってメモリするのか悩んだ(余談だけど)。わかってしまえば簡単なのは上に書いたとおり。
不具合発覚 ― SSBが復調できない
この記事を概ねまとめ上げたところで、「そういえば、SSBの受信を確認していなかったな」と思い出してやってみて愕然。なんと、SSBが復調できない。MODEボタンでモードや周波数の表示が変わり、10Hzステップでダイヤルが動かせることは確認していたので大丈夫だと思っていたのだけど、実際の受信ができないとは…。その様子は下のビデオで。
前半がgoshante氏版でSSBが問題なく復調できている。後半が今回のdiqezit氏版。こちらは表示は変わるが、ダイヤルを回しても全然復調できない。そもそも、ノイズの聞こえ方がAMと同じ。SI4732をちゃんと設定できていないのか?ビデオでは最後にもう一度goshante氏版に戻して、SSBが復調できることを確認している。
コメント