緑の中に

緑の中に
国立天文台

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言語の文字処理・配列・ポインターの扱いが関連してます。

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