SIN@SAPPOROWORKSの覚書

C#を中心に、夜な夜な試行錯誤したコードの記録です。

擬似交換機の作成(その1)



以前に分解した時に確かめたモデムの実装を頼りに、擬似交換機の作成に挑戦してみました。

DTMFなどの実装が、ちょっと難しそうなので、今回は、片方の受話器を上げると、もう片方の呼び出し音が鳴るというような形態を目標にしました。

ダイアルで交換する機能は無く、2回線のみの接続です。
※すいません、正確には交換してないので交換機ではありません

1 電話機に必要な電力

電話機は、回線の電力を使用して動作するため、電話機同士をそのまま接続しても使用することはできません。
規格では、電話回線の電圧は-48Vとなっているようですが、実際は電話局からの電圧降下を考慮して、 オフフックでループが形成された時点で5V程度でも動作するようです。
実験で、どれくらいの低電圧で動作するかを試してみました。
※一応、電話機が壊れると寂しいので、とりあえず流す電流は30mA程度までとしました。

電圧(V)抵抗(Ω)電流(mA)A機B機電力(mW)計算値
322013mA××39
315020mA××60
310030mA××90
522023mA115
515033mA165
732022mA154
722032mA224
1244027mA324
1266018mA216
12100012mA144
結果は、機種によって結構違うようですが・・・手持ちの機種では160mW程度以上は、電力が必要なようです。安定した動作を求めるには、12V/20mAって所でしょうか。

※参考
[事業電気通信設備規則第27条]
2線間の電圧は、一方は地気、他方は−42〜−53V
両線間を50〜300Ωの純抵抗で終端した時の回路電流は、15mA 以上、130mA 以下

2 擬似回線(2回線用)

2回線のみの擬似電話回線として図のような構成で各所の電流を測定してみました。
測定結果は表のとおりです。
定電流ダイオード(CRD1)が、15mA用だったので、これを入れたときは、その制限を受けているようすが分かります。

今回は、CRDなしで220Ωの電流制限抵抗を入れた構成が一番よい結果だったと思います。

軽易に試験できるのが15mAの定電流ダイオードしかなかったので試していないのですが、
25mA程度のものが用意できるなら、各回線ごとに電流制限を入れる(電源に対して並列の構成でA点及びB点に置く)のが理想かもしれません。

ある程度の電流が流れると、電話機同士での会話が可能なことを確認しました。

3 オフフックの検出

交換機としては、電話機が、今どういう状態であるかを把握する必要があります。
先の実験からも分かるとおり、受話器が置かれている時(オンフック)は、電話機の回路は解放状態(抵抗が無限大)ですが、受話器を上げる(オフフック)と回路はループとなり回線に電流が流れます。
従って、各回線に流れる電流を検出すれば、受話器が上がったどうかを確認できます。
写真は、回線に流れる電流をフォトカプラで検出しているようすです。
(右のブレッドボードは12V 左は5Vで動作しています

4 受話器から聞こえる音

【技術参考資料「NTT西日本」】

受話器を取ると、プーという発信音が聞こえます。また呼び出し中のプルプルプルや相手との電話が切れた時の音などもあります。

発信音・呼出音・話中音だけなら16Hzと400Hzの2つがあれば作成できそうです。
以下は、割り込みを使用して16Hzと400Hzをピンに発生させるコードです。


#include<16F648A.h>
#fuses INTRC_IO, NOPUT, NOWDT, NOMCLR, NOLVP, NOBROWNOUT
#use delay(CLOCK=4000000)
typedef int1 bool;

#define PIN_16HZ  PIN_B0
#define PIN_400HZ  PIN_B1


void wave16(){
	//毎回ON/OFFを交互に行う
	static bool n=false;
	(n)?output_low(PIN_16HZ):output_high(PIN_16HZ);
	n^=1;
}
void wave400(){
	//毎回ON/OFFを交互に行う
	static bool n=false;
	(n)?output_low(PIN_400HZ):output_high(PIN_400HZ);
	n^=1;
}

//5回に1回処理すると、約16Hz 128回に1回処理すると約400Hzになる
int cnt = 0;

#INT_RTCC   //割込み処理の開始指定
func_rtcc(){ 
	cnt++;
	if(cnt%5==0){
		wave400();//400Hz発振関数
	}
	
	if(cnt%128==0){
		wave16();//16Hz発振関数
	}
}

void main(){
	setup_counters(RTCC_INTERNAL,RTCC_DIV_1);//タイマ0のプリスケーを1/1に設定する
	enable_interrupts(INT_RTCC);	//タイマ0の割り込みを許可する
	enable_interrupts(GLOBAL);	//GLOBAL割り込を許可する
	while(1){
		;
	}
}

擬似回線に発振を重層させて確認しているようすです。
擬似回線に対しては1μのカップリングコンデンサ経由で接続しました。 また、400Hzの発振は、ボリュームが大きいのでは通常(発信音、和中音)時に2.2KΩ、16Hzと400Hzをミックスする際(呼出音)は、1KΩの抵抗を入れました。

回線の状態をモニタしてみました。右が16Hzと400Hzの混合、左が400Hzのみです。
正弦波ではないので、ちょっと硬い感じの音になってますが、周波数はだいたい合っているので、それらしく聞こえなくもないです。