顯示具有 04160683_邱繼儀 標籤的文章。 顯示所有文章
顯示具有 04160683_邱繼儀 標籤的文章。 顯示所有文章

2018年1月8日 星期一

week17-期末作品展示

期末作品展示:

皮卡丘打排球



作品說明:
遊戲為兩隻皮卡丘在打排球,分別為P1、P2,玩家可透過遊戲裝置(如上圖)操控皮卡丘,按鈕分別為向左(黃色按鈕)、跳(紅色按鈕)、向右(黃色按鈕)。最後先得15分者獲勝。

裝置內部:


展示影片:
https://www.youtube.com/watch?v=6JNwfsUDVpk&feature=youtu.be

2018年1月5日 星期五

Week 11 邱

#第11週
-------------------------------------------------------------------------------------------------------------------------












2017年12月25日 星期一

Week 15 邱

#第15週

期末作品:皮卡丘打排球-------------------------------------------------------------------------------------------------------------------------

◎接上搖桿

程式碼:

const int SW_pin = 2; // digital pin connected to switch output
const int X_pin = 0; // analog pin connected to X output
const int Y_pin = 1; // analog pin connected to Y output

void setup() {
  pinMode(SW_pin, INPUT);
  digitalWrite(SW_pin, HIGH);
  Serial.begin(115200);
}

void loop() {
  Serial.print("Switch:  ");
  Serial.print(digitalRead(SW_pin));
  Serial.print("\n");
  Serial.print("X-axis: ");
  Serial.print(analogRead(X_pin));
  Serial.print("\n");
  Serial.print("Y-axis: ");
  Serial.println(analogRead(Y_pin));
  Serial.print("\n\n");
  delay(500);
}

  • 沒有按:1
  • 按下去:0





◎數值簡單化



程式碼:



const int SW_pin = 2; // digital pin connected to switch output
const int X_pin = 0; // analog pin connected to X output
const int Y_pin = 1; // analog pin connected to Y output
void setup() {
pinMode(SW_pin, INPUT);
digitalWrite(SW_pin, HIGH);
Serial.begin(115200);
}
void loop() {
int s=digitalRead(SW_pin);
int x=analogRead(X_pin);
int y=analogRead(Y_pin);
Serial.print("w");
Serial.print(s);
Serial.print("x");
if(x/4=='w' || x/4=='x' || x/4=='y' ) Serial.write('v');
else Serial.write(x/4);
Serial.print("y");
if(y/4=='w' || y/4=='x' || y/4=='y' ) Serial.write('v');
else Serial.write(y/4);
delay(50);
// Serial.print("Switch: ");
// Serial.print(digitalRead(SW_pin));
/* Serial.print("\n");
Serial.print("X-axis: ");
Serial.print(analogRead(X_pin));
Serial.print("\n");
Serial.print("Y-axis: ");
Serial.println(analogRead(Y_pin));
Serial.print("\n\n");*/
// delay(500);
}





◎連到Processing


程式碼:

import processing.serial.*;
Serial myPort;
void setup(){
size(300,300);
myPort = new Serial(this, "COM7", 115200);
}
int t=0, s=48, x=128, y=128;
void draw(){
background(255);
while(myPort.available() > 0){
t = myPort.read();
if(t=='w') s = myPort.read();
else if(t=='x') x=myPort.read();
else if(t=='y') y=myPort.read();
}
if(s==49)fill(255,0,0);
else fill(0,255,0);
ellipse(x, y, 30,30);
}





◎代入之前期中的程式碼

程式碼:
import processing.serial.*;
Serial myPort;
//import ddf.minim.*;
//Minim minim;
//AudioPlayer bgm;
PImage imgBall,imgP1,imgP2;
void setup(){
   size(800,600);
   textSize(50);
   myPort = new Serial(this, "COM7", 115200);
   imgBall=loadImage("Ball.png");
   imgP1=loadImage("P1.png");
   imgP2=loadImage("P2.png");
   imageMode(CENTER);
   //minim=new Minim(this);
   //bgm=minim.loadFile("pika.mp3",2048);
   //bgm.play();
   //bgm.loop();
}
int t=0, s=48, x=128, y=128;
float ballX=120,ballY=150,ballVX=0,ballVY=0;
float p1X=100,p1Y=430,p1VX=0,p1VY=0;
float p2X=700,p2Y=430,p2VX=0,p2VY=0;
Boolean bGG=false;
int p1S=0,p2S=0; ///Score

