緑の中に

緑の中に
国立天文台

8/17/2023

■ Unoマイコンの端子の利用状況


■ Unoマイコンの端子の利用状況

折り返されて見ずらいかもしれません。興味ある方は別テキストエデッタにコピー展開してご覧ください。

=========================================================================================================

Unoには4個のLEDを取付け--> D4?,D7,D8,D9 

---------------------------------------------------------------------------------------------------------

基板番号  機能(Diodeは3~9)    信号状態       用途                接続回路

---------------------------------------------------------------------------------------------------------

9~ D9(L9) ledPin9 (緑LED)プログラム実行確認LED  Normal Low プログラム実行確認LED 点滅現象 

8   D8(L8) ledPin8 (赤LED)◎A-夜間 [真]  Normal Low ◎A-夜間 [真 true]           

7   D7(L7) ledPin7 (青LED) △B―昼間[偽]  Normal Low △B―昼間 [偽 false]           

6~ D6(L6) ledPin6         xx:x5    Normal ★High 電子音Ⅱ(12V10W-AMP) Shoot#2 (黄LED)

5~ D5(L5) ledPin5         xx:x3    Normal ★High  PIC電子音Ⅰ          Shoot#1 (黄LED)

4   D4(L4) ledPin4 (緑LED) xx:x0    Normal ★High  ラジオON         Shoot#3 (黄LED) 77秒

3   D3(L3) ledPin3  未使用          空き

2   INPUT(INT)  [分]更新中にINTが入ると、時刻取得が正しく行われず時刻が乱れた。INT動作は採用できません。

--------------------------------------------------------------

A0  アナログ 0 --> デジタルへ LED

A1  アナログ 1 --> デジタルへ  BZ Tr:2SC1815の最大コレクタ電流は150mAである

---------------------------------------------------------------------------------------------------------

Oneshoot IC555 は、 2pin Active Lowで3pin OUT(HIGH) 

=========================================================================================================

One Shoot#1 PIC電子音Ⅰ C=33μF R=100KΩ T=3.6 [Sec]  PICに引き渡すので周期Tを越えて可能

One Shoot#2 電子音Ⅱ_12vAMP C=33μF R=100KΩ T=3.6 [Sec] 周期T以内の動作

One Shoot# C=33μF R=100KΩ T=3.6 [Sec]

One Shoot#3 ラジオ C=33μF R=2M(2x10^6)Ω T=77[Sec] 周期T以内の動作

=========================================================================================================

T=1.1xCR=1.1x33x10^(-6)x1x10^6=36秒

T=1.1xCR=1.1x33x10^(-6)x10x10^6=360秒(6分) 茶黒緑 デジタル抵抗計で 10.8MΩ <--- カラー表示おかしい


Shoot#3 赤黒緑 20x10^5=2x10^6  2MΩ T=1.1CR=1.1x33x10Exp(-6)x2x10Exp(6)=72.6秒 


*実測値は理論値より長めの値となる。すると4~5分のワンショットを設計するなら、


理論値

2MΩ 73秒

3MΩ  108秒(1分超) 

5MΩ 181秒(3分)

10MΩ 6分



One Sootの強制動作スイッチ(IC555の2pinを10KΩでPull Up,IC555の2pinをGND)は設ける必要がある。

このスイッチにより、電子音Ⅰ・電子音ⅡのONを確認できる。

=====================================================================================

2023.7.5 現在の設定


[xx:x3]  pin5 PIC電子音  ショット#1  約4秒

[xx:x5]  pin6  電子音Ⅱ_12vAMP  ショット#2 約4秒


[xx:x0]  pin4  ラジオON  ショット#3  77秒


==============================================================



 

■ [xx:x0] 時刻でラジオがONとなります

プログラムの一部です。

時刻「分」の桁が例えば、10,20,30,40,50,00 で動作します。要するに10分間隔の動作が実現できます。ON継続時間はおおよそ77秒間です。この77秒とはワンショット・マルチ・バイブレータのパルス長です。

このような記述で [xx:x3]  電子音1 [xx:x5] 電子音2 の各回路を起動動作させます。




下記がArduino Uno のプログラム(スケッチ)です。

