緑の中に

緑の中に
国立天文台

11/21/2023

対策装置の警報 時刻一覧

 対策装置の警報 時刻一覧




赤外線センサーはまだ未実装です。これからです。
現在、電子音の改良中です。



季節により時間帯イメージを変更します。
変更はプログラムで容易に可能です。

  • i以下 テレビニュースでの情報です
  • 本年は熊による被害が多く発生し、ニュースになっています。
  • 死亡事故も含むニュースです。
  • ついに、AIカメラによる警報・威嚇装置の実証実験がありました。
  • 会津大学の先生による研究です。
  • カメラで熊を検知すると、相当大きな電子音およびストロボ発光があります。
  • 犬の吠える音声も発していました。
  • 熊は一目散に退散しました。ニュースでの情報でした。






9/25/2023

関数定義とその使用法 について(C言語)

 関数定義とその使用法 について(C言語)

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

関数定義について プロトタイプ宣言とは。関数を定義し、その関数を使用する前に その型(プロトタイプ)を

コンパイラーに通知・教えます。その必要があります。

関数名 flash_1() について解説します。setup{ }内は1回だけの実行です。

以下の様に、3か所の位置での記述が必要になります。

1つ目が setup内、2つ目はloop内、3つ目は それ以外で定義内容を書くことになります。

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

setup{

  flash_1();//プロトタイプ宣言 関数定義の前に ひな型をコンパイラーに通知します

}//setup


void loop() {//loop

flash_1();//定義関数の実行 


}//loop

int  flash_1()//以下定義した関数の内容です xx:x0 xx:x2 xx:x4 xx:x6 xx:x8  

{  

digitalWrite(ledPin8, HIGH);  // LED赤1を点灯させる 確認Action

delay(1000);

digitalWrite(ledPin8, LOW);//LED赤1を

}

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

 *何回も使用するルーチンは、関数として扱うと楽になる。
変更が発生した場合、関数内を修正するだけで済む。


9/23/2023

温度データーロガー 順調です

 

秋分の日です 20度以下になりました。


2023-09-23 02:38:00     19.2   mode 19.2

2023-09-23 02:48:04     19.2   mode 19.2

2023-09-23 02:58:08     19.2   mode 19.2

2023-09-23 03:08:12     19.2   mode 19.2

2023-09-23 03:18:16     19.2   mode 19.2

2023-09-23 03:28:20     19.2   mode 18.2

2023-09-23 03:38:23     19.2   mode 19.2

2023-09-23 03:48:27     19.2   mode 19.2

2023-09-23 03:58:31     18.2   mode 18.2

2023-09-23 04:08:35     18.2   mode 18.2

2023-09-23 04:18:39     19.2   mode 19.2

2023-09-23 04:28:43     18.2   mode 19.2

2023-09-23 04:38:47     18.2   mode 18.2

2023-09-23 04:48:50     18.2   mode 18.2

2023-09-23 04:58:54     18.2   mode 18.2

2023-09-23 05:08:59     18.2   mode 18.2

2023-09-23 05:19:03     18.2   mode 18.2

2023-09-23 05:29:07     18.2   mode 18.2

2023-09-23 05:39:11     18.2   mode 18.2

2023-09-23 05:49:15     18.2   mode 18.2

2023-09-23 05:59:19     18.2   mode 18.2

2023-09-23 06:09:22     18.2   mode 18.2

2023-09-23 06:19:27     18.2   mode 18.2

2023-09-23 06:29:31     18.2   mode 18.2

2023-09-23 06:39:35     18.2   mode 18.2

2023-09-23 06:49:36     error

2023-09-23 06:59:40     19.2   mode 18.2

2023-09-23 07:09:45     19.2   mode 19.2

2023-09-23 07:19:48     19.2   mode 19.2

9/21/2023

「夜明け」「朝」「昼」「夕方」「夜」「夜中」 この時刻帯は

 「夜明け」「朝」「昼」「夕方」「夜」「夜中」 この時刻帯は

夜明け dawn     4:00~6:00

       morning     6:00~9:00    

       day     9:00~17:00 

夕方       evening 17:00~19:00

     night 19:00~24:00

