2012年12月26日 星期三

Week15,HW12

期末作品進度

作品名稱: 划船遊戲


1、遊戲規則初步想法

利用兩個按鍵不斷輪替按著,讓船有加速度不斷前進,
接著計算其到達終點的時間,讓玩家挑戰最佳時間最短的紀錄。



2、確認作品操控以及進行的方向

我們的想法是由google和逆向思考的小遊戲所結合的,
這周我們討論遊戲的前進控制和玩法,
我們打算利用兩個按鈕控制他的前進方向,
小葉老師有建議我們利用旋鈕來做類似雙渦輪的設定,
但是後來發現,我們利用按鈕簡單的控制物體前進的加速度,
在配合他轉彎X值做加減以及背景地圖的不斷延伸,
就可以讓他有往左前和右前的方向以及速度控制。


3、素材貼圖





























4、心得

在規劃這作品前,我們最擔心的是按鈕的配合,
也就是arduino和processing的連接,因為沒有試過的經驗,
在小葉老師上課的範例中,我們有嘗試著做修改,
arduino是不是可以傳兩個不一樣的值,然後processing可以分別,
但是我們試了很久,還是搞不懂為甚麼他只給我們讀到一個按鈕的訊號,
這是我們這一周所遇到的問題,我們雖然只需要兩個按鍵,
但是這個問題會是我們期末作品最大的一個瓶頸,
所以我想可以馬上解決問題,往完整的作品邁向一大步。















2012年12月25日 星期二

期末

PImage img;
int rx=28,ry=5;
boolean move = true;
void setup() {
  size(400, 400);
  img = loadImage("path.jpg");
}
void draw() {
  image(img, 0, 0);
  loadPixels();
 
  fill(225, 0, 0);//點點
  ellipse(rx, ry, 10, 10);
 
  if (move==true) {
    if(key==97) rx=rx-1;
    if(key==119) ry=ry-1;
    if(key==100) rx=rx+1;
    if(key==115) ry=ry+1;
  }
  color now_color = pixels[ry*400+rx];
 
  if (rx>398){
    rx=398;
    fill(0, 0, 0);
    rect(0, 0, 400, 400);
    textSize(50);
    fill(255, 255, 0);
    text("Congratulation", 25, 220);
  }
 
  if (red(now_color)<100){
    move = false;
    fill(0, 0, 0);
    rect(0, 0, 400, 400);
    textSize(50);
    fill(255, 255, 0);
    text("GAME OVER", 60, 220);
  }
 
  else move = true; 

}

Week15, HW12,

本周進度為成功時做了兩個按鈕,分別控制讓小人不掉落和重新開始遊戲的部分

本周電路板圖片



以下為本周程式碼

processing

import processing.serial.*;
Serial myPort;
int now;
int now2;
int testState=0;
//int testState2=0;
int cfg_width =450;
int cfg_height = 450;
int cfg_maxchange = 5;
float cfg_space_mod = 0.9994;
int cfg_playersize = 5;
float cfg_gravity = 1.0002;
PImage body;
float dir = 1;  // current direction of the player (gravity vs pushing)
long score = 0; //分數
long maxscore = 0; //最高分紀錄
int push = 0; //按空白鍵增加
int mode = 1; // 遊戲狀態, 1=running, 0=lost, -1=lost and score printed
float cur_space = 450;  // space to play
float factor = 0.5;     // how far the cave can move max in the y axis for one x step
// the cave borders
int[] ylinetop = new int[cfg_width];
int[] ylinebottom = new int[cfg_width];
// the player (snake)遊戲的線
float[] yplayer = new float[cfg_width/2];
PFont myFont;
import ddf.minim.*;
Minim minim;
AudioPlayer player;

void initcave() {

  score = 0;
  dir = 1;
  push = 0;
  cur_space = 400;
  body=loadImage("bodyknife.png");

  for (int i = 0; i < width; i++) {
    ylinetop[i] = height/2-int(cur_space)/2;
    ylinebottom[i] = ylinetop[i]+int(cur_space);
  }

  for (int i = 0; i < width/2; i++) {
    yplayer[i] = height/2;
  }
}

