BASIC4MCU | 질문게시판 | (초보)아두이노, 프로세싱 코드
페이지 정보
작성자 흑흑 작성일2018-12-13 18:12 조회33,420회 댓글8건본문
프로세싱 코드
import processing.serial.*;Serial myPort;int val;ArrayList<Particle> particles;PImage[] bullets;PImage red_bullet;PImage green_bullet;PImage blue_bullet;final float GRAVITY = 200;void setup(){frameRate(60);noStroke();size(1920, 1080, P3D);String portName = Serial.list()[0];myPort = new Serial(this, portName, 9600);if (myPort.available() > 0) {val = myPort.read();}if (val == 1) {red_bullet = loadImage("a.png");green_bullet = loadImage("a2.png");blue_bullet = loadImage("a3.png");bullets = new PImage[]{red_bullet, green_bullet, blue_bullet};PVector GravityVector = new PVector(0, GRAVITY);PVector rocket_vel = PVector.fromAngle(-PI/3.0);rocket_vel.mult(150.0);particles = new ArrayList<Particle>();for (float i=0; i<100; i++) {createRocket(i*0.5);}}}void draw(){if (val == 1) {background(0);blendMode(ADD);color black = color(0, 0, 0);for (int i=0; i<8; i++) {for (Particle p : particles) {float t = get_t() - i * 0.02;if (t >= p.initial_t && t < p.end_t) {PVector velVector = new PVector(p.x.vel(t), p.y.vel(t));pushMatrix();translate(p.x.pos(t), p.y.pos(t));rotate(velVector.heading() - PI * 0);scale(0.2, 0.2);drawSpark(p.image);popMatrix();}}}} else {background(255);}}float get_t() {return frameCount/60.0;}void createRocket(float time) {PVector initial_pos = new PVector((width/2.0), height);float burn_time = 1.5 + random(0.4);float glide_time = 1.0 + random(0.5);float thrust_mag = 400;PVector thrust_vector = PVector.fromAngle(3.0*PI/2.0 + random(-0.2, 0.2));thrust_vector.setMag(thrust_mag);PVector rocket_accel = new PVector(0, GRAVITY);rocket_accel.add(thrust_vector);Particle rocket_with_thrust = new Particle(initial_pos,new PVector(0, 0),rocket_accel,time,time + burn_time,color(255, 100, 100),red_bullet);Particle rocket_without_thrust = new Particle(rocket_with_thrust.pos(time + burn_time),rocket_with_thrust.vel(time + burn_time),new PVector(0, GRAVITY),time + burn_time,time + burn_time + glide_time,color(255, 100, 100),red_bullet);particles.add(rocket_with_thrust);particles.add(rocket_without_thrust);createExplosion(rocket_without_thrust.pos(time + burn_time + glide_time),rocket_without_thrust.vel(time + burn_time + glide_time),time + burn_time + glide_time,bullets[int(random(3))]);}void createExplosion(PVector position, PVector rocketVector, float time, PImage image) {for (int i=0; i<80; i++) {float explosion_vel = 150;PVector vel;vel = PVector.random3D();vel.mult(explosion_vel);vel.add(rocketVector);particles.add(new Particle(position,vel,new PVector(0, GRAVITY),time,time + 1.0 + random(0.2) + random(0.2) + random(0.2),color(255, 100, 100),image));}}void drawSpark(PImage image) {image(image, -32, -32);}class Particle {color baseColor;Motion x;Motion y;float initial_t;float end_t;PImage image;Particle(PVector position, PVector velocity, PVector accel, float initial_t, float end_t, color baseColor, PImage image) {this.x = new Motion(position.x, velocity.x, accel.x, initial_t);this.y = new Motion(position.y, velocity.y, accel.y, initial_t);this.initial_t = initial_t;this.end_t = end_t;this.baseColor = baseColor;this.image = image;}PVector pos(float t) {return new PVector(this.x.pos(t), this.y.pos(t));}PVector vel(float t) {return new PVector(this.x.vel(t), this.y.vel(t));}PVector accel() {return new PVector(this.x.accel, this.y.accel);}}class Motion {float initial_pos;float initial_vel;float accel;float initial_t;float t0_pos;float t0_vel;Motion(float initial_pos, float initial_vel, float accel, float initial_t) {this.accel = accel;this.t0_vel = 0;this.t0_vel = initial_vel - vel(initial_t);this.t0_pos = 0;this.t0_pos = initial_pos - pos(initial_t);}public float vel(float t) {return this.accel * t + this.t0_vel;}public float pos(float t) {return 0.5 * this.accel * pow(t, 2) + this.t0_vel * t + this.t0_pos;}}아두이노 코드int switchPin = 2;void setup() {pinMode(switchPin, INPUT);Serial.begin(9600);}void loop() {if (digitalRead(switchPin) == HIGH) {Serial.println(1);Serial.write(1);delay(1000);} else {Serial.println(0);Serial.write(0);delay(1000);}}아두이노를 통해 1이라는 값을 받았을때 프로세싱에서 1일 경우에만 위 코드가 실행되도록 하고 싶은데 val==1로 실행하면 else 코드만 실행되고 val==0으로 해두면 1일때에도 코드가 멈추지 않아요ㅠㅠ어떻게 해야할까요 도와주세요ㅠㅠ
댓글 8
조회수 33,420master님의 댓글
master 작성일
if (val == 1) {
이 코드가 두군데 있군요
한번만 실행 하려면
if (val == 1) {
val =0; // <-- 추가하세요
흑흑님의 댓글
흑흑
이게 불꽃놀이 코든데
setup에 저 코드를 넣지 않으면 실행하자마자 불꽃이 터져요 val=1일때만 불꽃이 날아가서 터졌으면 하는데 어떻게 해야할까요ㅠㅠ? 바쁘신데 귀찮게해서 죄송합니다 좀만 도와주세요ㅜㅜ
draw에 있는걸 빼면 else 코드가 실행이 안되구용..
master님의 댓글
master 작성일
void draw()
{
if (val == 1) { // <-- 이 코드는 필요 없어서 삭제 했나요?
val= 0; // 위 코드가 있다면 여기도 추가해주세요
background(0);
흑흑님의 댓글
흑흑
앗 그럼
if ( val == 1) {
위 코드가 있는 곳에는
val = 0;을 넣으면 되는건가요? setup이랑 draw에 모두 필요한거면 두 코드 모두에 넣음 될까요?
master님의 댓글
master
다른 사람은 돌려볼 수 없으니 디버깅을 하지 못합니다.
돌려보고 문제가 되는 부분을 다시 질문하세요
master님의 댓글
master 작성일
//프로세싱 코드
import processing.serial.*;
Serial myPort;
int val=0; //--------------------------
//생략
//
void setup(){
frameRate(60);
noStroke();
size(1920,1080,P3D);
String portName=Serial.list()[0];
myPort=new Serial(this,portName,9600);
if(myPort.available()>0){
val=myPort.read();
if(val==1){ val=0; //--------------------------
red_bullet=loadImage("a.png");
//생략
}
}
}
//
void draw(){
if(val==1){ val=0; //--------------------------
background(0);
//생략
}
if(val==0){ background(255); } //--------------------------
}
흑흑님의 댓글
흑흑
알려주신 코드대로 정확하게 입력 후 다시 실행했는데요,
오류가 나는 부분은 없지만 시리얼 통신으로 1값을 받았는데도 코드가 실행되지 않고 background(255)만 실행이 됩니다.
흰 화면만 떠요. 아두이노에서 시리얼 모니터로 확인한 결과 0,1 값이 잘 구분이되는데 r이라는 영문이 숫자 앞에 뜹니다.
아두이노에서 값을 정확하게 받아들이지 못하고 있는 중인걸까요?
master님의 댓글
master
숫자1과 문자'1'은 값이 다릅니다.
r이라는 영문이 아니고 ┌그림문자입니다.