7MHz 1/4λのバーチカルアンテナに延長コイルを追加して、3.5MHzと3.8MHzのバンド追加を構想した。以前もリレーで切り替え使用していた回路がありましたが、今回は、アンテナがどのバンドになっているかをLEDを点灯表示させる表示回路を考えてみました。案外と2つのSWでバンドを切り替えを行うには、少し条件がいります。SW1とSW2で制御するのですが、SW1で7MHzになっているときは、SW2が効かないようにしなければなりません。SW1が3.5/3.8MHzに選択されているときだけ、SW2が効くようにするためには、やはり論理回路で組むのが得策です。
真理値表です。
----入力---- -----出力--------
SW1 SW2 7 3.5 3.8
0 0 1 0 0
0 1 1 0 0
1 0 0 1 0
1 1 0 0 1
最初に考えた論理回路です。
(ANDゲート,INV,BUFの3種類で構成です。)

上記の制御回路にて、SWトランジスタ回路でリレー2個を制御します。3.8MHzはLED表示用のみです。

リレー2個でバーチカルアンテナに延長コイル2個を付けて3.5MHzと3.8MHzを切り替えます。

上記は、大まかな回路ではありますが、現実的な面で、コントローラでANDゲートをそのまま使用してもいいのですが、汎用のNANDゲート(4011)にて構成するように書き換えてみました。(ANDとNOTを書き換えです。H!)

しかしながら、4011のNAND(2入力4個入り)を4個も用意する必要があります。てがるな、4011ではありますが、BUFをふくめてもゲートIC数が5個です。かえって最初の回路のAND回路の場合のほうが4個ですみます。
ここで、発想の転換で、ハードではなく、ソフトウェアでゲート回路の動作をプログラミングしてみました。回路的には、2入力SWに対して3出力が制御できれば良いことになります。一番使いやすい8ピンのPIC 12F675等がマッチします。
簡単に、プログラムのコーディング構想として、ササッと書いたものが次になります。
IF SW1=0 AND SW2=0
THEN OUT1=1,OUT2=0,OUT3=0 ;7MHz
IF SW1=0 AND SW2=1
THEN OUT1=1,OUT2=0,OUT3=0 ;7MHz(SW2が効かないようにしてます)
IF SW1=1 AND SW2=0
THEN OUT1=0,OUT2=1,OUT3=0 ;3.5MHz
IF SW1=1 AND SW2=1
THEN OUT1=0,OUT2=0,OUT3=1 ;3.8MHz
上記の仕様でPIC12F675のコーデイングを行いました。
設定部は省略でメインのコーディングです。
******************************************************
int main(int argc, char** argv) {
OPTION_REG = 0b00000010;//prescale 8 デジタルI/Oに内部プルアップ抵抗を使用する
CMCON = 0x07; //コンパレータは使用しない
ANSEL = 0b00000000; //アナログは使用しない(全てデジタルI/Oに割り当てる)
TRISIO = 0b00110000; //GP4,GP5だけ入力その他のピンは出力に割り当てる(GP3は入力のみ)
WPU = 0b00110000; // GP4,GP5 PULLUP
GPIO = 0b00000000; //出力ピンの初期化(全てLOWにする)
OPTION_REG = 0b00000010;//prescale 8 デジタルI/Oに内部プルアップ抵抗を使用する
CMCON = 0x07; //コンパレータは使用しない
ANSEL = 0b00000000; //アナログは使用しない(全てデジタルI/Oに割り当てる)
TRISIO = 0b00110000; //GP4,GP5だけ入力その他のピンは出力に割り当てる(GP3は入力のみ)
WPU = 0b00110000; // GP4,GP5 PULLUP
GPIO = 0b00000000; //出力ピンの初期化(全てLOWにする)
while(1)
{
if ((GPIO5 == 1) && (GPIO4 == 1 )){ //2番,3番ピン(GP5,GP4)のスイッチが押されたか?
Delay_ms(10);
GPIO2 = 0;
GPIO1 = 0;
GPIO0 = 1; //7MHz Nominal
}else
{
if ((GPIO5 == 0) && (GPIO4 == 1 )){ // 7,3.5MHzSW on(0) 3.5,3.8MHzSW off(1)
Delay_ms(10);
GPIO2 = 0;
GPIO1 = 1; // 3.5MHz
GPIO0 = 0;
}else{
if ((GPIO5 == 0) && (GPIO4 == 0 )){ //7,3.5MHzSW on(0) 3.5,3.8MHzSW on(0)
Delay_ms(10);
GPIO2 = 1; //3.8MHz
GPIO1 = 0;
GPIO0 = 0;
}else{
if ((GPIO5 == 1) && (GPIO4 == 0 )){ //7,3.5MHzSW off(1) 3.5,3.8MHzSW on(0)
Delay_ms(10);
GPIO2 = 0;
GPIO1 = 0;
GPIO0 = 1; //7MHz
}else{
GPIO2 = 0;
GPIO1 = 0;
GPIO0 = 0;
Delay_ms(10);
}
}
}
}
}
}
{
if ((GPIO5 == 1) && (GPIO4 == 1 )){ //2番,3番ピン(GP5,GP4)のスイッチが押されたか?
Delay_ms(10);
GPIO2 = 0;
GPIO1 = 0;
GPIO0 = 1; //7MHz Nominal
}else
{
if ((GPIO5 == 0) && (GPIO4 == 1 )){ // 7,3.5MHzSW on(0) 3.5,3.8MHzSW off(1)
Delay_ms(10);
GPIO2 = 0;
GPIO1 = 1; // 3.5MHz
GPIO0 = 0;
}else{
if ((GPIO5 == 0) && (GPIO4 == 0 )){ //7,3.5MHzSW on(0) 3.5,3.8MHzSW on(0)
Delay_ms(10);
GPIO2 = 1; //3.8MHz
GPIO1 = 0;
GPIO0 = 0;
}else{
if ((GPIO5 == 1) && (GPIO4 == 0 )){ //7,3.5MHzSW off(1) 3.5,3.8MHzSW on(0)
Delay_ms(10);
GPIO2 = 0;
GPIO1 = 0;
GPIO0 = 1; //7MHz
}else{
GPIO2 = 0;
GPIO1 = 0;
GPIO0 = 0;
Delay_ms(10);
}
}
}
}
}
}
***********************************************************
簡単なIF分でのコーディングのみで出来てしまいます。
PIC12F675の実験時の実際の回路構成です。ブレッドボードに組みました。

コーディング後にライターで書き込みです。

コーディング、書き込み、チェックを繰り返してデバッグして完成した動作の動画です。仕様通りに動作してくれています。
PIC12F675を使用した場合の回路は下記になります。

久々にPICコーディングしました。Windows10にインストールしたMPLABでコーディングしましたが、最初PICの認識ができなくて、あせりました。単純に端子の酸化による接触不良がトラブルの原因でした。端子を数回ゴシゴシと酸化膜をはがすことで解決しました。久々に使用するとこんなことになります。Hi!
ゲート回路を考えること自体が最高に面白いですが、今はやはりハードよりソフトウェアのほうが、全体の作業も楽で、簡単になり、仕様も任意に変更対応できるので望まれる時代のようです。しかしながら、久々に頭の体操になりました。