デスクトップマイクやハンドマイク、コンプレッサーマイクなどを切り替えて選択し、
さらにどのRIGに接続するか切り替えられるようなMIC切り替え器を構想。
ロータリースイッチを2個用意すれば済むが、ちょっと工夫してみたくなり切り替えスイッチを
ICで構成し切り替えにはArduinoを使用して長時間送信防止やMIC自動切り替えを盛り込む。
回路は無償のEagleで試してみたが基板サイズに制限があるために3枚に分割しなければならなかった。
作ってみると両面基板3枚を部品実装した状態で重ねてピンで接続するのはかなり難航。
コネクタを実装すると裏側しか、はんだ付けができない。
TH内がメッキ処理できない限りソルダーペーストを流し込んでリフローはんだ付けするしかない。
いろいろ悩んだ挙げ句、今回はアナログスイッチICではなくリレーで作ってみようと思う。
Eagleは使わずにpcbeで回路図も書かずにいきなりパターン描画。
これを両面基板にCNCでパターン切削
基板サイズは195mm×120mm
TH接続したあとにレジスト塗布。
部品実装してはんだ付け。
TH接続にはブラインドナットというかハトメを使用して両面をはんだ付け。
おすすめ
今回はリレー制御なので部品も少なく回路も簡易。
制御はnanoにやらせる。
nanoからの+5vを分圧して押されたスイッチの電圧をアナログポートに入力する。
入力された電圧を判断して入力側と出力側のリレーを制御する。
MIC側4個+RIG側6個のリレーをD2~D9ポートに割り当て。
マイクとRIGの切り替えイメージはこんな感じ。
リレーで切り替えているものは8pinマイク端子のうちGNDと電源以外の6本の信号線。
検討段階ではMICは4種類接続、RIGは6台接続としたがパターンを描いている途中で
ケースに収まらなくなったのでMIC入力3、RIG出力5に変更した。
付加機能として連続送信防止を入れてみた。
時間測定の組み込みが良くわからなかったのでループ処理^^;
使ってみて、ノイズや誤動作は無いもののリレー音が大きい。
次回のPART2でリレーを使わい静かなものを考える。
/* 2019/06/22 nanoでMICとRIGの切り替え
* 2019/11/17 auto power offからrig監視
*
*/
int mic_sw = 0 ; // 選択されたMICを格納
int mic_data = 0 ; // MIC選択ボタンからの電圧入力
int ptt = 0; // PTTが押されているフラグ
int rig_data = 0; // RIG選択ボタンからの電圧入力
long tx_timer = 0; // 連続送信時間カウンタ
const int mic1 = 5 ; // MIC1制御端子 D5
const int mic2 = 4 ; // MIC2制御端子 D4
const int mic3 = 2 ; // MIC3制御端子 D2
const int rig1 = 3 ; // RIG1制御端子 D3
const int rig2 = 8 ; // RIG2制御端子 D8
const int rig3 = 6 ; // RIG3制御端子 D6
const int rig4 = 7 ; // RIG4制御端子 D7
const int rig5 = 9 ; // RIG5制御端子 D9
const int tx_alarm = 10 ; // ALARM出力PWM端子 D10
const int mic1_ptt = 11 ; // MIC1PTT入力端子 D11
const int mic2_ptt = 12 ; // MIC2PTT入力端子 D12
const int mic3_ptt = 13 ; // MIC3PTT入力端子 D13
const int rig_select = 0 ; // RIG選択SW電圧入力端子 A0
const int mic_select = 1 ; // MIC選択SW電圧入力端子 A1
const int rig_power = 2 ; // RIGからの電圧監視端子 A2
int rig_ready = 0 ;
void setup() {
pinMode(mic1, OUTPUT); // MIC-1選択出力
pinMode(mic2, OUTPUT); // MIC-2選択出力
pinMode(mic3, OUTPUT); // MIC-3選択出力
pinMode(rig1, OUTPUT); // RIG-1選択出力
pinMode(rig2, OUTPUT); // RIG-2選択出力
pinMode(rig3, OUTPUT); // RIG-3選択出力
pinMode(rig4, OUTPUT); // RIG-4選択出力
pinMode(rig5, OUTPUT); // RIG-5選択出力
pinMode(tx_alarm, OUTPUT); // アラーム出力
pinMode(mic1_ptt, INPUT); // MIC-1 PTT検出
pinMode(mic2_ptt, INPUT); // MIC-2 PTT検出
pinMode(mic3_ptt, INPUT); // MIC-3 PTT検出
pinMode(rig_select, INPUT); // RIG選択スイッチ読み取り
pinMode(mic_select, INPUT); // MIC選択スイッチ読み取り
pinMode(rig_power, INPUT); // RIG ON読み取り
}
void mic_off() { // MIC全OFF
digitalWrite(mic1,LOW);
digitalWrite(mic2,LOW);
digitalWrite(mic3,LOW);
}
void rig_off() { // RIG全OFF
digitalWrite(rig1,LOW);
digitalWrite(rig2,LOW);
digitalWrite(rig3,LOW);
digitalWrite(rig4,LOW);
digitalWrite(rig5,LOW);
}
void alarm1() { // 長時間送信1回アラーム
tone(tx_alarm, 900);
delay(80);
noTone(tx_alarm);
delay(50);
tone(tx_alarm, 900);
delay(80);
noTone(tx_alarm);
delay(50);
tone(tx_alarm, 900);
delay(80);
noTone(tx_alarm);
delay(50);
tone(tx_alarm, 900);
delay(80);
noTone(tx_alarm);
delay(300);
}
void alarm2() { // 長時間送信3回アラーム
for (int i=0; i <= 3; i++){
tone(tx_alarm, 1400);
delay(80);
noTone(tx_alarm);
delay(50);
tone(tx_alarm, 1400);
delay(80);
noTone(tx_alarm);
delay(50);
tone(tx_alarm, 1400);
delay(80);
noTone(tx_alarm);
delay(50);
tone(tx_alarm, 1400);
delay(80);
noTone(tx_alarm);
delay(300);
}
}
void alarm3() { // 送信停止
tone(tx_alarm, 1400); // 1400Hzの音を
delay(1000); // 1000ミリ秒鳴らす
noTone(tx_alarm); // 音を止める
rig_off(); // RIGからMICを切り離す
}
// 長時間送信防止タイマー
void tx_time() {
if (ptt == 1) {
tx_timer=tx_timer+1 ;
if (tx_timer == 180000) {
alarm1();
} else if (tx_timer == 240000) {
alarm2();
}else if (tx_timer == 300000) {
alarm3();
}
}
}
// MIC選択
void mic_control() {
mic_data = analogRead(mic_select); // MIC選択スイッチ,PTTの検出
if (digitalRead(mic1_ptt) == LOW ){ // MIC1のPTTによってD11がGNDに落ちたら
mic_sw = 1; // MIC1が選択されたと判断
ptt=1;
tx_time(); // 送信時間計測
} else if (digitalRead(mic2_ptt) == LOW ){ // MIC2のPTTによってD12がGNDに落ちたら
mic_sw = 2; // MIC2が選択されたと判断
ptt=1;
tx_time(); // 送信時間計測
} else if (digitalRead(mic3_ptt) == LOW ){ // MIC3のPTTによってD13がGNDに落ちたら
mic_sw = 3; // MIC3が選択されたと判断
ptt=1;
tx_time(); // 送信時間計測
} else if (mic_data > 800 && mic_data < 900){ // MIC_SW1が押されたら
mic_sw = 1; // MIC1が選択されたと判断
} else if (mic_data > 700 && mic_data < 800){ // MIC_SW2が押されたら
mic_sw = 2; // MIC2が選択されたと判断
} else if (mic_data > 500 && mic_data < 700){ // MIC_SW3が押されたら
mic_sw = 3; // MIC2が選択されたと判断
} else if (mic_data > 400 && mic_data < 500){ // MIC_SW4が押されたら
mic_off(); // MIC全off
mic_sw = 0;
} else {
ptt = 0;
tx_timer=0;
}
switch (mic_sw){ // mic_swの値は1~3のどれ?
case 1: // 1だったら
mic_off(); // 一旦全部のMICをOFFにする
digitalWrite(mic1,HIGH); // mic1をHIGHにしてMIC1が選択されたことにする
break ;
case 2: // 2だったら
mic_off(); // 一旦全部のMICをOFFにする
digitalWrite(mic2,HIGH); // mic2をHIGHにしてMIC2が選択されたことにする
break ;
case 3: // 3だったら
mic_off(); // 一旦全部のMICをOFFにする
digitalWrite(mic3,HIGH); // mic3をHIGHにしてMIC3が選択されたことにする
break ;
}
}
// RIG選択
void rig_control() {
rig_data = analogRead(rig_select); // RIG選択スイッチの検出
if ( rig_data > 800 && rig_data < 900 ) { // RIG_SW1が押されたら
rig_off(); // 全RIGを一旦OFFにする
digitalWrite(rig1,HIGH); // rig1をHIGHにしてRIG1が選択されたことにする
} else if ( rig_data > 600 && rig_data < 800 ) { // RIG_SW2が押されたら
rig_off(); // 全RIGを一旦OFFにする
digitalWrite(rig2,HIGH); // rig2をHIGHにしてRIG2が選択されたことにする
} else if ( rig_data > 500 && rig_data < 600 ) { // RIG_SW3が押されたら
rig_off(); // 全RIGを一旦OFFにする
digitalWrite(rig3,HIGH); // rig3をHIGHにしてRIG3が選択されたことにする
} else if ( rig_data > 400 && rig_data < 500 ) { // RIG_SW4が押されたら
rig_off(); // 全RIGを一旦OFFにする
digitalWrite(rig4,HIGH); // rig4をHIGHにしてRIG4が選択されたことにする
} else if ( rig_data > 200 && rig_data < 300 ) { // RIG_SW5が押されたら
rig_off(); // 全RIGを一旦OFFにする
digitalWrite(rig5,HIGH); // rig5をHIGHにしてRIG5が選択されたことにする
} else if ( rig_data > 100 && rig_data < 200 ) { // RIG_SW6が押されたら
rig_off(); // 全RIGをOFFにする
}
}
void loop() {
while(analogRead(rig_power) > 500) {
mic_control();
rig_control();
}
rig_off();
mic_off();
}