緑の中に

緑の中に
国立天文台

12/31/2021

                             今季の最低気温(自室)を観測


校正が行えました。ただし、7℃まで。

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

2021-12-27 16:33:28  170.0 10℃

2021-12-27 16:43:30  170.0 10℃  真値7.5℃

2021-12-27 16:49:33  170.0 10℃

2021-12-27 16:49:45  169.0 10℃ 真値7.5℃

2021-12-27 16:54:40  167.0 7℃

2021-12-27 16:57:29  172.0 10℃

2021-12-27 16:57:36  167.0 7℃

2021-12-27 16:57:47  173.0 10℃

2021-12-27 16:57:56  167.0 7℃

2021-12-27 17:00:07  171.0 10℃

2021-12-27 17:00:15  169.0 7℃ 真値7℃ 2021.12.26から27 家族旅行でした

2021-12-27 17:03:24  174.0 10℃ 真値8.0℃

2021-12-27 17:07:58  171.0 10℃ 8℃

2021-12-27 17:10:09  171.0 8℃

2021-12-27 17:13:16  170.0 8℃

2021-12-27 17:13:29  174.0 8℃

2021-12-27 17:13:38  172.0 8℃

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

真値7℃ までの校正が行えました。

その時のデーターの状況です。

1泊留守にしたことにより部屋は冷え切りました。

旅行より帰り、真値表示(一応)の温度計を見たら7℃まで低下していました。

これより、部屋の温度を上昇させて18℃近くまでの校正をしました。

7℃以下の校正は、センサーを屋外へ置かない限り無理です。

現在、ミニ百葉箱を工作中です。しかし、大工作業は不得意のため完成の目途は立ちません。

年間の気温を考えた場合、1月最も気温が低下するとのことです。

この時期の気温を観測したいのですが、大工仕事にかかっています。







11/30/2021

百葉箱もどきの工作

 百葉箱もどきの工作



センサーを屋外へ置くために収納箱を工作します。
百葉箱もどきを考えています。

設計図なしで、現物材料を組み合わせて作ります。
12月中の完成を目指します。1月の年間最低気温を観測したいためです。

このような工作に適したやさしいCADの優れモノが欲しくなりました。
いいCADは無いのかな!

自分の部屋から近い屋根に、設置します。とりあえず屋外に設置することが目標です。









11/19/2021

Data logger Tempurature 9600bps 完了

 Data logger Tempurature  9600bps  ついに完了  


 完了しました。

 次は、センサーを屋外に設置してDataを観測するステージに入ります。

現在は11月です。これよりぐんぐん冷えてくる時節となります

NTCサーミスタセンサーがどんな値を返すか興味あります。それと同時に校正をしたいと思います。

窓の外に防風よけケースを取り付け、センサー部を収納する予定です。

有線ですから、窓を少し開けてケーブルを外に出す段取りとなります。

隙間風が部屋に入り、部屋は少し寒くなるかもしれません。


防風ケースの製作は大工仕事になりそうです。

遅くっても12月中に製作完了となれば、寒い時期のデータを収集できます。







 

10/25/2021

9600bpsへの準備実験

 9600bpsへの準備実験

 プログラムを公開します

9600bpsへの準備です。A/D変換をStopさせています。とにかく伝送スピードの状況を

実験しています。Good. です。


受信側の設定










 送信プログラム側

折り返して見ずらくなっています。これをCopyしてTXT画面でご覧ください。

  /* PIC12F675

 * file name Logger-external_osc-6505.c 外部発振子 8MHz

 * AD変換を止めて、外部振動子を8MHzで動作するか。  #define _XTAL_FREQ 8000000 で整合させた。Good!

 *265行あたりの __delay_us(85); #define _XTAL_FREQ 8000000  ->  このマージンを検査したい   ◎  TeraTerm 9600で 0000-A  0000-A  0000-A  

 * __delay_us(82);◎ ? __delay_us(93);◎  ===> 88 ここあたりに設定する  __delay_us(88)としよう!

 * 外部発振子 8MHz  GP0<7pin>AN0入力   <5pin> 出力  TeraTerm 9600で 0000-A  0000-A  0000-A 

 * 2pin,3pin  そして振動子の真ん中の端子はアースへ

 * 

 *  ★ダミ-数値データを読む事を試したい!

 * 9600bpsへの準備実験

 * 9600bps送信している事の  確認方法 その1 その2

 *  AD-sender-2400bps-7000.c の遺伝子を持つ

 * 

 * 

 * 

 * 

 * 

 * 

 * -------Regacy ----------------------------------------------------------------------------------------

 *   AD-sender-2400bps-7000.c    pinをchangeする GP1 <6pin>AN1 を有効にできた。GP1<6pin>の場合無信号時(センサーリード断)に数十ミリVのA/D変換出力を返すので注意のこと。

 * GP0<7pin>AN0入力   GP2<5pin>は出力でMAX232Cへ  予定通り GP1<7pin>が動作している ■■ 

 * Data形式  4160-A (真値4240)、465-A (真値464)  2種類の電圧を用意した  100K+20Kの分圧,   1K+10Kの分圧 

 * GP0<7pin>AN0 受けて変換している

 * 

 *  

 *  

 *  ●● この AD-sender-2400bps-3.cが 現在最高スピードで伝送する ● ●

 * 

 * ■■ 照度センサーより データを採取する ■■ 温度センサーでも良好

 *  ■ Build 成功 Pickit3書き込み成功(プロジェクトファイル名を右フォーカスしプロパテイ,Pickit3より4.75V供給 * DC5V_OFF

 *  RS232Cコネクタは接続のまま 書き込み )

 * TeraTermを起動する。2400bps

 * 素晴らしい。これが本来の2400bpsの送信と思われる(160行あたりのdelayをすべてコメントアウト)

 * AD-sender-2400bps-1.c > AD-sender-2400bps-2.c  > AD-sender-2400bps-3.c  の順に速くなった

 * 

 *  

 * -------------------PICkit3 について-------------------------------------------------------------------------------------------------------------------------------

 *  

 * * File ->ProjectProperties->マウス右 ー>PICKit3->option categories ->Power を選択する. Power target circuit from PICkit3.

 * を選択し、Voltage Level 4.75 を選択した。PICkit3より回路ボードに電源が供給されます。よって、ボード側の電源をOFFとすること。

 * 

 *  ボード側の電源をOFFとしなくって良い設定もあります。Power Target circuit from PICkit3  □ チェックは入れない。 

 * Voltage Level 4.75 

 * 

 * プログラム書き込み後は、PICkit3のコネクタピンは外しターゲットボードのPICがプログラム通りに実行するか確認する

 * ---------------------------------------------------------------------------------------------------------------------------------

 * 

 * 

 *--------------  AD変換クロック-------------------------------------------------------------------------------------------

   //AD変換するとき、AD変換クロックが使われる。AD変換クロックの周期のことをTADといい、1回のAD変換には11TADかかる。

   

   //FRCをAD変換クロックにする場合

   //ADコンバータには、専用のRC発振器がついている。この専用のRC発振器で作ったAD変換クロックをFRCという。FRCの周期は4μsecになっている。

   //FRCを使うとスリープ・モード中でもAD変換ができる。

   //なお、CPUクロックが1MHZ以上で動作している場合は、FRCを使うとAD変換の結果が悪くなる場合があるので、ほかのAD変換クロックを使った方がよい。

   

   //FRC以外をAD変換クロックにする場合

   //FRC以外のAD変換クロックを使う場合は、システム・クロックの周波数とADCS0~2ビットの内容の組み合わせで、AD変換クロックの周期が選べる。

   // AD変換クロックの周期は1.6μsec以上になるように選ぼう。長くなりすぎるとホールド・コンデンサが自己放電するかもしれないので、

   //(1.6μsec以上で)1.6μsecにできるだけ近くしよう。

   //例えば、システム・クロックが4MHZの場合、AD変換クロックはFosc/8を選ぼう(AD変換クロックの周期は2μsecになる)

   //ただし、発振クロックが4MHzでも、スリープ・モード中にAD変換を行う場合はFRCを選ぼう。

   

 //--------------------------------------------------------------------------------------------------------------------------------------------------

 *

 */

  