真夜中  midnight 24:00~4:00


季節によって感じが変化するかもしれません。


これをプログラムで使う予定で調べました。この時間帯でアラームのモードを変更するためです。プログラムに入れ込みました。下記がその時刻においての応答です。

「夜明け」から「朝」の時刻帯への境界の状況をCopyしました。

プログラムで例えば mornig_flag=1 などとフラグを立てその時刻帯である事を通知します。これによりプログラムが考え易くなります。 


現在時刻 05:00

■--------------------↓

05:00

p_alarm

xx:x405:00

p_alarm

xx:x6_was not detected△

05:00

p_alarm

xx:x8_was not detected△

05:00

p_alarm

xx:x0_Detected time●◎xx:x0●

05:00

p_alarm

xx:30_was not detected△

05:00

p_alarm

xx:x2_was not detected△

05

00

△B―実験1 [偽 false] else動作です.

◎A-dawn_夜明け [真 true] 動作です

△B―Not morning  [偽 false] else動作です.

△B―Not day  [偽 false] else動作です.

△B―Not evning [偽 false] else動作です.

△B―Not night  [偽 false] else動作です.

△B―Not midnight  [偽 false] else動作です.

■■-------------------------↑


■■-------------------------↑

現在時刻 06:19

■--------------------↓

06:19

p_alarm

xx:x406:19

p_alarm

xx:x6_was not detected△

06:19

p_alarm

xx:x8_was not detected△

06:19

p_alarm

xx:x0_was not detected△

06:19

p_alarm

xx:30_was not detected△

06:19

p_alarm

xx:x2_was not detected△

06

19

△B―実験1 [偽 false] else動作です.

△B―Not dawn  [偽 false] else動作です.

◎A-mornig_朝 [真 true] 動作です

△B―Not day  [偽 false] else動作です.

△B―Not evning [偽 false] else動作です.

△B―Not night  [偽 false] else動作です.

△B―Not midnight  [偽 false] else動作です.

■■-------------------------↑


現在時刻 08:40

■--------------------↓

08:40

p_alarm

xx:x408:40

p_alarm

xx:x6_was not detected△

08:40

p_alarm

xx:x8_was not detected△

08:40

p_alarm

xx:x0_Detected time●◎xx:x0●

08:40

p_alarm

xx:30_was not detected△

08:40

p_alarm

xx:x2_was not detected△

08

40

△B―実験1 [偽 false] else動作です.

△B―Not dawn  [偽 false] else動作です.

◎A-mornig_朝 [真 true] 動作です

△B―Not day  [偽 false] else動作です.

△B―Not evning [偽 false] else動作です.

△B―Not night  [偽 false] else動作です.

△B―Not midnight  [偽 false] else動作です.

■■-------------------------↑


現在時刻 09:00
■--------------------↓
09:00
p_alarm
xx:x409:00
p_alarm
xx:x6_was not detected△
09:00
p_alarm
xx:x8_was not detected△
09:00
p_alarm
xx:x0_Detected time●◎xx:x0●
09:00
p_alarm
xx:30_was not detected△
09:00
p_alarm
xx:x2_was not detected△
09
00
△B―実験1 [偽 false] else動作です.
△B―Not dawn  [偽 false] else動作です.
△B―Not morning  [偽 false] else動作です.
◎A-day_昼 [真 true] 動作です
△B―Not evning [偽 false] else動作です.
△B―Not night  [偽 false] else動作です.
△B―Not midnight  [偽 false] else動作です.
■■-------------------------↑

現在時刻 17:00
■--------------------↓
17:00
p_alarm
xx:x417:00
p_alarm
xx:x6_was not detected△
17:00
p_alarm
xx:x8_was not detected△
17:00
p_alarm
xx:x0_Detected time●◎xx:x0●
17:00
p_alarm
xx:30_was not detected△
17:00
p_alarm
xx:x2_was not detected△
17
00
△B―実験1 [偽 false] else動作です.
△B―Not dawn  [偽 false] else動作です.
△B―Not morning  [偽 false] else動作です.
△B―Not day  [偽 false] else動作です.
◎A-evning_夕方 [真 true] 動作です
△B―Not night  [偽 false] else動作です.
△B―Not midnight  [偽 false] else動作です.
■■-------------------------↑



