チーム143A

課題名

イライラPSoC

研究者名

2年15組19番 桑田浩平
2年15組20番 小石栄一

概要

PSoCを手の平にのせたまま一定時間耐えれたらCLEAR(イライラ棒の要領)
傾いてしまうとGAMEOVER

使用器具

配線 7本
PSoC
加速度センサ
スピーカー

配線図


hglhfl.png

動作確認

1、ゲーム開始(リセットを押すたびに再スタート)
 x,y座標を常に表示。傾きが初期値から70未満かどうかを加速度センサでチェック。

2、傾きが70以上を観測したらLCDにGAMEOVERと表示され、音が鳴る。

3、一定時間経過したらGAMECLEARと表示。

詳しい動作の確認のために動画を作成した。


下記のリンク参照



考察

AD変換を応用し加速度センサを実現した。
PWM16を用いて指定した音域の音をならせるようにした。
main文ではゲーム上で使う傾きの許容量を定めた(今回は70に設定)。
ゲーム終了時に出力されるメッセージやx,yの座標の出力もmain文内で設定している。
今回の自由課題の設計で、AD変換でセンサによって出力を決める方法を学んだ。
加速度センサに限ったことではないが、センサは配線の接触による不具合が起こりやすいので配線の確認が重要であると分かった。
また、加速度センサを実装する際にTRIADCとPGAを使った。TRIADCは3つの入力を持つA/Dコンバータだ。加速度センサのx軸、y軸、z軸をそれぞれ計測しmain文内の値に代入するために用いられその値によってゲームを行っていく。
今回はゲームとして加速度センサを用いたが他にも地震を感知する警報機などにも使えるのではないかと思われる。

ソースコード

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

#define SW 0b00010000


#include "stdlib.h"

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

void User_Function(int iResult1, int iResult2)

{

  char    pszData[7];



  iResult1 *= (5000/4096);

  iResult2 *= (5000/4096);



  LCD_1_Position(0,0);

  LCD_1_PrCString("X:");

  itoa(pszData,iResult1,10);m

  LCD_1_PrString(pszData);

  LCD_1_PrCString("    ");



  LCD_1_Position(0,8);

  LCD_1_PrCString("Y:");

  itoa(pszData,iResult2,10);

  LCD_1_PrString(pszData);

  LCD_1_PrCString("    ");




}





void main()

{

int iResult1, iResult2;
 int x = 0, y = 0;
 int i=0;
 int j =0;
 int k=0;
 int l = 0;
 
 PRT1DR &=(~SW);
 
// if(PRT1DR & SW){
PWM16_1_Start();
 while(1){

LCD_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);          
     

    
   while(j<1000){
   while(TRIADC_1_fIsDataAvailable() == 0); 
   
   iResult1 = TRIADC_1_iGetData1(); 
   
   iResult2 = TRIADC_1_iGetData2();  
   
   User_Function( iResult1, iResult2);

  

                                          
   while(i<1){
       x = iResult1;
       y = iResult2;
       i++;
       }

  if((iResult1-x)>70 | | (x-iResult1)>70 | | (iResult2-y)>70 | |(y-iResult2)>70){
   
   LCD_1_Position(1,0);
   while (k<100000000){
   LCD_1_PrCString(" GAME OVER");


   PWM16_1_WritePeriod(D);

  }
   }
   j++;
   }
   LCD_1_PrCString("GAME CLEAR");
                                                 
   
 }

}

  • 最終更新:2014-07-15 15:41:39

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

認証パスワード