void drawframe () {
  drawframe2 ();//我寫的背景變色程式
  // draw cave
  stroke(255, 0, 0);
  for (int i=1; i<width; i++) {  
    line(i, 0, i, ylinetop[i]);
    line(i, ylinebottom[i], i, height);
  }

  if (mode < 1) {
    stroke(0, 255, 0);
    strokeWeight(5);
    fill(100, 255, 0);
    ellipse(width/2, yplayer[width/2 - 1], 150, 150);
  }
  people();
}
//背景變色程式在這邊~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void drawframe2 () {
  if (score/10<10) {//因為他計分我發現他是score有除以10 所以這邊也要把分數除10才會跟顯示的計分看起來一樣
    background(0, 0, 0);//小於10分
  }
  else if (score/10<=50) {
    background(0, 0, 255);//大於10分小於等於50分
  }
  else  if (score/10<100) {
    background(255, 255, 255);//大於等於50分小於100分
  }
  else  if (score/10>=100) {
    background(255, 255, 255);//大於等於100分
  } 
  //要把所有數值的情況考慮進去,不然畫面會閃一下。例如原本是小於100 和大於100 沒有寫道等於100的情況 那100分的時候遊戲畫面會閃一下
}
void people() {//小人改變大小
  for (int i=1; i<width/2; i++) {  
    if (score/10<50) {
      image(body, i, int(yplayer[i]), 80, 80);
    }
    else if (score/10<=100) {//大於50分 小於等於100分
      image(body, i, int(yplayer[i]), 60, 60);
    }
    else  if (score/10<150) {
      image(body, i, int(yplayer[i]), 30, 30);//大於100分小於150分
    }
    else  if (score/10>=150) {
      image(body, i, int(yplayer[i]), 30, 30);//大於等於150分
    }
  }
}

void setup()
{


  size(cfg_width, cfg_height);
  myPort= new Serial(this, "COM3", 9600);

  initcave();
  frameRate(100);
  minim = new Minim(this); //播音樂
  player = minim.loadFile("Kalimba.mp3");  //播音樂
   player.play();  //播音樂
    myFont = loadFont("SansSerif-12.vlw");
   textFont(myFont);
}

void drawscore()
{
  stroke(0);
  strokeWeight(3);
  fill(0);
  text("最高分紀錄: " + int(maxscore/10) + "  分數: " + int(score/10), 1, 12);//計分都有除10在這
  if (mode == -1) {
    text("Game Over!再玩一次.", 2, 26);
  }
}
void draw()
{

  while (myPort.available ()>0) {
    testState = myPort.read();
    println(testState);
    if (testState==49)
    {
      now = 1;
    }
    if (now==1)
      dir *= 0.997;
    if (testState=='a')
    {
      mode = 1;
      initcave();

    }

  if (mode == 1) {

    for (int i = 1; i < width; i++) {
      ylinetop[i-1] = ylinetop[i];
      ylinebottom[i-1] = ylinebottom[i];
    }
 
    for (int i = 1; i < width/2; i++) {
      yplayer[i-1] = yplayer[i];
    }
 
    ylinetop[width-1] =
      constrain( int( random(-cfg_maxchange, cfg_maxchange) + factor)
      + ylinetop[width-1]
      , 0, height-int(cur_space+1));
    ylinebottom[width-1] = ylinetop[width-1] + int(cur_space);

 
    dir = pow(cfg_gravity, dir) * dir;
 
    yplayer[width/2-1] = constrain(yplayer[width/2- 2] * dir, 1, height-2);


    if (yplayer[width/2-1] < ylinetop[width/2] ||
      yplayer[width/2-1] > ylinebottom[width/2]) {
      mode = 0;
    }
 
    cur_space *= cfg_space_mod;

    score += 1;

    if (ylinetop[width-1] < 2 || ylinebottom[width-1] > height-2) {
      factor *= -1;
    }
  }
  else {  // collision detected
    if (mode == 0) {
      // save new max score
      maxscore = maxscore > score ? maxscore : score;
      mode = -1;
    }
  }
  drawframe();
  drawscore();
}

void keyPressed() {

  if (mode == 1 && key == '2') {
    dir *= 0.997;
  }

  if (mode == -1 && (key == '0' )) { //按0重新開始
    mode = 1;
    initcave();
  }
}

ardino

/*
  DigitalReadSerial
 Reads a digital input on pin 2, prints the result to the serial monitor

 This example code is in the public domain.
 */
// digital pin 2 has a pushbutton attached to it. Give it a name:
int pushButton = 2;
int pushButton2 = 3;
// the setup routine runs once when you press reset:
void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
  // make the pushbutton's pin an input:
  pinMode(pushButton, INPUT);
  pinMode(pushButton2, INPUT);
}
int a=0;
int a2=0;
// the loop routine runs over and over again forever:
void loop() {
  // read the input pin:
  int buttonState = digitalRead(pushButton);
  int buttonState2 = digitalRead(pushButton2);
  // print out the state of the button:
  if (buttonState == HIGH && a==0 ) {  // If switch is ON,
      Serial.print(1);
      a=1;      // send 1 to Processing
  }
  if (buttonState == LOW && a==1) {                               // If the switch is not ON,
    Serial.println(0); 
      a=0;    // send 0 to Processing
  }
  if (buttonState2 == HIGH && a2==0 ) {  // If switch is ON,
    Serial.print('a');
    a2=1;      // send 1 to Processing
  }
  if (buttonState2 == LOW && a2==1) {                               // If the switch is not ON,
    Serial.println('b'); 
     a2=0;    // send 0 to Processing
  }
 // Serial.println(buttonState);
  delay(10);        // delay in between reads for stability
}