現在時刻 19:07
■--------------------↓
19:07
p_alarm
xx:x4_was not detected△
19:07
p_alarm
xx:x6_was not detected△
19:07
p_alarm
xx:x8_was not detected△
19:07
p_alarm
xx:x0_was not detected△
19:07
p_alarm
xx:3019:07
p_alarm
xx:x2_was not detected△
19
07
△B―実験1 [偽 false] else動作です.
△B―実験2 [偽 false] else動作です.
△B―Not dawn  [偽 false] else動作です.
△B―Not morning  [偽 false] else動作です.
△B―Not day  [偽 false] else動作です.
△B―Not evning [偽 false] else動作です.
◎A-night_夜 [真 true] 動作です
△B―Not midnight  [偽 false] else動作です.
■■-------------------------↑
global_dawn_flag
0
global_morning_flag
0
global_day_flag
0
local_evening_flag
0
global_night_flag
1
global_midnight_flag
0
global_dawn_flag
0
global_morning_flag
0
global_day_flag
0
local_evening_flag
0
global_night_flag
1
global_midnight_flag
0




現在時刻 02:47

■--------------------↓

02:47

p_alarm

xx:x402:47

p_alarm

xx:x6_was not detected△

02:47

p_alarm

xx:x8_was not detected△

02:47

p_alarm

xx:x0_was not detected△

02:47

p_alarm

xx:30_was not detected△

02:47

p_alarm

xx:x2_was not detected△

02

47

△B―実験1 [偽 false] else動作です.

△B―Not dawn  [偽 false] else動作です.

△B―Not morning  [偽 false] else動作です.

△B―Not day  [偽 false] else動作です.

△B―Not evning [偽 false] else動作です.

△B―Not night  [偽 false] else動作です.

◎A-midnight_真夜中 [真 true] 動作です

■■-------------------------↑


* 各時刻帯域にflagを導入します。 C言語の広域(global)変数と局所(local)変数の扱いができる必要があります。

グローバル変数として扱うには、関数の外で定義します。

int global_midnight_flag = 0; //このように関数外で再宣言します ->グローバル変数。ここはglobal変数の位置です。

void loop() {//loop

      int local_midnight_flag = 1; //

      global_midnight_flag=local_midnight_flag;

 このようにローカル変数の値をグローバル変数へ渡して、どこからでも参照できるようにします。


loopの先頭でLED緑、loopの最後でLED青を1回点滅動作をさせます。これにより、プログラム実行の様子が推測できます(ここでは見れません)。 このように時刻帯を識別させます。

◎A-evning    △B―Not night   などの A、Bの意味について

A  if の真の動作を意識するために付けました。

B は if の偽の動作を意識するために付けました。






8/20/2023

人間の生活エリアである証

 人間の生活エリアである証

小型ラジオを買いました。
TOSHIBA TY-HR4 FM/AM 2BAND PORTABLE RECIVER  AC/DC 2WAY POWER

DCバッテリーで動作させるため、電池部の電極に工作を施しました。

このラジオの電池仕様は、単1電池3本の直列接続です。
電源電圧は 3X1.5=4.5[V]  です。 







 この対策装置の電源は12Vを主電源と考えています。
 12V -->5V 半導体7805という三端子レギュレータを使用します。
    

    5V ---> ダイオードを通過(0.65V 降下)---> 4.35 V 

 この方式で対応しました。Just 4.5 V ではありませんが、良好です。
ダイオードには1S1588 を使いました。


単1電池と同等の径の棒をホームセンターで買いました。

電極部への接触は、感光基板の未使用プリント基板を使用しました。
適切な大きさを切り出します。
接続コードをはんだ付けします。
両面テープ止めます。(接着剤)

*最初は単1電池3本分の長さの1/2 の丸棒2本を作りました。
しかし、ラジオの電池BOXへ収納できませんでした。結局、3本となる寸法での切断となりました。特に、均等な長さではありません。


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

2023.8.19 現在の設定

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

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

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

[xx:x6]  A0端子    青色ダイオード発光 1.5[Sec]

[xx:x8]  A1端子 5Vブザー 1.0[Sec]

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

机上での準備実験ですが良好です。


*放熱器の付いた装置がありますが、10Wモノラルアンプです。
 「TDA2030使用 10Wモノラルアンプキット」(秋月電子)

  10Wとありますが、 AMP電源電圧24V使用時ですので注意してください。
 しかし、12V~24Vの電源に応じて動作します。

2分毎に何らかの反応をします。そのようなプログラムを試しています。

「 [xx:x6]  A0端子    青色ダイオード発光 1.5[Sec] 」   

 この発光部分を今後変更します。

 より高輝度となるように検討します。あるいは、単に1.5秒間の点灯では動物に認識されないかもしれません。そこで、フラッシャー動作をPICマイコンを介して行わせることも検討します。


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;

      


    }


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









































