ATS-20+のファームウェアをATS_EXに入れ替えたら色々良くなった。そのうちの一つが、9kHzステップのチューニング。中波での使い勝手が良くなった。
9kHzステップは手動チューニングなら問題ないのだけど、スキャンすると周波数が狂う。今回はそれを解決しようという話。
9kHzステップでのスキャン問題
問題の詳細を前の記事から引用。
9kHzステップでのスキャン動作がおかしい。例えば、810kHzにセットしてスキャンさせた場合、手動で止めて戻ってくると808kHzや817kHzになって、810kHzにはならない。これはどうやら、バンド下限周波数が影響しているようだ。MWバンドでは下限周波数が520kHzに設定されており、ここを基準に9kHzステップで動くみたい。520+(9*32)=808、520+(9*33)=817ということ。このため、9kHzステップでのスキャンは実用にならない。手動チューニングではこのようなおかしな動作はしない。そのときの周波数から9kHzステップで動く(520kHzからの縛りはない)。
これ、なんとかならないかと色々考えた。
- MWバンドの下限周波数を9の倍数にする
⇒ 日本の中波は531kHzからなので、これにしておけば9kHzステップでのスキャンの問題は起きない。しかし、逆に10kHzステップの地域で使うには問題が起きる。日本などの9kHzステップの地域に限定するならいいが、解決方法としてはイマイチ。 - 9kHzステップの場合はMWバンドでの下限周波数を入れ替える
⇒ 他への影響なく実現するのはかなり困難。9kHz以外に設定したら戻す処理も必要だし。そもそも、バイナリサイズが元々ほぼ限界のため入らない。無理やり入れる(Arduino Unoとしてコンパイルする(ブートローダがOptibootなので行けるはず?))と、スタック領域が足りないのか、表示が乱れたりの不具合発生。目に見えない不具合も否定できない。 - 9kHzステップの場合はスキャンステップを強制的に1kHzにする
⇒ これは簡単に実現できる。しかし、当然ながらスキャン速度が遅い(単純に1/9)。それだけでなく、ノイズなどで9kHzステップの倍数(グリッド)以外で止まってしまった場合は、その後の手動チューニングが上手くいかなくなる(手動チューニングは単純に9kHzを足す/引くだけなので、9kHzのグリッドから外れたまま)。
シンプルな解決法
あれこれやってみたけど、どれも今ひとつ。しかし、問題を整理してみたら、とてもシンプルな方法を思いついた。
ようは、9kHzと10kHzのステップの両方で問題が起きなければいいわけで、それなら9と10の公倍数をMWバンドの下限周波数とすればよいはず。10kHzステップの地域のMWバンドの下限周波数は530kHz。9kHzステップの地域では531kHz。それより低い9と10の公倍数だと450kHz。
この方法の弱点は、下限周波数が低すぎてチューニングできるムダに範囲が広がってしまうこと。まぁ、それでもスキャンで変な周波数にならないほうがありがたい。
下限周波数の定義を変えるだけなので、バイナリの量も増えない。プログラム領域が足りないとかそういう問題は起きない。
ソースコードの変更箇所
変更箇所は、globals.hのBand g_bandList[]。
Band g_bandList[] =
{
/* LW */ { LW_LIMIT_LOW, 520, 300, 0, 4 },
/* MW */ { 520, 1710, 1476, 3, 4 },
/* SW */ { SW_LIMIT_LOW, SW_LIMIT_HIGH, SW_LIMIT_LOW, 0, 4 },
/* FM */ { 6400, 10800, 8400, 1, 0 },
};
MWの定義を次のようにする。
/* MW */ { 450, 1710, 1080, 3, 4 },
450が下限周波数で、1710が上限周波数。上限周波数は元々1710で、これは偶然にも9と10の公倍数。その次の1080は最初の起動時などの使われるデフォルト周波数。これも9と10の公倍数の1080にしておいた。元々の1476はどういうわけか9の倍数。なぜ10の倍数にしていないのかは不明。
9lkHzステップ関連の変更は上の一箇所だけだけど、ついでにバッテリモニタのピン定義をA1にしておく。これは、defs.hにある。
//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)。
oledPrint(" ATS-20 RECEIVER", 0, 0, DEFAULT_FONT, true);
oledPrint("ATS_EX v1.18", 16, 2);
oledPrint("Goshante 2024", 12, 4);
//oledPrint("Best firmware", 12, 6);
oledPrint("BATT:A1 MW:450", 8, 6);
delay(2000);
動作の様子
起動時のメッセージ。

MWバンドは下は450kHzまで行く(想定通り)。

9kHzステップでも、10kHzステップでも、スキャンが変な周波数になることはない。ただ、実際に使ってみると、強い局でも止まらないこともあって、スキャン動作自体がイマイチ。ま、それはしょうがないか。
バイナリ
ついでなので、コンパイル済みのバイナリをおいておく。
ZIPファイルを展開すると、ATS_EX.ino.hex というファイルが入っている(このファイルしか入っていない)。
書込み方法は前の記事を参照。書き込んだ後は初期化したほうが良いと思う(ロータリエンコーダを押しながら電源投入)。
コメント