uBITX、Custom LFPの設定

LPFの制御線の状態が自由に設定できるように!

先日、CEC版ファームウェアVersion 1.1がリリースされた。

特段、急ぐものでもないので後回しにしていたけど、Custom Filterという機能があることを知り、面白そうなので試してみることに。

これが、新しいMemory Manager(Ver 1.1)の画面で、一番下にCustom Filterの項目がある。もちろん、ファームウェアの方も1.1を入れなきゃダメだけど。

早速、Memory Managerの「Enable customize filters」にチェックを入れて試すのだけれど、思ったように動いてくれない。というか、標準のままでどうやっても変化がない。

仕方がないので、ファームウェアのソースコードを見てみたら、どうやらこの機能は有効になっていない疑惑。「#define USE_CUSTOM_LPF_FILTER」がコメントアウトされている。単純に、リリースされているソースコードがそうなっているのか、配布されているバイナリもそうなのか?仕方ないので、自分でコンパイルして確かめることに。それで、初めてArduinoのソースのコンパイルにトライ。

はじめてのArduinoコンパイル uBITXをいじっていて、ついにファームウェアのコンパイルにまで手を出すことに。諸般の事情で、出来合い...

ソースコードの変更

Arduinoのソースコードを修正するには、まず、Arduino IDEを立ち上げる。ソースファイルがタブとして並んでいて、右端の方にある逆三角をクリックすると、タブに入りきららないものもリストアップされる。

対象ファイルはubitx.h。これを開くとわりと上の方にコンパイルオプションが並んでいる。

//==============================================================================
// Compile Option
//==============================================================================
//Depending on the type of LCD mounted on the uBITX, uncomment one of the options below.
//You must select only one.
//#define UBITX_DISPLAY_LCD1602P //LCD mounted on unmodified uBITX (Parallel)
//#define UBITX_DISPLAY_LCD1602I //I2C type 16 x 02 LCD
//#define UBITX_DISPLAY_LCD1602I_DUAL //I2C type 16 x02 LCD Dual
//#define UBITX_DISPLAY_LCD2004P //24 x 04 LCD (Parallel)
//#define UBITX_DISPLAY_LCD2004I //I2C type 24 x 04 LCD
#define UBITX_DISPLAY_NEXTION //NEXTION LCD

//#define UBITX_DISPLAY_NEXTION_SAFE //Only EEProm Write 770~775
#define I2C_LCD_MASTER_ADDRESS_DEFAULT 0x27 //0x27 //DEFAULT, if Set I2C Address by uBITX Manager, read from EEProm
#define I2C_LCD_SECOND_ADDRESS_DEFAULT 0x3F //0x27 //only using Dual LCD Mode

//Select betwen Analog S-Meter and DSP (I2C) Meter
//#define USE_I2CSMETER

#define EXTEND_KEY_GROUP1 //MODE, BAND(-), BAND(+), STEP
//#define EXTEND_KEY_GROUP2 //Numeric (0~9), Point(.), Enter //Not supported in Version 1.0x

//Custom LPF Filter Mod
//#define USE_CUSTOM_LPF_FILTER //LPF FILTER MOD

//#define ENABLE_FACTORYALIGN
#define FACTORY_RECOVERY_BOOTUP //Whether to enter Factory Recovery mode by pressing FKey and turning on power
#define ENABLE_ADCMONITOR //Starting with Version 1.07, you can read ADC values directly from uBITX Manager. So this function is not necessary.

extern byte I2C_LCD_MASTER_ADDRESS; //0x27 //if Set I2C Address by uBITX Manager, read from EEProm
extern byte I2C_LCD_SECOND_ADDRESS; //only using Dual LCD Mode
#define SMeterLatency 3 //1 is 0.25 sec

#define USE_CUSTOM_LPF_FILTER//を外して有効化。その他、ディスプレイのタイプなど、必要に応じて変更。これでコンパイルすればOK。

標準動作の確認

ファームウェアのコンパイルとインストールが終わったら、Memory Managerで設定。

