====== 아두이노 그대로 따라하기 - 5.프로세싱과 연동하기 ====== 아두이노의 쓰임새는 매우 다양하다. 하드웨어의 경우 각종 쉴드(Sheild)가 있어 여러가지 통신 인터페이스를 제공하고 있고, 소프트웨어의 경우 여기서 소개할 프로세싱이라는 언어로 PC 와 인터렉티브(interactive)한 통신이 가능하다. ====== 준비운동하기 ====== 프로세싱은 아두이노와 시리얼 인터페이스로 통신한다. 이 채널을 통해 데이터를 주거나 받고 이를 가공해서 화면에 그리거나 데이터를 출력한다. 앞으로 아두이노와 프로세싱이 연동하는 예제들을 살펴볼 것이다. ====== 데이터 스트림을 시각화하기 ====== 아두이노로부터 보내지는 데이터를 시각화는 예제를 살펴보겠다. 먼저 회로를 아래 그림처럼 만든다. {{ :computer:embedded:ldr.jpg |}} ===== 프로세싱 코드 ===== import processing.serial.*; Serial port; float val; int x; float easing = 0.05; float easedVal; void setup() { size(440, 440); frameRate(30); smooth(); String arduinoPort = Serial.list()[0]; port = new Serial(this, arduinoPort, 9600); background(0); } void draw() { if(port.available() > 0) // 만약 데이터가 가용하다면 { val = port.read(); // 데이터를 읽어서 val 에 저장한다 val = map(val, 0, 255, 0, height); // 그 값을 변환한다 println(val); ---- ③ } float targetVal = val; easedVal += (targetVal - easedVal) * easing; stroke(0); line(x, 0, x, height); // 검은 선 stroke(255); line(x+1, 0, x+1, height); // 흰 선 line(x, 220, x, val); // 원 데이터 line(x, 440, x, easedVal + 220); // 평균 값의 데이터 x++; if(x>width) { x = 0; } } 위 코드는 화면이 두 부분으로 나뉘면서, 광감지 센서를 통해 들어오는 원래의 데이터는 위쪽에 표시하고 평균값으로 부드럽게 처리한 신호는 아래쪽에 표시한다. ===== 아두이노 코드 ===== int sensorPin = 0; int val = 0; void setup() { Serial.begin(9600); } void loop() { val = analogRead(sensorPin)/4; Serial.write((byte)val); ---- ① //Serial.println(byte); ---- ② delay(100); } 위의 코드에서 유의 할 것은 보내는 함수와 데이터 타입을 byte 형으로 치환하는 것이다. - 센서에서 읽은 값을 byte 형으로 시리얼 포트로 내보낸다. - 시리얼 포트에 byte 값을 출력한다. - 프로세싱 코드에 읽은 값을 출력한다. 각각 1 번과 2번을 각각 주석을 풀고 제대로된 값이 읽히는지 확인해보자. 2번의 경우 엉뚱한 값이 찍힌다. 빛의 변화를 주면, 그림의 곡선에 변화가 생길 것이다. ====== 데이터를 보는 또다른 방법 ====== 앞의 예제에서 그렸던 그래프를 마치 레이더 화면처럼 표현해보자. ===== 프로세싱 코드 ===== import processing.serial.*; Serial port; float val; float angle; float radius; void setup() { size(440, 440); frameRate(30); strokeWeight(2); smooth(); String arduinoPort = Serial.list()[0]; port = new Serial(this, arduinoPort, 9600); background(0); } void draw() { if(port.available() > 0) { val = port.read(); radius = map(val, 0, 255, 0, height * 0.45); // val 값을 변환하여 반지름을 설정한다 //println(val); } int middleX = width/2; int middleY = height/2; float x = middleX + cos(angle) * height/2; float y = middleY + sin(angle) * height/2; stroke(0); line(middleX, middleY, x, y); x = middleX + cos(angle) * radius; y = middleY + sin(angle) * radius; stroke(255); line(middleX, middleY, x, y); angle += 0.01; ---- ① } sin() 과 cos() 함수를 사용하여 원형 패턴으로 시각화했다. 원 둘레를 돌며 현재의 값을 그리는 선을 움직이기 위해 angle 변수가 계속 업데이트되며, val 변수는 움직이는 선의 길이를 조정하여 화면의 중심으로부터 선이 얼마나 먼지 거리를 설정한다. 원을 한 바퀴 돈 다음에는 이전 데이터 위에 새로운 값을 덮어쓴다. {{ :computer:embedded:pro2.jpeg |}} ---- {{indexmenu>:#1|skipns=/^(wiki|etc|diary|playground)$/ skipfile=/^(todays|about|guestbook)$/ nsort rsort}} ----