-
아두이노(송신)와 프로세싱(수신)에서의 데이터 처리하기 - 하Processing 2020. 11. 11. 17:48
아래의 내용을 기반으로 아두이노에 조이스틱을 연결해서 조이스틱의 값을 받아서 프로세싱에 전달해보자.
designatedroom87.tistory.com/306?category=902512
아두이노(송신)와 프로세싱(수신)에서의 데이터 처리하기 - 상
아두이노에서 숫자를 보내나 문자를 보내를 보내나 프로세싱은 문자로 본다. 아두이노에서 Serial.write(123); 을 하면 프로세싱은 이를 '1', '2', '3' 으로 즉, 아스키 코드값인 49, 50, 51로 데이터를 받
designatedroom87.tistory.com
그리고 조이스틱과 아두이노의 연결은 아래를 참고해보자.
그런데 연결할 것도 딱히 없다.
designatedroom87.tistory.com/300?category=902307
JoyStick과 아두이노의 기본적인 연결과 값 읽기
아두이노와 조이스틱의 연결 연결에는 어려운 것이 없다. 조이스틱의 VRX핀은 아두이노의 A0핀에 연결 조이스틱의 VRY핀은 아두이노의 A1핀에 연결 조이스틱의 SW(버튼)핀은 아두이노의 D8번핀에
designatedroom87.tistory.com
아두이노와 조이스틱의 연결은 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