====== 簡易遠隔操作ユニット(携帯電話版) ====== ===== 概要 ===== 必要に迫られて、簡単な仕組みで、且つ、費用が余りかからない「簡易遠隔操作ユニット」を製作しました。 <本ユニットへの要望事項> * 操作が簡単であること。 * 入出力を制御できること。 * 通信費用が安いこと。 * 近くに商用電源(AC100V)やネットワーク(LAN)が無くても使用できること。 * 仕組みが簡単で、構築に時間がかからないこと。 * 入手が容易な部品を使用すること。 * 持ち運びが容易であること。 これらの要望をある程度満足させられる方法として、以下の理由で携帯電話を採用しました。 * 携帯電話用接続コード(平型プラグ) を使用することにより、容易に発着信を制御できる。 * ファミリー割引を適用することにより、通話料が無料となる。 * 利用可能範囲が広い。いつでも、どこでも通話・通信ができる。 <簡易遠隔操作ユニットのイメージ図> ※遠隔操作する携帯電話(左側)は、固定電話でも利用できますが、通信費用が高くなってしまいます。 {{:imgpaste:202004:htmikan-20200430-143307.png?500}} <仕様> * 入力は、3チャネルのデジタル(PICのポート)とします。 * 出力は、3チャネルのデジタル(PICのポート)とします。 * 遠隔からの操作は、携帯電話のピポパ音(DTMF:Dual-Tone Multi-Frequency)を使用します。\\ 「1」→入力チャネル(1)の状態を音で知らせます。(ハイ状態=2000Hz、ロー状態=500Hz) 「2」→入力チャネル(2)の状態を音で知らせます。(ハイ状態=2000Hz、ロー状態=500Hz) 「3」→入力チャネル(3)の状態を音で知らせます。(ハイ状態=2000Hz、ロー状態=500Hz) 「4」→出力チャネル(1)をオンにします。(完了状態=1000Hz) 「5」→出力チャネル(1)をオフにします。(完了状態=1000Hz) 「6」→出力チャネル(2)をオンにします。(完了状態=1000Hz) 「7」→出力チャネル(2)をオフにします。(完了状態=1000Hz) 「8」→出力チャネル(3)をオンにします。(完了状態=1000Hz) 「9」→出力チャネル(3)をオフにします。(完了状態=1000Hz) 「0」→通話を終了します。 * 自動応答モード\\ 着信をトリガとして、遠隔操作処理を行います。 * 自動通知モード\\ 入力チャネル(1)が、ロー(ON)状態になると、自動発信を行い、遠隔操作処理を行います。 ===== 動作原理(ハードウェア) ===== ◎携帯電話との接続 携帯電話には、ヘッドセット(イヤホンマイク)を接続するための平型端子が用意されています。 ヘッドセットを接続することにより、ハンズフリーで運転中も安心して通話することが出来ます。 {{:imgpaste:202004:htmikan-20200430-143512.png}} 今回使用する、ヘッドセットは、発着信がワンタッチ操作で行える、ON/OFFスイッチ付きのものを使用します。 {{:imgpaste:202004:htmikan-20200430-143528.png}}※500円前後で販売されています。 ヘッドセットに付いている、マイク、スイッチ、イヤホンを取り外します。 そして、ブレッドボードに接続し易いようにユニバーサル基板で治具を作ります。 {{:imgpaste:202004:htmikan-20200430-143536.png}}{{:imgpaste:202004:htmikan-20200430-143541.png}} 平型端子のピンアサイン(ヘッドセット接続時)は、次のようになっています。 【01】アナログ(GND) 【02】送信信号(マイク入力) 【03】HS検出(ヘッドセット有無)有り=Low、無し=オープン 【04】受信信号(ヘッドホン出力:R)※モノラル時に出力されない。 【05】受信信号(ヘッドホン出力:L)※モノラル時に出力される。 【06】ステレオ/モノラル切り替えステレオ=Low、モノラル=オープン 【07】予約 【08】通話スイッチ(発信、着信、終了) 【09】予約 【10】デジタルGND ※マイクの入力インピーダンスは、1kΩ以上 ※ヘッドホンの負荷インピーダンスは、16Ω以上 通話スイッチの操作が重要となるので、少し詳しく説明します。 * 電話を受ける。\\ 着信中に、通話スイッチを押下(約1秒)すると、通話が開始されます。 * 電話をかける。\\ 待受中に、通話スイッチを押下(約2秒)すると、メモリNo.999に登録された番号に電話がかかります。 * 電話を切る。\\ 通話中に、通話スイッチを押下(約2秒)すると、電話が切れます。 ※これらの仕様は、機種によって若干異なります。詳細は各機種の取扱説明書をご覧下さい。 ◎DTMFレシーバ 携帯電話からのDTMF信号を受けて、4ビットのデジタル信号に変換するDTMFレシーバには、CM8870を使用しました。(California Micro Devices Corp) <ブロックダイアグラム> {{:imgpaste:202004:htmikan-20200430-143620.png}} <片線接地(シングルエンド)での使用例> {{:imgpaste:202004:htmikan-20200430-143630.png}} ◎着信の検出 着信音をLM386を使用して20倍に増幅し、ダイオードで倍電圧整流し、着信電圧に変換します。 ◎通話スイッチの制御 トランジスタのコレクタを使用して、通話スイッチをオープン状態(オフ)またはGNDに接地状態(オン)とします。 ===== 動作原理(ソフトウェア) ===== ◎自動応答モード 着信電圧を検出して、300mV以上であれば、着信とみなします。 着信とみなした場合、通話スイッチを1秒間オンにし、通話を開始します。 ◎自動通知モード 待受中に、入力チャネル(1)が、オン状態(ロー)になると、通話スイッチを2秒間オンにし、通話を開始します。 ◎遠隔操作処理 - 開始を知らせる音「ドミソド」を鳴らせます。 - 携帯電話のキー(DTMF信号)が、押されるのを待ちます。 - 押されたキーに対応した処理を行います。\\ 「1」→入力チャネル(1)の状態を音で知らせます。(ハイ状態=2000Hz、ロー状態=500Hz) 「2」→入力チャネル(2)の状態を音で知らせます。(ハイ状態=2000Hz、ロー状態=500Hz) 「3」→入力チャネル(3)の状態を音で知らせます。(ハイ状態=2000Hz、ロー状態=500Hz) 「4」→出力チャネル(1)をオンにします。(応答音=1000Hz) 「5」→出力チャネル(1)をオフにします。(応答音=1000Hz) 「6」→出力チャネル(2)をオンにします。(応答音=1000Hz) 「7」→出力チャネル(2)をオフにします。(応答音=1000Hz) 「8」→出力チャネル(3)をオンにします。(応答音=1000Hz) 「9」→出力チャネル(3)をオフにします。(応答音=1000Hz) 「0」→通話を終了します。終了を知らせる音「ドソミド」を鳴らせます。 ※DTMF信号は、携帯電話の通信状態によっては、認識率が低下します。従って、応答音がない場合には、再度キーを押してください。 ◎サウンド処理 maikorC提供のサウンドライブラリ(ソフト処理)を使用します。 ===== 回路図 ===== {{:imgpaste:202004:htmikan-20200430-143830.png}} ===== ソースコード ===== //********************************************************************** /*    『遠隔操作(携帯電話使用)V2』 */ //********************************************************************** #define PHONE PORTB.B4 #define PHONE_ON 1 #define PHONE_OFF 0 #define BYTE unsigned char #define WORD unsigned int #define DELAY 100 #define SW1 PORTA.B1 #define SW2 PORTA.B0 #define SW3 PORTA.B7 #define SW_ON 0 #define SW_OFF 1 #define LED4 PORTA.B3 #define LED1 PORTA.B6 #define LED2 PORTB.B7 #define LED3 PORTB.B6 #define LED_ON 1 #define LED_OFF 0 #define DTMF_STD PORTA.B5 //********************************************************************** void do_mi_so_do() { Sound_Play(523, 250); //ド(ピン) Sound_Play(659, 250); //ミ(ポン) Sound_Play(784, 250); //ソ(パン) Sound_Play(1047, 500); //ド(ポーン) } //********************************************************************** void do_so_mi_do() { Sound_Play(1047, 250); //ド(ピン) Sound_Play(784, 250); //ソ(ポン) Sound_Play(659, 250); //ミ(パン) Sound_Play(523, 500); //ド(ポーン) } //********************************************************************** const char table[][8] = { "A.-", "B-...", "C-.-.", "D-..", "E.", "F..-.", "G--.", "H....", "I..", "J.---", "K-.-", "L.-..", "M--", "N-.", "O---", "P.--.", "Q--.-", "R.-.", "S...", "T-", "U..-", "V...-", "W.--", "X-..-", "Y-.--", "Z--..", "1.----", "2..---", "3...--", "4....-", "5.....", "6-....", "7--...", "8---..", "9----.", "0-----", "..-.-.-" }; void short_beep() { Sound_Play(800, DELAY); Delay_ms(DELAY); } void long_beep() { Sound_Play(800, DELAY * 3); Delay_ms(DELAY); } void morse_chr(char chr) { static short cnt, i; // if (chr == ' ') { Delay_ms(DELAY * 3); return; } // for (cnt = 0; cnt < 37; cnt++) { if (table[cnt][0] == chr) { for (i = 1; table[cnt][i] != 0x00; i++) { if (table[cnt][i] == '.') short_beep(); else long_beep(); } Delay_ms(DELAY * 3); return; } } } void morse_str(char* str) { while (*str != 0x00) { morse_chr(*str); str++; } } //********************************************************************** int ring_tone() { WORD ad; short cnt; // ad = 0; for (cnt = 0; cnt < 50; cnt++) { ad += ADC_Get_Sample(2); } return (ad / 50); } //********************************************************************** void proc() { short key; //通知開始“ドミソド”を知らせます。 Delay_ms(500); do_mi_so_do(); Delay_ms(500); // while (1) { //キー(DTMF信号)が押されるのを待ちます。 while (DTMF_STD == 0) { } while (DTMF_STD == 1) { } key = PORTB & 0x0F; // switch (key) { case 1: if (SW1 == 1) { Sound_Play(2000, 500); } else { Sound_Play(500, 500); } break; case 2: if (SW2 == 1) { Sound_Play(2000, 500); } else { Sound_Play(500, 500); } break; case 3: if (SW3 == 1) { Sound_Play(2000, 500); } else { Sound_Play(500, 500); } break; case 4: LED1 = LED_ON; Sound_Play(1000, 500); break; case 5: LED1 = LED_OFF; Sound_Play(1000, 500); break; case 6: LED2 = LED_ON; Sound_Play(1000, 500); break; case 7: LED2 = LED_OFF; Sound_Play(1000, 500); break; case 8: LED3 = LED_ON; Sound_Play(1000, 500); break; case 9: LED3 = LED_OFF; Sound_Play(1000, 500); break; case 10: //通知終了“ドソミド”を知らせます。 Delay_ms(500); do_so_mi_do(); Delay_ms(500); return; break; } } } //********************************************************************** void main() { double ad; short cnt; // OSCCON = 0b01110000; // クロックは8Mhz CMCON = 0b00000111; // コンパレータは使用しない。 ANSEL = 0b00000100; // A/D変換を使用する。 TRISA = 0b10110111; TRISB = 0b00001111; PHONE = PHONE_OFF; LED4 = LED_OFF; // for (cnt = 0; cnt < 10; cnt++) { LED1 = LED_ON; LED2 = LED_ON; LED3 = LED_ON; Delay_ms(100); LED1 = LED_OFF; LED2 = LED_OFF; LED3 = LED_OFF; Delay_ms(100); } // ADC_Init(); Sound_Init(&PORTB, 5); Delay_ms(1000); // while (1) { while (1) { //自動応答:着信をチェックします。 ad = ring_tone(); ad *= 4.8828125; if (ad > 300.0) { //電圧が300mV以上で自動着信します。 //着信を承諾(受付)します。 PHONE = PHONE_ON; Delay_ms(1000); PHONE = PHONE_OFF; break; } //自動通知:SW1の押下で自動通知します。 if (SW1 == 0) { //自動発信します。 PHONE = PHONE_ON; Delay_ms(2000); PHONE = PHONE_OFF; break; } } //自動応答または自動通知の処理を行います。 LED4 = LED_ON; proc(); LED4 = LED_OFF; //通話を終了します。 PHONE = PHONE_ON; Delay_ms(2000); PHONE = PHONE_OFF; //暫らく待機します。 Delay_ms(10000); } }//~! //********************************************************************** ===== 動作確認 ===== 右側の携帯で遠隔操作します。 {{:imgpaste:202004:htmikan-20200430-143937.png?500}} LED1~LED3を遠隔操作でオン・オフさせてみました。 一番左側のLED4は、通話中はオンになっています。 {{:imgpaste:202004:htmikan-20200430-143956.png}}{{:imgpaste:202004:htmikan-20200430-144002.png}}{{:imgpaste:202004:htmikan-20200430-144007.png}} {{:imgpaste:202004:htmikan-20200430-144015.png}}{{:imgpaste:202004:htmikan-20200430-144021.png}}{{:imgpaste:202004:htmikan-20200430-144026.png}} 入力スイッチ(SW1、SW2、SW3)の操作の画像はありませんが、携帯電話の「1」「2」「3」を押すことにより、受話器から、スイッチの状態に応じた音(ハイ状態(オフ)=2000Hz、ロー状態(オン)=500Hz)が聞こえてきます。 如何ですか? これを応用することによって、遠隔から様々なコントロールが出来ますね ^_^ このページは稲崎様の閉鎖したHPのコピーで、著作権は稲崎様にあります。[[elechobby:picdic:picdic|詳細]] This page is a copy of Mr. Inasaki's closed website, and the copyright is held by him.[[elechobby:picdic:picdic|Details]]