チーム172B
課題名
シューティングゲーム ver1.0
研究者名
Yoshinao Toshimitu
Kosuke Todoroki
使用器具
【送信機】
PSoC基盤 1個
ジャンパ線 3本
赤外線LED 1個
スピーカー 1個
【受信機】
PSoC基盤 1個
ジャンパ線 5本
赤外線受信機 1個
スピーカー 1個
概要
ハードウェア割り込み、ポーリング、赤外線送受信などを利用して、簡易的なシューティングゲームを作成した。
銃の役割となるPSoC基盤から赤外線を送り、それをターゲット側のPSoC基盤が受信すると、当たり判定を示す。
銃の側もターゲットの側もそれぞれの情報を常にLCDに表示している(残弾数 etc)。
銃の側ではリロードの時に、ターゲット側では受信処理が発生した際に音楽を流している。
赤外線波形
受信機から観測された波形
モジュールの配置と配線
【送信機】
【受信機】
ソースコード
【送信機】
#include <m8c.h>
#include "PSoCAPI.h"
#pragma interrupt_handler myISR
#define SW 0b00010000
int PW=125;
int TC=0;
int SILENT=0,G=153/*ソ*/,F=172/*ファ*/,Eb=193/*ミb*/;
/* ファ、ファ、ファ、ファ/ミb/ソ/ファ
/*割り込みを使用。ドラゴンクエストのレベルアップ時の効果音*/
void myISR(void){
TC += 1; if(TC == 2 | | TC == 4 | | TC == 6 | | TC == 8 | | TC == 20) PWM16_WritePeriod(F); else if(TC == 3 | | TC == 5 | | TC == 7 | | TC == 9 | | TC == 13 | | TC == 17) PWM16_WritePeriod(SILENT); else if(TC == 12) PWM16_WritePeriod(Eb); else if(TC == 16) PWM16_WritePeriod(G);
}
void main(void)
{
int n=5,num=5,sign=0,sign1=0,tc=0,tc1=0,time,time1; PWM8_Start(); LCD_Start(); PWM16_Start(); PWM16_WritePulseWidth(PW); M8C_EnableGInt; while(1){ /*スィッチを押したら赤外線送信*/ if(PRT1DR & SW){ sign=1; PWM8_Start(); LCD_Position(1,0); LCD_PrCString("Shooting "); PWM16_WritePeriod(G); } /*押されていなかったら待機*/ else{ PWM8_Stop(); if(sign && n==1){ sign1=1; time1=0; for(time=500;time;time--){ PWM16_WritePeriod(SILENT); LCD_Position(0,0); LCD_PrCString("Buy bullets?"); LCD_Position(1,0); LCD_PrCString("Push the button"); if(sign1==1 && (PRT1DR & SW)) time1++; if(time1 == 250){ sign1=2; break; } } if(sign1==2) num+=5; LCD_Position(0,0); LCD_PrCString("Get"); LCD_PrHexInt(num); LCD_PrCString("bullets! "); LCD_Position(1,0); LCD_PrCString(" "); TC=0; Timer16_1_EnableInt(); Timer16_1_Start(); while(1){ if(TC == 30) break; } sign=0; n=num; } else if(sign){ n-=1; sign=0; } LCD_Position(0,0); LCD_PrHexInt(n); LCD_PrCString(" "); LCD_Position(1,0); LCD_PrCString("Waiting "); PWM16_WritePeriod(SILENT); } }
}
【受信機】
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#pragma interrupt_handler myISR
#define SW 0b00010000
int PW=125; //Pulse Width
int SILENT=0,D=229,L=204,M=182,F=172; //音階(ド、レ、ミ、ファ)
int TC=0;
/* 割り込みによってマリオのゲームオーバー時の音楽を流す */
void myISR(void) {
TC += 1; PWM16_WritePulseWidth(PW); if(TC==9) PWM16_WritePeriod(D); else if(TC==8) PWM16_WritePeriod(L); else if(TC==6) PWM16_WritePeriod(M); else if( TC==3 | | TC==5) PWM16_WritePeriod(F); else if(TC==4 | | TC==3) PWM16_WritePeriod(SILENT); else if(TC==13) PWM16_WritePeriod(SILENT);
}
/* 実際に音楽を流している */
void play(void)
{
M8C_EnableGInt;
Timer16_1_EnableInt(); Timer16_1_Start(); while(TC != 14) {};
}
void main(void)
{
LCD_Start(); LCD_InitBG(LCD_SOLID_BG); PGA_Start(PGA_HIGHPOWER); PWM16_Start(); PRT1DR &= (~SW); while(1){ /* 赤外線未受信状態 */ if(PRT1DR & SW){ LCD_Position(0,0); LCD_PrCString("Target "); PWM16_WritePeriod(SILENT); } /* 赤外線受信状態 */ else{ TC=0; LCD_Position(0,0); LCD_PrCString("Congraturation!!"); play(); // 音楽を流す関数へ飛ばす } }
}
考察
ラボ hello_world、ラボ timer_pwm2、ラボ gpio_pollを参考にした。
研究発表TAを参考にした。
残弾数の表示が16進数表示になってしまったので、10進数表示に改良できれば、もっとよいものになると考えられる。
受信機の方でよく接触不良を起こしてしまった。PSoC基盤を変えたりしてもそのまま不良状態が続いてしまったことから、配線が交差していたりなどの配線自体に問題があったと考える。
バージョンアップの機会があったら、モーターなどを付属させてターゲットのPSoCを動かしたりしてみても面白いと思う。
- 最終更新:2017-06-13 18:32:44