その前にちょっと補足。今回のMemory Managerは以前のものとは少し手順が違う。以前は、読込時にRead、Decodeという二手順が必要だった。しかし、今回はReadだけで自動的にデコードまでやってくれる。手間が省けた。書込時も同じ。

まずは、標準動作と同じになるように設定。

それっぽく動くけど、なんかへん…。

再び、ソースコードを確認 → 変更

#define USE_CUSTOM_LPF_FILTERを検索してみたところ、これを使っているファイルのはubitx_20.ino。

void setTXFilters(unsigned long freq){
#ifdef USE_CUSTOM_LPF_FILTER
freq = freq / 1000000UL;
for (byte i = 0; i < 7; i++) {
if (freq > CustFilters[i][0])
{
char aIn = CustFilters[i][1];
digitalWrite(TX_LPF_A, aIn & 0x01);
digitalWrite(TX_LPF_B, aIn & 0x02);
digitalWrite(TX_LPF_C, aIn & 0x04);

if (isCustomFilter_A7 == 1)
{
digitalWrite(A7, aIn & 0x08);
}
return;
}
} //end of for
#else

<Custom Filter機能を使わない標準時の動作>

#endif
}

まず、freq = freq / 1000000UL;で現在周波数がMHz単位に丸められるようになっている。

続いて、if (freq > CustFilters[i][0])で「超える」で判定している。

このため、例えば、21.123MHzであっても21MHzに丸められ、比較基準が21だと「超えない」ので、この判定分はfalseとなってしまう。

freqをMHzに丸めたのは、CustFilters[][]charだからだろう。

ということで、次のように変更。

void setTXFilters(unsigned long freq){
#ifdef USE_CUSTOM_LPF_FILTER
// freq = freq / 1000000UL;
for (byte i = 0; i < 7; i++) {
// if (freq > CustFilters[i][0])
if (freq >= (CustFilters[i][0] * 1000000UL))
{
char aIn = CustFilters[i][1];
digitalWrite(TX_LPF_A, aIn & 0x01);
digitalWrite(TX_LPF_B, aIn & 0x02);
digitalWrite(TX_LPF_C, aIn & 0x04);

if (isCustomFilter_A7 == 1)
{
digitalWrite(A7, aIn & 0x08);
}
return;
}
} //end of for
#else

<Custom Filter機能を使わない標準時の動作>

#endif
}

  • freqを丸めずに、比較時にCustFiltersをMHz単位に拡大
  • 比較判定を「以上」に変更

これで、期待通りの動きをするようになった。

ついでながら、このコードを見るとUSE_CUSTOM_LPF_FILTER時に「Enable customize filters」の設定を見るようになってはいないので、このチェックボックスは効かないだろう(チェックを外しても標準動作にはならず、自分で設定した動作になってしまう)。そこまで修正してもいいけど、面倒なので放置。

いよいよ独自設定

Custom Filterの動作が上手くいくようになったで、ようやく独自設定。

判定条件を「以上」にしたのでバンドエッジの周波数を設定してもいいのだけど、一応、念のため、切替えは途中の周波数で行うように設定。

標準では、21MHz帯は18MHz帯側のバンクに含まれるが、ここでは、24MHz帯側のバンクに属するように設定している。また、1.9MHz帯は独自のフィルタを使えるように独立させている。

これの設定で、TXA、TXB、TXCが期待通りに出力されることが確認できた。3ビットにエンコードして出力しているわけなので、外部でデコードしてリレーを制御する。

余談: Memory Magaerのデコードミス?

上のように書き込んだものの、再び読み出すとちょっと違ってしまっていた。

下から三番目、書込時は「TXA:0、TXB:0、TXC:1、SPARE:1」だけれど、読み出すと「TXA:1、TXB:0、TXC:0、SPARE:0」。しかし、実際の値(アドレス58)は12と読み出している。TXA側がビット0なので「TXA:0、TXB:0、TXC:1、SPARE:1」とデコードするのが正しい。正しく書き込めているけれど、デコードに失敗している様子。何度試しても同じ。PCを再起動しても変らず。そういうことで、ちょっと気持ち悪いので、この行は使わない周波数を割り当てるようにした。うちの環境だけかなぁ…?

スポンサーリンク
スポンサーリンク