아두이노프로세싱 프로그래밍

프로세싱 프로그램에 의한 아두이노 보드의 LED 제어

coding art 2016. 12. 27. 17:07
728x90

프로세싱에서 아두이노와 연결하여 데이터를 주고 받는 핸드 셰이킹 과정을 통해 프로세싱에서 실시간으로 아두이노 보드 상의 LED 스위치를 on OFF 하는 프로그램을 작성하기로 한다.
일반 웹프로그래밍에서 흔히 하는 버튼 형식의 프로그램이 아니라 프로세싱의 그래픽 화면을 좌우 흑백 영역으로 나누어 마우스의 위치 영역에 따라 on OFF가 이루어지게 된다.
이 프로그램은 웹에서 on OFF 버튼을 클릭하여 아두이노와 연결된 스위치 또는 LED를 on OFF하는 사물인터넷 프로그램과 유사한 프로그램이다.

아두이노 보드를 USB 커넥터에 의해 데스크 탑이나 노트 북에 연결한 다음 아두이노 스케치를 열어서 파일 탭 예제의 Firmata의 StandardFirmata를 로딩하여 일차적으로 컴파일하여 업로딩해야 한다. 이는 아두이노가 외부의 호스트 컴퓨터와 통신하기 위한 프로토콜을 준비하는 단계이다.





프로세싱에서 아두이노를 끌어들이기 위해서 다음의 두 가지 명령을 수행한다.
                   import processing.serial.*;
                   import cc.arduino.*;
                   Arduino arduino;

첫째 명령은 아두이노와 연결된 USB 커넥터를 통해 직렬통신을 통해 아두이노에서 실시간으로 생성되는 데이터를 끌어 들이기 위한 필수적인 명령이다.
두 번째 명령은 프로세싱 프로그램 내에서 아두이노의 디지털 데이터 핀들과 아날로그 데이터 핀들을 통제하기 위한 라이브러리를 호출하는 명령이다.
프로세싱 스케치 탭에서 라이브러리 추가하기 하단에 Arduino(Firmata) 가 편입 정의되어 있어야 한다.

 Arduino(Firmata)가 정의되어 있지 않은 경우 라이브러리 추가 명령을 집행하고 창이 뜨면 Filter 란에 Arduino를 타이핑하면 해당 라이브러리가 나타나면 선택 체크하고 install을 클릭한다. 약간의 시간이 소요된다.






ledPin=11은 아두이노 보드의 디지털 데이터 핀 번호를 뜻한다.프로세싱에서 size(400,400) 명령에 의하여 좌우 흑백 영역을 구성한다.
    int ledPin=11;
    void setup(){
      size(400,400);
                     background(0);
                     fill(255);

                     noStroke();rect(width/2,0,width/2,height);

                     println(Arduino.list());
                                 arduino = new Arduino(this,Arduino.list()[2],57600);
                                 arduino.pinMode(ledPin,Arduino.OUTPUT);
                               }
프린트라인(println) 명령이 수행되면 프로세싱 하단 모니터링 창에 사용되고 있는 COM 포트들이 인쇄된다. 

그 내용은 COM1 COM2 COM8 이다.

이들은 제어판의 장치 관리자에서 체크해 보면 통신포트 하나와 프린터 포트 그리고 아두이노와 USB 커넥터로 연결된 포트를 나타낸다.


그 다음의 아두이노 new 명령문 줄에서 Arduino.list()[2]는 상기 3개의 포트 중에서 COM8를 의미하게 된다. 즉 COM 포트 넘버링은 반드시 0,1,2 순서에 따름에 유의하자.
이 부분에 관해서는 아두이노 스케치의 탭 툴에서 보드 지정과 포트 지정에서 확인해야 할 필요가 있다.
세 번째 명령의 의미는 프로세싱에서 아두이노 명령을 직접 수행하기 위해서는 이미 라이브러리 처리가 되었듯이 Arduino.+아두이노 명령(pinMode) 형식으로 처리된다. 출력도 마찬가지로 Arduino.OUTPUT으로 선언된다.

아두이노에서는 기본적인 프로그램 구성이 void setup(){ }과 void loop(){ } 구조로 이루어지나 프로세싱은 그래픽 중심인 관계로 void setup(){ }은 동일하나 void loop(){ } 대신 void draw(){ } 구조로 대체된다. 그 역할에 큰 차이는 없어 보인다.

                 void mouseMoved(){
                       if(mouseX<width/2){
                       arduino.digitalWrite(ledPin,Arduino.LOW);
                       }else{
                       arduino.digitalWrite(ledPin,Arduino.HIGH);
                 }
마지막 명령문mouseMoved는 마우스의 움직임을 감지하는 루틴이다. 마우스의 위치가 흑배 창의 왼쪽 즉 (mouseX<width/2)이라면 아두이노 보드에 설치된 LED 출력이 LOW 즉 소등된다. 그렇지 않으면 LED 출력이 on 이 된다. 한편 아두이노 보드에 설치된 LED는 반드시 330옴 저항과 직렬 연결하여 한쪽은 GND에 다른 한쪽은 디지털 데이터 핀에 연결해둬야 한다. 디지털 데이터 핀이 여럿 있으므로 프로그램 중간에서 지정하였듯이 반드시 11번 핀임을 배선 확인하기 바란다.

프로세싱에서 직접 아두이노의 데이턴핀을 제어할 수 있는 장점이 있으나 복잡한 프로그래밍 환경하에서는 아두이노 자체가 여러 가지 라이브러리들을 불러들여야 할 경우 본 프로그래밍 기법은 적용하기 어렵다는 점을 지적해 둔다.

Processing_graph_led_01



int ScreenWidth = 400, ScreenHeight=400;

import processing.serial.*;
import cc.arduino.*;

Arduino arduino;


int ledPin=11;


void setup(){
    size(400,400);
    background(1000);
    fill(255);
    noStroke();rect(width/2,0,width/2,height);
   
    println(Arduino.list());
    arduino = new Arduino(this,Arduino.list()[2],57600);
    arduino.pinMode(ledPin,Arduino.OUTPUT);
   
}

void draw(){
   
}

void mouseMoved(){
  if(mouseX<width/2){
    arduino.digitalWrite(ledPin,Arduino.LOW);
  }else{
    arduino.digitalWrite(ledPin,Arduino.HIGH);
  }
}//end of program