以下為我們的電路板




final


1.processing

import processing.serial.*;
Serial myPort;
int val;
void setup() {
  size(400, 200);
  background(255);
  noStroke();
 // frameRate(30);
  fill(102);
 myPort = new Serial(this, "COM4", 9600);
}
int d=0,r=0,m=0,f=0,s=0;
void draw() {
  if(myPort.available()>0){
    val = myPort.read();//第三個重點:如果讀到數字就拿出來用
    //rect(20, 20, 72, 160);
  }
 
  fill(255, 255, 255);
  stroke(0, 0, 0);
  strokeWeight(2);
  if(val=='G'){
   d=1;
  }
  else if(val=='B'){
   d=0;
  }
  if(val=='F'){
   r=1;
  }
  else if(val=='V'){
   r=0;
  }
  if(val=='D'){
   m=1;
  }
  else if(val=='C'){
   m=0;
  }
  if(val=='S'){
   f=1;
  }
  else if(val=='X'){
   f=0;
  }
  if(val=='A'){
   s=1;
  }
  else if(val=='Z'){
   s=0;
  }
  if(val=='H'){
    d=0;
    r=0;
    m=0;
    f=0;
    s=0;
  }
 
 //println(doo);
  if(s==1){
    fill(255,0,0);
   rect(20, 20, 72, 160);
  }
  else if(s==0){
    fill(255);
   rect(20, 20, 72, 160);
  }
 
   if(f==1){
    fill(255,0,0);
    rect(92, 20, 72, 160);
  }
  else if(f==0){
    fill(255);
   rect(92, 20, 72, 160);
  }
   if(m==1){
    fill(255,0,0);
     rect(164, 20, 72, 160);
  }
  else if(m==0){
    fill(255);
     rect(164, 20, 72, 160);
  }
   if(r==1){
    fill(255,0,0);
    rect(236, 20, 72, 160);
  }
  else if(r==0){
    fill(255);
    rect(236, 20, 72, 160);
  }
   if(d==1){
    fill(255,0,0);
    rect(308, 20, 72, 160);
  }
  else if(d==0){
    fill(255);
    rect(308, 20, 72, 160);
  }
  fill(0);
  rect(74, 20, 36, 80);
  rect(146, 20, 36, 80);
  rect(290, 20, 36, 80);
  rect(362, 20, 18, 80);
}

2.arduinno

