-
아두이노(송신)와 프로세싱(수신)에서의 데이터 처리하기 - 하Processing 2020. 11. 11. 17:48
아래의 내용을 기반으로 아두이노에 조이스틱을 연결해서 조이스틱의 값을 받아서 프로세싱에 전달해보자.
designatedroom87.tistory.com/306?category=902512
그리고 조이스틱과 아두이노의 연결은 아래를 참고해보자.
그런데 연결할 것도 딱히 없다.
designatedroom87.tistory.com/300?category=902307
아두이노와 조이스틱의 연결은 GND, 5V, VRX핀만 아두이노와 연결한다.
VRX핀은 아두이노의 A0핀에 연결한다.
아두이노에서의 소스 코드는 다음과 같다.
아두이노 소스 코드
더보기// 조이스틱의 VRX는 A0핀에 연결한다. int joyX; // 센서로부터 읽은 값이라고 하자. int highX = 0; int lowX = 0; byte startByte = 0x7E;// 시작바이트 byte dataLen = 2; // 정보를 처리하는데, 길이는 2바이트면 된다. byte endByte = 0xFE; // 끝 바이트 void setup() { Serial.begin(9600); } void loop() { joyX = analogRead(A0); if (joyX > 255) { highX = joyX >> 8; lowX = 0x00FF & joyX; } else { highX = 0; lowX = joyX; } Serial.write(startByte); Serial.write(dataLen); Serial.write(highX); Serial.write(lowX); Serial.write(endByte); //Serial.println("sensor : " +joyX); delay(600); }
프로세싱 소스 코드
더보기import processing.serial.*; Serial port; void setup() { port=new Serial(this, "COM6",9600); delay(4000); } void draw() { if (port.available() > 0) { int c = port.read(); // read start if (c == 0x7E) // 0x7E equals to 126 { int i = 0; int buf[] = new int[3]; // until read endByte while (c != 0xFE) { buf[i++] = port.read(); if (i == 3) break; } //for (i = 0; i < 3; i++) // println(buf[i]); int sensor = (buf[1] << 8) + buf[2]; println("sensor : "+sensor); } delay(100); } // available end if }
위의 프로세싱 코드와 아래는 유사한 내용이다.
프로세싱 소스 코드
더보기import processing.serial.*; Serial port; int sensor; int buf[]=new int[3]; // java statement void setup() { port=new Serial(this, "COM6",9600); } void draw() { if (port.available() > 0) { int c=port.read(); if (c==0x7E) // 0x7E = 126 { int i=0; while ((buf[i++]=port.read())!=0xFE) { if (i == 3) break; } // for(i=0;i<3;i++) { println(buf[i]);} sensor = (buf[1] << 8)+buf[2]; println("senosr : "+sensor); } delay(100); } }
그리고 마지막으로 프로세싱에서는 조이스틱의 x 입력값을 받아서 이를 그래프로 나타내보자.
참고로 프로세싱은 화면 창을 기준으로 좌측상단이 원점이다.
그러므로 y값이 작아질수록 화면의 위쪽과 가까워진다.
그리고 조이스틱의 x값은 0~1023사이 값을 갖는데, 이를 적당한 값의 범위로 변환해보자.
변환할 값은 0~ 300 사이의 값이라고 정하자.
아래의 소스에서 맨 마지막에 curY를 구할 때, 기준 값에서 조이스틱의 값을 빼는 것을 볼 수 있다.
여기서 기준값은 300이라고 정하자.
출력 결과는 생각만큼 잘 나오지 않는다.
프로세싱 소스 코드
더보기import processing.serial.*; Serial port; int prevX = 10; int prevY = 300; int curX = 10; int curY = 400; int buf[]=new int[3]; int data = 0; void setup() { size(800,400); port = new Serial(this, "COM6", 9600); line(prevX, prevY, curX, curY); delay(4000); } void draw() { if (port.available() > 0) { int c = port.read(); if (c == 0x7E) // 0x7E = 126 { int i = 0; while ((buf[i++] = port.read()) != 0xFE) { if (i == 3) break; } data = (buf[1] << 8) + buf[2]; } if (data > 0) { data = (int)(data/1023.0f * 300); println(data); } delay(100); } curX += 1; curY = 400 - data; line(prevX, prevY, curX, curY); prevX = curX; prevY = curY; }
최종적으로 조이스틱의 x값과 y값을 동시에 전송해보자.
데이터의 길이는 2배가 증가한다.
아두이노 소스 코드
더보기byte startbyte=0x7E; int joyX; int joyY; int highX=0; int lowX=0; int highY = 0; int lowY = 0; byte dataLen = 4; // 길이가 2배증가. byte endbyte = 0xFE; void setup() { Serial.begin(9600); joyX = 1234; joyY = 5678; if(joyX>255){ highX=joyX>>8; lowX=0x00FF & joyX; }else{ highX=0; lowX=joyX; } if(joyY>255){ highY=joyY>>8; lowY=0x00FF & joyY; }else{ highY=0; lowY=joyY; } Serial.write(startbyte); Serial.write(dataLen); Serial.write(highX); Serial.write(lowX); Serial.write(highY); // Serial.write(lowY); // Serial.write(endbyte); delay(600); } //아두이노에서 숫자를 보내나 //문자를 보내나 문자로 인식 void loop() { }
프로세싱에서 기존의 x값에 y값까지도 같이 처리를 해주면 된다.
프로세싱 소스 코드
더보기import processing.serial.*; Serial port; void setup(){ port=new Serial(this, "COM6",9600); } int sensor; int buf[]=new int[5]; //java statement int x,y; void draw(){ if(port.available()>0){ int c=port.read(); if(c==0x7E){ //0x7E=126 int i=0; while((buf[i++]=port.read())!=0xFE) { if(i == 5) break; } x=(buf[1] << 8)+buf[2]; println("x:"+x); y=(buf[3] << 8)+buf[4]; println("y:"+y); } delay(100); } }
프로세싱 출력 결과
'Processing' 카테고리의 다른 글
알카노이드 게임 (0) 2020.11.11 마우스 클릭으로 선을 그리고 지우기 (0) 2020.11.11 아두이노(송신)와 프로세싱(수신)에서의 데이터 처리하기 - 상 (0) 2020.11.10 아두이노에서 프로세싱에 데이터를 전송하고 그래프로 표현하기 (0) 2020.11.10 프로세싱을 활용해서 도형(원, 선) 그리기 (0) 2020.11.10