p_alarm = "xx:x0"; //ポインタalarmに時分をセット @@@@@@@@@@@@@@@@@@@@@@@@@@@@@    xx:x0   1件目の検索設定あり

    Serial.println(p_Ntime);//ポインタNewTimeの意味

    Serial.println("p_alarm");//ポインタalarmの意味

    Serial.print(p_alarm);//シリアルモニタに印字(変数p_alarmの内容)


    int m = 4;//基数0  "xx:x0"  下1桁を照合  "xx:xx" は照合無し

    int n = 4;//基数0 4で最下位となる

    //xx:x0 10分インターバルでラジオ駆動 ワンショットマルチバイブレーターをトリガーします

    if (strncmp(p_alarm + m, p_Ntime + m, n + 1 - m) == 0) { //<-- 注意 n-m=4-3=1 1文字を比較

      Serial.println("_Detected time●◎xx:x0●");//あたり

      digitalWrite(ledPin4, HIGH);  // //Normal High LEDを点灯 ラジオを Soot#3使用。

      digitalWrite(ledPin4, LOW);// One Shoot Active Low

      delay(100);// One Shoot Active Low

      digitalWrite(ledPin4, HIGH);


    } else {

      //Serial.println("_was not detected△");// はずれ

      //digitalWrite(ledPin4, HIGH);  // LEDを消灯 ラジオをOFF

    }




 p_alarm = "xx:x3"; //ポインタalarmに時分をセット @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@   xx:x3   件目の検索設定

    Serial.println(p_Ntime);//ポインタNewTimeの意味

    Serial.println("p_alarm");//ポインタalarmの意味

    Serial.print(p_alarm);//シリアルモニタに印字(変数p_alarmの内容)


    m = 4;//基数0 "xx:30"  m = 3; n = 4;下2桁を照合  "xx:xx" は照合なし 

    n = 4;//基数0


    if (strncmp(p_alarm + m, p_Ntime + m, n + 1 - m) == 0) { //<-- 注意 n-m=4-3=1 1文字を比較

      Serial.println("_Detected time●◎xx:x3●");//あたり

      digitalWrite(ledPin5, HIGH);

      delay(100);

      digitalWrite(ledPin5, LOW); // LED消灯灯させる xx:x8でOne Shoot#2 PIC警報音 電子音Ⅱを送出

      delay(100);                 //PIC電子音1  Up Edge でトリガーされる

      digitalWrite(ledPin5, HIGH); // One Shoot#1 の2pin Active Low 信号をPIC alarmの起動信号に利用


  /*

      digitalWrite ( A0, 1 );//A0に接続したLEDを点灯

      delay(1000);

      digitalWrite ( A0, 0 );//A0に接続したLEDを


      // LEDの状態をトグル(反転)

      if (A0 == 0) {

            //A0 = 1; // 消灯から点灯に変更

            digitalWrite ( A0, 1 );

        } else {

            //A0 = 0; // 点灯から消灯に変更

            digitalWrite ( A0, 0 );

        }

    */  


    if(global_night_flag){

    digitalWrite ( A0, 1 );//A0に接続したLEDを点灯

   }

   

   else { digitalWrite ( A0, 0 );//A0に接続したLEDを

   }

      

        


    } else {

      Serial.println("_was not detected△");// はずれ

      //digitalWrite(ledPin3,HIGH);  // LEDを消灯

    }





   p_alarm = "xx:x5"; //ポインタalarmに時分をセット @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@   xx:x5   3件目の検索設定

    Serial.println(p_Ntime);//ポインタNewTimeの意味

    Serial.println("p_alarm");//ポインタalarmの意味

    Serial.print(p_alarm);//シリアルモニタに印字(変数p_alarmの内容)


    m = 4;//基数0 "20:10" 5桁を照合

    n = 4;//基数0

    if (strncmp(p_alarm + m, p_Ntime + m, n + 1 - m) == 0) { //<-- 注意 n-m=4-3=1 1文字を比較

      Serial.println("_Detected time●◎xx:x5●");//あたり

      digitalWrite(ledPin6, HIGH);

      delay(100);

      digitalWrite(ledPin6, LOW);  // Active Low ワンショット#2 のTrigger Normal High

      delay(100);                   //電子音Ⅱ

      digitalWrite(ledPin6, HIGH);

    } else {

      Serial.println("_was not detected△");// はずれ

      //digitalWrite(ledPin6, HIGH);  // LEDを点灯 ワンショットのTrigger Normal High ハード部でプルアップ済

    }




******************************

■ プログラムの後半です。部分抜き書きで申し訳ありません。
main ルーチン すなわちUnoプログラムのloop 内を60秒(1分)以内に実行完了する必要があります。

理由はRTCが「60秒」毎に新時刻を送り出します。
RTCからのこの新時刻を受信スタンバイの状態であることが必要です。Unoでそのようなプログラムとしています。

 digitalWrite(ledPin7, LOW);//RTCの「分」更新時に1回だけ点滅

確認のため、上記の命令を入れています。
イメージ的にはこの「マイコンの生存確認プログラム」と理解してください。
60秒以内に点滅を繰り返します。
この点滅を見ると安心できます。

    //char n_time[6] = "06:00"; // 現在時刻を文字列で指定


    char *hour_str = strtok(p_Ntime, ":");

    char *minute_str = strtok(NULL, ":");


    Serial.println(hour_str);

    Serial.println(minute_str);


    int hour = atoi(hour_str);

    int minute = atoi(minute_str);


    if ((hour >= 18 && minute >= 00) || (hour <= 4 && minute >= 00)) {

      // 04時00分は真 04時01分は真 04時59分は真  05時00分は偽  05時01分は偽

      // (注意)04時代は真となる. 00時代~04時代は真となる。18時以降は真となる。


      //if ((hour >= 17 && minute >= 30)) {

      // 17時30分 以降 真  00時00分 偽



      // 夜間の時間帯にある場合の処理を想定

      

      digitalWrite(ledPin8, HIGH);  // LEDを点灯させる

      delay(1000);

      digitalWrite(ledPin8, LOW);//RTCの「分」更新時に1回だけ点滅


      Serial.println("●◎A-夜間 [真 true] 動作です●");


      int night_flag = 1;

      global_night_flag= night_flag;


    } 

    else {

      // Bの動作を行います

      

      

      digitalWrite(ledPin7, HIGH);  // LEDを点灯させる

      delay(1000);

      digitalWrite(ledPin7, LOW);//RTCの「分」更新時に1回だけ点滅


      Serial.println("△B―昼間 [偽 false] else動作です.");


      int night_flag = 0;

      global_night_flag= night_flag;

      


    }


******************************