#include <stdio.h>


 #include <xc.h>


#define _XTAL_FREQ 8000000    //XT mode 4MHz   または 4e6 と書いてよい .  この記述が無いと  __delay_ms(200); でエラーが発生する



/////////////////////環境設定   外部発振子///////////////////////////////////////////////////////////////////////////////

// CONFIG  これを生成したもの


// PIC12F675 Configuration Bit Settings


// 'C' source line config statements


// CONFIG

#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator: High speed crystal/resonator on GP4/OSC2/CLKOUT and GP5/OSC1/CLKIN)

#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)

#pragma config PWRTE = ON       // Power-Up Timer Enable bit (PWRT enabled)

#pragma config MCLRE = OFF      // GP3/MCLR pin function select (GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD)

#pragma config BOREN = ON       // Brown-out Detect Enable bit (BOD enabled)

#pragma config CP = OFF         // Code Protection bit (Program Memory code protection is disabled)

#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)


// #pragma config statements should precede project file includes.

// Use project enums instead of #define for ON and OFF.

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


#include <xc.h>


#define  VDD 5000 //電源電圧

   

void   func (unsigned short ); //プロトタイプ宣言 第1引数の型を定義

unsigned short  adc(unsigned char ch); //プロトタイプ宣言 第1引数の型を定義



int main(void) // [型]main([引数])        

{

//★ OSCCAL=0b010011;    //ブレッドボード上のPICはこれで正しく伝送した。PICDに装着したPIC12F675もこれで正しく伝送した。 


  

    

    

//=======■■と●● を切り換える==========================================================================================================================================    


    

    

    

    

//======================================================================================================================================================================    

  

//ADIE=1;     // PIE1bits.ADIE=1;     //A/D変換終了割り込みを許可

//PEIE=1;     //INTCONbits.PEIE=1;    /* Peripheral Interrupt Enable  1=Enables all unmasked peripherall interrupts  0=Disable all peripheral interrups */

    

   

    

    

    

    

    

    

unsigned long ad_data0; //0~4294967295  (32bit)   数値型の整数型

unsigned short ad_data; //0~65535    (16bit) 数値型の整数型

int n;

int n_1,n_2,n_3,n_4;     //4桁の整数の各桁の数値を抜き出すプログラムである

n_1=0; //下位1桁目

n_2=0;

n_3=0;

n_4=0; //上位4桁目

    

 


    TRISIObits.TRISIO2=0;     // GP2<5pin>ピンは出力 ◎

 




    

ad_data0= (long)adc(0)*VDD;

ad_data=ad_data0/1024;

n=ad_data;

if(n>=1000)

n_4=n/1000;

if (n<1000)

n_4=0;

if ((n-n_4*1000)>=100)

n_3=(n-n_4*1000)/100;

if ((n-n_4*1000)<100)

n_3=0;

if ((n-n_4*1000-n_3*100)>=10)

n_2=(n-n_4*1000-n_3*100)/10;

if ((n-n_4*1000-n_3*100)<10)

n_2=0;

n_1=(n-n_4*1000-n_3*100-n_2*10);

func ( 0x20); //空白文字 SPACE

func(48+n_4);     //数値をASCIIコードへ変換する。10進数でちょうど48を加算した数値となっている。

func(48+n_3);

func(48+n_2);

func(48+n_1);

    func(0x2D);     //0x20 -      func ( 0x6D); //0x6D m

    func(0x41);     //0x41 A      func ( 0x76); //0x76 v

func ( 0x20); //空白文字 SPACE

}

