チーム2118

課題名

PSoCを用いたクイズ

研究者名

Kentaro Ono
Takumi Ogino

概要

PSoCを用いたクイズ。
問題文をTeraTermに出力し、キーボードで答えを受け付ける
正解か不正解で流れるBGMが変わる
このBGMは答えに関連するものにした

使用する機器

・PSoC基盤
・USB-Serial変換ケーブル
・PSoCMiniProg
・スピーカー
・ジャンパー線2本

設計方針

スクリーンショット _1_.png

ソースコード

#include <m8c.h>
#include <string.h>
#include "PSoCAPI.h"
#define MAX_LENGTH 50
#define NUM_STAGES 1
#pragma interrupt_handler myISR

int PW=125;
int SILENT=0,D=229,DC=217,L=204,Mb = 193,M=182,F=172,S=153,Rb=145,R=136,Cb=129, C=121,DD=115,SS=77,CC=50,SSA = 77;
int TC=0;
int isCorrect = -1;
//曲を流す関数
void myISR(void) {
 TC+=1;
  PWM16_1_WritePulseWidth(PW);
  if (isCorrect == 1) {
//正解の曲

...

 } 

 else if (isCorrect == 0)  { 
//不正解の曲

...

 } 

 else {
       PWM16_1_WritePeriod(SILENT);
  }
}

//問題文の文字列
char questions[][MAX_LENGTH] = {
"What is the pink and round glutton character?"
};

//答えの文字列
char answers[][MAX_LENGTH] = {
"kirby"
};

char ans[MAX_LENGTH];

void main(void)
{
 int stage = 0;
  int waiting = 0;
  int count = 0;
  char *strptr;
  UART_CmdReset();
  UART_IntCntl(UART_ENABLE_RX_INT);
  M8C_EnableGInt;
  Counter8_WritePeriod(155);
  Counter8_WriteCompareValue(77);
  Counter8_Start();
  PWM16_1_Start();
  Timer16_1_EnableInt();
  Timer16_1_Start();
  UART_Start(UART_PARITY_NONE);
    
  UART_CPutString("\r\n Welcome to PSoC Quiz! \r\n");
  
  while (1) {
      if (!waiting) {
          UART_CPutString("Please input your answer : ");
          UART_PutString(questions[stage]);
          UART_CPutString("\r\n");
          waiting = 1;
      }
      
      if (UART_bCmdCheck()) {
          if (strptr = UART_szGetParam()) {
              ans[0] = 0;
              UART_CPutString("answer : ");
              strcat(ans, strptr);
              while (strptr = UART_szGetParam()) {
                  strcat(ans, strptr);    
              }
              UART_PutString(ans);
              UART_CPutString("\r\n");
              if (strcmp(ans, answers[stage]) == 0) {
                  UART_CPutString("Excellent!");
                  count++;
                  isCorrect = 1;
              }
              else {
                  UART_CPutString("Wrong.");
                  isCorrect = 0;
              }
              UART_CPutString(" The answer is 'kirby'");
              
              TC = 0;
                  
              UART_CPutString("\r\n");
              stage++;
              if (stage == NUM_STAGES) break;
          }
          waiting = 0;
          UART_CmdReset();
      }
  }
  UART_CPutString("\r\nGAME OVER\r\n");
}

考察

最初は以下のようなイントロクイズをしようと企画していた
1.曲が流れる
2.選択肢をTeraTerm上に出力する
(例:
a.ただ君に晴れ(ヨルシカ)
b.夜に駆ける(YOASOBI)
c.うっせぇわ(Ado)
)
3.回答を受け付ける(a,b,cのどれかをキーボードで入力する)
4.正解か不正解かを出力する

だが、曲を流してから回答を受け付けるシステムを思いつくことができなかったため、順番を逆にした。
また、流れる曲もランダムにしようとしたのだが、回路やソースコードが複雑になったので断念した。

timer_pwm2とpwm_uart2のラボを融合しようとしたが、中々スピーカーから音が流れずに苦労した。
原因は、複数のモジュールのclock周波数が違ったからで、合わせると音を流すことに成功した。

音が高すぎて周波数がわからないところは自分で計算して探した。
休符のところはSILENTで代用した。
4分休符や8分休符の違いを出すのにはSILENTの時間を長くするなど工夫を施した。
また、ただ単に「ピンポーン」や「ブブー」のようなありふれた曲を流してもつまらないので答えに関連した曲を選んだ。

他にも、最初は日本語の文章を出力しようとしたが、バグが出てしまったので英語に戻した。なぜバグが出たのかはわからなかった。

作成するにあたって、以下のラボ・発表を参考にさせていただいた
・timer_pwm2
・pwm_uart2
・チーム2069

  • 最終更新:2021-05-22 13:20:51

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

認証パスワード