arduino와 processing을 연동 하면서, processing 언어가 어떻게 자바로 바뀌는지 궁금했다.
export application 하니 win32, win64 에서 동작할 수 있도록 코드가 생성된다. windows32 디렉토리와 window64 디렉토리가 생기고, 각각 lib, source 디렉토리와 serial 통신이 가능한 dll파일과 exe 파일이 생긴다.
자바소스는 source디렉토리에 보니 processing언어로 된 원래 코드와 변환된 자바 코드가 있다.
기존 코드는 다음과 같다.
import processing.serial.*;
Serial port;
boolean button = false;
int x = 150;
int y = 150;
int w = 100;
int h = 75;
void setup() {
size(400,400);
// 디버그
println("Available serial ports:");
println(Serial.list());
// 내 pc 에는 Serial 내부 구조의 1번에 com3로 연결된 아두이노가 있다.
port = new Serial(this, Serial.list()[1], 9600);
}
void draw() {
if (button) {
background(255);
stroke(0);
} else {
background(0);
stroke(255);
}
fill(175);
rect(x,y,w,h);
}
void mousePressed() {
if (mouseX > x && mouseX < x+w && mouseY > y && mouseY < y+h) {
button = !button;
}
// 버튼의 값이 true이면 led을 끼고, false이면 led를 끈다.
if (button == true) {
// turn on led
port.write(255);
} else {
// turn off led
port.write(0);
}
}
자동으로 변환된 자바 코드이다.
import processing.core.*;
import processing.xml.*;
import processing.serial.*;
import java.applet.*;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.event.MouseEvent;
import java.awt.event.KeyEvent;
import java.awt.event.FocusEvent;
import java.awt.Image;
import java.io.*;
import java.net.*;
import java.text.*;
import java.util.*;
import java.util.zip.*;
import java.util.regex.*;
public class sketch_dec08a extends PApplet {
Serial port;
boolean button = false;
int x = 150;
int y = 150;
int w = 100;
int h = 75;
public void setup() {
size(400,400);
// \ub514\ubc84\uadf8
println("Available serial ports:");
println(Serial.list());
// \ub0b4 pc \uc5d0\ub294 Serial \ub0b4\ubd80 \uad6c\uc870\uc758 1\ubc88\uc5d0 com3\ub85c \uc5f0\uacb0\ub41c \uc544\ub450\uc774\ub178\uac00 \uc788\ub2e4.
port = new Serial(this, Serial.list()[1], 9600);
}
public void draw() {
if (button) {
background(255);
stroke(0);
} else {
background(0);
stroke(255);
}
fill(175);
rect(x,y,w,h);
}
public void mousePressed() {
if (mouseX > x && mouseX < x+w && mouseY > y && mouseY < y+h) {
button = !button;
}
if (button == true) {
// turn on led
port.write(255);
} else {
// turn off led
port.write(0);
}
}
static public void main(String args[]) {
PApplet.main(new String[] { "--bgcolor=#F0F0F0", "sketch_dec08a" });
}
}
PApplet을 상속받은 클래스를 하나 만들고, PApplet의 method를 override 하도록 되어 있다.
이렇게 만들어진 PApplet 을 바로 쓰면 애플릿으로 바로 쓸 수 있고,
main 메서드만 추가하면 어플리케이션처럼 쓸 수 있도록 짜 있다. 전형적인 어플 개방 방식을 쓰고 있다.
lib/core.jar 파일에 processing.core.JApplet 클래스가 존재한다. JApplet 클래스는 java.awt.Applet 을 상속하고, java.awt의 이벤트 계열 리스너와 쓰레드를 상속해서 쓰고 있다.
public class PApplet extends Applet implements PConstants, Runnable, MouseListener, MouseMotionListener, KeyListener, FocusListener {
...
}
...
}
lib/args.txt 파일을 보니, 클래스이름과 jar 파일 classpath가 적힌 것 같다.
lib/RXTXcomm.jar 파일을 살펴보니. gnu.io 패키지를 가지고 있다. serial 통신을 지원하는 library인데 정체가 무엇일까 하는 생각이 들었다. http://users.frii.com/jarvi/rxtx/ 웹 페이지에 자세한 설명이 있다. 이 라이브러리는 LGPL 라이선스 이고 java에서 사용할 수 있도록 만들어진 serial, parallel 통신 library이다.
이 페이지는 old 해졌고, http://rxtx.qbang.org/wiki/index.php/Main_Page 페이지가 최신 소개 페이지이다.
serial port 통신에 대한 얘기들과 예제들이 있다. java로 쉽게 개발할 수 있도록 고생하셨다. 짝짝~
생각보다 processing의 원리가 무척 간단하다는 생각이 들었다. 단순히 java 언어로 변환하고, library만 지원하는 구조가 아닌가 생각이 든다. 그래서 예술가들이 processing 언어를 쓰는 것 같다.
'아두이노' 카테고리의 다른 글
me2day 의 특정 글에 리플을 달면 램프 깜박이게 하기 (아두이노-이클립스-Serial RXTX 연동) (0) | 2011.12.16 |
---|---|
프로세싱(processing) + 이클립스(연동) (1) | 2011.12.12 |
[아두이노] 프로세싱 연동 - 어플에서 버튼을 누르면 불 깜빡거리게 하기 (0) | 2011.12.08 |
[아두이노] 프로세싱(Processing) 과 아두이노(arduino)를 연동해보기 (3) | 2011.12.08 |
아두이노 Arduino 1.0 Release (0) | 2011.12.02 |