unsigned short  adc(unsigned char ch) //  [型] 関数名 ([型と仮引数並び])

 {


//★    ADCON0=((ch<<2) & 0X0C); //アナログ入力チャネルを設定。ch0を指定しても、ch1を指定しても ビットが整合してセットが整う。まことに考えたものだ。

  

////////// ADCON0 レジスタ/////////////////////////////////////////////    

//★    ADON=1; //ADコンバータの電源をONにする   ADCON0レジスタの0bit

//★    ADFM=1; //AD変換結果を右詰めにする       ADCON0レジスタの7bit

///////////////////////////////////////////////////////////////////////

    

////////////// ANSEL レジスタ///////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////

//★    ADCS2=1;    //AD変換クロックはFRC  ここは後で詳述する  ADコンバータには、専用のRC発振器がついている。この専用のRC発振器で作ったAD変換クロックをFRCという

//★    ADCS1=1; 

//★    ADCS0=1;

 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

   

///////////////////////////////////////////////////////////////////    

    

///////// ADCON0 レジスタ /////■■と●●      ここだけの変更で良い AN0<7pin>GP0を有効にできた ////////////////    

 

    

    

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////   

    

    

    

    

    return((ADRESH*256)+ADRESL);    //上位桁への数への変換

}


 void func (unsigned short  tx_byte ) //  [型] 関数名 ([型と仮引数並び])

{

int i; //関数内変数の宣言

    GPIO2=1;   // スタートビット ●   

__delay_ms(10); //既定値 __delay_ms(50);    これでspeed up した __delay_ms(25);  ● このdelayを外したら、受信文字が化けた


    GPIO2=0;    // スタートビット ●

    

//__delay_us(12);     //既定値 __delay_us(12);    __delay_us(100);としたが2種類のデータを交互に受信した。

for (i=0;i<10;i++){     //1ビット分のスターとビットと2ビット分のストップビット 合計10ビット分。?

    

__delay_us(88);  // 9600bps TeraTerm 9600で 0000-A  0000-A  0000-A

                    //★ __delay_us(345); を変更する-> __delay_us(85); ◎  TeraTerm 9600で 0000-A  0000-A  0000-A

                    // __delay_us(80);× __delay_us(81);× __delay_us(82);◎ __delay_us(83);◎  __delay_us(84);◎

                    // __delay_us(85); ◎  ---------- __delay_us(90);◎ __delay_us(91);◎ __delay_us(92);◎ __delay_us(93);◎   

                    //__delay_us(94);× __delay_us(95);×  __delay_us(100);×

    

 

     GPIO2=(tx_byte & 0x01);     //<5p> データビット  &はビットのAND .これにより0ビット目だけを取出している

     

tx_byte>>=1;     //tx_byte の内容を1ビット右へシフト。次のビットを送る準備

tx_byte  |=  0x80;     //ストップビットを作っておく。 ORしてtx_byte に書く。都度,8bitを”1”に入れ換える。

 

}

}


10/24/2021

伝送スピードの高速化

                 伝送スピードの高速化

Data loggerの現在のボーレートは2400bpsです。

このボーレートを9600bpsで送信するように、ハードおよびソフトを変更しています。

PIC12F675において、外部発振子(コンデンサー内臓セラミック発振子)8MHzを取り付けました。

PIC12F675においては内部発振子が存在しており,その最高振動数が4MHzです。そこで、伝送スピードを上げるにはシステムクロックの振動数さらに上げてあげる必要があります。

そこで、外部発振子を取り付けて対応します。PIC12F675の2pin,3pinに取り付けます。

発振子には3本端子がありますが、左から数えて2番目の端子はGNDへ接続します。1番目と3番目の端子をPIC12F675の2番、3番へ接続しました。

以下、プログラムの関連する部分を抜き書きしました。


-----------  関連するプログラムの部分 -------外部振動子の使用---


// CONFIG

#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator: High speed crystal/resonator on GP4/OSC2/CLKOUT and GP5/OSC1/CLKIN)

#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)

#pragma config PWRTE = ON       // Power-Up Timer Enable bit (PWRT enabled)

#pragma config MCLRE = OFF      // GP3/MCLR pin function select (GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD)

#pragma config BOREN = ON       // Brown-out Detect Enable bit (BOD enabled)

#pragma config CP = OFF         // Code Protection bit (Program Memory code protection is disabled)

#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)

 

------------ 関連するプログラムの部分 --- 外部振動子8MHz ------------

#define _XTAL_FREQ 8000000    //



--------- 関連するプログラムの部分 ----- 時間タイミング -------------------

void func (unsigned short  tx_byte ) //  [型] 関数名 ([型と仮引数並び])