7/20/2023

机が大変! 

机がブレッドボードで一杯です!! 


 RTCおよびワンショット・マルチバイブレーター さらに音源1・音源2と順調に動作します

RTCの威力がすごいです。私の指定した時刻、例えば夜中でも正確に動作し、機器を起動します。私が寝ずに夜中に手動でスイッチを操作する作業を自動で行ってくれます。

このRTCは「RTC-10」というもので、10年以上前に購入したものです。
マイクロテクニカさんからの購入でした。
非同期のRTCです。現在、このRTCは手に入りません。残念です。バックアップとしてほしかったのですが。

今後、RTCは同期式のタイプの使用になります。この場合、プログラムを一から考える必要がまたあり、一苦労強いられます。


机上のブレッドボードの回路を、基板に組む必要があります。これがまた大変です。
ブレッドボードで済ませることが可能ならその部分はブレドボードで済まそうと思います。






7/01/2023

獣害対策装置 電子警報音

 獣害対策装置 電子警報音



電子警報音の作成



6/23/2023

Power MOS FET をインターフェースとして使用する

 Power MOS FET をインターフェースとして使用する




書きかけ途中です

6/21/2023

ワンショット・マルチバイブレータ(単安定回路)

ワンショット・マルチバイブレータ(単安定回路)

回路はトリガーパルスを受けると一定時間幅のパルスを出します。
トリガパルスのパルス幅はmsec単位です。この時間幅はある程度短いことが要求されます。

T=1.1xCR  [sec]の計算式で出力パルス幅の理論値が求まります。
CRの値が大きくなるに従い、実際の時間は理論値より長くなります。




コンデンサ容量 抵抗器の値を変えてストップウオッチで実測しました。
33μF 10MΩ のとき8分を実測しました。

この回路を使用するメリットとは
・マイコン側(Arduino)の動作としてmsecのパルスを出すだけで、マイコンは以降の作業に関してタッチしなくって良いことになります。マイコン側で8分について判定する必要はありません。

・マイコンの負荷の軽減が行えます。CRのハードで時間幅を変更できる。

*ワンショットを使用せずとも同種の事がプログラムだけでも実現できます。
[xx:x0] [xx:x8] の種類で現在時刻を検索するプログラムで、8分間パルスを出力できます。
具体的な例で示します。
00:00 を検出 ON信号出力 00:08を検出 OFF信号を出力 --> 8分間のパルス幅
00:10 を検出 ON信号出力 00:18を検出 OFF信号を出力 --> 8分間のパルス幅

00:20 を検出 ON信号出力 00:28を検出 OFF信号を出力 --> 8分間のパルス幅
マイコンはすでに時計を内蔵(RTC)しましたので、現在時刻検出で同種のことが実現できました。






 

6/18/2023

現在時刻の時間帯を識別(朝 午前 午後 昼 夕方 夜 真夜中)

 現在時刻の時間帯を識別(朝 午前 午後 昼 夕方 夜 真夜中)

現在時刻がどの時間帯であるか識別・判別するプログラムです。例えば「朝」と識別させる
には、朝とは時刻が~から~でると定義しておく必要があります。
プログラムの一部を載せます。