int buttonPin = 2;
int buttonPin3 = 3;
int buttonPin4 = 4;
int buttonPin5 = 5;
int buttonPin6 = 6;
int buttonState = 0; 
int buttonState3 = 0; 
int buttonState4 = 0; 
int buttonState5 = 0; 
int buttonState6 = 0; 
void setup() {

  pinMode(buttonPin, INPUT);    
  pinMode(buttonPin3, INPUT);    
  pinMode(buttonPin4, INPUT);    
  pinMode(buttonPin5, INPUT);    
  pinMode(buttonPin6, INPUT);    
    Serial.begin(9600);

}
void loop() {
  buttonState = digitalRead(buttonPin);
  buttonState3 = digitalRead(buttonPin3);
  buttonState4 = digitalRead(buttonPin4);
  buttonState5 = digitalRead(buttonPin5);
  buttonState6 = digitalRead(buttonPin6);
 
  if (buttonState == HIGH) {    
   tone(8, 131, 300);
   Serial.write('A');
  } 
  else if (buttonState == LOW) {
   Serial.write('Z');
  }
 
  if (buttonState3== HIGH) {    
   tone(8, 147 , 300);
   Serial.print('S');
  }
  else if (buttonState3 == LOW) {
   Serial.write('X');
  }
  if (buttonState4 == HIGH) {    
   tone(8, 165 , 300);
   Serial.print('D');
  }
   else if (buttonState4 == LOW) {
   Serial.write('C');
  }
  if (buttonState5 == HIGH) {    
   tone(8, 175 , 300);
   Serial.print('F');
  }
   else if (buttonState5 == LOW) {
   Serial.write('V');
  }
  if (buttonState6 == HIGH) {    
   tone(8, 196, 300);
   Serial.print('G');
  }
   else if (buttonState6 == LOW) {
   Serial.write('B');
  }
 else {
   Serial.print('H');
  }
   delay(100);
}

3.展示歌曲 火車快飛

5531 5531 2344 3455

5353 231

4222 3111

2342111

week15,hw12

1.void setup() {
  size(400, 200);
  background(255);
  noStroke();
  fill(102);
}
void draw() {
  fill(255, 255, 255);
  stroke(0, 0, 0);
  strokeWeight(2);
  rect(20, 20, 72, 160);
  rect(92, 20, 72, 160);
  rect(164, 20, 72, 160);
  rect(236, 20, 72, 160);
  rect(308, 20, 72, 160);
  fill(0);
  rect(74, 20, 36, 80);
  rect(146, 20, 36, 80);
  rect(290, 20, 36, 80);
  rect(362, 20, 18, 80);
 
}



畫出一個鋼琴鍵盤,之後再跟arduino結合,按出一個音,鋼琴鍵盤就會變紅色。

Week15,HW11

我們這組目前期末作業的計劃是要延續期中作品:大方快吃小方塊,期末再加上Arduino來連接四顆按鈕,上下左右來控制紅色方塊。

              
    現在我們的進度是在思考和修正如何將其中程式碼的滑鼠事件,轉換成按鈕來控制,也因為之前的程式碼只輸入了方塊只要跟著滑鼠移動而已,所以簡單許多,而這次要在加上四顆按鈕對我們來說也相對較困難,再加上要將之前遊戲執行後的問題想要一併解決,也就是有時候會一開啟就碰到大方塊就馬上遊戲結束的問題,因此也讓期末作業困難度又增加了。

week15,hw12

我們是打算使用之前其中的程式,作出類似實體的jubeat的遊戲,可選歌並將透明鍵盤放螢幕上在進行遊戲。

Week15,HW12

期末構想:角子老虎機
 目前進度:
所需素材、登入畫面和遊戲畫面


       















登入畫面



















遊戲畫面







素材

2012年12月19日 星期三

Week15, HW12,




  本周專心於探討將期中的processing作品如何和arduino做結合的部分,我們的期中作品是利用空白鍵控制挖洞穴的小人不一直掉下來得以前進,將原本利用空白鍵來控制的部分改用數字鍵2,希望可將此訊息傳到arduino中,將我們製做好的按鈕可以取代鍵盤來實作。

  日後更希望可以將重新開始遊戲的按鍵也能夠讓我們做的第二顆按鈕取代,而其中困難的部分將是思考如何將processing所傳送的按鍵訊息讓arduino收到並得以實踐。