void draw(){
  background(#BFEAFF); ///sky
  while(myPort.available() > 0){
    t = myPort.read();
  if(t=='w') s = myPort.read();
  else if(t=='x') x=myPort.read();
  else if(t=='y') y=myPort.read();
  }
  //if(s==49)fill(255,0,0);
  //else fill(0,255,0);
  //ellipse(x, y, 30,30);
   noStroke();fill(#D1C0A6);rect(0,500,800,100); ///floor
   fill(#A6ACAF);rect(400,320,10,240); ///cylider
   image(imgP1,p1X,p1Y,200,200);
   image(imgP2,p2X,p2Y,200,200);
   image(imgBall,ballX,ballY,80,80);

   fill(#484646);
   text(p1S,100,70);
   text(p2S,700,70);
   
   if(p1S==15){
    bGG=true;
    String p1win = "p1 is winner !!";
    fill(#E85050);
    text(p1win, 230, 150, 500, 200);
   }
   if(p2S==15){
    bGG=true;
    String p2win = "p2 is winner !!";
    fill(#E85050);
    text(p2win, 230, 150, 500, 200);
   }
   
   if(ballX<=360 && ballY>=500-40){
       bGG=true; ///if ball touch the floor : GameOver
       if(bGG)
       {
         p2S++;
         ballX=680;ballY=150;
         p1X=100;p1Y=450;
         p2X=700;p2Y=450;
         ballVX=0;ballVY=0;
         p1VX=0;p1VY=0;
         p2VX=0;p2VY=0;
         bGG=false;
       }
   }
   if(ballX>=450 && ballY>=500-40){
      bGG=true; ///if ball touch the floor : GameOver
      if(bGG)
       {
         p1S++;
         ballX=120;ballY=150;
         p1X=100;p1Y=450;
         p2X=700;p2Y=450;
         ballVX=0;ballVY=0;
         p1VX=0;p1VY=0;
         p2VX=0;p2VY=0;
         bGG=false;
       }
   }
   
   if(bGG)return;
   ballX += ballVX; ballY += ballVY;
   ballVY += 0.98;
   
   p1X+=p1VX;
   if(p1X<80) p1X=80; 
   if(p1X>300) p1X=300;
   p1Y += p1VY; p1VY+=0.98;
   
   p2X+=p2VX;
   if(p2X<500) p2X=500;
   if(p2X>720) p2X=720;
   p2Y += p2VY; p2VY+=0.98;

   if(ballX<50){ballX=50;ballVX=-ballVX;} 
   if(ballX>800-50){ballX=800-50;ballVX=-ballVX;}
   if(ballY<50){ballY=50;ballVY=-ballVY;}
   if(ballY>800-50){ballY=800-50;ballVY=-ballVY;}
   
   if(330<ballX && ballX<470 && 270<ballY &&ballY<560)
     {ballVX=-ballVX;ballVY=-ballVY;}
  
   if(p1Y>=500-50) {p1VY=0; p1Y=500-50;}
   if(p2Y>=500-50) {p2VY=0; p2Y=500-50;}
   if(dist(p1X,p1Y,ballX,ballY)<=80)ballVY=-ballVY;
   if(dist(p2X,p2Y,ballX,ballY)<=80)ballVY=-ballVY;
   if(dist(p1X,p1Y,ballX,ballY)<=80) ballVX=(80-ballVX)/6.0;
   if(dist(p2X,p2Y,ballX,ballY)<=80) ballVX=-(80-ballVX)/6.0;
}








2017年12月11日 星期一

Week 13 邱

#第13週
-------------------------------------------------------------------------------------------------------------------------

◎旋轉編碼器

安裝







  • CLK → 2
  • DT → 3
  • SW → 4
  • +  → 5V
  • GND → GND




程式碼:



#define SERIAL_BAUDRATE 115200
#define CLK_PIN 2 // 定義連接腳位
#define DT_PIN 3
#define SW_PIN 4

#define interruptA 0 // UNO腳位2是interrupt 0,其他板子請見官方網頁

volatile long count = 0;
 unsigned long t = 0;

 void setup() {
   Serial.begin(SERIAL_BAUDRATE);
   // 當狀態下降時,代表旋轉編碼器被轉動了
  attachInterrupt(interruptA, rotaryEncoderChanged, FALLING);
   pinMode(CLK_PIN, INPUT_PULLUP); // 輸入模式並啟用內建上拉電阻
  pinMode(DT_PIN, INPUT_PULLUP); 
   pinMode(SW_PIN, INPUT_PULLUP); 
 }
 void loop() {
   if(digitalRead(SW_PIN) == LOW){ // 按下開關,歸零
     count = 0;  
      Serial.println("count reset to 0");
      delay(300);
   }
 }
 void rotaryEncoderChanged(){ // when CLK_PIN is FALLING
   unsigned long temp = millis();
   if(temp - t < 200) // 去彈跳
    return;
   t = temp;
   
   // DT_PIN的狀態代表正轉或逆轉
  count += digitalRead(DT_PIN) == HIGH ? 1 : -1;
   Serial.println(count);
 }


  • 9600 baud → 115200 baud
  • 往右(順時針)旋轉 +
  • 往左(逆時針)旋轉 --


◎不會移動的圓

程式碼:

import processing.serial.*;
Serial myPort;

void setup(){
   size(500,500);
   myPort = new Serial(this,"COM8",115200);
}
int x=0;
int lf=10;//new line , line feed
void draw(){
   background(0);
   if(myPort.available() >0){
      String now = myPort.readStringUntil(lf);
      x = int (now);
      println(now + " " + x);
   }
   ellipse(width/2 + x*20, height/2, 100, 100);
   
}




◎左右移動的圓

程式碼:

import processing.serial.*;
Serial myPort;

void setup(){
   size(500,500);
   myPort = new Serial(this,"COM7",115200);
}
int x=0;
int lf=10;//new line , line feed
void draw(){
   background(0);
   if(myPort.available() >0){
      String now = myPort.readStringUntil(lf);
      x = int (split(now,'\r')[0]);
      println(now);
   }
   ellipse(width/2 + x*20, height/2, 100, 100);
   
}


  • 往右(順時針)旋轉:往右移


  • 往左(逆時針)旋轉:往左移



Week 12 邱

#第12週
-------------------------------------------------------------------------------------------------------------------------


  • 搖桿




















  • KEY:按鈕
  • Y:Y座標
  • X:X座標
  • VCC:伏特
  • GND:接地





  • Switch:1(按下去) / 0(沒有按)
  • 9600 baud → 115200 baud







  • myPort = new Serial(this, portName, 115200) ;







  • readString()


import processing.serial.*;

Serial myPort;  // The serial port

void setup() {
  // List all the available serial ports:
  printArray(Serial.list());
  // Open the port you are using at the rate you want:
  myPort = new Serial(this, Serial.list()[0], 9600);
}

void draw() {
  while (myPort.available() > 0) {
    String inBuffer = myPort.readString();   
    if (inBuffer != null) {
      println(inBuffer);
    }
  }
}


  • The Code


// Arduino pin numbers const int SW_pin = 2; // digital pin connected to switch output const int X_pin = 0; // analog pin connected to X output const int Y_pin = 1; // analog pin connected to Y output void setup() { pinMode(SW_pin, INPUT); digitalWrite(SW_pin, HIGH); Serial.begin(115200); } void loop() { Serial.print("Switch: "); Serial.print(digitalRead(SW_pin)); Serial.print("\n"); Serial.print("X-axis: "); Serial.print(analogRead(X_pin)); Serial.print("\n"); Serial.print("Y-axis: "); Serial.println(analogRead(Y_pin)); Serial.print("\n\n"); delay(500); }


  • Switch:1



  • Switch:0