チーム2159

課題名

DISTANCE

研究者名

2-14-037 Yuka Natsuki
2-14-038 Yu Niiya

使用器具

・PSoc基板 1つ
・Mini Progケーブル 1つ
・通信ケーブル 1つ
・スピーカー 1つ
・ジャンパ線 2本
・距離センサー 1つ

概要

距離を測り、約3㎝であるかを判定する。判定結果を表示および音声で表現した。
photo1.png

OKの場合:
ディスプレイにOKという文字が表示される。
音楽が流れる。
コメント.png

NGの場合:
ディスプレイにNOの内容が表示される。
NOを表現する音が流れる。
コメント2.png

配置

hardware_2159_配置図.png


ソースコード

【main文】

#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#pragma interrupt_handler myISR
int PW = 125;
int SILENT=0, D=229, L=204, M=182, F=172, S=153, R=136, C=121, CF=118, DD=115;
int TC=0;
int n=0;

void myISR(void){
  if(n == 1){
   
   PWM16_1_WritePulseWidth(PW);
   /*if(TC == 1)
       PWM16_1_WritePeriod(D);
   else if(TC == 3)
       PWM16_1_WritePeriod(D);
   else if(TC == 4)
       PWM16_1_WritePeriod(C);
   else if(TC == 5)
       PWM16_1_WritePeriod(CF);
   else if(TC == 6)
       PWM16_1_WritePeriod(R);
   else if(TC == 7)
       PWM16_1_WritePeriod(S);
   else if(TC == 9)
       PWM16_1_WritePeriod(CF);
   else if(TC == 11)
           PWM16_1_WritePeriod(R);
   else if(TC >= 13)
       PWM16_1_WritePeriod(SILENT);
   if(TC == 1)
       PWM16_1_WritePeriod(R);
   else if(TC == 3)
       PWM16_1_WritePeriod(CF);
   else if(TC == 5)
       PWM16_1_WritePeriod(C);
   else if(TC == 7)
       PWM16_1_WritePeriod(DD);
   else if(TC >= 9)
       TC = 0;
   TC += 1;*/
   if(TC == 1)
       PWM16_1_WritePeriod(D);
   else if(TC == 3)
       PWM16_1_WritePeriod(M);
   else if(TC == 5)
       PWM16_1_WritePeriod(S);
   else if(TC == 7)
       PWM16_1_WritePeriod(S);
   else if(TC == 9)
       PWM16_1_WritePeriod(D);
   else if(TC == 11)
       PWM16_1_WritePeriod(F);
   else if(TC == 13)
       PWM16_1_WritePeriod(R);
   else if(TC == 15)
       PWM16_1_WritePeriod(R);
   else if(TC == 17)
       PWM16_1_WritePeriod(D);
   else if(TC == 19)
       PWM16_1_WritePeriod(M);
   else if(TC == 21)
       PWM16_1_WritePeriod(S);
   else if(TC == 23)
       PWM16_1_WritePeriod(S);
   else if(TC >= 25)
       TC = 0;
   TC += 1;
       //PWM16_1_WritePeriod(SILENT);
   }else if(n == 2){
       TC += 1;
       PWM16_1_WritePulseWidth(PW);
       if(TC == 1)
           PWM16_1_WritePeriod(D);
       else if(TC >= 10)
           PWM16_1_WritePeriod(SILENT);
   }
}

void main(void)
{
  // M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts
   // Insert your main routine code here.
   unsigned int adc_data;
   char* strPtr;
   PGA_Start(PGA_HIGHPOWER);
   LCD_Start();
   LCD_InitBG(LCD_SOLID_BG);
   M8C_EnableGInt;
   ADCINC_Start(ADCINC_HIGHPOWER);
   ADCINC_GetSamples(0);    
   UART_CmdReset();
   UART_IntCntl(UART_ENABLE_RX_INT);
   Counter8_WritePeriod(155);
   Counter8_WriteCompareValue(77);
   Counter8_Start();
   UART_Start(UART_PARITY_NONE);
   M8C_EnableGInt;
   UART_CPutString("\r\n\r\n\r\n\r\n_________Welcome to DISTANCE_________  \r\n");
   UART_CPutString("\r\n手順  \r\n");
   UART_CPutString("\r\n1.距離センサーを3cmだと思う距離に置いてください。  \r\n");
   UART_CPutString("\r\n2.任意のキーとEnterを押すと結果が表示されます。 \r\n");
   UART_CPutString("\r\n3.正確な距離がとれているか否かで、OKまたはNOが表示されます。 \r\n");
   
   while(1){
       while(ADCINC_fIsDataAvailable() == 0);
       if(UART_bCmdCheck()){
           if(strPtr = UART_szGetParam()){
               adc_data = ADCINC_wClearFlagGetData();
               UART_CPutString("\r\n>>>>>>RESULT:\r\n");
               if(adc_data > 0x1500 && adc_data < 0x3000){
                   UART_CPutString("\r\n xxxxxx  x   xx");
                   UART_CPutString("\r\n x    x  x xx ");
                   UART_CPutString("\r\n x    x  xx   ");
                   UART_CPutString("\r\n x    x  x xx ");
                   UART_CPutString("\r\n xxxxxx  x   xx");
                   
                   UART_CPutString("\r\n※終了もしくはリトライする場合、resetボタンを押してください。 \r\n");
                   n = 1;
                   PWM16_1_Start();
                   Timer16_1_EnableInt();
                   Timer16_1_Start();
               }else{
                   UART_CPutString("\r\nNOOOOO");
                   
                   UART_CPutString("\r\n※終了もしくはリトライする場合、resetボタンを押してください。 \r\n");
                   n = 2;
                   PWM16_1_Start();
                   Timer16_1_EnableInt();
                   Timer16_1_Start();
               }
           }
           UART_CmdReset();
       }
   }
}



考察

【工夫した点】
・実験を繰り返し、距離を判定できるようにした
距離センサーから得た値をadc_dataという変数に格納し、その格納された値で約3cmになっているかどうか確認しようとしたが、格納された値をcmに変換することができなかったので、距離センサーで約3cmを測定したときにOKが表示されるように実験を繰り返して条件式の範囲を設定した・

・判定結果の表示と音
画面に判定結果を表示するだけではなく、音も使うことで視覚的にも聴覚的にも判定結果がわかりやすくなるように工夫した。


【課題点】
・ピーという音が解消されなかった
音楽を流すことはできたが、音楽を指定していない範囲の場合、謎のピーという音が流れてしまい、消すことができなかった。
OKの場合は、音楽を繰り返すことでカモフラージュしたが、NGの場合は謎のピーという音自体を消そうと思ったが、適切な方法が見つからなかった。

・距離を正確に設定することができなかった
電圧の強さと実際の距離の関係がつかめず、正確に3㎝を判定するように設定できなかった。
パラメータを調整したことが原因だと考えられる。

・パラメータの調整
問題点として、2つのラボを統合した際、同じパラメータを2つのラボで使用していたが、値が異なったため調整する必要があった。
最終的に、さまざまな値で試すことで動作する値を見つけることができ、自由課題自体は完成した。しかし、VCなどの値の変更と正常に動作したこととの関係性が不明であったため、論理的に調節することができなかった。

参考

・授業資料timer_pwm2.pdf
・授業資料uart_1.pdf
・授業資料pwm_uart_2.pdf
・授業資料lab3_adc.pdf

  • 最終更新:2021-11-30 16:21:12

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

認証パスワード