チーム1647

課題名

Number_Hit_Game

研究者名

Yusuke Iwano
Yuichiro Usami

概要

数当てゲームをする。
数字はキーボードから入力する。
最初の範囲は1~9で、レベルが上がるにつれ範囲が10ずつ増える。
「High!」が出たら、その数字は正解の数字より大きい。
「Low!」が出たら、その数字は正解の数字より小さい。
「Congratulation!!」が出たら、正解で、音が鳴る。
その後に「i」キーを入力すると音が止まり、レベルが上がる。
「h」キーを押すとヘルプモードに入り、正解と5以上離れているときは「Very ○○!!」と表示される。
もう一度「h」キーを押すと元のモードに戻る。

1647_2.jpg
1647_3.jpg

使用機器

・PSoC基盤 ×1
・MiniProg ×1
・スピーカー ×1
・ジャンパ × 3
・通信ケーブル × 1

IMG_1647_1.jpg

ソースコード

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

int SILENT=0,D=229;
int x;
int number;
int Max;
int flg;

void main(void)
{
// M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts
  // Insert your main routine code here.
  char* strPtr;
  unsigned int adc_data;
  
  Max =9;
  flg = 0;
  

    UART_CmdReset();
      UART_IntCntl(UART_ENABLE_RX_INT);
  Counter8_WritePeriod(155);
  Counter8_WriteCompareValue(77);
  Counter8_Start();
      UART_Start(UART_PARITY_NONE);
  M8C_EnableGInt;
  PWM16_1_Start();
      UART_CPutString("\r\nWelcome to Number Hit Game . V1.1 \r\n");

PGA_Start(PGA_HIGHPOWER);
  ADCINC_Start(ADCINC_HIGHPOWER);
  ADCINC_GetSamples(0);
      while(ADCINC_fIsDataAvailable() == 0);
      adc_data = ADCINC_wClearFlagGetData();
      srand(adc_data);
      number = 1 + (int)(rand() * (Max - 1 + 1.0)/(1.0 + RAND_MAX));

while(1){
      if(UART_bCmdCheck()){
          if(strPtr = UART_szGetParam()){
              UART_CPutString("Enter Number = >");
              UART_PutString(strPtr);
              
              x = atoi(strPtr);
              
              if(*strPtr == 'h'){
                  flg = (flg + 1) % 2;
                  if (flg == 1)
                      UART_CPutString("<\r\n\nHelp Mode!!\r\n");
                  else
                      UART_CPutString("<\r\n\nNormal Mode!\r\n");
              }
              
              else if(*strPtr == 'i'){
                  UART_CPutString("<\r\n\nLevel up!!\r\n");
                  PWM16_1_WritePeriod(SILENT);
              }
              else if(number == x){
                  UART_CPutString("<\r\nCongratulation!! Press key i !\r\n");
                  PWM16_1_WritePeriod(D);
                  Max = Max + 10;
                  number = 1 + (int)(rand() * (Max - 1 + 1.0)/(1.0 + RAND_MAX));
              }
              else if(number > x){
                  if (number - x >= 5 && flg == 1)
                      UART_CPutString("<\r\nVery Low!!\r\n");
                  else
                      UART_CPutString("<\r\nLow!!\r\n");
              }
              else if(number < x){
                  if (x - number >= 5 && flg == 1)
                      UART_CPutString("<\r\nVery High!!\r\n");
                  else
                      UART_CPutString("<\r\nHigh!!\r\n");
              }
          }
          UART_CmdReset();
      }
  }
}

考察

pwm_uart_2とlab3_adcを参考にした。
乱数のシードとして、C言語のtime関数を使おうとしたがPSoCでは使うことができなかった。そのため、乱数のシードをAD変換で得られる連続的な電圧の値から取り出したことで、VRを回すと生成される乱数のパターンを変えることができた。乱数のシードとして他に光センサーや温度センサーの値を使っても異なる乱数のパターンを作成できると思った。
pwm_uart2の回路にlab3_abcの回路を付け加えると異なるVRの値は得られたが、ドの音が正しく出なくなってしまった。クロックの値を次のように調節することで、乱数の生成とドの音程を正しく処理することができた。正解の音はドの音が出るだけだが、Timerなどを使って音楽を鳴らしたらより面白くなったもしれない。
変更前
VC1 = 1
VC2 = 16
VC3 Source = VC2
VC3 Divider = 25
Sysclk Source = 24MHz
変更後
VC1 = 8
VC2 = 16
VC3 Source = VC1
VC3 Divider = 50
Sysclk Source = 24MHz

  • 最終更新:2016-11-22 14:29:22

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

認証パスワード