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のソースコードを修正するには、まず、Arduino IDEを立ち上げる。ソースファイルがタブとして並んでいて、右端の方にある逆三角をクリックすると、タブに入りきららないものもリストアップされる。
対象ファイルはubitx.h。これを開くとわりと上の方にコンパイルオプションが並んでいる。
[code]//==============================================================================// 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[/code]
#define USE_CUSTOM_LPF_FILTER
の//
を外して有効化。その他、ディスプレイのタイプなど、必要に応じて変更。これでコンパイルすればOK。
標準動作の確認
ファームウェアのコンパイルとインストールが終わったら、Memory Managerで設定。
その前にちょっと補足。今回のMemory Managerは以前のものとは少し手順が違う。以前は、読込時にRead、Decodeという二手順が必要だった。しかし、今回はReadだけで自動的にデコードまでやってくれる。手間が省けた。書込時も同じ。
まずは、標準動作と同じになるように設定。
それっぽく動くけど、なんかへん…。
再び、ソースコードを確認 → 変更
#define USE_CUSTOM_LPF_FILTER
を検索してみたところ、これを使っているファイルのはubitx_20.ino。
[code]void setTXFilters(unsigned long freq){#ifdef USE_CUSTOM_LPF_FILTER
freq = freq / 1000000UL;
for (byte i = 0; 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
}[/code]
まず、freq = freq / 1000000UL;
で現在周波数がMHz単位に丸められるようになっている。
続いて、if (freq > CustFilters[i][0])
で「超える」で判定している。
このため、例えば、21.123MHzであっても21MHzに丸められ、比較基準が21だと「超えない」ので、この判定分はfalseとなってしまう。
freqをMHzに丸めたのは、CustFilters[][]
がchar
だからだろう。
ということで、次のように変更。
[code]void setTXFilters(unsigned long freq){#ifdef USE_CUSTOM_LPF_FILTER
// freq = freq / 1000000UL;
for (byte i = 0; 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
}[/code]
- 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を再起動しても変らず。そういうことで、ちょっと気持ち悪いので、この行は使わない周波数を割り当てるようにした。うちの環境だけかなぁ…?
コメント