真夜中にある動作を予定している場合、自分が考える真夜中の時間帯をif文にセットします。
時刻範囲の指定のif文は間違いやすいので、事前にシミュレーションすると良いです。


 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(led4, HIGH);  // LEDを点灯させる

         delay(1000);

        digitalWrite(led4, LOW);

                                  

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

                  

    } else {

        // Bの動作を行います

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

        delay(1000);

        digitalWrite(led5, LOW);

        

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

        

    }

次回はプログラムの全体を載せる予定です。

*獣害動物が夜の何時に出没するのか? 人間の活動時間外に出没している事は確かです。
獣害動物が出没した時の時刻を知りたくなりました。

もしその時刻に集中して出現しているようなら、その時間帯で威嚇すれば効果があるかもしれません。

より高度な対策装置を考えるなら、画像認識により獣害動物を識別して警報を発する方法が一番です。(ハイレベルです)

獣害動物の出現をどのようにして検知するか!!

6/16/2023

RTC実験風景

 RTC実験風景

LEDを6本取り付けました。プログラムを点検するためです。どの動作に入っているか確認する必要に迫られました。

特に、loopの最後に達したのか確認のためLEDを1秒間隔の点滅動作にしています。よって、プログラムが走行中はこの点滅を繰り返します。

必要に応じてプログラム途中にLED点灯プログラムを設けました。if文に多く設けました。これらのLEDの点灯・消灯でプログラム開発が確実にできました。

自分の予定・想定と実際のプログラムの動作のギャップは何回もありました。都度プログラムを修正しました。

ここまで完成しました。先がまだ長いです。例えば、OUT PUTをどうするか? <書きかけ途中>




RTC 時刻範囲での動作

 RTC 時刻範囲での動作

例えば、「マイコンに夜間帯においてある動作をさせたい」この事の実験です。

良好に動作しました。



  //if ((hour >= 18 && minute >= 00) || (hour <= 4 && minute >= 00)) { 
      // 04時00分は真  04時59分は真  05時00分は偽  05時01分は偽
      // (注意)04時代は真となる. 00時代~04時代は真となる。18時以降は真となる。
    
    if ((hour >= 17 && minute >= 30)) { 
              
        // 夜間の時間帯にある場合の処理を想定                                    
        Serial.println("◎A [真 true] 動作です.");
                  
    } else {
        // Bの動作を行います
        Serial.println("△B [偽 false] else動作です.");
        
    }

if文の条件式はOR論理です(||の記号が)。このプログラムでは17時30分以降であれば条件を満たし、動作Aを行うはずです。
17:30から23:59 (24時00分=00時00分) の論理を満たすはずです。

やはり、この時間帯までプログラムを走らせ確認をしないことには不安です。
後日、これについて述べます。実験について述べます。 


6/13/2023

RTCの内蔵アラームを5件セット

 RTCの内蔵アラームを5件セット

[12:00]にアラームをセットしました。
見事! 応答しました。 ◎
(16:00の表示はこの資料の撮影時刻です。気にしないでください)

内蔵設定時刻になるとRTCはarmx  xは1~5を返します。










 テストプログラムの実行状態です。

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

基板番号 機能

9~ D9

8 D8

7 D7

6~ D6

5~ D5

4 D4

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

Arduino Uno に5個のLEDを上記対応表のよに取りつけました。


取得時刻の下1桁が[0],[3],[5]に一致したらLEDを点灯(1分間)させたり、[xx:xx]の指定時刻と一致したらLEDを点灯させたりプログラムの確認をしました。

またRTC-10の内蔵アラームは5件設定できます。

このアラーム設定は[xx:xx]の形式で登録します。

下写真 現在時刻の1桁が[5]に一致しました。

Atariに2重まる。◎を表示させました。
(現在時刻が15:45ですが、シリアルモニタの10分前にスクロールした写真を撮影しています。)

内蔵アラームも問題なく動作しました。良好です。
しかし、内蔵アラームは使用しません。
自作プログラムで柔軟に対応できます。

*2つの時刻の大小関係のプログラムの理解が要求されます。
*以上により私が眠っている夜中の指定した時刻に動作を可能にできます。
 また、バッテリーの消耗も防止できると思います。
照度センサーで「夜中」を判定する場合は、範囲が広すぎ単に「暗い」の判定しかできません。月夜? こんなときもあるわけですので。




6/12/2023

