ICOM対応 BAND切り替えI/F (3)

BAND基準電圧とBAND信号を同じ分圧抵抗をつけてA0とA1に入力して比較処理をする。

基準値と比較して算出すると機種間の差異が増えて28MHzと50MHzの境界が狭く、設定できない。

 

実際の電圧を測定すると、IC-7000は基準電圧が低いのにBAND電圧は高い。

これを同じ補正演算させると更に差が出てしまう。

BAND電圧は調整できないかとサービスマニュアルを見たがVR等は無く調整不可。

ならば、受け取ったBANDデータを処理するのではなく、

BANDデータ出力をVRで調整してからRIGを切り替えてARDUINOが受け取れるMax5Vのデータで読み取る。

 

ここで問題発生!

単体ではVRで0~7.8Vまで可変できるのにArduinoに接続すると、Maxでも3.6V程度まで下がってしまう。

原因はアナログポートの入力インピーダンス。

そこで8Vを5Vに変換する分圧はArduino内部でしてもらうこととし外部には微調整用のVRのみとしてみた。

入力に8Vを加え、A0ポートの電圧を確認しながら4.7Vに調整できた。

 

また問題発生!

配線が終わってArduinoの電源を入れたらA0ポートの電圧が5.23VになってVRで調整不可能。

通電すると入力端子に5Vがプルアップされるようだ。

Arduinoの回路の中にはプルアップ等は無いのでデバイス内部の構造かも。

また、やりなおし。

 

結局、通電した状態で安定したのがこの構成。

正常に動作するようになったが数値の変動による誤動作を監視するために、しばらく使用してみて設定値の見直しを行う。

世の中のすべてのICOM製品に対応しなくても我が家で快適に動作してくれればそれでいい。

そのために、現在のBANDデータの状態が見られるようにする必要があるので以下のようにSerial転送を記述。

 

 

しばらく使ってみたが50MHzになると28MHzと間違うことがあるので各RIGごとの設定にすることにした。

追加はRIGの切り替わりを判断するためにリレーの電圧をAnalogポートに入れるだけ。

あとはソフトで処理。

void setup() {
	
	for (int i=2; i <= 13; i++){
		pinMode(3, OUTPUT);
	}
	
// Self Test
	for (int i=2; i <= 13; i++){
		digitalWrite(i, HIGH);
		delay(100);
		digitalWrite(i, LOW);
	}
	Serial.begin(9600) ;
}
	float band ;  	// A0ポ-トからBAND電圧入力
	int relay;  	// A1ポートからRIG選択電圧入力 IC-7000 同軸リレーの+端子
	int rig;  

void loop() {

	band = analogRead(0) ;    // A0ポートに入力されたBAND電圧 
	relay= analogRead(1) ;    // A1ポートに入力されたRIG選択電圧入力
  
	if (relay <= 50 ){
		rig = 1 ; //IC-736
	} else {
		rig = 2 ; //IC-7000	
		}
		
	Serial.print("RelayData = ") ;   
	Serial.print(relay) ;
	Serial.print("  ") ;  
	Serial.print("RIG = ") ; 
	Serial.print(rig) ;
	Serial.print("   AnalogData = ") ;  
	Serial.print(band,0) ;
	Serial.print("  ") ;
	Serial.print(band * 5 /1024 ,2) ; 
	Serial.print("V   ") ;  
	delay(100);
	
//1.9MHz
	if (rig ==1 && band >= 1000 || rig == 2 && band >= 1000 ) {    		
		for (int i=2; i <= 13; i++){
			digitalWrite(i, LOW);
		}
		digitalWrite(2 , HIGH);
		digitalWrite(10, HIGH); // DP 
		Serial.println("1.9MHz") ;
// 3.5MHz
	} else if (rig ==1 && band >= 750 && band <= 820 || rig == 2 && band >= 840 && band <= 900) {
		for (int i=2; i <= 13; i++){
			digitalWrite(i, LOW);
		}
		digitalWrite(3 , HIGH); 
		digitalWrite(10, HIGH); // DP
		Serial.println("3.5MHz") ;
// 7MHz
	} else if (rig ==1 && band >= 620 && band <= 680 || rig == 2 && band >= 690 && band <= 760) {
		for (int i=2; i <= 13; i++){
		digitalWrite(i, LOW);
		}
		digitalWrite(4 , HIGH); 
		digitalWrite(10, HIGH); // DP
        Serial.println("7MHz") ;
// 14MHz
	} else if (rig ==1 && band >= 460 && band <= 520 || rig == 2 && band >= 550 && band <= 610) {
		for (int i=2; i <= 13; i++){
			digitalWrite(i, LOW);
		}
		digitalWrite(6 , HIGH); 
		digitalWrite(10, HIGH); // DP
         Serial.println("14MHz") ;
// 21MHz
	} else if (rig ==1 && band >= 320 && band <= 390 || rig == 2 && band >= 430 && band <= 490) {
		for (int i=2; i <= 13; i++){
			digitalWrite(i, LOW);
		}
		digitalWrite(7 , HIGH); 
		digitalWrite(11, HIGH); // 218H
        Serial.println("21MHz") ;
// 28MHz
	} else if (rig ==1 && band >= 210 && band <= 270 || rig == 2 && band >= 290 && band <= 340) {
		for (int i=2; i <= 13; i++){
		digitalWrite(i, LOW);
		}
		digitalWrite(8 , HIGH); 
		digitalWrite(11, HIGH); // 218H
        Serial.println("28MHz") ;
// 50MHz
	} else if (rig ==1 && band >= 100 && band <= 209 || rig == 2 && band >= 200 && band <= 289) {
		for (int i=2; i <= 13; i++){
			digitalWrite(i, LOW);
		}
		digitalWrite(9 , HIGH); 
		digitalWrite(12, HIGH); // CL6A
        Serial.println("50MHz") ;
// 10MHz
	} else {
		for (int i=2; i <= 13; i++){
		digitalWrite(i, LOW);
		}
                digitalWrite(5 , HIGH); 
		Serial.println("10MHz or OFF") ;
	}
}

今回はこれで完成、バージョンアップ時にはCI-Vからの周波数や電波形式も読み取って処理できるようにする。