チーム1355

課題名

警報音付き地震探知マシーン

研究者名

2-14-9 宇都宮大典
2-14-10 榎本美優

概要と仕様

地震のゆれを探知するして、揺れの大きさによりLCDへの表示と警告音が変わるマシンを作成した。
x方向とy方向の揺れをAD変換して加速度センサーより得て、監視しているため
地面に対して平行方向の揺れを探知できる。
このデジタル数値化した値の大きさにより、地震の大きさを判別して
ソフトウェア処理によって流すメロディーを変更した。

小さい揺れの場合、LCDに「earth quake!」と表示され
それなりに怖いメロディーが流れる。
大きい揺れの場合、LCDに「earth quake!!!」と表示され
結構恐怖心をあおる?メロディーが流れる。

DSC_0603_convert_20131119141955.jpg
DSC_0600_convert_20131119134958.jpg

使用パーツ

PSoC本体 1個
ジャンパー線 6本
スピーカー 1個
LCDディスプレイ 1個
加速度センサー 1個

ソースコード

#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#include "stdlib.h"

int PW=125; // Pulse Width
int SILENT=0, D=229, L=204, M=182, F=172, S=153, R=136, C=121, DD=115, Ds=217, Ls=193, Fs=162, Ss=145, Rs=129;

 //LCDディスプレイ用の関数
void Lcd_display(int x, int y)
{
  char    pszData[7];

  x *= (5000/4096);
   y *= (5000/4096);

  LCD_1_Position(0,0);
   LCD_1_PrCString("X:");
   itoa(pszData,x,10);
   LCD_1_PrString(pszData);
   LCD_1_PrCString("    ");

  LCD_1_Position(0,8);
   LCD_1_PrCString("Y:");
   itoa(pszData,y,10);
   LCD_1_PrString(pszData);
   LCD_1_PrCString("    ");
}

void main()
{
int position_x, position_y;
 
 int x=0, y=0;
 int i=0;

LCD_1_Start();
 PWM16_1_Start();
 PGA_1_Start(PGA_1_MEDPOWER);
 PGA_2_Start(PGA_2_MEDPOWER);
 PGA_3_Start(PGA_3_MEDPOWER);

M8C_EnableGInt; 
 TRIADC_1_Start(TRIADC_1_HIGHPOWER);    
 TRIADC_1_SetResolution(12);  
 TRIADC_1_GetSamples(0); 
 
 for(;;)    
 {   
   while(TRIADC_1_fIsDataAvailable() == 0);  // AD変換されるまで待つ  
   position_x = TRIADC_1_iGetData1();     
   position_y = TRIADC_1_iGetData2();   

  Lcd_display(position_x, position_y);

  //初回だけx軸,y軸の値を取り込む(基準とする)
   while(i<1){
       x = position_x;
       y = position_y;
       i++;
   }
                                              
   if(x!=0 && y!=0){
       if((position_x-x)>180 | | (x-position_x)>180 | | (position_y-y)>250 | | (y-position_y)>250){
           LCD_1_Position(1,0);
           LCD_1_PrCString("earth quake!!!");
           for(i=0; i<7999; i++){}
           PWM16_1_WritePulseWidth(PW);
           PWM16_1_WritePeriod(Ls);
           for(i=0; i<7999; i++){}
           PWM16_1_WritePeriod(Rs);
           for(i=0; i<7999; i++){}
           PWM16_1_WritePeriod(Ls);
           for(i=0; i<7999; i++){}
           PWM16_1_WritePeriod(Rs);
           for(i=0; i<7999; i++){}
           PWM16_1_WritePeriod(Ls);
           for(i=0; i<7999; i++){}
           PWM16_1_WritePeriod(Rs);
           for(i=0; i<7999; i++){}
           PWM16_1_WritePeriod(SILENT);
           LCD_1_Init();
       }
       else if((position_x-x)>150 | | (x-position_x)>150 | | (position_y-y)>200 | | (y-position_y)>200){
           LCD_1_Position(1,0);
           LCD_1_PrCString("earth quake!");
           for(i=0; i<7999; i++){}
           PWM16_1_WritePulseWidth(PW);
           PWM16_1_WritePeriod(D);
           for(i=0; i<7999; i++){}
           PWM16_1_WritePeriod(M);
           for(i=0; i<7999; i++){}
           PWM16_1_WritePeriod(F);
           for(i=0; i<7999; i++){}
           PWM16_1_WritePeriod(Ds);
           for(i=0; i<7999; i++){}
           PWM16_1_WritePeriod(Ls);
           for(i=0; i<7999; i++){}
           PWM16_1_WritePeriod(Fs);
           for(i=0; i<7999; i++){}
           PWM16_1_WritePeriod(SILENT);
           LCD_1_Init();
       }
   }
   LCD_1_Position(1,0);
   LCD_1_PrCString("safe!");        
                                              
   PWM16_1_WritePeriod(0);                                               
 }
}

考察

最初は、AD変換が完了毎に加速度の数値を比較していたが
PSoC起動時にすぐに揺れていないのに地震だと判断してしまった。
これは、PSoC起動時の加速度の値とその後の平時の値に差があるためだと考えられる。
また、二段階の揺れの大きさを判別するためにはAD変換毎に値を比較するだけでは
差が得にくかったのでPSoC起動時の加速度の初期値を変数に保存して
この値と比較することとした。
また、揺れの大きさごとにこの加速度の差をif文で判別しているが
基準となる差の大きさを決めるのに苦労した。

  • 最終更新:2013-11-19 15:42:00

このWIKIを編集するにはパスワード入力が必要です

認証パスワード