RTC内蔵のアラーム

 RTC内蔵のアラームの実験

「RTC-10」には5件のアラーム時刻を登録できます。
登録形式は[xx:xx] です。日についてのアラーム登録はできません。

登録すなわちセットした時刻になると[arm1],[arm2],[arm3],[arm4],[arm5]と返します。
よって、Arduino Uno のプログラムでこの[xxxx]の4文字を照合すればアラーム時刻を活用できると考えます。

これから[arm1]を登録し実験します。

内蔵アラームは使用しないことにしました。
理由は[arm1]を受信後、受信並びがずれ以降の時刻表示が乱れました。
確実性のあるプログラムにはまだ至っていません。
また、設定もTera Termの画面上で行う必要がありややこしさもありました。

Arduino Unoのプログラム上より実行させることで十分です。そして、自分のプログラムである事より柔軟性に優れています。



6/10/2023

取出した[時分]の活用(レベル3)

 取出した[時分]の活用(レベル3)







[05:30]にアラームをセットしました。

ここで言うアラームとはRTC-10独自のアラームとは違います。
誤解無いようにお願いします。

時刻5桁(5文字xx:xx)を照合し、現在時刻がアラーム時刻と一致するとLEDを点灯します。点灯時間は1分間です。
分の桁上げが発生するまで点灯は継続することになります。

Arduino Uno には5個のLEDを取付けました。理由はプログラムの実行位置を確認するためです。if文などでは、論理がややこしくなりシーケンスの確認が必要です。
確認方法として他には、シリアルプリント命令を使用して分かりやすい記号を印字する方法を採用しました。

気づいた事をランダムに記します。

・ハード部ですが、RTCの受け端子(Rx)を構築する必要があることです。
 0,1番ピンを使用してはいけません。
  
・C言語の配列・文字・文字列の扱いが要求されました。

・ポインタの使用は避けて通れません。ポインタの威力を実感しました。

・Chat GPTと私のコラボとも考えられます。しかし、相当の修正が余儀なくさ       ました。参考書をめくるより早いです。

・11番ピン(Tx端子)に構築しましたが、ジャンパー(配線)は外しています。
    今のところ未使用です。

#include <stdio.h>

#include <string.h>

#include <SoftwareSerial.h>

SoftwareSerial rtcSerial(10, 11);// RTC-10のTxをArduinoの10番ピン(Rx)に接続し、11番ピン(Tx)を使用して通信する

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