{

int i; //関数内変数の宣言


    GPIO2=1;   // スタートビット   


__delay_ms(10);


    GPIO2=0;    // スタートビット 

 

for (i=0;i<10;i++){     //1ビット分のスターとビットと2ビット分のストップビット 合計10ビット分。?

    

__delay_us(85);  

                    //★ __delay_us(345); を変更する-> __delay_us(85); ◎  TeraTerm 9600で 0000-A  0000-A  0000-A

 

     GPIO2=(tx_byte & 0x01);     //<5p> データビット  &はビットのAND .これにより0ビット目だけを取出している

     

tx_byte>>=1;     //tx_byte の内容を1ビット右へシフト。次のビットを送る準備

tx_byte  |=  0x80;     //ストップビットを作っておく。 ORしてtx_byte に書く。都度,8bitを”1”に入れ換える。

 

}

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

///////////////////////////// 確認方法 /////////////////////////

受信ターミナルソフト Tera Termを起動して、受信します。

このとき、Tera Termに  設定-->シリアルポート-->スピード  とあります。

スピードを2400から9600へセットします。

これにより、意図する受信が確認できればまずはOKです。

PIC12F675のプログラムでは、A/D変換はまだ行わないようにしています。

数値として4桁の「0000」を送信します。よって、受信プログラムでこの数値が再現されれば伝送スピードに同期したと考えます。もっと、シビアな確認方法も現在検討中です。

0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A

Tera Termの画面をCopyしました。









9/17/2021

ch0 ch1 (センサー2つ)の信号を

 

ch0 ch1 (センサー2つ)の信号を

上図 センサー基板


写真のより線をご覧ください。

この基板はセンサー部です。このセンサーを駆動するには直流5Vが必要です。

青端子ブロックの右側に赤・茶線が接続してあります。

この基板へDC+5vを供給しています。


青端子ブロックの左側に青・黄の線が見えます。青がch0,黄がch1のアナログ信号をMPU

PIC12F675 の7番6番ピンへ導いています。

PIC12F675ではこのアナログ信号をデジタル信号に(A/D)変換します。

変換されたch0・ch1のデジタル信号は、PIC12F675の2番ピンからパソコンに向かって送り出されます。

2番ピンからは、ch0,ch1のデータはdata-A,data-Bのように2種類を識別する識別符号を付加しています。もちろん、2種類のデータの直列伝送となります。


より線を保護するために金具をつけました。

装置として安定してきました。

kicadをかじり始めました。すばらしい装置を作るには、プリント配線が良いのでしょうが

試作のみの場合は手配線で費用を安くしています。

トラブル回避・小型を図るならCADを使いプリントパターンを作ることは意味があると思います。

 



9/06/2021



 

Aデータ、Bデータとして受信しています。ほとんど同じデジタル値を返します




上図   NTCサーミスター 同規格を2個

 黒いトランジスタのような部品は、温度センサーですがこれは使用していません。ただ、差し込んでいるだけです。

 










7/12/2021


改善  表示件数を制限しました



      おおよそ1時間分の件数を表示するように、バッチプログラムを書き換えました。

  現在は、2時間分を表示するようにさらにバッチプログラムを変更しました。

  これで、それほどにスクロールせずに最新データを見ることができました。

 1件のデータが34バイトです。

2時間は120分です。120分を5分で割ります。 120/5=24 件を表示すればよいわけです


 バッチプログラムの詳細をここに載せます。2本のバッチファイルで一連の動作をします。

 バッチファイルから他のバッチファイルを呼び出して実行しています。 

(参考) REM これはコメント注釈として扱われます。

1本目のバッチで無限に繰り返し処理をさせます。

2本目のバッチで指定容量に達したらそのファイルを一旦削除させます。

そして、新たに1件目より書きます。

5分ごとに行いますので、「ハードデスクいじめ」かもしれません。


REM ===以下 1本目=== log2.bat =========

:START

@echo off

echo Hello Tom

echo 295[sec] interval logger. eternally  


cd C:\Users\*****\Documents\MyRuby


C:\Users\*****\Documents\MyRuby\NTC.rb

Copy C:\Users\*****\Documents\MyRuby\2_data_NTC_current.txt   C:\Users\*****\OneDrive\temperature\current_temperature.txt

timeout 297 /NOBREAK > NUL


REM 300--> 5min

REM 600-->10min

call delete.bat

GOTO START

REM ======以上 1本目 ===================


REM ==== 以下 2本目 delete.bat  ======================

cd C:\Users\*****\Documents\MyRuby

REM for %%fin(*.log) do if %%~zf GTR 646 del "%%f"

for %%f in ( 2_data_NTC_current.txt ) do if %%~zf  GTR 374 del "%%f"

REM もし3行表示を設定するなら 34x3-34=34x(3-1)=68 byte の条件を入れる


REM 20行表示を考えるなら  Data 1件 34byte   34x20-34=34x(20-1)=646   12行表示 34x(12-1)=374   1時間分である

exit /b


REM =====以上 2本目 =======================

6/28/2021

外出先から自室の温度をスマホで見れる

 外出先から自室の温度をスマホで見れる

上写真 5分間隔での温度をスマートフォンから見ることが

できます。外出先から見れます。

温度の左の数値はセンサからのデジタル情報です。
この数値を温度に変換しています。

ここまで、自作のハード&ソフトウエアで達成できました。

改良が必要な個所
・最新温度が常に画面の最下部に表示される問題です。
画面いっぱいになると、スクロールさせてみる必要があります。これは、不便です。
最新温度データが画面の上部に表示されれば良いのでしょうがその様にはなりません。

現在、対策を検討しています。
可能性は温度データのテキストファイルがある大きさになったら削除することです。
そうすると、次の5分後には新規にファイルを起こします。これにより、見やすくなります。

とにかく現在温度(直近5分前)のみ表示されていれば、目的は達成です。
この事を自動で実行させるバッチあるいはプログラムを考える必要があります。






6/23/2021

2020年10月1日の室温







 やっと涼しく感じられるようになりました。2020年10月1日の室温です。

また、10月2日の一部です。温度が揺らぐような変化をしていますがこれは正しいのでしょうか? センサーや回路の問題かもしれません。

Data Logger として西暦年月日を表示する必要はありそうです。さらに検索表示は西暦年月日でのキーワードとする必要を感じてきました。

「コンピュータの管理」で記録のタイミングの設定をしています。バックグラウンドで15分間隔の動作設定としています。最初の起動トリガーはコンピュータがOSにログオンのタイミングとしています。

順調に継続して動作しています。


取集したデータの整理に関する技術について考えさせられます。

検索システムをどの様にするのか。表示方法をどの様にするのか。比較をするのか。

などなど思いが及びます。そして、プログラム作りが課題となります。

ここで、C言語を自在に操れる技が要求されてきます。






 

Zoom音響構成ー多人数会場からZoomに参加する


 

6/10/2021

5月から6月 私の部屋の温度

             5月から6月 私の部屋の温度




5月 6月 18℃~27℃ 校正済
実測真値(MASTECH熱電対)にて校正

本日は2021.6.10 です。27℃を校正できました。
まだ梅雨に入りはしていません。しかし、暑い日となっています。

ドヤイヤーを使用して、温度上昇させる方法もあると思います。
しかし、今時期は夏に向かっています。私の部屋はルームエアコンを使用しなければ、30℃以上には上昇します。自然にまかせながら校正することにします。

18℃~27℃ 校正済 
 
2021-06-10 17:15:21  262.0 27℃
2021-06-10 17:20:21  264.0 27℃
2021-06-10 17:25:21  263.0 27℃
2021-06-10 17:30:21  263.0 27℃
2021-06-10 17:35:20  263.0 27℃
2021-06-10 17:40:21  264.0 27℃
2021-06-10 17:45:20  263.0 27℃
2021-06-10 17:50:20  264.0 27℃
2021-06-10 17:55:20  262.0 27℃
2021-06-10 18:00:19  263.0 27℃
2021-06-10 18:05:19  264.0 27℃
2021-06-10 18:10:20  263.0 27℃
2021-06-10 18:15:19  264.0 27℃




6/06/2021

Logger 工作

 Logger 工作



            テプラーで表示しました。
            黄色の装置は温度計です。熱電対タイプの温度計です。
            とりあえずこの温度計をもとに校正します。




Logger工作

 Logger工作1




 ブレッドボードで動作確認します。うまく動作したら基板に組みます。




基板で作ります




6/03/2021

このような表示もできます

  このような表示ができます


上図

指定時間間隔のインターバルで

日付、時刻、センサーのデジタル値、気温、実行中プログラム名

を表示更新します。

最小化して、画面から隠しても問題ありません。






5/19/2021

Loggerでアナログ量をデジタルに変換するMPU

 Loggerでアナログ量をデジタルに変換する技


私のこのロガーの場合、MPU(マイクロ・プロセッサー・ユニット)を使用しています。

このMPUにてA/D変換を行っています。別方法ではA/D変化を行うICなどもあります。

そしてデジタル値としてMPUより出力しています。別方法では8ビットパラレルで出力方法もあります。

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

(A)この8ビットパラレルデータをあるところに送り受信します。そのデータを再現する技が必要になります。そして、液晶表示器やパソコンのディスプレイーに表示して初めて意味があります。

(B)あるいは、シリアルデータをあるところに送り受信します。そして、そのデータを再現し、液晶表示器やパソコンのディスプレイーに表示して初めて意味があります。

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

(A)(B)それぞれについて考えます。

(A) アナログ量を8bitに変換して、8本の端子(ポート)へ出力します。

 例えば、ある時刻に 10101011のデータが端子に出力されたとします。

 時々刻々にアナログ量は変化しています。さらに、その後のデジタル値が

 10101110であったとき、この値をなんどきに端子へ送るかを考える必要があります。


 今日は、ここまでの記述です。途中。




5/06/2021

3チャネル受信

3チャネル(A-Data B-Data C-Data) を可能にしました

PIC12F675マイコン側のアナログ端子7pin(A0)、6pin(A1)、5pin(A2)のA/D変換を2pinよりデジタルデータとしてパソコンへ伝送したものです。



(図1)
7pin 6pin 5pin の各データを -A  -B  -C  として直列に送信します。もちろん変換後のデジタル値としてです。Aの温度センサはLM35DZ、Bの温度センサはNTCサーミスタ、Cの温度センサもNTCサーミスタです。

ABCと連続して受信したデータを種類ごとに分類します。その様子を3つの区画に表示しました。
BとCの温度センサは同一品であり、判定プログラムも同一としています。それゆえ、同じ温度を表示してきます。まーあ 納得です。










(図2)
受信プログラムの一部が見えます。
パソコンのCOM(コミュニケーションポート)へRS232Cケーブルで接続しています。
伝送速度は2400bpsです。 


(図3)
パソコンの受信プログラムを自動で実行させるバッチプログラムです。
実行中の様子です。
このバッチにより、約5分間隔でプログラムを実行します。
時間間隔は自由に設定できます。 



 

4/02/2021

Ruby言語の特徴

                                      Ruby言語の特徴    

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

Ruby

変数の型宣言はありません

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

スコープの種類は

・ローカル変数 小文字のアルファベッドで始まる変数名。

(変数名の頭に記号が付いていない)

・グローバル変数 変数名の頭に$が付いている。

・インスタンス変数 変数名の頭に@が付いている。

・クラス変数      変数名の頭に@@が付いている。

・クラス定数 大文字のアルファベッドで始まる変数名。

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

Rubyには、マルチスレッド機能が装備されています。「マルチスレッド」とはひとつのプログラム内で、複数の処理を同時に実行させる機能のことです。

Rubyでは、マルチスレッドを言語レベルで用意しているため、マシンレベルのスレッド(ネイティブスレッド)を用いません。

このことにより、マルチスレッド機能を持たないOSでも、この機能を利用することができるだけでなく、どのCPUで動作させてもプログラムは同じ動作を実現します。

その代わりに、プログラムの実行速度が非常に遅くなるという欠点があります。

  

4/01/2021

RubyーLogger

Ruby-温度 Logger(ロガー)

下記は部屋の温度を記録させた状態です
ほんとに素晴らしいです。

5分インターバルの計測です。途中、手動で計測を起動しています。
温度センサーはサーミスターを使用しました。

サーミスターは、温度上昇時と温度下降時の履歴が一致しませんでした。
私が校正用に使用した温度計は、1℃目盛りです。

本当は、0.5℃目盛の精密温度計を使用して校正したいところです。


水銀0.5℃目盛の精密温度計は1万円前後します。

今とれる対策は、サーミスターと直列に入れた510Ωの抵抗を酸化金属被膜抵抗に変更することです。今現在はカーボン抵抗を使用しました。

下図のif文の羅列をご覧ください。

校正用の温度計を見て、その時のセンサー値を都度その温度
範囲になるように合わせます。



5分インターバルの実行には、バッチを組みました。
Windows10におてのバッチファイルの作り方はWebで検索可能です。
一度経験すると、何とか使えるようになります。
これはそのバッチ(log.bat)の内容です。

---------------- log.bat ----------------------------------
:START

@echo off
 
echo Hello Tom  
echo Programe name is thermistor_purple_big_logger_100.rb
echo 5min. interval logger. eternally  

cd C:\Users\**\Documents\MyRuby
REM ruby LM35DZ_logger_102.rb

ruby thermistor_purple_big_logger_100B.rb

timeout 294 /NOBREAK > NUL



REM 300--> 5min
REM 600-->10min

GOTO START
---------------------------------------------------------

REM ruby LM35DZ_logger_102.rb

このREM(リマーク)箇所は実行されません。

温度センサーLM35DZの場合のプログラムです。

300秒の設定でもほとんど問題ないと思います。



3/24/2021

Rubyと温度センサー LM35DZ

  温度センサー LM35DZ 

 

温度センサー LM35DZ を使用したときのデータです。まだ、校正途中です。

2021.6.23  今振り返りますが、LM35DZ温度センサーの出力をマイコンのアナログ端子(A0)へ直接接続していました。

この事は、インピーダンスの関係では問題が何かしらあると考えます。

A0端子の入力インピーダンスとLM35DZの出力インピーダンスの関係です。

この問題があり不安定な受信(受信記録)データとなったと考えます。

回路を追加する実験をします。

後日の報告となります。


3/22/2021

Rubyでシリアル通信 大成功


Rubyでシリアル通信 大成功




 Rubyでシリアル通信 大成功
-------------------------------------------------------
log.bat の記述です

:START

@echo off

echo Hello Tom  10min. interval logger. eternally

cd C:\Users\ __\Documents\MyRuby

ruby RS232C_280.rb

timeout 600 /NOBREAK > NUL

REM 600-->10min

GOTO START

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

10分間隔の起動です。10分インターバルです。

プログラムを起動してからそのプログラムが終了する時間をT1とします。

インターバル時間をT2とします。すると、周期をTとするとT=T1+T2 となります。

ここで、T1=600(SEC),T2=(1SEC)

と仮定すると、1日(24時間)では24X6=144回実行します。T2の1(SEC)が144秒遅れで現れます。144/60=2.4分 

これが、インターバル時間による問題と言えば問題です。


これが嫌なら、

高度に時刻に厳密に実行させたいなら、割り込み処理を行わせます。

途中


3/11/2021

Ruby(ルビー)をはじめました

             Ruby(ルビー)をはじめました 

Rubyとは「まつもとひろゆき」さん開発による言語とのことです。
楽しいプログラミング(Enjoy Programming)というコンセプトから開発され、1995年12月に最初のバージョンが公開されました。

・オブジェクト指向型スクリプト言語
・インタプリタ形式で実行

宝石のパール(Pearl)は6月の誕生石で、ルビーは7月の誕生石です。
日本人が設計し、開発した言語です。世界中で使用されています。


Cではポインター(*)、アドレス演算子(&)で訳が分からなくまいりました。
構造体でも訳が分からず、降参です。unixがCで書き直されたとのことで、何としてもCを理解すべきだと考えましたが、意気込みだけでは手に負えませんでした。

「Rubyがいいよ」とのアドバイスを以前よりもらっていました。
コンピュータ言語の世界では、最初はその言語を扱う環境を作るところから始まります。その手順を書きます。

1. マイクロソフトのヴィジュアル・スタデオ・コード(Visual Studio Code)をパソコンに  インストールしました。無償です。
  要するに、エデイッターでもあり実行結果表示でもあり、ファイル管理でもあります。
 IDEという言葉がありますがまさにそれに相当しています。
 VSCを初期値のままでは画面が白系で目が疲れます。私は、ブルー系に変更しました。目には負担が少ないように思います。

2.  次にRubyそのものをパソコンにインストールする必要があります。
    https://www.ruby-lang.org/ja/downloads/
このサイトよりダウンロードします。

 さらに、インストーラーを入手します。
 https://rubyinstaller.org/
このサイトよりダウンロードします。

 インストールプログラムが必要であるなんて少し1ステップ余計ですが。
 Linuxなどでもインストーラを使用してインストールしていました。

ソースプログラムを格納するフォルダ(MyRuby)をMyDocumentsに配置しました。 
以上で環境構築はできると思います。

Ruby関係の書籍には、このことの記述があるはずです。またはNetによる検索でも情報は得られるはずです。

「たのしい Ruby 第6版 SB Creative(著者 高橋征義、後藤裕蔵、監修 まつもとひろゆき)を買いました。 [2600円+税]

   下記  ビジュアルスタデオコードを立ち上げて、ソースコードを書いた画面です。
 エデッータの補完機能は抜群です。色分けも自動で行ってくれます。


下図 マイコンからの受信データはおおよそ下記の形式で受信予定です。
この状態を想定して、データの一部を抜き出しできるか簡単なプログラムを作り、実行させた結果です。



    • コンパイラ型の言語と違い、プログラムのデバッグが楽です。コンパイラ型では都度、exeーファイルを生成して実行する必要があり手間を要しましたが、これは楽です。
    • p メソッドがいい!  プログラムの実行状況の確認に便利です。 






3/01/2021

RS232C この先がわかんない!

 //+++++++ 各文の分かりやすい注釈文(コメント)が欲しいです +++++++

// +++++ コンパイルができたので、とにかく何とかなりそうな予感がします +++

// +++  minGW でコンパイルができました。ワーニングは出ました。ですが、+++

//++++ コンパイルエラーではなかったです +++++++++++++

//Good.

//東京工業大学ロッボト技術研究会さんありがとうございました。私、何とか自力でCompileできました。

//■C:\MinGW\RS232C> mingw32-g++  RS232C~1.CPP   私の現在のマシンはデヴァイスマネージャーでCOM1・COM6を表示していたのでCOM1を記述しました。

//私のマシンのCOM6は現在DataLoggerBで稼働使用中です。

// Compileエラー無し。ワーニングはあり。

/* RS232Cプログラムを書く方法ですが、

・C#やVBで.NETFrameworkを利用する

・C++でWin32APIを利用する

の二つの方法があるようですが、私がCしか触れたことがないのでWin32APIをつかって作ります。

またWindowsアプリケーションはよくわからないのでコンソールアプリケーションを想定しています。


全体の流れは

1.ファイルとしてCOMポートを開く

2.送信バッファの設定

3.送受信バッファの初期化

4.COMポート構成情報の初期化

5.タイムアウトの設定

でRS232C通信が使えるようになります。

今回の通信の仕様は

RTS,CTSフロー制御なし

9600bps

データサイズ8bit

パリティビットなし

ストップビット1bit

main()関数内での受信処理

です。


まずはいくつかのヘッダファイルを読み込んでおきましょう。*/

#include <string>//良く知らん

#include <stdio.h>//printfなどの標準入出力関数を使うためのヘッダファイル

#include <windows.h>//Wi32APIを使うためのヘッダファイル

#include <tchar.h>//_T()使うのに要る


int main(void){

//1.COMポートを開く

// HANDLE hComPort;//COMポートのハンドルいろいろ使うのでグローバル変数にしておくとよい

//  hComPort = CreateFile(    //ファイルとしてポートを開く

//      _T("COM4"),// ポート名を指すバッファへのポインタ:COM4を開く(デバイスマネージャでどのポートが使えるか確認)

//      GENERIC_READ | GENERIC_WRITE, // アクセスモード:読み書き両方する

//      0,        //ポートの共有方法を指定:オブジェクトは共有しない

//      NULL,       //セキュリティ属性:ハンドルを子プロセスへ継承しない

//     OPEN_EXISTING,     //ポートを開き方を指定:既存のポートを開く

//      0,   //ポートの属性を指定:同期 非同期にしたいときはFILE_FLAG_OVERLAPPED

//      NULL       // テンプレートファイルへのハンドル:NULLって書け

//  );

HANDLE hComPort;


hComPort = CreateFile(

_T("COM1"), //@@@@@@@@@@@@@@@@@@@@@@@@@ ここ

GENERIC_READ | GENERIC_WRITE,

0,

NULL,

OPEN_EXISTING,

0,

NULL

);

 if (hComPort == INVALID_HANDLE_VALUE){//ポートの取得に失敗

  printf("指定COMポートが開けません.\n\r");

  CloseHandle(hComPort);//ポートを閉じる

return 0;

 }

 else{

  printf("COMポートは正常に開けました.\n\r");

 }

/*ポートをファイルとみなしCreateFile()関数を用いて開きます。失敗するとINVALID_HANDLE_VALUEを返します。

ポートの属性は非同期(FILE_FLAG_OVERLAPPED)にした方がいいらしいですが上手くいかなかったので同期通信にしてあります。


2.送受信バッファの設定 */

 int check;//エラーチェック用の変数

 check = SetupComm(

       hComPort,//COMポートのハンドラ

       1024,//受信バッファサイズ:1024byte

       1024//送信バッファ:1024byte

  );

 if (check == FALSE){

     printf("送受信バッファの設定ができません.\r\n");

CloseHandle(hComPort);

     return 0;

 }

 else{

      printf("送受信バッファの設定が完了しました.\r\n");

 }

/*SetupComm()関数を用いて送受信バッファの設定をします。


3.送受信バッファの初期化 */

 check = PurgeComm(

       hComPort,//COMポートのハンドラ

       PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR//出入力バッファをすべてクリア

 );

 if (check == FALSE){

     printf("送受信バッファの初期化ができません.\r\n");

     CloseHandle(hComPort);

     return 0;

 }

 else{

      printf("送受信バッファの初期化が完了しました.\r\n");

 }

/* PurgeComm()関数を用いて出入力すべてのバッファをクリアします。


4.COMポート構成情報の初期化 */

 DCB dcb;//構成情報を記録する構造体の生成

 GetCommState(hComPort, &dcb);//現在の設定値を読み込み

 dcb.DCBlength = sizeof(DCB);//DCBのサイズ

 dcb.BaudRate = 9600;//ボーレート:9600bps

 dcb.ByteSize = 8;//データサイズ:8bit

 dcb.fBinary = TRUE;//バイナリモード:通常TRUE

 dcb.fParity = NOPARITY;//パリティビット:パリティビットなし

 dcb.StopBits = ONESTOPBIT;//ストップビット:1bit

 dcb.fOutxCtsFlow = FALSE;//CTSフロー制御:フロー制御なし

 dcb.fOutxDsrFlow = FALSE;//DSRハードウェアフロー制御:使用しない

 dcb.fDtrControl = DTR_CONTROL_DISABLE;//DTR有効/無効:DTR無効

 dcb.fRtsControl = RTS_CONTROL_DISABLE;//RTSフロー制御:RTS制御なし


 dcb.fOutX = FALSE;//送信時XON/XOFF制御の有無:なし

 dcb.fInX = FALSE;//受信時XON/XOFF制御の有無:なし

 dcb.fTXContinueOnXoff = TRUE;// 受信バッファー満杯&XOFF受信後の継続送信可否:送信可

 dcb.XonLim = 512;//XONが送られるまでに格納できる最小バイト数:512

 dcb.XoffLim = 512;//XOFFが送られるまでに格納できる最小バイト数:512

 dcb.XonChar = 0x11;//送信時XON文字 ( 送信可:ビジィ解除 ) の指定:XON文字として11H ( デバイス制御1:DC1 )

 dcb.XoffChar = 0x13;//XOFF文字(送信不可:ビジー通告)の指定:XOFF文字として13H ( デバイス制御3:DC3 )


 dcb.fNull = TRUE;// NULLバイトの破棄:破棄する

 dcb.fAbortOnError = TRUE;//エラー時の読み書き操作終了:終了する

 dcb.fErrorChar = FALSE;// パリティエラー発生時のキャラクタ(ErrorChar)置換:なし

 dcb.ErrorChar = 0x00;// パリティエラー発生時の置換キャラクタ

 dcb.EofChar = 0x03;// データ終了通知キャラクタ:一般に0x03(ETX)がよく使われます。

 dcb.EvtChar = 0x02;// イベント通知キャラクタ:一般に0x02(STX)がよく使われます


 check = SetCommState(hComPort, &dcb);  //設定値の書き込み

 if (check == FALSE){//エラーチェック

     printf("COMポート構成情報の変更に失敗しました.\r\n");

     CloseHandle(hComPort);

     return 0;

 }

 else{

      printf("COMポート構成情報を変更しました.\r\n");

 }

/* DCB構造体で構成情報を設定します。今回すべての変数について書き込んでいますが、GetCommState()関数で基本情報を読み込んでいるため変更する部分だけ書き換えればいいです。

ボーレートやデータサイズ、パリティビット、ストップビットなどはマイコン側とあわせてください。

書き換えた後にSetCommState()関数で再設定を行います。*/


//5.タイムアウト時間の設定

 COMMTIMEOUTS TimeOut; // COMMTIMEOUTS構造体の変数を宣言

 GetCommTimeouts(hComPort, &TimeOut); // タイムアウトの設定状態を取得


 TimeOut.ReadTotalTimeoutMultiplier = 0;//読込の1文字あたりの時間:タイムアウトなし

 TimeOut.ReadTotalTimeoutConstant = 1000;//読込エラー検出用のタイムアウト時間

 //(受信トータルタイムアウト) = ReadTotalTimeoutMultiplier × (受信予定バイト数) + ReadTotalTimeoutConstant

 TimeOut.WriteTotalTimeoutMultiplier = 0;//書き込み1文字あたりの待ち時間:タイムアウトなし

 TimeOut.WriteTotalTimeoutConstant = 1000;//書き込みエラー検出用のタイムアウト時間

 //(送信トータルタイムアウト) = WriteTotalTimeoutMultiplier ×(送信予定バイト数) + WriteTotalTimeoutConstant


 check = SetCommTimeouts(hComPort, &TimeOut);//タイムアウト設定の書き換え

 if (check == FALSE){//エラーチェック

     printf("タイムアウトの設定に失敗しました.\r\n");

     CloseHandle(hComPort);

     return 0;

 }

 else{

      printf("タイムアウトの設定に成功しました.\r\n");

 }

/*構成情報の設定と似た手順です。COMMTIMEOUTS構造体を使い、GetCommTimeouts()関数で基本情報を取得し、変更したのちSetCommTimeouts()関数で書き換えています。各値はよく知りませんがこんな感じが多いです。

ここまででCOMポートの初期設定ができました次に送信してみましょう。


6.送信 */

 char SendData[] = "17";//送信データの用意

 int SendSize = strlen(SendData)+1;//送信データサイズを取得

 DWORD writeSize;//実際に送信したデータサイズ

 WriteFile(hComPort,SendData,SendSize,&writeSize,NULL);

/* WriteFile()関数を用いて送信。送信するデータサイズはNULL文字の分+1するのを忘れないように。


7.受信 */

 int i = 0;

 char RecieveChar[1];//1文字受信のための変数

 char RecieveData[100];//受信文字列

 unsigned long nn;

 while (1) {

       ReadFile(hComPort, RecieveChar, 1, &nn, 0); // シリアルポートに対する読み込み

       if (nn == 1) {

           if (RecieveChar[0] == 10 || RecieveChar[0] == 13) { // '\r'や'\n'を受信すると文字列を閉じる

               if (i != 0) {

                   RecieveData[i] = '\0';//最後にNULL文字を付加して

                   i = 0;//文字列を先頭に戻す

                   printf("%s\n", RecieveData);//受信した文字列を表示

               }

}

           else {

                RecieveData[i] = RecieveChar[0];//受信した文字を文字列にする

                i++;

           }

       }

}

}

/*ReadFil()関数で1文字ずつ受信して'\r'や'\n'で文字列の切り分けを行っています。

受信のタイミングは分からないのでスレッド受信にすべきなのですが、スレッドに関して未だ理化していないことが多いので今回はwhileで回し続けています。


VisualStudio2013で作り、PIC32MX440FとRS23C通信を行いました。

数字を文字データとして送信しPICが素数かどうか判定して素数だと「~ is a prime! 」と返すプログラムを書いて実行したところ。*/



//--------------------------------------------------------------

//COM1を指定して、Compileし、実行しました

//Compilerは ■C:\MinGW\RS232C> mingw32-g++  RS232C~1.CPP

//C:\MinGW\RS232C>a.exe

//---------------------------------------------------------------

//COMポートは正常に開けました.

//送受信バッファの設定が完了しました.

//送受信バッファの初期化が完了しました.

//COMポート告ャ|情報を変更しました.

//タイムアウトの設定に成功しました.

//------------------------------------------------------------------------------------------------------------------------------

//なるメッセージを表示しました

//c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/bin/ld.exe: cannot open output file a.exe: Permission denied

//はa.exegaがすでに実行中においてCompile実行をしたからです。

//--------------------------------------------------------------------------------------------------------------------------------