程式碼



import processing.serial.*;
Serial myPort;

int testState=0;

int cfg_width =450;
int cfg_height = 450;
int cfg_maxchange = 5;
float cfg_space_mod = 0.9994;
int cfg_playersize = 5;
float cfg_gravity = 1.0002;
PImage body;

float dir = 1;
long score = 0; //分數
long maxscore = 0; //最高分紀錄
int push = 0; //按空白鍵增加
int mode = 1;
float cur_space = 450;
float factor = 0.5;  

// the cave borders
int[] ylinetop = new int[cfg_width];
int[] ylinebottom = new int[cfg_width];

// the player (snake)遊戲的線
float[] yplayer = new float[cfg_width/2];

PFont myFont;

import ddf.minim.*;
Minim minim;
AudioPlayer player;


void initcave() {
 
  // game variables
  score = 0;
  dir = 1;
  push = 0;
  cur_space = 400;
 
  body=loadImage("bodyknife.png");
 
 

  for(int i = 0; i < width; i++) {
    ylinetop[i] = height/2-int(cur_space)/2;
    ylinebottom[i] = ylinetop[i]+int(cur_space);
  }

  for(int i = 0; i < width/2; i++) {
    yplayer[i] = height/2;
  }
}


void drawframe () {

    drawframe2 ();//我寫的背景變色程式

   stroke(255,0,0);
 
  for(int i=1; i<width; i++) {  
    line(i, 0, i, ylinetop[i]);
    line(i, ylinebottom[i], i, height);

  }

  if (mode < 1) {
    stroke(0,255,0);
    strokeWeight(5);
    fill(100,255,0);
    ellipse(width/2, yplayer[width/2 - 1], 150, 150);
  }
     people();
}
//背景變色程式在這邊~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  void drawframe2 () {
  if (score/10<10){//因為他計分我發現他是score有除以10 所以這邊也要把分數除10才會跟顯示的計分看起來一樣
  background(0,0,0);//小於10分
  }
  else if (score/10<=50) {
    background(0,0,255);//大於10分小於等於50分

  }
  else  if (score/10<100){
  background(255,255,255);//大於等於50分小於100分
  }
   else  if (score/10>=100){
  background(255,255,255);//大於等於100分
  }
 //要把所有數值的情況考慮進去,不然畫面會閃一下。例如原本是小於100 和大於100 沒有寫道等於100的情況 那100分的時候遊戲畫面會閃一下
}

void people(){//小人改變大小
  for(int i=1; i<width/2; i++) {  
  if (score/10<50){
     image(body,i, int(yplayer[i]),80,80);
  }
  else if (score/10<=100) {//大於50分 小於等於100分
     image(body,i, int(yplayer[i]),60,60);

  }
  else  if (score/10<150){
     image(body,i, int(yplayer[i]),30,30);//大於100分小於150分
  }
  else  if (score/10>=150){
     image(body,i, int(yplayer[i]),30,30);//大於等於150分
  }

  }

}


void setup()
{
 
 
  size(cfg_width, cfg_height);
  myPort= new Serial(this,"COM3",9600);
  initcave();
  frameRate(100);
 
  minim = new Minim(this); //播音樂
  player = minim.loadFile("Kalimba.mp3");  //播音樂
 // player.play();  //播音樂
//  myFont = loadFont("SansSerif-12.vlw");
 // textFont(myFont);
}



void drawscore()
{
  stroke(0);
  strokeWeight(3);
  fill(0);
  text("最高分紀錄: " + int(maxscore/10) + "  分數: " + int(score/10), 1, 12);//計分都有除10在這~~~~~~~~~~~~~~~~~~~
 
  // when lost tell the player how to restart
  if (mode == -1) {
    text("Game Over!再玩一次.", 2, 26);
  }
}