if (rtcSerial.available() >= 6) {//if_1   // RTC-10から10バイトのデータが受信可能な場合 6でok

char nowTime[6];// 受信したデータを格納する文字配列 [要素数] 6でok  現在時刻の意味

rtcSerial.readBytes(nowTime, 6);  // データを読み込み、nowTimeに格納する 6でok

 nowTime[6] = '\0';// 文字列の終端を追加する  


 Serial.println(nowTime);// Arduinoのシリアルモニターに受信したデータを表示


 char* firstColon = strchr(nowTime, ':');  // 最初のセミコロン「:」を検索する firstColonが文字型のポインタであることを示し

         //strchrは「ストリング・クラ」と発音します。 

      //nowTime文字列内で最初に見つかったセミコロン(:)のポインタを返す関数です。

   //セミコロンが見つからない場合はNULLポインタを返します。

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

char nowTime[6];// 受信したデータを格納する文字配列 [要素数] 6でok  現在時刻の意味

char *p_Ntime;//ポインタ(アドレス値を格納している) ポインタNewTimeの意味

p_Ntime=nowTime;//配列の先頭のアドレス値を格納する

char *p_alarm;//ポインタ(アドレス値を格納している)  ポインタalarmの意味


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

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

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


p_alarm="06:05";//ポインタalarmに04時03分をセット @@@@@@@@@@@@@@@

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

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

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


  if(strncmp(p_alarm,p_Ntime,5)==0){//2つの文字列の比較 5文字

     Serial.println("_Atari◎");//あたり

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

  } else{

    Serial.println("_Hazure○");// はずれ

    digitalWrite(led1, LOW);  // LEDを消灯

  }


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

順序はランダムです。ここに出ている命令は意味があります。
その意味で掲載しました。

非常にランダムに不完全な記載です。ご承知ください。勘所の参考にして下さい。
別機会にプログラム(スケッチ)の全容を掲載したいと思います。

RTC-10に着手してから3週間経ちました。






6/09/2023

RTC-10の時刻の取出し-3

 RTC-10の時刻の取出し-3


[時[[分]を取出し表示できた

[時[[分]を取出し表示できた






スケッチ(プログラム)の様子

ここまでがRTCの扱いの私が思うレベル2です。

レベル3として、「この現在時刻_1と設定した時刻_2が一致したときLEDを点灯」させる。

この事が出来たら目標達成です。



6/08/2023

RTC-10の時刻の取出し-2

 RTC-10の時刻の取り出し-2 









時刻を xx:xx の形式で表示できた

6/07/2023

RTC-10 の時刻の取出し-1 いい予感 !

     RTC-10 の時刻の取出し-1









6/02/2023

RTCの難関 ここからです!

 RTCの難関 ここからです!

この現在時刻いや5分遅れ時刻でも十分です。
Arduino UnoマイコンのSerial monitor(シリアルモニタ)  を眺めていても進展しません。



この時刻をマイコンの「変数」へ記憶させて、この時刻を活用できなければ何の意味もありません。

現在スケッチ(プログラム)にチャレンジ中です!
C言語の文字処理・配列・ポインターの扱いが関連してます。

数か月必要な予感です?!う~お もう難関です。







5/31/2023

[RTC-10]  [インターフェースIC] [Arduino Uno]  [通信ソフトTeraterm]


実験接続図

  [RTC-10]    [インターフェースIC]   [Arduino Uno]    [通信ソフトTeraterm]     


パソコンにUSBケーブルを2本差すことになります。


実験接続図
Rx端子とは受信用を意味し、Tx端子とは送信用を意味します。
Txで送り出された信号は、Rx端子で受ける接続になります。

Arduino Uno の10,11番端子はRx,Tx端子として機能するようにスケッチで構築しました。
0,1番端子もRx,Tx端子ですが、ここは使用できません。理由はArduino Unoのシリアルモニタ(Serial Monitor)として機能しているためです。



RTC-10 は初めて通電した場合は、セットアップが必要です。
すなわち、現在時刻、年月日曜日 また12時制24時制の選択などです。
上記画面は現在時刻の「時」を入力して下さいという意味です。


セットアップ後において、いくつかの命令(コマンド)を受付けその返信を返します。
d(day)コマンドに対しての返信(応答)です。「230522」
西暦年の下位2桁、月を2桁、日を2桁で表します。

ほかに、どんなコマンドがあるか書きます。
t(time)コマンド、y(year)コマンド,h(hour)コマンドなどがあります。





RTC-10のTx信号をTeraTermで受信しているところです。
RTC-10 は1分毎に送信(Tx端子からデータを出します)します。






Arduino Uno のシリアルモニタ画面です。このシリアルモニタの設定での「bps」は

4800をセットします。その理由はRTC-10は4800bpsでの通信を行うからです。RTC-10は4800bps固定で変更できません。

両者の通信速度を一致させないと正しく通信できません。

暗号の羅列に見えますが、そうではありません。
「:」の前後の各2桁を見ます。Serial Monitor での最右端の表示は 06:35 です。

すなわち「6時35分」を表しています。

Serial Monitorの受信スタートは *「時分」のどの部分から受信するか不明です。
重要なことは、 「○□:△×」 の表示規則中「:」が重要な意味を果たしています。
 

*C受信プログラム作成により、RTC-10の「分」の桁上げに連動し、必ずxx:xxの形式で受信できました。
RTC-10は一分毎に「xx:xx」の形式で時刻を吐き出します。








「通信速度」という言葉が出ましたが、上記画面にあります。














アラーム設定
アラーム設定を実験したときの画面です。
今日は、ここまでです。


5/24/2023

RTCに反応がありましたー3

 RTCに反応がありましたー3

アラームの設定の様子を載せます。



上図 eコマンドにより







設定の詳細は、RTC-10の取扱い説明書をご覧ください

5/23/2023

RTCに反応がありましたー2

 RTCに反応がありましたー2

RTC-10の接続回路の詳細は、後日述べます。
RTC-10から下記写真のように1分おきに時刻を表示できました。
TearTerm通信端末画面に表示できただけです。

RTC-10は1分の最下位桁の桁上げ毎にTx端子に時刻データを吐き出します(その様らしいです)。

このRTCの初期設定などは、どのようにしたか後日述べたいと思います。
ここまでがおそらくRTCのステージ1(Step1)に相当すると考えています。


ステージ2:マイクロコンピュータ側で時刻データを受け取ること。
ステージ3:時刻を含んだマイクロコンピュータのプログラムをつくること。

とにかくこの時刻をマイクロコンピュータで受信し、この時刻を活用できるプログラムへ発展させる必要があります。



上記写真は、RTC-10 が送り出した時刻をパソコン(Tera Term)で受信した画面です。

ここで、パソコン=マイコン(Arduino やPIC)と置き換える予定です。
その様にすれば、真夜中の時刻に何らかの動作を可能にできます。
すると、獣害対策装置に使えそうです。

現在考えている獣害対策装置は
・時刻範囲を指定する ----- 夜中 明け方  夕暮れ
・周囲環境の明るさ 
・赤外線感知

・光で威嚇
・音で威嚇
・動き(ムーブメント)で威嚇

順次課題をクリアしていく予定です。防湿・防雨の対策も必要です。
ハードルが高いです。




5/22/2023

RTCに反応がありました-1

 RTCに反応がありました-1

このRTCはマイクロテクニカ より購入したものです

超高精度UARTリアルタイムクロックモジュール

現在時刻(時、分、秒)及び現在日付(年、月、日、曜日)の情報を非同期シリアル通信(UART)にて簡単なコマンドで取得することができます。



ボタン電池CR2032によるバッテリーバックアップ機能付きですので、電源切断時でも約500時間、正確に時を刻むことができます。

5つの個別登録できるアラーム機能や、毎分ごとに現在時時刻を出力する毎分毎時出力、12時間/24時間表示切り替えなど時計アプリケーションに必要な機能を搭載しています。






本日はここまでにします。後日、さらに詳しく述べます。USART (universal synchronous asynchronous receiver transmitter )ユーサート非同期通信を行います。

RTC-10の装置は電圧レベルがTTL(0~5V)での動作です。
パソコンのRS-232Cは(±5~15v)での動作です。

この2装置を直結できません。そこでインターフェースICとしてADM3202ANZを通して
接続します。ADM3202ANZは3~5V動作のRS232Cドライバーです。


RTC-10装置には 4端子ピンが存在します。
1ピン  Rx  受信(TTLレベル)
2 ピン  Tx  送信 (TTLレベル)
3 V+   +5v電源
4 G      グランド電位(GND)

通信速度は4800bpsで作られているため変更できません。
データ長 8ビット長
パリティ    なし
ストップビット    1







                                 RTC-10ユザーズガイドより抜粋


私の場合はインターフェスIC ADM3202ANZ(3~5V動作のRS232Cドライバー)を使用しました。
ADM3202ANZは16ピンのICです。+5Vを16ピンへ、GNDは15ピンへ接続します。
また0.1μFのコンデンサーを5個使用しました。この0.1μFのコンデンサーの使用ピン番号を書きます。他資料によるとここの5個のコンデンサーの容量が色々です。
1μFとか。
私の場合、0.1μFで確認済みの装置がありましたので0.1μFとしました。

1-3
4-5
2-16
6-GND
16-GND

SD-MOD55 とありますが、ここはRTC-10なる装置に読みかえてください。そして、そこに書いてある6,7なる番号は無視してください。ただし、RTC-10のRx Tx はそのままです。

(MAX202Eのコンデンサー部分は、マネしませんでした)

いずれにしてもADM3202ANZのData Sheetを見て作業をしました
左端の9pコネクタはパソコンへつながります。
----------------------------------------------------------------------------






5/11/2023

無線によるデータ収集

 無線によるデータ収集

TWEーLite(トワイライト)を扱います








書きかけ 途中です
RTC-10を優先してプログラムなど行っています。
無線はその後です。