-
아두이노(송신)와 프로세싱(수신)에서의 데이터 처리하기 - 상Processing 2020. 11. 10. 18:43
아두이노에서 숫자를 보내나 문자를 보내를 보내나 프로세싱은 문자로 본다.
아두이노에서 Serial.write(123); 을 하면 프로세싱은
이를 '1', '2', '3' 으로 즉, 아스키 코드값인 49, 50, 51로 데이터를 받고 출력한다.
'0'은 아스키 코드값으로 48이다.
송신 측에서는 데이터의 길이도 함께 보내줘야 한다.추가로 시작 코드는 0x7E를 보내준다.
[시작 코드 / 데이터의 길이 / 데이터 / 종료 코드] 로 구성한다.그리고 아두이노에서 데이터를 전송할 시에, print함수와 write함수를 사용할 수 있는데
이 두 함수의 차이점은 print함수는 2바이트를 write함수는 1바이트 전송한다.
네트워크에서는 write함수 사용한다.
아두이노는 int가 2바이트이다. 이는 sizeof(int)를 출력해보면 알 수 있다.
우리가 나중에 처리할 내용은 조이스틱의 x,y값을 아두이노가 입력받아 프로세싱에 송신하고
프로세싱에서 이 데이터를 처리한다.
우선 문제를 간단히 하기 위해서 조이스틱의 x값만 받는다고 가정을 하면 조이스틱의 x값은 0 ~ 1023의 값을 갖는다.
조이스틱의 x좌표 값은 sensor 변수가 저장한다.
이 조이스틱의 x좌표 값은 최대값1023은 1바이트가 표현할 수 있는 최대값인 255를 넘긴다.
그래서 조이스틱의 x좌표 값 하나를 전송하기 위해서는 2바이트만 있으면 충분하다.
그래서 데이터의 길이는 우선 2로 두자.
그리고 조이스틱의 x좌표값은 255를 넘느냐 넘지 않느냐에 따라 별도의 처리가 필요하다.
이 읽은 값을 처리하기 위해서 highSensor, lowSensor 두 변수를 추가로 선언한다.
즉,센서값이 1바이트로 표현할 수 있는 수의 범위를 넘어 갈 수 있으므로 변수 2개에 걸쳐 저장을 한다.
데이터의 길이와 highSensor, LowSensor가 프로세싱에 수신이 되는지 알아보자.
센서값이 1234라고 한다면
1234 - 1024(2^10) = 210 이며, 210 - 128(2^7) = 82 이며, 82 - 64(2^6) = 18 이며, 18 - 16(2^4) = 2 이다.
아두이노 소스 코드
더보기void setup() { Serial.begin(9600); int sensor = 1234; // 센서로부터 읽은 값이라고 하자. int highSensor = 0; int lowSensor = 0; // 255는 1바이트가 표현할 수 있는 최대값 if (sensor > 255) { highSensor = sensor >> 8; // highSensor에는 4가 저장된다. lowSensor = 0x00FF & sensor; // 0x00FF는 255이다. lowSensor는 210이 저장 } else { highSensor = 0; lowSensor = sensor; } byte startByte = 0x7E; // 시작바이트 //int dataLen = String(sensor).length(); //byte dataLen = String(sensor).length(); // 데이터의 길이(비트 수로 전달) byte dataLen = 2; // 정보를 처리하는데, 길이는 2바이트면 된다. byte endByte = 0xFE; // 끝 바이트 /* Serial.print(startByte,HEX); Serial.print(dataLen); Serial.print(sensor); Serial.print(endByte,HEX); */ Serial.write(startByte); Serial.write(dataLen); Serial.write(highSensor); Serial.write(lowSensor); Serial.write(endByte); delay(1000); } void loop() {}
프로세싱에서는 데이터의 길이와 highSensor와 lowSensor의 값을 읽어서 출력을 해보자.
프로세싱 소스 코드
더보기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]); } delay(100); } // available end if }
프로세싱의 출력 결과
위의 프로세싱에서 출력 결과를 이용해서 원래의 센서 값을 다시 얻어보자.
아두이노에서 처리한 과정의 역순으로 하면 된다.
아래의 문장을 추가하면 된다.
소스 코드
더보기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]; print("sensor : "+sensor); } delay(100); } // available end if }
출력 결과
아래에서 아두이노와 조이스틱을 연결해서 프로세싱과 통신을 해보자.
designatedroom87.tistory.com/308
'Processing' 카테고리의 다른 글
알카노이드 게임 (0) 2020.11.11 마우스 클릭으로 선을 그리고 지우기 (0) 2020.11.11 아두이노(송신)와 프로세싱(수신)에서의 데이터 처리하기 - 하 (0) 2020.11.11 아두이노에서 프로세싱에 데이터를 전송하고 그래프로 표현하기 (0) 2020.11.10 프로세싱을 활용해서 도형(원, 선) 그리기 (0) 2020.11.10