![]() |
![]() |
![]() ![]() PICマイコン使用 JR方式/関東私鉄MSK方式(NEC方式)両対応 「インテリジェント空線信号キャンセラー」の製作 部品代 約1300〜1800円 * 記事を掲載 2008/4/10
* プログラム Ver1.01に更新 2008/4/14
今回は「インテリジェント空線信号キャンセラー」の製作です。 「空線信号キャンセラー」機能は最近の“マルチバンド受信機”には必須機能と言われるほど需要の高い機能になりました。 その昔はこのような機能は無線機・受信機の標準機能ではなく、必要な人のみ「自作」するのが一般的でしたが、「無線の受信を趣味とする人」の裾野の広がりと共に市販の“マルチバンド受信機”も多機能・高性能になり「空線信号キャンセラー」機能搭載機も多くなって手軽に空線信号の乗った鉄道無線を楽しめるようになりました。 しかしひと口に「空線信号」と言っても無線の世界には何種類もあり、そのうち鉄道無線に限って言えば「JR方式」「関東私鉄方式」の2方式が主なものです。 そして「JR方式」は単純なトーン方式なので検出(デコード)は容易でその為の回路も過去にいくつも書籍やHPなどで公開されてきました。 「関東私鉄方式」は単純なトーン方式ではなく、MSKデータ通信という一種のデジタル通信が行われていて簡単には検出(デコード)できません。この「データ音」の一部をトーンとみなして「JR方式」と同様にトーン検出で空線を判別している受信機がほとんどです。 受信機の外にとりつけるタイプの「空線信号キャンセラー」でも両方式に対応していると言われている回路が公開されていますが、それらや受信機内蔵機能もほとんどは「スイッチによるトーン周波数切替」でしかなく、両方の空線信号に自動追従するものがありません。 そこで今回は無線機の外(イヤホン端子など)にとりつけるアダプター型で、「JR方式」「関東私鉄方式」の両方の方式に対応して自動切換え・自動追従する機能をPICマイコンのプログラムで実現し、複雑な機能でありながら部品数の少ないコンパクトな回路に仕上げてみました。 また、トーン検出方式の空線信号キャンセラーは過去にいくつも作り現在も使用中ですが、最近受信環境が少し悪化して受信音に周期的なノイズが乗るようになりました。 そこでノイズ対策として「少々のノイズでも自動識別して空線状態はホールドする機能」が欲しくなり、今回のプログラム式の空線信号キャンセラーの製作に至ったという経緯もあります。 ノイズに強く固定運用はもとより、列車に乗っての移動運用でも安定して動作する空線信号キャンセラーができました。 ■ 主な機能
![]() ■ 動作確認路線
無線通信では、普通は「通話していない時には電波は出ていない」のが一般的です。
この方式だとふだん通話の無い時には無線機・受信機からは音声は出ていないので待機中は静かですし、通話を自動録音する場合でも「音声信号を検知したら録音がはじまるテープレコーダー」(今はICレコーダーやパソコンのソフト)等を繋いでおけば通話が始まったら自動的に録音してくれます。通話があった時のみ録音してくれますから一日中テープを回しておく必要がありませんし、後で聞くときには通話ぶんだけまとめて一気に聞けます。 ところが「空線信号」がある方式の無線ではそうはゆきません。 「空線信号」がある方式の無線では、通話が行われていない期間には「現在この回線は通話がありません、空いています」という意味を表す信号が常に流れています。その信号を「空線信号(あきせんしんごう)」と呼びます。 JRの列車無線のうち、比較的列車運行本数の多い地域などで使用されている「A/Bタイプ」と呼ばれる方式では空線信号として2280Hzの「ピー」という音が常に流れています。 関東の私鉄ではMSK方式のデジタルデータが「ガラガラ・ピー」という感じの音として繰り返し聞こえます。(鉄道会社により音は多少異なります) 関東以外の私鉄やJRでもCタイプと呼ばれる列車無線(乗務員無線も)では空線信号はありませんし通話が無い時には電波は出ていません。 ● JR方式 ![]() JRのA/Bタイプ列車無線は300MHz帯を使用する複信方式の無線システムで、基地局側と列車側の周波数が異なり、Aタイプは受話器を持って電話のように「もしもし、はいはい」と同時に通話ができ、Bタイプは基地局側からの電波は出っ放しですが列車側はプレストークボタン(PTT)を押している間は受信機から音は出ませんので通話の最後に「どうぞ」を言って相手と交互に話します。列車側が話している(送信している)間は指令側は話しても送信中の列車の人には聞こえません。 空線期間には基地局側から「2280Hzの空線信号」が出ています。 A/Bタイプの列車無線にはそのほかに以下の機能別トーンが割り振られています。
このうち今回識別するのは「空線信号 2280Hz」「一斉呼 1960Hz」「試験良 800Hz」の3つです。 「空線信号 2280Hz」は検知した場合は空線信号キャンセラーの音声出力をOFFにします。 「一斉呼 1960Hz」は通話(通信)が始まる冒頭に指令側から流されます。本物の列車無線機ではこの信号を受信した場合に無線機から音声を出すように設計されているようです。本機でも一斉呼信号を受信したら音声出力をONにします。 本物ではこの信号を受信しない場合はもし通話が行われていても音声出力はONにしないようです。「空線信号が受信できなくなったら音声を通す」というキャンセラー的な動作では無いという事ですね。尼崎列車事故の際に「一斉呼トーンを受信しなかった時でも通話音を聞く方法の乗務員の間に伝わる裏技がある」と一部報道で流れたアノ方法はこの音声出力カットを回避するやり方ですね。結局尼崎事故とは関係無い内容でしたけど。(この製作記事とも関係無い・・・) 「試験良 800Hz」は列車側の「試験」ボタンを押されて800Hzの試験トーンが送信された場合、基地局から「試験電波は受信した、良好である」と自動的に折り返し送信されるトーンです。通常の無線機のように音声で「通話テストをお願いします、感度明瞭度いかがですか?」といちいち指令を呼び出して話す必要を無くしています。空線信号キャンセラー付きの受信機でもこの試験良の「ポー!」という音はキャンセルしていませんのでそのままスピーカーから出てしまいます。「時々ポーって鳴るけど受信機の故障?」と思われた方もいらっしゃるのではないでしょうか。本機ではこの試験良トーンもキャンセルすると共に、試験良信号を受信している間はJRの空線信号受信表示のLEDを点滅させて試験良受信中をお知らせします(^_^) 「個別呼 2400Hz」は今回は判別しません。 私は今まで一度も個別呼トーンを聞いたことが無いからです。少なくとも関西圏のJRでは使用されていないので割愛します。 基地側「個別呼」→呼ばれた列車側「応答」操作で特定の動作をするようなのですが、実際に運用されているかどうか、また「応答」操作をしない列車側はどのような動作をするのか確認できていません。 もし個別呼信号で通話が開始されたとしても、本機では「通話検知」機能で音声信号はONになります。(ここは本物のJR列車無線機と動作が違います) ※ もし関東のJR路線などで「個別呼」が多用されているのでしたら運用例をお教えください。プログラムのバージョンアップ等の際に対応させるかもしれません。 PICプログラムでは以下のように各信号波形の一周期の時間を計測して周波数を検知します。 ![]() ● 関東私鉄方式 ![]() 関東私鉄方式は別名「NEC方式」と呼ばれています。無線機納入業者がNECだから・・・だそうです。 VHF 150MHz帯を使用する複信方式が多いようで、電話のように指令側と列車側が「もしもし、はいはい」と同時に通話ができます。 関東私鉄でも100KHz帯を使用する長波無線を使用した路線もあり地下鉄等はほとんどがそうですが、今回はVHF使用の路線のみで受信確認を行っています。(鉄道の長波受信は面倒なので…) 関東私鉄方式の場合、空線期間には「1200bps MSK方式」のデータ通信が行われています。 スピーカーからは「ピーギャギャ!ピーギャギャ!ピーギャギャ!」という感じのデータ音が連続して聞こえてきます。 「ピー」の部分は実際のデータ通信では無く「ビット同期」といってデジタル信号に乱れが無いよう正しく通信できるようにタイミングをあわせる為の信号部分です。「ギャギャ!」のところが実際のデジタルデータ(フレーム同期+データ本体)です。 通話がはじまる冒頭では「ギャギャギャ…ギャギャギャ」と少し長い目のデータが数度流されます。 これはデジタル信号で通話相手の列車を特定する呼び出し信号が流されているようです。呼び出された列車の運転席では何か呼び出しトーンが鳴っているのでしょうか? 特定の列車の運転士がすぐに無線にかかるようなので電話機のような個別呼び出しが実装されているようですね。 この信号を復号すればパソコン上に呼び出された列車番号を表示する装置なども作れそうですね。(今回は関係無いですが) 今回の空線信号キャンセラーではデジタルデータの中身は復号していませんので、この呼び出し信号で音声出力をONにする操作はしていません。 簡単にデータを“眺めて”みた限りではこの呼び出し信号も鉄道会社毎に少し違いがあるようですので、簡単にデータパターンを1つ特定してそれで呼び出し信号だと認識させるだけではうまくゆかない気がします。 具体的に1200bpsのMSK信号とはどのようなものか説明します。 1200bpsとは 1200 bit per second すなわち毎秒1200ビットのデータ通信速度を表します。MSKは Minimum Shift Keying の略で「ミニマムシフトキーイング」と読むデジタルデータ伝送方式の一種です。ある一定の波形を基本とし、そこから最低限の変化で別の状態を作り、その2つの波形でデジタルデータの1と0を表す方式です。 実際の通信データの波形はこのようになっていて、位相が連続する形で1または0を表す波形を切り替えながら送信しています。 (この図では実際に電波に乗っているサイン波の形は省略しています) ![]() 1200bps MSK波形の場合、マーク(1)の場合の1200Hz波形、スペース(0)の場合の1800Hz波形のほかに、マーク(1)からスペース(0)に変わる時とスペース(0)からマーク(1)に変わる時にそれぞれ1440Hzに相当する波形が現れますので、この3種類の周波数特性を持つ信号を検知した場合は「1200bps MSKデータである」と識別します。 重ね重ね・・・ですが、今回は正しくデジタルデータの1と0を復号するのではなく、あくまでJR方式等と混在で「その信号の有無」を検出する方法をとります。 ここで1つ。 頭の回転の速い方なら「一周期の時間を測るのではなく、信号の山1つや谷1つの時間だけ測れば"1200Hzの半分の時間"と"1800Hzの半分の時間"の2種類しか存在しなくなり、1440Hzに対応する検出部は必要なくなるのでは?」とお気づきになられるでしょう。 理論的には正解!です。 「理論的には」と言うのは、あくまでこの信号が伝送されてくるのはアナログ回路を使用したアナログ音声通信システムであり、受信されたサイン波形は電波状態によりかなり揺れていてこの図のような理想的なデジタル波形ではありません。 アナログ波形からPICマイコンに入力するデジタル信号に変換した場合、1つの信号波形のデューティ比は正しく50%ではなくかなりの「ゆらぎ(誤差)」があります。その為に山の長さが長かったり、逆に谷の長さが長かったりと計算値の長さとは異なる場合が多く「山だけ」「谷だけ」では正確な測定に向いていません。(デジタルデータを取り出すなら別のロジックで1か0かが判定できれば良いのでそれでもOKなのですが…) 本機では信号の「周波数」を知りたいわけですので、アナログ的なゆらぎでも誤差の少ない「山から谷までの区間全部で一周期」を測定することにしています。
JR方式/関東私鉄方式での空線信号の検出周波数については上の項で必要なものが出てきました。
● 周波数検出 ![]() JR方式/関東私鉄方式の両方に対応する為にはどのような周波数を検知して、その検知結果をプログラム処理するのに必要な情報をここで改めて整理してみましょう。 ![]() ![]() しかし本機ではPICマイコン(12F629)を使用することで、周波数の判別やその後の論理処理などを全て右の写真の小さな8ピンICで行います。 さて、周波数検出ですが、「2280Hz」と数字では出ていても実際にはアナログ信号のゆらぎ・誤差などで正確にその周波数が検出されるわけではありません。 その為に本機では検出された周波数を上記のどの信号か判定するプログラム部分で「ゆとり」を持たせ、ある幅まではその信号であると判定させています。上の図の薄い色の部分が「ゆとり」の部分です。 プログラムで入力波形から1つの波形の時間を計測し「2280Hz(に近い)周波数だ!」と検知しただけでは正しく空線信号などを検知していることにはなりません。 通常の音声波形の中には様々な周波数成分が混ざっていて、通話中の人間の音声にも2280Hzという周波数成分は含まれています。 また無音中に聞こえる「サー」というホワイトノイズには「全ての周波数成分が含まれている」とされています。 ですので単純に「ある信号に合致する周波数の音を検出した」では無く、「それが一定期間続いているから、何らかの意味を持つ信号が送出されている」という判断をプログラムで行います。 本機プログラムでは「連続して約100msecに達する」事を判定基準として、各信号種別毎にカウンタを持たせてそれが約100msec続いた時に達するカウント値になれば「ある信号を連続受信した」として次の『判定ロジック』に操作を受け渡します。 これで細かなノイズ等による誤作動は取り除けます。 しかしこれだけではやはり音声中に含まれる似た周波数成分の音での誤反応や、「NEC方式の通話中に割り込んで流れる2〜3回のMSK信号(結構邪魔)」でも音声出力をOFFしてしまって使い勝手の悪いものになります。 そこでせっかくPICマイコンでプログラムを作るのですから、この周波数検出部とは別に「状態判断プログラム」を作ってやって、電子頭脳を持ったインテリジェントな空線信号キャンセラーにしてやる事にしましょう。 ● 状態判定 ![]() 状態判定部では、周波数検出部で検出した「信号種別」を元にもう1つ別の「判定カウンタ」を用意して「ある周波数情報が一定期間(回数)続いて、はじめてその状態(空線とか通話とか)であると判定してモードを切り替える」という動作をします。 単純に「空線信号の周波数だよ」ではなく「空線信号が一定期間続いていて、他の信号では無いよ」という判断を行うわけです。 また、1つの周波数条件が連続せずに、別の周波数条件と交互になったりした場合は「不安定」としてカウントをリセットしてまたはじめからカウントし直すことで、ノイズやごく短い他の周波数を検出した際にそれを誤カウントしてしまう事を防いでいます。 安定して1つの周波数条件が続かない場合は以前の判定を保持したままにします。 これで移動運用などでの少し長い受信音の乱れ(ノイズ)などによる誤判定はほとんど減らしてしまえます。 またNEC方式の通話音中に割り込むMSK信号音での誤OFFや、JR通話中に列車側から割り込んで送信された中央呼音(2300Hz)を空線信号(2280Hz)と誤認識して出力をOFFにしてしまう事もほとんど回避できます。(信号受信が長い場合は回避できません) ● 路線判定シフト ![]() 更に『気の迷い』的な「ここは突っ込んで作ろう!」機能として、「JRシフト」と「NECシフト」という二種類の論理的な動作モードを組み込んでいます。 JR無線を受信している時には基本的には「NEC空線信号は聞こえない」はずですので高感度で判定すると通話音声中の似た周波数成分をすぐに検知して「誤作動の元」になってしまいます。そこでJRの空線信号を受信した時には「JRシフト」として誤って音声中のNEC空線信号と似た周波数を検出しにくくします。逆にNEC空線信号を受信した場合にはJR空線信号は検出しにくくする事で誤作動を防止します。 あくまで「検出しにくくする」だけで常に両方の検出プログラムは動作していますので、JR無線を聞いていて乗り換えてNEC無線を使用している私鉄に乗って受信機のチャンネルも変えた(もしくはその逆)という場合にでも自動的に検知してモードが切り替わります。
ただこのシフト機能の弊害(副作用?)として、JR無線を受信(JRシフト中)していて通話中に長い「MSK信号に似た音」を受信した場合、どうしても「私鉄空線」と判断はしてしまいます。JR無線の中で長時間の無音(誰も喋っていない)期間に起こりやすく、もしJRの通話受信中にMSKと判定するとモードはNECシフトに切り替わります。そのまま通話や無音が続いた場合は「通話」と判断して音声出力は再度ONになりますが、モードはNECシフトのままなので通話終了後にJR空線信号を受信しても音声カットまで数秒かかります。(私鉄モードで遅延時間を延ばしているため) 受信機の音声回路の特性や、路線毎の送信機の特性、またJRの指令室内の雑音状況にもより無音期間中に誤ってMSKと認識するかどうかは条件次第のようですが、長時間指令員が黙ってしまうような場合は誤作動する可能性があります。 逆に私鉄無線を聞いていてNECシフト、通話中にJR空線信号と誤判断する事はほぼ確認されていません。(テスト環境では条件が揃わないだけかも) 回避策としては、JRシフトからNECシフトに切り替わった場合、逆にNECシフトからJRシフトに切り替わった場合は一定時間(10秒以上くらい?)はニュートラルモードに戻して各判定を高速で行うようにしてしまう等、プログラムの追加が考えられます。 今回公開しているプログラムVer1.0では対応はしていませんが、後日バージョンアップする場合があります。 ● ジェネラルフロー ![]() ![]() 実際にはもう少し細かく分かれていますが、ここでは全体の流れを把握する為に簡略化したフローチャートを示します。 電源が入るとPICが動作を開始し0x000番地からプログラムが実行されます。 まず最初にPIC本体の機能や動作指定を行って今回の回路用に動くよう初期化します。 続けて今回のプログラムで使用する変数を初期化したりパラメータの初期設定を行います。 初期設定の段階で「ハードウェアが壊れていないか?」を確かめるのも重要な要素で、本機ではLEDが3個付いていますからこれが壊れていなくて正しく点灯するか3個を順番に点滅させる事を3回繰り返します。これを「ランプテスト」と言います。 ランプテストを行う事でLEDが玉切れになっていないか確認できますし、PICのプログラムが正しく起動した事を使用者に知らせる事ができます。 その後にニュートラルモードで受信信号の周波数チェックを開始します。 動作開始時(電源ON時)は音声出力はONになりますので、受信機が繋がっていて空線信号を受信していたら本機の出力に繋がったスピーカーなどから空線信号音が聞こえます。 これも動作テストの一環で、ここで音声が聞こえない場合は音声スイッチング用のトランジスタまわりが故障しているとわかります。 音声はこの後の「空線信号判定」が正しく行われるとカットされますので、そこでまたプログラムの正常動作と音声カット回路が正常であると確認できるわけです。 PICマイコン(や、工業用の組み込みマイコン)の場合は豪華な表示装置(CRTディスプレイや液晶パネル)などが付いていない機器に入れてしまう事が多いので、このような方法で故障個所の判断が簡単にできるように仕様を考えるのもハードウェアに密接するプログラマのお仕事の1つです(^^; ● 周波数測定プログラム ![]() ![]() (1) パルスが下がるのを待ちます。 立ち上がりの瞬間からカウントを開始するためです。 (2) パルスが立ち上がったらカウンタをリセットして次の立下りを待ちます。 (3) 下がったらここで半分。(デューティ比が50%ならちょうど半分でも…) (4) 立ち上がりの瞬間を待って、その時点でのカウント値はパルスの一周期×8μ秒。 これで次の周波数判定へ進みます。 各カウントループ中でカウンタがオーバーフローしてしまった場合は「無音」または「測定範囲外の低周波」を検出したとして周波数判定部を飛ばして「その他 PC(パルスカウンタ)」に進みます。 この方法では周波数測定を終えて周波数判定に進んだ場合は必ず入力パルスは上がっている状態で、そこから後の判定などを終えて再度この周波数測定ルーチンに来た時にはパルスはまだその周期の山の部分です。 従ってそこからこのルーチンで立下りを待ち、立ち上がった所からのパルス幅を検出することになりますので実際にはすべての入力パルスのうち半分のパルス数だけを検査していることになります。 ハードウェアのタイマー/カウンタ機能などを使えば各パルスの立ち上がりまたは立下り毎の間隔を必ず毎回測ることができますが、今回はそこまで厳密に調べる必要もなく、タイマーは使用しないというルールで測定ルーチンを考えていますのでこのような方法になっています。 単純にこの後の「100msec続いたか?」で数える回数(閾値)を半分にするだけで済むのですから。 あまり良い例ではありませんが、「何事もマニュアル通りにしなくても良い」という見本でしょうか(^^; ● 受信状況判断プログラム ![]() ★ トーン信号識別ロジック 単に一回「xxxxHzのパルスを見つけたよ!」だけでは「今受信している音声信号はxxxHzの連続音だ」とは判断できません。 そこで「パルス数カウンタ(PC)」というカウンタを用意してやって、見つけたパルスの数をカウントして「一定の数だけ連続したらその周波数の信号音だと認めよう」という判断ルーチンを作ります。 パルス数カウンタ(PC)は PC_NEC_MSK…… NEC MSK タイプのパルスをカウントする PC_JR_AKI …… JR空線信号 タイプのパルスをカウントする PC_JR_YOBI…… JR一斉呼出 タイプのパルスをカウントする PC_JR_TEST…… JR試験良好 タイプのパルスをカウントする PC_OTHER……… その他(通話音や無音) タイプのパルスをカウントする の合計5種類を用意しています。 周波数判定部でカウントされたパルス幅カウンタの値を元に、「そのパルス幅はどのタイプのパルスと合致する?」かを順次判定して、合致したパルス数カウンタ(PC)を+1します。 各パルス数カウンタ(PC)には「100msec連続するのに必要な時間」が周波数の逆数で求められますので、その数値に達した時点で「100msec連続した」と判断できるわけです。 但し、その種類のパルスだけ数えているのならその回数で100msecで正しいのですが、間にノイズや不安定な入力で他のパルス幅のものが混ざっていたらどうなるでしようか? それぞのカウンタ(PC)がバラバラに数値をアップさせてゆき実際の100msecを過ぎてもどのカウンタも閾値に達していない状況になりますね。 でも大丈夫。 ここでは別に「絶対100msecごとに判定を下せ!」という命令は誰からもされていないので、「バラバラになった場合は『真っ先に閾値に達した者の勝ち!』ルールである」という事にして、ノイズ混じりでもなんでもいいのでどれかが閾値に達するまでに最もその存在確率が高かった物をその期間の信号とする。という判断にしています。 説明しやすいようにこれを「徒競走方式」・・・とここでは勝手に命名します。 正確なタイマー割り込みで100msec等に時間を区切って、その時点で5種類の各PCに対して「存在確率計算」をして出てきた数値(%)で最も高い物を勝ちとする・・・という非常に論理的かつ教科書的なルーチンでも良いわけですが、タイマー割り込みなどを使わずに徒競走方式で判定しているわけです。 タイマー方式だと「5人のランナーが20秒間に何メートル走れるのかを競う。20秒後に最も長距離走った人の勝ち!」というルールになります。「一定時間のうちに」というのは良くプログラムで使用される判断方法ですね。 対して徒競走方式は「5人のランナーが100メートルの距離を走る。最も先にゴールラインを超えた人の勝ち!(走るスピード、ゴールするまでの時間はその人達次第…)」というルールになります。 どちらも速く走った人が勝ちという部分では同じですね。(人の場合は持久力等で違いが出るかもしれませんが、タイマー式の判定時間を徒競走式のゴール時間とほぼ同等にしてやれば違いはほとんど無くなります) ★ モード判定ロジック こうして約100msecおきに「その期間はどのタイプの信号を受信しているか」が決められますので、次に「その信号がどれだけの時間続いているか」を判定します。 実はノイズ等が少なければこのパルス数カウンタ(PC)だけでの判定で音声出力をON/OFFしてもかなりイイ感じに動作します。 ちょうどトーン検出IC NE567の出力くらいの感じなのでこの出力に多少のCRタイマー回路などを付けて遅延させてやればそれでも空線信号キャンセラーはできると思います。 ※ プログラム・ソース中でEQU設定値を書き換えると「モード判定ロジック」部を飛ばして「単純に検出トーンでモードを切り替える動作」にもなります。アセンブル環境をお持ちの方はその部分を変更したPICを焼いて試してみるとLEDが音声入力にあわせてパラパラと切り替わったりする様子を確認できます。(まぁ、動作試験用なのですが…) しかしやはり単なるトーン検出だけではノイズに弱かったり、人間の音声中に含まれる各トーンに似た周波数の音にも反応してしまってブツブツと途切れることもあります。 そこでこのトーン検出状態がどれくらい継続しているかで「正しくモード切替(判断)をする」というプログラムを作って「知能を持った?」(は、少し言い過ぎ)高性能な空線信号キャンセラーにしましょう。 認定カウンタ(CT)は CT_NEC_MSK…… NEC MSK タイプの連続時間をカウントする CT_JR_AKI …… JR空線信号 タイプの連続時間をカウントする CT_JR_YOBI…… JR一斉呼出 タイプの連続時間をカウントする CT_JR_TEST…… JR試験良好 タイプの連続時間をカウントする CT_OTHER……… その他(通話音や無音) タイプの連続時間をカウントする の合計5種類を用意しています。 また各モードを認定するカウンタの閾値(どれだけ連続したら認めるか)は「可変」にしています。 これは上のほうで説明したJRシフトやNECシフト時にノイズ・誤作動防止の為に関係無いモードの検出を遅らせることができるよう、モード切替に応じて閾値ほ自由に変更できるようにするものです。 JR_B_NINTEI …… JR-B の認定判定回数を可変にする為 NEC_NINTEI …… NEC MSK の認定判定回数を可変にする為 OTHER_NINTEI……その他 の認定判定回数を可変にする為 の合計3種類を用意しています。 ![]() 文章で書くとややこしいですが、図にすると簡単ですね(^^; 右のフローチャートは「JR空線」の部分ですが、実際はほかに「JR一斉呼」「JR試験良」「NEC MSK」部や「その他」部などがほほ同じような内容でプログラム中には並んでいます。 それぞれの違いは各カウントの閾値やモードが確定した後に他モードのカウンタの閾値を書き換えるなど、そのモードに特化した部分がそれぞれ異なります。 また「JR一斉呼」と「JR試験良」はモード判定が「JR空線」となっていて音声OFFの期間中のみしか判断しないようにもなっています。 ほか、実際のプログラム・ソース中にはここで紹介していない細かなルーチン等もあります。 ![]() 写真は開発・テスト中の様子です。 8ピンPICではなくピン数の多いPICに液晶パネルを繋いだ汎用開発用ボードとブレッドボード上に仮組みしたアナログ回路を繋いでテストを行っています。 表示は判定カウンタ1桁(英文字)+検知カウンタ3桁
| NEC空線 | JR空線 | JR試験良 | その他 | ![]() [JRテスト]と[その他]の検知カウントも少し動いていますね。 ![]() [その他]の検知カウントが少し動いていますが他は0です。ノイズが増えると[その他]が増えます。 ![]() ![]() 近い周波数の音を検知して空線信号の各カウンタもちょろちょろ回りますが判定には至りません。 だいたいプログラムの仕様も決まり、テストボードでのバグ取りも終わった所で目的の8ピンPIC 12F629に移植して本番回路の作成です。
今回の回路図です。
▼回路図をクリックすると拡大表示
● 音声入力アンプとデジタル化 ![]() ほとんど聞こえるか聞こえないか程度の小さな音量から、スピーカーが音割れする程度の音量まで対応します。入力音量調節の必要はありません。 LM358の右半分(コンパレータ・反転出力回路)で音声信号をPICマイコンに受け渡す為のデジタル信号に変換しています。 ![]() MICROCHIP社のPIC 12F629を一個使用します。 (他の8pinタイプのPICでも良いですが、今回はこれ) 複雑な機能は全て「プログラム」という目に見えない部分で処理してしまいますので、回路図中ではPICまわりは非常にシンプルです。 クロックも内蔵の4MHzオシレータを使用していますので外部に発振子をとりつける必要はありません。内蔵オシレータ程度の精度でじゅうぶんです。 プログラムは本ページで公開しています。ご自分でPICライターをお持ちの方はHEXファイルを、プログラム内容を書き換えて使用されたい場合にはASMソースファイルをダウンロードしてください。 尚、プログラムの著作権は放棄していません。個人で遊ばれる為に使用される場合は無償ですが、販売用途・また営利使用される場合は必ずご連絡ください。 ● LED表示 LEDは三個使用します。 「私鉄」「JR」「通話」の3モードをそれぞれ表示します。色はご自由に! 「JR」は試験良信号を受信中は点滅します。 ※ 順番を変えたい!とか私鉄とJRの区別無く一個の「空線」LEDにしたい!などの場合は適宜プログラムソース中の対応ビット設定を書き換えてアセンブルしてください。 モード表示用なので「同時には一個しか点灯させない」というルールで電流制限抵抗は一個にしています。 もしプログラムを改変して複数個同時に点灯させる場合は回路図も書き換えてください。(個別に抵抗を) ● 音声キャンセルスイッチ 音声を出す/出さないを切り替えるスイッチ部はトランジスタによるスイッチにしています。 トランジスタのベース電圧の有無でアンプ動作をON/OFFする基本的な回路ですが、単純にベース抵抗をPICマイコンに繋いだだけではON/OFF時に「ブツッ!」とか「ボッ!」という感じのかなり大きなノイズが発生してしまいます。 これは音声出力OFFの時は出力は約0Vになっていますが、ONになるとトランジスタのコレクタの電位(音声入力から来ている)に急に上がるためにスピーカーに大きな音を発生させる電気信号が流れるからです。 スピーカーを壊してしまうような大電力は受信機のイヤホン/スピーカー端子からは出ていないものの、かなりの耳障りですので積分回路を挟んでON/OFF時の電圧変化を滑らかにしています。 ● 電源部 PICマイコンは約3V〜5.5Vで動きますし、LM358も3V〜30V程度と電源幅には余裕があるのでニッケル水素充電池×4本の最低4V程度から定格外ですがまぁPICが壊れない範囲の6Vくらいまでなら本回路は動作します。 受信機が固定機で「電源出力を持っている」とか、ハンディ受信機だけど家で固定運用するのに「安定化電源を繋いでいる」など、空線信号キャンセラーも受信機に繋いで24時間運用するものとして、本機の電源部は三端子レギュレータ78L05で直流7V〜15V入力型としています。 電源装置が無い場合はDC 9〜12V出力のACアダプターを回路図通りの電源部に繋ぐか、78L05を取り払って5VのACアダプター(秋月で600円の奴とか、携帯電話のACアダプターとか)で直接5Vを与えてやるなど、作られる方次第です。 消費電流は10mA〜20mA(状態による)程度ですので、単三電池×2本からDC/DCコンバータで昇圧してもほとんどの昇圧回路でじゅうぶん動作させられるでしょう。 持ち運び用の小型ケースに組み込む場合は単四電池とDC/DCコンバータでも一日くらいは連続動作させられそうです。 ● 電源スイッチと音声切り替えスイッチ 空線信号キャンセラーの定番ですが、電源スイッチを切った場合は回路中の音声ON/OFF回路が働かなくなるのでスピーカーから音声が出なくなります。 それでは不便ですので音声出力を「電源ONの時はキャンセラー回路に」「電源OFFの時は入力をバイパスさせる」為の連動スイッチにしておきます。 ● 入力端子・出力端子 回路図では単純に「音声入力」「音声出力」としてそれぞれ1つの端子で書いていますが、単に受信機とスピーカー(イヤホン)の間に接続するだけではなく「スピーカーで聞きつつ、録音機に繋ぎたい!」などの希望もあるでしょう。 ここでは一番基本形の回路図を示しただけで、そのあたりの拡張・改造は作られる方のご自由に行ってください。 また「通話時にリレーを働かせて、他の機器(テープレコーダー等)を動作させたい!」等の場合はPICの2番ピン(音声回路用出力)や5番ピン(通話LED出力)などのHレベル信号を拾ってトランジスタ等を動作させる回路を追加すると良いでしょう。 リレーなどを使用すると消費電流も多くなりますので電源部の三端子レギュレータは定格100mAの78L05では電流不足になる事も考えられます。改造する場合は電源容量なども含めて回路を考えてください。
「必ずこの通りに作らなければならない!」というわけではありませんので予めご了承ください。今回製作した基板の一例です。
専用基板を使用しなくても、この程度の規模の回路ならユニバーサル基板(穴空き基板)の上に組み立ててもすぐにできてしまいます。 ■部品面 ![]() ![]() LEDを曲げているのはケースに入れた時に前側にLEDを出す穴を空けているためです。ご自分のケースにあわせて実装してください。 PICはICソケットを使用して載せていますので、プログラム変更・バージョンアップの際に簡単に抜いて交換できます。 基板サイズは5cm×3cmとコンパクトですので、色々なケースに簡単に入れる事ができるでしょう。 ● 部品表 ![]()
● プログラムのダウンロード ![]() こちらから「インテリジェント空線信号キャンセラー」プログラムをダウンロードできます。
本ページの「専用基板、完成基板、組み立て完成品の頒布 」の項をご覧下さい。 【お知らせ】 記事公開から3ヶ月経過しましたので、頒布は終了しました。 ● 製作例 ![]() ● 携帯用/固定用兼用オールインワン型 ![]() 電池を単四×4本とした事でサイズが少し大きくなってしまったのが難点ですが、必要な機能は全て盛り込んでいるので当面は私の使用するメイン機となりそうです。 ● アダプター型 ![]() ![]() 出力端子は1つだけの基本回路図通りの製作です。 入力端子は3.5φジャックではなく、直接ケーブルを出して先に3.5φプラグをつけています。 どうせ受信機のイヤホン端子に繋ぐのでここをジャックにして中継ケーブルを別途用意するくらいなら、直づけケーブルにしておいても不便ではありません。 ![]() このケース(タカチSW-75)は実は100円ショップダイソーの「耳元スピーカー」と幅がちょうど良く、スピーカーを上に置いて使えます。 スピーカーを載せるとこんな感じになります。 まるで誂えたようにぴったりですね。 このままスピーカーを両面テープで固定してしまっても良いくらいです(^^; ● スピーカー一体型 ![]() どうせケースを買って小型スピーカーを内蔵させるなら、元からスピーカーのほうに回路を入れてしまおう!という手抜き方針ですね(^^; 今まで作ったいくつかの空線信号キャンセラーもこういう感じにスピーカーに内蔵してしまいました。 本当は白いスピーカーに入れたかったのですが最寄のダイソー数件を回りましたがどこも黒しか売っていませんでした。(上の写真の白いのは別の用途で使っているので流用は…) 仕方なく黒を買ってきて工作しはじめたわけですが、どうも黒いケースからLEDの頭がニョキっと出ているのもおかしな感じなのでLEDは奥に隠してしまって、表面に貼るシールのデザインを透過型照明タイプにしてみました。 ![]()
専用基板のご要望が多いので追加製作しました。 PICにプログラムを書き込む環境が無い方の為に「プログラム済みPIC」の頒布も行います。 実費でお譲り致しますのでご希望の方は頒布情報ページよりお問い合わせください。 ※ ケース入り完成品は全てお譲りすることができました。 現在は2008/7/7製作ぶんの「専用基板」「PIC」の頒布を行っています。 残りわずかですので品切れの際はご容赦ください。 尚、次回製作の予定はありません。
「インテリジェント空線信号キャンセラー」の製作はいかがでしたでしょうか。
JR方式/私鉄方式(NEC方式)の両対応・自動認識機能を持った空線信号キャンセラーというものは世界初(?)なのではないかと自負しています。 ノイズや受信状況の変化にもかなり強く、プログラム中のパラメータを自由に変更して頂く事で作られる方オリジナルの個性をもった空線信号キャンセラーを組み立てることもできます。 また「自分は東京には住んでいないので関東私鉄方式は不要だ」という方はNEC方式の識別部をカットしてよりJRに特化した空線信号キャンセラーとする事も可能です。 プログラム冒頭の
※ 改行位置を少し変えてあります
部分を
またこの設定はメモリーに書き込んでから各ルーチンで参照していますので、プログラムの一部を変更すれば、オプションスイッチを現状の「断続型対応」機能ではなく「JR/NEC方式切り替えスイッチ」とする事もできますね。自動識別ではなく任意に方式を切り替えられる空線信号キャンセラーとする事も可能です。 いくらPICプログラムで状態判定や識別を行っているとはいえ、元の音声入力があまりにもノイジーであったりレベルの変動が激しかったりした場合には空線状態を判定できずに「通話」としてしまう場合があります。 プログラムの判別できない信号にはさすがに無力ですので、ある程度はちゃんと空線音として聞こえる範囲で使用してください。プログラム式とはいえ神様のように万能ではありません。 空線信号キャンセラー以外にも音声入力中の様々なトーン信号を検出する用途に応用が利きますので、PICを使って音識別をする技術のひとつの方法として役立てば幸いです。
(C)「気の迷い」 Kansai-Event.com 本記事の無断転載・転用などはご遠慮下さい |
![]() |
![]() |