チーム1343

課題名

信号機(障がい者用音楽演奏機能付き)
DSC_0026.jpg

研究者名

2-14-27 須川 貴介
2-14-28 杉本 雄亮

コンセプト&動作

一定時間ごとに青信号点灯→青信号点滅→赤信号点灯→…と順番に切り替わる信号機を実装した。
また、青信号点灯時の障がい者用の音楽演奏も実装した。


LEDを点滅させるためにPulse Widthを変更させる方法と、PWMのSTARTとSTOPを繰り返す方法とあったが、時間を観測する変数を徐々に足していき、if文で分岐させてPWMのSTARTとSTOPを繰り返す方法を採用した。
青信号点灯→青信号点滅→赤信号点灯の流れを作るために、PWMを青信号用(PWM16_2)と赤信号用(PWM16_3)に分けた結果、信号点灯の流れを作ることができた。
さらに音楽演奏の実装するために、PWMを音楽演奏用に別に作成し(PWM16_1)、if文の青信号点灯時に障がい者用に音楽を演奏が可能になった。
そして、時間計測とともに信号機の流れ(青信号点灯→青信号点滅→赤信号点灯→青信号点灯→…)を作る関数を、時間計測用の変数TCの判定文を行うことで実装した。いくつも判定文が存在するのは演奏する曲の音階変更ごとに判定文が現れたり、青信号点滅時に点く、消す、を行うごとに判定文が現れたりするためである。関数の最後にTCを初期化する。
繰り返しはmain関数内のwhile文内で繰り返しこの関数を呼び出すことで可能とした。

DSC_0028.jpg
DSC_0029.jpg

使用器具

PSoC基盤×1個
MiniProg×1個
ジャンパー線×6本
スピーカー×1個
赤LED×1個
青LED×1個
抵抗器×2個(それぞれ330Ω)

ソースコード

#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#define LED 0b00000010
#define LED1 0b00000100
#pragma interrupt_handler myISR
int PW=125; //Pulse Width
int SILENT=0, D=229, L=204, M=182, F=172, S=153, R=136, Cb=129, C=121, DD=115, LL=102; //Scale
int TC=0; //Time Count

void myISR(void){
TC += 1; //TC = TC + 1
PWM16_1_WritePulseWidth(PW);
if(TC==1){
PWM16_2_Start();
PWM16_1_Start();
PWM16_1_WritePeriod(R);
}
else if(TC==8)
PWM16_1_WritePeriod(SILENT);
else if(TC==10)
PWM16_1_WritePeriod(R);
else if(TC==14)
PWM16_1_WritePeriod(S);
else if(TC==18)
PWM16_1_WritePeriod(R);
else if(TC==23)
PWM16_1_WritePeriod(SILENT);
else if(TC==24)
PWM16_1_WritePeriod(R);
else if(TC==26)
PWM16_1_WritePeriod(S);
else if(TC==28)
PWM16_1_WritePeriod(M);
else if(TC==36)
PWM16_1_WritePeriod(Cb);
else if(TC==41)
PWM16_1_WritePeriod(SILENT);
else if(TC==42)
PWM16_1_WritePeriod(Cb);
else if(TC==44)
PWM16_1_WritePeriod(SILENT);
else if(TC==45)
PWM16_1_WritePeriod(Cb);
else if(TC==47)
PWM16_1_WritePeriod(LL);
else if(TC==51)
PWM16_1_WritePeriod(Cb);
else if(TC==53)
PWM16_1_WritePeriod(R);
else if(TC==55)
PWM16_1_WritePeriod(Cb);
else if(TC==57)
PWM16_1_WritePeriod(R);
else if(TC==59)
PWM16_1_WritePeriod(S);
else if(TC==61)
PWM16_1_WritePeriod(SILENT);
else if(TC==62)
PWM16_1_WritePeriod(S);
else if(TC==64)
PWM16_1_WritePeriod(R);
else if(TC == 75){
PWM16_2_Stop();
PWM16_1_WritePeriod(M);
}
else if(TC == 80){
PWM16_2_Start();
PWM16_1_WritePeriod(D);
}
else if(TC == 85){
PWM16_2_Stop();
PWM16_1_WritePeriod(M);
}
else if(TC == 90){
PWM16_2_Start();
PWM16_1_WritePeriod(D);
}
else if(TC == 95){
PWM16_2_Stop();
PWM16_1_WritePeriod(M);
}
else if(TC == 100){
PWM16_2_Start();
PWM16_1_WritePeriod(D);
}
else if(TC == 105){
PWM16_2_Stop();
PWM16_1_Stop();
PWM16_3_Start();
}
else if(TC == 145){
TC=0;
PWM16_3_Stop();
}
}

void main(void)
{
  // M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts
   // Insert your main routine code here.
   M8C_EnableGInt;
  Timer16_1_EnableInt();
   Timer16_1_Start();
   while(1)
   {};
   }

考察

今回作成した信号機は本当ならば押しボタン式の信号機を作成したかったが、それは実力と時間不足で作成することができなかった
信号機を点滅させる方法も本当ならばPWMを使って蛍のように点滅させるなどのやり方でいきたかったのだが
やり方などがわからなかったのもあり青信号を点灯させる→消灯させるという動作を繰り返すという逃げの方法によって
青信号を点滅させることにした。
蛍のように点滅させるやりかたではlab2_pwm_lcdの方法を考えていた。

押しボタン式にする方法としては割り込みなどを使ってスイッチが押されると赤から青に切り替わるようにする。というものを考えていたが実装はかなわなかった。

  • 最終更新:2013-10-22 16:41:45

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

認証パスワード