PR

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、コンパイル後のHEXファイルを残すには
はじめてのArduinoコンパイル uBITXをいじっていて、ついにファームウェアのコンパイルにまで手を出すことに。諸般の事情で、出来合いのバイナリファイルには含まれていない部分を使おうと思ったため。ということで、初めて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を再起動しても変らず。そういうことで、ちょっと気持ち悪いので、この行は使わない周波数を割り当てるようにした。うちの環境だけかなぁ…?

無線機
この記事のタイトルとURLをコピーする
スポンサーリンク
スポンサーリンク
スポンサーリンク
jh4vaj

コメント