void draw()
{
  println(testState);
   while(myPort.available()>0){
    testState = myPort.read();
    print(testState);
  }

 if (mode == 1) {

  for(int i = 1; i < width; i++) {
    ylinetop[i-1] = ylinetop[i];
    ylinebottom[i-1] = ylinebottom[i];
  }
 

  for(int i = 1; i < width/2; i++) {
    yplayer[i-1] = yplayer[i];
  }
 

  ylinetop[width-1] =
    constrain( int( random(-cfg_maxchange, cfg_maxchange) + factor)
                 + ylinetop[width-1]
              , 0, height-int(cur_space+1));
             
  ylinebottom[width-1] = ylinetop[width-1] + int(cur_space);
 
 

  dir = pow(cfg_gravity, dir) * dir;
 

  yplayer[width/2-1] = constrain(yplayer[width/2- 2] * dir, 1, height-2);
 
 

  if (yplayer[width/2-1] < ylinetop[width/2] ||
      yplayer[width/2-1] > ylinebottom[width/2]) {
    mode = 0;
  }

  cur_space *= cfg_space_mod;

  score += 1;

  if (ylinetop[width-1] < 2 || ylinebottom[width-1] > height-2) {
    factor *= -1;
  }
   
 } else {  // collision detected
   if (mode == 0) {
     // save new max score
     maxscore = maxscore > score ? maxscore : score;
   
     mode = -1;
   }
 }
 
 drawframe();
 drawscore();
 
}


void keyPressed() {
 

  if (mode == 1 && key == '1') {
    dir *= 0.997;
  }


  if (mode == -1 && (keyCode == ENTER || keyCode == RETURN)) {
    mode = 1;
    initcave();
  }
 
}

2012年12月18日 星期二

00葉正聖老師, Week15, HW12

1. 繳交校外教學心得報告 1頁半 Word檔
(沒有去的同學,就自行寫份實作期末作品的報告)
2. 今天專注在期末作品的實作
Week 15
Week 16
//Week 17
Week 19 (期中考後星期一下午繳交)
3. 今天要教 Arduino Button 對映 Processing 中,做對映的畫面
4. 老師挑選幾個作品進行實作示範
4.1. Processing 做

Week15,Hw12

1.1 如何將 ArduinoInput 與 期末作品做結合

想法:
 1.將期中作品的鍵盤按鍵,改制成使用Button輸入。或是稍微做一些改變,將遊戲玩法改成類似於吉他,必須事先按下對應的區域,然後使用紅外線感測當作琴弦。

 2.製作跳舞機,但不是使用雙腳,而是使用數個紅外線感測器,然後螢幕上游標到對應區域時,利用雙手伸到對應位置。

 3.將數個感應器,包括水銀、按鈕以及紅外線感測,製作二個手套,利用雙手不同的位置以及特定姿勢,製作一個許多小遊戲的組合。

 4.將Arduino與process以及opencv做結合,搭配opencv人臉偵測以及像素處裡,配合水銀感測製作比較精準的互動視訊。能夠將不同的帽子(眼鏡)結合到當下視訊,利用手部控制。

進度:
 今天練習時,欲先熟練Arduino Input,故選擇其中作業來做一些修正,將其按鈕改為使用Button輸入。目前已經完成,只是感覺太過簡單、敷衍,故址當作練習。

心得:
 Java本身其實是支援許多openSource的函式庫,而Processing又是基於java所產生的語言,在使用的時候其實有很大的自由度,但需要的是足夠的創意,否則又只是一個敷衍了事的產物。而使用opencv的想法,是覺得如果能夠有視訊,並與視訊互動,再搭配Arduino的按鈕。從頭到尾完全不需要鍵盤、滑鼠,只需要看著螢幕,做一些動作就能產生對應的效果及反應。這感覺不是很酷嗎?
 一直覺得在現在的科技上、產品上,最主要的都是在講求與人的互動性,所以我希望在這一次的期末作品中,不論各個部分所應用的多少,或是硬體用的多好,我是希望能夠有很好的、足夠的互動性。

Week15, HW12



我們要做一個迷宮,用Aduino的四個按鍵作前後左右的控制

Week 15, HW12


一、期末作品主題

期中時是做射擊酒瓶的遊戲,用滑鼠點擊移動中的酒瓶,並在限定的時間裡看可以得到多少分數。期末也打算做射擊方面的遊戲,但是會全部從新開始,我們想要做直升機的攔截遊戲,搭配arduino 的按鍵做出射擊的動作。

 

