/** 16F1823用 Transponder制御プログラム by JH1IFZ Katsunobu A. Yoshida * Written for MikroC Pro * Written for MikroC Pro V7.6.0 Feb 02 2025 Transponder exApril 18, 2024 HandyBeacon.mccpi * * Clock: 20.0MHz Xtal cirtified 2024/12/28 * Device Flags: * _HS_OSC _WDT_OFF _PWRTE_ON _MCLRE_OFF * _CP_ON _CPD_ON _BOR_ON * _LVP_OFF _DEBUG_OFF _BOR21V _WRT_OFF * * *---------------------------------------------------------------------------------------------------------------------- * HandyBeaconの動作概要 ※このプロジェクトは動作したが、それ以上の開発は中止し、Transponderプロジェクトに移行した2024.12.15 * Transponder音声起動用のパルス信号を発生する * メッセージ長は10秒max(録音再生のIC設定) * AD変換部は、リモコンマイクのキーパッド判定に用途変更した。 * @ Aボタン判定 第1メッセージ録音 長押しで録音ボタンON、当該メッセージボタンクリック、再クリックで停止 * A Bボタン判定 第2メッセージ録音 長押しで録音ボタンON、当該メッセージボタンクリック、再クリックで停止 * B ▲ボタン判定 第4メッセージ録音 長押しで録音ボタンON、当該メッセージボタンクリック、再クリックで停止 * C ▼ボタン判定 トラポンの動作停止再開(トグル) 長押しで動作停止  再長押しで動作再開 *  D PTT SW 判定   PTT押下で録音開始・停止処理に変更した * スピーカマイク抵抗値 * 「B]2.7k [A] 6.8k  「▲」15k 「▼」33k * ※使えるコンビネーションは[▲▼] 10.3k くらいかなー * [AB] 1.93k [B▲] 2.28k [B▼] 2.49k [A▲]4.69k [A▼] 5.64k [▲▼] 10.3k * * * モコンマイクのキーパッドからのアナログ電圧をPICのAD変換し、設定にジャンプ * 本機内蔵スピーカで発声し無線機のトラポン内蔵マイクロフォンで拾う。無線機はPICからのPTT信号で送信動作させる。 * 無線機からのSP信号を受け、チャネルクリアなら、トランスポンダ―動作を開始する。 * 無線機からのSP信号を受け、チャネルBUSYを検出した場合は、ビーコンの送出を一時停止する。 * *---------------------------------------------------------------------------------------------------------------------- * Transponder動作概要 * (1)Transponder Announce モード *  @ 定形メッセージ1「こちらは Transponder JH1IFZ 横浜港南区 信号を受信したら録音して送信します。"Pi"」 * *  A 受信音声を検出した場合は(2)Signal Detect モードに移行する 信号検出無い場合は既定時間でループする * * * (2)Signal Detect モード *  A 受信している信号を録音する *  B 定形メッセージ2「"Pi"こちらは Transponder JH1IFZ 横浜 信号を受信しましたので再生します。"Pi"」 *  C メッセージ3「*****録音した音声*****」 * D 定形メッセージ4 "Transponderの動作を終了しました Pi---" モード@に戻る * * *---------------------------------------------------------------------------------------------------------------------- * PICピンアサイン情報 PIC 16F1823 * PIN番号 名称 用途・接続先 * 1 VDD * 2 OSC1 Xtal * 3 OSC2 Xtal * 4 RA3 Digital入力 モードSW検出 NC(H),Play(H),Rec(L) * 5 RC5 Digital出力 HK829 メッセージ 0 (アクティブL) 「こちらは Transponder JH1IFZ 横浜港南区 信号を受信したら録音して送信します。"Pi"」 * 6 RC4 Digital出力 HK829 メッセージ 1 (アクティブL) 「"Pi"こちらは Transponder JH1IFZ 横浜 信号を受信しましたので再生します。"Pi"」 * 7 RC3 Digital出力 HK829 メッセージ 2 (アクティブL) 「*****録音した音声*****」 * 8 RC2 Digital出力 HK829 メッセージ 3 (アクティブL) 「"Pi---" 」 * 9 RC1 Digital入力 HK829 MICG Play(H),Rec(L) * 10 RC0 Digital出力 HK829 REC端子制御 (アクティブL)(再生時はH) * 11 AN2  Analog入力 HM243 リモコンマイクキーパッド電圧入力(A,B,▲,▼) [A]6.8kΩ 「B]2.7k 「▲」1.5k 「▼」3.3k * 12 AN1  Analog入力 HM243 PTT SW 検出(アナログ入力) * 13 AN0 Analog入力 IC-905 SP接続 (相手局サウンド検出用) HK829の録音用マイクロフォンにも接続 * 14 VSS 電源GND *----------------------------------------------------------------------------------------------------------------------- * 音声録音再生ボード HK829 * 14  VDDL +3〜+5V 電源 * 11 VSSP GND 電源 * 6 M0 メッセージスイッチ1(16F1823 RC5と接続) * 21 M1 メッセージスイッチ2(16F1823 RC4と接続) * 9 M2 メッセージスイッチ3(16F1823 RC3と接続) * 20 M3 メッセージスイッチ4(16F1823 RC2と接続) * 27 MIC+ 録音用マイクロフォン入力(無線機 SP出力に接続し受信音を録音する) * 28 MIC- 録音用マイクロフォン入力 * 12 SP+ 再生用スピーカー  (無線機 マイク入力に接続し録音した音を送信する) * 13 SP- 再生用スピーカー * 22 /REC 再生(H)ー録音(L) 切替スイッチ LED赤(L) * 17 RSTB リセット端子 (16F1823 AN1と接続) * * * * * メッセージ1出力(アクティブL) 「こちらは Transponder JH1IFZ 横浜港南区 信号を受信したら録音して送信します。"Pi"」 * メッセージ2出力(アクティブL) 「"Pi"こちらは Transponder JH1IFZ 横浜 信号を受信しましたので再生します。"Pi"」 * メッセージ3出力(アクティブL) 「*****録音した音声*****」 * メッセージ4出力(アクティブL) 「"Pi---" 」 * * * *-----------------------------------------------------------------------------------------------------------------------* * 開発記録 HandyTransponder プロジェクト・ソース管理 *-----------------------------------------------------------------------------------------------------------------------* * 2024年4月18日 ハンディビーコン作業開始 * 4/18 ピンアサイン決定 * 2024/04/20 Ver0.01 2024/04/20 * 2024/04/21 HandyBeacon02.c を元に12月から開発開始 * 2024/12/25 Transponder00.c Ver0.00 PICkit-4からPICkit-5に変更 MPLAB IPE を5.4から6.2に変更* * 2024/12/28 Transponder00.c DIPSW LED点灯動作確認した  開発環境 MikroC7.6(変更なし) PICkit-5 開発環境安定動作開始 * 2024/12/29 Transponder02.c mainでシーケンス作成開始 ,AN0にTRのSP(テストではPBで2.5V接続)してRC5,RC1,RC3,RC2の検出動作を確認した。次へ * 2024/12/30 Transponder03.c RC1にTRのPTT(PIC9番テストではLED黄Lアクティブ)、RC0(PIC10番 テストではLED赤Lアクティブ)シーケンスOK * 2025/01/03 Transponder04.c 動作シーケンスOK 動作確認LED青を RA1に設定した 受信音モニター時に点灯 * 2025/01/05 Transponder05.c 録音機接続して動作を確認した。時間間隔未調整 ,音声送出が終わらないと次のコマンドを受け付けない。 * 2025/01/30 Transponder06.c IC-705に接続し、PTTオン以外の、メッセージ送出・録音・再生・ピーの動作を確認した。 試作1号終了 * 2025/02/05 Transponder07.c HK829リセット、リモコンマイク操作対応、PTT対応の為改良工事開始(先ずコメント整理) * 2025/02/07 Transponder08.c 試作2号機ハード開始 リモコンマイクスイッチ制御動作確認した * 2025/02/11 Transponder09.c HK829との接続開始 マイクスイッチで全チャネル再生動作確認した * 2025/02/14 TraPon10_01.c プロジェクト 10 固定して ソースファイル名 10_01 から連番とし、単体 Build する * 2025/02/15 TraPon10_01.c PIC RC1からのPTT出力は不要。HK829のD1 LED並列したフォトカプラで解決させる (当面コメントアウト対応) * 2025/02/15 TraPon10_01.c RA1を使ったモニタLEDは消去した * 2025/02/15 TraPon10_01.c このバージョンは、リアパネルSWトラポン側(下)で、PTTswONで録音+マイクキーでメッセージ選択 動作確認バージョン * 2025/02/19 TraPon10_02.c メッセージコメントを整理し、キーボードからの録音再生は完璧に動作した状態で保存した。 * 2025/02/20 TraPon10_03.c マイクキー制御を外し、6Pスイッチを905側にして、自動再生録音部分を開発テスト状態にする * 2025/02/20 TraPon10_03.c 録音・再生モード切り替えには1秒必要な事が分かった。次の課題は相手音声検出とTXコントロール * 2025/02/21 TraPon10_03.c 相手音声検出出来た(PICの入力インピーダンス高く雑音拾っていた100kでダンプ)動作確認 * 2025/02/23 TraPon10_04.c 旧04はエラーのため廃棄して新設した クロック20MHz Xtel メッセージ時間待ちにて動作OK版 void Det_RecMode() * 2025/02/27 TraPon10_05.c Det_RecMode()を新設して、ロータリースイッチ対応版 動作確認した。メッセージ終了検出HK829_Work()で動作OK * 2025/06/21 TraPon11_06.c 前verと変わらず、動作確認のため再コンパイルしてみた * **/ /* ----------------------------------------------------------------------------------------------------------------------------- */ // 変数定義領域 /* ----------------------------------------------------------------------------------------------------------------------------- */ //# include unsigned int adc_rd; // AD変換値保持 unsigned int v_PTT; // マイクPTT SWの分圧抵抗の電圧保持 unsigned int v_Rsw; // マイクKeyPad の分圧抵抗の電圧保持 unsigned long v_RX; // 受信音検出 ex unsigned long v_RX; unsigned int v_829; // HM829のMICG(23)の電圧 int i; // ループ変数 int MsgNum; // メッセージ録音ポート  /* MsgNum = 1; RC5 // exメッセージ1(固定)  「こちらはトランスポンダ―JH1IFZ 横浜港南区 受信した信号を録音して送信します」 int MsgNum = 2; RC4 // exメッセージ2(固定)  「こちらはJH1IFZ トランスポンダ―受信した信号を再生します」 int MsgNum = 3; RC3 // exメッセージ3(録再)  「***** 録音した相手局音声 *****」 int MsgNum = 4; RC2 // exメッセージ4(固定)  「Pi---」 */ int state = 0; // 待ち時間の状態記憶変数 int stateOLD = 0; // 前状態記憶変数 int RecMode = 0; /* ----------------------------------------------------------------------------------------------------------------------------- */ // μ秒単位でのディレイ (Delay_usは定数しか受け付けないので) /* ----------------------------------------------------------------------------------------------------------------------------- */ void DelaySEC(int pw) //秒単位の遅延 { while (pw > 0 ){ Delay_ms(1000); pw--; } } /* ------------------------------------------------------------------------------------------ */ // ReadV_RX() スピーカ入力の電圧を読む 閾値8V(分圧後0.73V)以上検出し外部音声入力と判断 /* ------------------------------------------------------------------------------------------ */ void ReadV_PTT() // HM243 スピーカマイク PTTアナログ出力読み込み用 ※動作OK 04.C { v_PTT = ADC_read(1); // アナログポートAN1 よりAD変換 Delay_ms(2); } void ReadV_Rsw() // HM243 スピーカマイク キーボードアナログ出力読み込み用 ※動作OK 04.C { v_Rsw = ADC_read(2); // アナログポートAN2 よりAD変換 Delay_ms(2); } void ReadV_RX() // IC-905 スピーカ受信音アナログ検出用 ※動作OK 04.C { v_RX = ADC_Read(0); // アナログポートAN0 よりAD変換し受信音を検出する Delay_ms(2); } void HK829_Work() // HK829が動作中であれば 1 を返す ※実験中2/27 { Delay_ms(1000); /* do { // アナログポートAN3はアナログ使用不可のためデジタル入力に変更した v_829 = ADC_Read(3); // アナログポートAN3 よりAD変換しHK829の動作中を検出し、動作終了までループして待つ Delay_ms(2); Delay_ms(100); }while ( v_829 < 10 ); // v_829が 700 以下なら録音再生中と判断し、動作終了までループして待つ */ do { v_829 = ADC_read(5); // アナログポートAN5(RC1) よりAD変換 Delay_ms(2); // v_829が録音再生中ならば動作終了までループして待つ // } while ( v_829 < 300 ); } void Det_RecMode() // モードSWが録音モードにあれば1を返す ※動作OK 04.C { // 受入ポートをRA3に変更  ※変更後は05c で動作OK 2/26 Delay_ms(100); // 遅延 100mS if( PORTA.B3 == 1){ // RecMode = 0; // 再生モード } else{ RecMode = 1; // 録音モード } } void Trig_1() { // メッセージ番号(MsgNum0)を送話する 「こちらはトランスポンダ―JH1IFZ 横浜港南区 受信した信号を録音して送信します」 // PTT ON は、HK819に接続したD1に並列接続するフォトカプラ―からマイク端子DC制御してIC-905送信状態にする LATC.f2 = 0; // メッセージ1出力( RC2(8) M3(29) アクティブL ) Delay_ms(300); // トリガーパルス出力 ※このトリガーパルスは100mSだと短い! LATC.f2 = 1; // メッセージ出力1開放  このパルスでメッセージ終話まで再生する Delay_ms(1200); // ec 100mS HK829動作検出までのアイドル時間 // DelaySEC(10); // 送信終了まで待機10秒 ※実験中はコメントアウト HK829_Work(); // ※実験中※実験中 音再生中ならば動作終了までループして待つ // } void Rec_RX() // 受信音録音 { LATC.f0 = 0; // 録音モードに切り替え(RC0 L) Delay_ms(1000); // IC-905からの音声は直接 HK829 の 22ピン /REC ポートに接続している LATC.f3 = 0; // メッセージ2( RC3(7) M2(9)アクティブL )「***** 相手局音声 *****」 ex f4 Delay_ms(300); // 録音開始パルス 100mS LATC.f3 = 1; // メッセージ2(OFF H) 録音スタート DelaySEC(10); // 最大録音時間 15秒 可能 LATC.f3 = 0; // メッセージ2( RC3(7) M2(9)アクティブL ) Delay_ms(300); // 録音終了パルス 100mS LATC.f3 = 1; // メッセージ2(OFF H)録音終了 Delay_ms(500); // トリガーパルス幅 500mS ※1000から500に変えてOK LATC.f0 = 1; // 再生モードに切り替え(RC0 H) HK829_Work(); // ※実験中※実験中 音再生中ならば動作終了までループして待つ // Delay_ms(1000); // 遅延 1000mS ※ここが短いと正常動作しない } void Trig_2() // メッセージ番号(MsgNum3)を送話する //「こちらはJH1IFZ トランスポンダ―受信した信号を再生します」 { // PTT ON は、HK819に接続したD1に並列接続するフォトカプラ―からマイク端子DC制御してIC-905送信状態にする LATC.f4 = 0; // 当該メッセージ3出力 Delay_ms(300); // トリガーパルス幅 100mS LATC.f4 = 1; // 当該メッセージ出力3 開放 Delay_ms(300); // 100mS HK829_Work(); // ※実験中※実験中 音再生中ならば動作終了までループして待つ // DelaySEC(5); // 送信終了まで待機10秒 から7にした(今) ex DelaySEC(10); 2025.02.24 } void Trig_3() // メッセージ番号(MsgNum4)を送話する // 「***** 録音した相手局音声 *****」 { // PTT ON は、HK819に接続したD1に並列接続するフォトカプラ―からマイク端子DC制御してIC-905送信状態にする Delay_ms(1000); LATC.f3 = 0; // 当該メッセージ4出力(アクティブL) Delay_ms(300); // トリガーパルス幅 100mS LATC.f3 = 1; // 当該メッセージ出力4 開放 Delay_ms(300); // 100mS 待機 HK829_Work(); // ※実験中※実験中 音再生中ならば動作終了までループして待つ // DelaySEC(10); // 送信終了まで待機10秒 } void Trig_4() // メッセージ番号(MsgNum4)を送話する // "Pi---" { // PTT ON は、HK819に接続したD1に並列接続するフォトカプラ―からマイク端子DC制御してIC-905送信状態にする LATC.f5 = 0; // 当該メッセージ4出力(アクティブL) Delay_ms(300); // トリガーパルス幅 100mS LATC.f5 = 1; // 当該メッセージ4出力 開放 Delay_ms(300); // 100mS 待機 HK829_Work(); // ※実験中※実験中 音再生中ならば動作終了までループして待つ // DelaySEC(2); // 送信終了まで待機10秒 } int PTT_Det() //Mic PTT リード PTTが押されていたら 1 を返す ※動作OK 弄るな { ReadV_PTT(); // 設定のためマイクスイッチを読む Delay_ms(2); // 遅延パルス幅 200mS if( v_PTT > 900 ) { //ex1000 LATC.f0 = 1; // HK829 Play LED OFF(アクティブH) return(0); } else{ LATC.f0 = 0; // HK829 REC LED ON(アクティブL) return(1); } } void MickeyDet() //Micキーリード と 録音/再生 ※動作OK 弄るな { ReadV_Rsw(); // 設定のためマイクスイッチを読む Delay_ms(2); // 遅延パルス幅 200mS if( v_Rsw >= 1000 ) { //ex1500ng LATC.f2 = 1; LATC.f3 = 1; LATC.f4 = 1; LATC.f5 = 1; } if( ( 850 <= v_Rsw)&&( v_Rsw < 1020 ) ) { // [▼]33k 3.3V 804 LATC.f5 = 0; // 当該メッセージ出力4(アクティブL) } Delay_ms(2); // 遅延パルス幅 200mS if( ( 600 <= v_Rsw)&&( v_Rsw < 850 ) ) { // [▲]15k 2.8V 560 LATC.f4 = 0; // 当該メッセージ出力4(アクティブL) } Delay_ms(2); // 遅延パルス幅 200mS if( (460 <= v_Rsw)&&( v_Rsw < 600 ) ) { // [A]6.8k 2.0V 487 LATC.f3 = 0; // 当該メッセージ出力3 } Delay_ms(2); // 遅延パルス幅 200mS if( ( 0 < v_Rsw)&&( v_Rsw < 460 ) ) { // [B]2.7k 1.1V 435 LATC.f2 = 0; // 当該メッセージ出力4(アクティブL) } Delay_ms(2); // 遅延パルス幅 200mS } void main() { // 初期化 INTCON = 0; // 全ての割り込みを禁止 16F1823に AN3は無い(RA3はMCLR兼用でデジタルのみの為) // TRISAは、PORTAの各ピンの方向(入力1または出力0)を設定するためのレジスタ // ANSELA は、PORTAのピンを アナログ入力 か デジタル入力/出力 に設定するためのレジスタ // PORTAは、デジタル出力時には値を設定し、デジタル入力時にはピンの状態を読み取るために使います。 #pragma config MCLRE = OFF // MCLR機能を無効にする TRISA = 0b00101111; // PORTA AN0をSP音検出Analog入力、AN1をMicPTT検出Analog入力、AN2はMicKBD検出Analog入力 ANSELA =0b00100111; // AN0(スピーカ出力電圧入力),AN1(MIC PTT 電圧入力),AN2(HM243スイッチ電圧センス) をアナログで使用 // RA3(再生・録音スイッチデジタル入力) AN5(RC1)は(HK829動作電圧MICGアナログ入力) PORTA = 0b00100000; // PortA 初期状態設定 // ex 0b00110111; テスト中 RA3 をデジタル入力(RA3はアナログ入力不可) TRISC = 0b00000010; // RC1のみ入力、他は出力に設定 HK829動作検出、HK829 M0-M3制御出力, REC制御、IC-905 send制御出力(PC LED) ANSELC =0b00000010; // RC1をAN5としてアナログで使用(HK829のMICGセンス用)。他はデジタルで使用 PORTC = 0b00111111; //PORTC初期状態設定 ex PORTC = 0b00111111 ADC_Init(); // ADコン初期化 ※必須※移植しただけで未設定状態 LATC.f0 = 1; // Play/Rec = Play 起動時初期状態は PLAY do { // ループスタート Det_RecMode(); if( RecMode == 1 ){ MickeyDet(); //Micキーリード ※ver10_03.c 開発のためコメント状態にする PTT_Det(); //PTT検出     ※ver10_03.c 開発のためコメント状態にする } else{ // DelaySEC(1); Trig_1(); // メッセージ番号(MsgNum1)を送話する 「こちらはトランスポンダ―JH1IFZ 横浜港南区 受信した信号を録音して送信します」 DelaySEC(2); // 2秒間 待機する ※メッセージ直後のノイズをカットするためチェックまで時間をとる i=0; v_RX = 0; while ( v_RX <= 1 ){ // 受信信号検出待ちex10回ループ ※ハード改善にて回復した v_RX = ADC_Read(0); // アナログポートAN0 よりAD変換し受信音を検出する Delay_ms(2); i++; if(i>20)break; } // v_RX = 0; // TEST 2/20 入れるとループ停止したのでOK // if( v_RX > 1 ){ // もし何か聞こえたら録音から再生まで一連の作業をする ex 5 Rec_RX(); // 一定時間(15秒)録音する Delay_ms(100); // DelaySEC(1); // 録音後の待機時間 Rec_RXにDelayが入っているのでコメントアウト Trig_2(); // メッセージ3出力 「こちらはJH1IFZ 受信した信号を再生します P」 Delay_ms(100); // // DelaySEC(15); // Rec_RXにDelayが入っているのでコメントアウト Trig_3(); // 録音メッセージ2再生・送信  「***** 録音した相手局音声 *****」 Delay_ms(100); // // DelaySEC(15); // 最大時間 15秒 可能 Rec_RXにDelayが入っているのでコメントアウト Trig_4(); // メッセージ4出力 「 Pi--- 」 Delay_ms(100); // ex DelaySEC(1); // DelaySEC(15); // 最大時間 15秒 可能 Rec_RXにDelayが入っているのでコメントアウト } } } while (1); }