チーム1729
課題名
ブルゾンちえみWithPSoC
研究者名
Kentaro Tanaka
Motoki Takematsu
概要
割り込み処理を使用して今話題のお笑い芸人ブルゾンちえみのネタをLCDで表示し、バックで流れているオースティン・マホーンの「Dirty Work」を共に再生します。
スピーカーを二つ使うことによって伴奏とリードメロディを同時に流しています。
使用機材
PSoC 1個
Mini Prog 1本
スピーカー2個
ジャンプ線4本
配線とソースコード
スピーカー2つをp00とGND,p01とGNDにそれぞれ繋ぐ
#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; // Pulse Width
int SILENT=0,Z=182, DS=193, F=172, FS=162, GS=145,AS=129,CS=108,B=121;
int Q=386, W=324, E=290,R=344,T=364,Y=243,D=408;
int TC=-30;
割込み処理ルーチンを表示
void myISR(void)
{
TC += 1; //TC = TC +1
PWM16_1_WritePulseWidth(PW);
PWM16_2_WritePulseWidth(PW);
if(TC==-29) PWM16_2_WritePeriod(B); else if(TC==-28) PWM16_2_WritePeriod(CS); else if(TC==-27) PWM16_2_WritePeriod(SILENT);
else if(TC==-26){
PWM16_1_WritePeriod(D);
PWM16_2_WritePeriod(B); }
else if(TC==-25)
PWM16_1_WritePeriod(W);
else if(TC==-23){
PWM16_1_WritePeriod(E);
PWM16_2_WritePeriod(GS); }
else if(TC==-22)
PWM16_1_WritePeriod(SILENT);
else if(TC==-20)
PWM16_1_WritePeriod(E);
else if(TC==-19)
PWM16_1_WritePeriod(SILENT);
else if(TC==-17){
PWM16_1_WritePeriod(E);
PWM16_2_WritePeriod(SILENT); }
else if(TC==-16)
PWM16_1_WritePeriod(SILENT);
else if(TC==-15) PWM16_2_WritePeriod(DS); else if(TC==-13) PWM16_2_WritePeriod(FS);
else if(TC==-11){
PWM16_1_WritePeriod(E);
PWM16_2_WritePeriod(GS); }
else if(TC==-10)
PWM16_1_WritePeriod(SILENT);
if(TC==-9){
PWM16_1_WritePeriod(E);
PWM16_2_WritePeriod(B); }
else if(TC==-7)
PWM16_1_WritePeriod(Y);
else if(TC==-6)
PWM16_1_WritePeriod(SILENT);
else if(TC==-4)
PWM16_1_WritePeriod(Y);
else if(TC==-3)
PWM16_1_WritePeriod(SILENT);
else if(TC==-1){
PWM16_1_WritePeriod(Y);
PWM16_2_WritePeriod(SILENT); }
else if(TC==0)
PWM16_1_WritePeriod(SILENT);
if(TC==1)
PWM16_1_WritePeriod(DS);
else if(TC==2)
PWM16_1_WritePeriod(SILENT);
if(TC==3)
PWM16_1_WritePeriod(DS);
else if(TC==4)
PWM16_1_WritePeriod(SILENT);
if(TC==5)
PWM16_1_WritePeriod(DS);
else if(TC==6)
PWM16_1_WritePeriod(SILENT);
else if(TC==7){
PWM16_1_WritePeriod(GS);
PWM16_2_WritePeriod(E); }
else if(TC==8)
PWM16_1_WritePeriod(SILENT);
else if(TC==9)
PWM16_1_WritePeriod(GS);
else if(TC==10)
PWM16_1_WritePeriod(SILENT);
else if(TC==11)
PWM16_1_WritePeriod(GS);
else if(TC==12)
PWM16_1_WritePeriod(SILENT);
else if(TC==13)
PWM16_1_WritePeriod(GS);
else if(TC==14)
PWM16_1_WritePeriod(SILENT);
else if(TC==15){
PWM16_1_WritePeriod(FS);
PWM16_2_WritePeriod(W); }
else if(TC==16)
PWM16_1_WritePeriod(SILENT);
else if(TC==17)
PWM16_1_WritePeriod(FS);
else if(TC==18)
PWM16_1_WritePeriod(SILENT);
else if(TC==19)
PWM16_1_WritePeriod(FS);
else if(TC==20)
PWM16_1_WritePeriod(SILENT);
else if(TC==21)
PWM16_1_WritePeriod(FS);
else if(TC==22)
PWM16_1_WritePeriod(SILENT);
else if(TC==23){
PWM16_1_WritePeriod(F);
PWM16_2_WritePeriod(R); }
else if(TC==24)
PWM16_1_WritePeriod(SILENT);
else if(TC==25)
PWM16_1_WritePeriod(F);
else if(TC==26)
PWM16_1_WritePeriod(SILENT);
else if(TC==27)
PWM16_1_WritePeriod(F);
else if(TC==28)
PWM16_1_WritePeriod(SILENT);
else if(TC==29)
PWM16_1_WritePeriod(F);
else if(TC==30)
PWM16_1_WritePeriod(SILENT);
else if(TC==31){
PWM16_1_WritePeriod(Z);
PWM16_2_WritePeriod(T); }
else if(TC==33){
PWM16_1_WritePeriod(SILENT);
PWM16_2_WritePeriod(SILENT);
}
if(TC==39){
PWM16_1_WritePeriod(W);
PWM16_2_WritePeriod(W);
}
else if(TC==41){
PWM16_1_WritePeriod(E);
PWM16_2_WritePeriod(E);
}
else if(TC==42){
PWM16_1_WritePeriod(SILENT);
PWM16_2_WritePeriod(SILENT);
}
else if(TC==44){
PWM16_1_WritePeriod(E);
PWM16_2_WritePeriod(E);
}
else if(TC==45){
PWM16_1_WritePeriod(SILENT);
PWM16_2_WritePeriod(SILENT);
}
else if(TC==47){
PWM16_1_WritePeriod(E);
PWM16_2_WritePeriod(E);
}
else if(TC==48){
PWM16_1_WritePeriod(SILENT);
PWM16_2_WritePeriod(SILENT);
}
else if(TC==54){
PWM16_1_WritePeriod(Q);
PWM16_2_WritePeriod(Q);
}
else if(TC==55){
PWM16_1_WritePeriod(E);
PWM16_2_WritePeriod(E);
}
else if(TC==58){
PWM16_1_WritePeriod(SILENT);
PWM16_2_WritePeriod(SILENT);
}
else if(TC==60){
PWM16_1_WritePeriod(E);
PWM16_2_WritePeriod(E);
}
else if(TC==61){
PWM16_1_WritePeriod(SILENT);
PWM16_2_WritePeriod(SILENT);
}
else if(TC==63){
PWM16_1_WritePeriod(E);
PWM16_2_WritePeriod(E);
}
else if(TC==64){
PWM16_1_WritePeriod(SILENT);
PWM16_2_WritePeriod(SILENT);
}
if(TC==71){
PWM16_1_WritePeriod(W);
PWM16_2_WritePeriod(W);
}
else if(TC==73){
PWM16_1_WritePeriod(E);
PWM16_2_WritePeriod(E);
}
else if(TC==74){
PWM16_1_WritePeriod(SILENT);
PWM16_2_WritePeriod(SILENT);
}
else if(TC==76){
PWM16_1_WritePeriod(E);
PWM16_2_WritePeriod(E);
}
else if(TC==77){
PWM16_1_WritePeriod(SILENT);
PWM16_2_WritePeriod(SILENT);
}
else if(TC==79){
PWM16_1_WritePeriod(E);
PWM16_2_WritePeriod(E);
}
else if(TC==80){
PWM16_1_WritePeriod(SILENT);
PWM16_2_WritePeriod(SILENT);
}
else if(TC==86){
PWM16_1_WritePeriod(Q);
PWM16_2_WritePeriod(Q);
}//4
else if(TC==87){
PWM16_1_WritePeriod(E);
PWM16_2_WritePeriod(E);
}
else if(TC==90){
PWM16_1_WritePeriod(SILENT);
PWM16_2_WritePeriod(SILENT);
}
else if(TC==92){
PWM16_1_WritePeriod(E);
PWM16_2_WritePeriod(E);
}
else if(TC==93){
PWM16_1_WritePeriod(SILENT);
PWM16_2_WritePeriod(SILENT);
}
else if(TC==95){
PWM16_1_WritePeriod(E);
PWM16_2_WritePeriod(E);
}
else if(TC==96){
PWM16_1_WritePeriod(SILENT);
PWM16_2_WritePeriod(SILENT);
}
if(TC == -22){
LCD_1_Start();
LCD_1_Position(0,0); LCD_1_PrCString(".");
}
else if(TC == -21){
LCD_1_Position(0,0); LCD_1_PrCString("...");
}
else if(TC == -20){
LCD_1_Position(0,0); LCD_1_PrCString("...Da");
}
else if(TC == -19){
LCD_1_Position(0,0); LCD_1_PrCString("...Datte,");
}
else if(TC == -17){
LCD_1_Position(1,4); LCD_1_PrCString("chikyu");
}
else if(TC == -16){
LCD_1_Position(1,4); LCD_1_PrCString("chikyu jo");
}
else if(TC == -15){
LCD_1_Position(1,4); LCD_1_PrCString("chikyu jo ni");
}
else if(TC == -13){
LCD_1_Init();
LCD_1_Position(0,0); LCD_1_PrCString("o");
}
else if(TC == -12){
LCD_1_Position(0,0); LCD_1_PrCString("oto");
}
else if(TC == -11){
LCD_1_Position(0,0); LCD_1_PrCString("otoko");
}
else if(TC == -10){
LCD_1_Position(0,0); LCD_1_PrCString("otoko ha");
}
else if(TC == -9){
LCD_1_Position(1,0); LCD_1_PrCString("nan");
}
else if(TC == -8){
LCD_1_Position(1,0); LCD_1_PrCString("nannin");
}
else if(TC == -7){
LCD_1_Position(1,0); LCD_1_PrCString("nannin i");
}
else if(TC == -6){
LCD_1_Position(1,0); LCD_1_PrCString("nannin iru");
}
else if(TC == -5){
LCD_1_Position(1,0); LCD_1_PrCString("nannin iruto");
}
else if(TC == -3){
LCD_1_Init();
LCD_1_Position(0,0); LCD_1_PrCString("omo");
}
else if(TC == -2){
LCD_1_Position(0,0); LCD_1_PrCString("omotte");
}
else if(TC == -1){
LCD_1_Position(0,0); LCD_1_PrCString("omotteruno?");
}
else if(TC == 9){
LCD_1_Init();
LCD_1_Position(0,0); LCD_1_PrCString(".");
}
else if(TC == 17){
LCD_1_Init();
LCD_1_Position(0,0); LCD_1_PrCString("..");
}
else if(TC ==25){
LCD_1_Position(0,0);
LCD_1_PrCString("... ");
}
else if(TC ==31){
LCD_1_Position(0,0);
LCD_1_PrCString("...3");
}
else if(TC ==32){
LCD_1_Position(0,0);
LCD_1_PrCString("...3 jyu");
}
else if(TC == 33){
LCD_1_Position(1,7); LCD_1_PrCString("5 ");
}
else if(TC == 34){
LCD_1_Position(1,7); LCD_1_PrCString("5 o");
}
else if(TC == 35){
LCD_1_Position(1,7); LCD_1_PrCString("5 o ku");
}
else if(TC == 41){
LCD_1_Init();
LCD_1_Position(0,0); LCD_1_PrCString(".");
}
else if(TC == 51){
LCD_1_Init();
LCD_1_Position(0,0); LCD_1_PrCString("..");
}
else if(TC ==61){
LCD_1_Position(0,0); LCD_1_PrCString("...");
}
else if(TC ==64){
LCD_1_Position(0,0); LCD_1_PrCString("...a");
}
else if(TC==65){
LCD_1_Position(0,0); LCD_1_PrCString("...a to");
}
else if(TC == 66){
LCD_1_Position(1,3); LCD_1_PrCString("5");
}
else if(TC == 67){
LCD_1_Position(1,3); LCD_1_PrCString("5 sen");
}
else if(TC == 68){
LCD_1_Position(1,3); LCD_1_PrCString("5 sen man");
}
else if(TC == 69){
LCD_1_Position(1,3); LCD_1_PrCString("5 sen man nin");
}
}
main関数を表示
void main(void)
{
// M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts // Insert your main routine code here.
M8C_EnableGInt;
PWM16_1_Start();
PWM16_2_Start();
Timer16_1_EnableInt();
Timer16_1_Start();
while(1)
{ };
}
考察
私たちが参考にした資料は
演習資料に関してはhello world,timer_pwm2
発表課題はチーム1347のモノを参考にしました
工夫した点としては
LCDの表示を少しずつ出すことで喋っているのを聞くのと同じスピード感を目で感じられるようにしました。
LCDとPWMで出力するif文を分けることでセリフの出るタイミングを本物のネタに近づける調整をしやすくしました。
音楽については、youtubeから楽譜を引用し、タイマー割り込みを使用してよりオリジナルに近づけよう努力しました。Period値が9999の状態のままだとテンポが遅かったため、Period値を8500にすることでちょうど良いテンポになりました。TCで音を制御すると、連続する音が一つの長い音になってしまうため、休符(SILENT)を挟むことによって連続する音を実現しました。元々はネタのfullの楽曲を作成しようと予定していましたが、かかる時間と膨大な労力を考慮して一番実現したい部分だけに絞りました。
改善点としては
LCD以外のツールで出力してセリフを日本語表記にすること
スピーカーをより増やすことによって厚みのある楽曲にすること
などがあげられます。
- 最終更新:2017-06-13 17:42:49