百葉箱もどきの工作
緑の中に
国立天文台
11/30/2021
百葉箱もどきの工作
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)
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
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本目 =======================