二、期末作品描述

直升機攔截遊戲,場景是銘傳大學,會讓直升機去攔截飛彈,畫面中會有從不同地方出現的飛彈,想轟炸我們美麗的校園。主要要搭配Arduino 的上、下、左、右 跟射擊鍵,操控直升機射擊出飛彈,來抵消從上方出現的飛彈,成功防禦我們的校園。當然期中時有做的功能,倒數計時、記分都會繼續保留,我們打算另外加上,如果沒有抵擋成功,使校園被炸到的話,會有失敗的畫面產生。

 

三、作品所需素材

畫面素材:

開始畫面












移動直升機













轟炸用飛彈






四、心得
後來跟老師討論過後,如果只做上下左右的按鈕再加一顆射擊鍵,這樣不如直接用鍵盤完還來的方便快速,因此後來稍稍的做了修改,可能會加入搖桿的功能,或是上下的功能改成用腳踏! 仿照值生機的內部操作。



hw11,week13

1.

2.小蜜蜂
   533
   422
   1234555
   533
   422
   13551

3.int buttonPin = 2;
int buttonPin3 = 3;
int buttonPin4 = 4;
int buttonPin5 = 5;
int buttonPin6 = 6;
int buttonState = 0; 
int buttonState3 = 0; 
int buttonState4 = 0; 
int buttonState5 = 0; 
int buttonState6 = 0; 
void setup() {
  pinMode(buttonPin, INPUT);    
  pinMode(buttonPin3, INPUT);    
  pinMode(buttonPin4, INPUT);    
  pinMode(buttonPin5, INPUT);    
  pinMode(buttonPin6, INPUT);    
}
void loop() {
  buttonState = digitalRead(buttonPin);
  buttonState3 = digitalRead(buttonPin3);
  buttonState4 = digitalRead(buttonPin4);
  buttonState5 = digitalRead(buttonPin5);
  buttonState6 = digitalRead(buttonPin6);
 
  if (buttonState == HIGH) {    
   tone(8, 131, 10);
  }

  if (buttonState3== HIGH) {    
   tone(8, 147 , 10);
  }

  if (buttonState4 == HIGH) {    
   tone(8, 165 , 10);
  
  }

  if (buttonState5 == HIGH) {    
   tone(8, 175 , 10);
  }

  if (buttonState6 == HIGH) {    
   tone(8, 196, 10);
  }
}

Wee13,HW11

01.將Arduino做出的鋼琴錄影上傳到youtube,再貼回部落格


02.發揮你的創意做出最特別的音樂

~~音樂 : 小蜜蜂~~
03.貼上程式碼

const int inPin1 = 7;
const int inPin2 = 6;
const int inPin3 = 5;
const int inPin4 = 3;
const int inPin5 = 2;
int val1 = 0, val2 = 0, val3 = 0, val4 = 0, val5 = 0;
void setup() {
   pinMode(inPin1, INPUT);
   pinMode(inPin2, INPUT);
   pinMode(inPin3, INPUT);
   pinMode(inPin4, INPUT);
   pinMode(inPin5, INPUT);
}
void loop() {
   val1 = digitalRead(inPin1);
   val2 = digitalRead(inPin2);
   val3 = digitalRead(inPin3);
   val4 = digitalRead(inPin4);
   val5 = digitalRead(inPin5);

      if(val1==HIGH){
         tone(8,524,8);
      }
      if(val2==HIGH){
         tone(8,588,8);
      }
      if(val3==HIGH){
         tone(8,660,8);
      }
      if(val4==HIGH){
         tone(8,698,8);
      }
      if(val5==HIGH){
         tone(8,784,8);
      }
}

心得:
這次在課堂上做了"1 2 3 4 5 "五個音階,但是我們按"2"的按鈕,發出來的聲音聽起來有點分岔,不是很悅耳。電線經過幾次的調整後,"2"的音終於比較正常了,但是"3"的音卻怪怪的,索性我們跟別組借了按鈕,五個音階終於正常了。

影片中的音樂是"小蜜蜂"。