아두이노 코딩-50: Processing 프로그램에 의한 아두이노 보드의 LED 제어

in #kr6 years ago (edited)

Processing은 예능(Art)분야를 지원하기 위해 강력한 그래픽을 지원하는 특이한 C/C++ 기반의 소프트웨어로서 예능 분야 사람들이 컴퓨터 배선 및 코딩을 지원하도록 하는 아두이노 보드의 출현과 어떤 점에서는 맥락을 같이한다.

noname01.png

오픈소스로 유명했던 1990년대의 OPENGL의 개발 연속 상에 있는 소프트웨어로서 그 성능이 뛰어난 편이며 사용법을 익히면 대단히 유익할 것이다. 한 가지 특징은 이 프로세싱(Processing) 프로그램은 아두이노에서 동작하는 프로그램이 아니라 PC 본체에서 실행되며, 중요한 점은 USB 케이블 시리얼 인터페이스를 통해 아두이노와 통신을 할 수 있다는 점이다. 간단하게 풀어 말하자면 유선 시리얼 통신 기반으로 사물인터넷 제어 프로그램을 구현할 수 있다는 점이다. 아울러 프로세싱은 일반 소프트웨어 체계에서 키보드를 통해 타자를 치면 입력할 수 있는 그런 시스템이 아예 없으며 단지 마우스를 이용하여 비틀던지 던지든지 찍어 누르던지 하여 여하간 입력을 받아들일 수 있도록 되어 있다는 점이다.

프로세싱에서 아두이노와 연결하여 데이터를 주고받는 핸드 셰이킹 과정을 통해 프로세싱에서 실시간으로 아두이노 보드 상의 LED를 ON OFF 하는 코드를 작성하기로 한다.

처음에는 아두이노와 윈도우즈 수준의 PC와의 통신이라는 점에서 뭔가 특별한 드라이버 설치 문제가 있지 않을까 하는 우려도 있었다. 하지만 이 프로세싱 프로그램 실행을 위해서는 단지
www.processing.org 사이트로부터 편집기만 다운 받아 설치하면 그만이다.

일반 웹프로그래밍에서 흔히 하는 버튼 형식의 프로그램이 아니라 프로세싱의 그래픽 화면을 좌우 흑백 영역으로 나누어 마우스의 위치 영역에 따라 ON 할 것인지 OFF 할 것인지 사용자의 선택이 이루어지게 된다.

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

프로세싱 프로그램을 준비하기 이전에 우선 예제 프로그램에서 StandardFirmata를 불러들인 후 컴파일하고 업 로딩 하도록 한다. 이 프로그램은 다양한 종류의 호스트 PC와 연동하여 실행될 수 있도록 코드가 작성되어 그 내용이 복잡하고 길이 또한 길다. 하지만 아두이노 LED코딩을 위해서는 단순히 컴파일하여 업로딩 하면 된다.

noname02.png

프로세싱에서 아두이노를 좀비처럼 사용할 수 있도록 하기 위해서는 헤더 영역에 다음의 세 가지 명령을 수행한다.

import processing.serial.;
import cc.arduino.
;
Arduino arduino;

import 란 명령어는 아두이노에서 include 에 해당하는 바 파이선 코딩에서 라이브러리 즉 모듈을 불러들이는 익숙한 명령어 이기도 하다.

첫째 명령은 아두이노와 연결된 USB-2-Serial 커넥터를 통해 시리얼 통신에 의해 아두이노에서 실시간으로 생성되는 데이터를 받기 위한 필수적인 명령이다.

두 번째 명령은 Processing 코드 내에서 아두이노의 디지털 데이터 핀들과 아날로그 데이터 핀들을 통제하기 위한 라이브러리를 호출하는 명령이다.

한편 프로세싱 스케치 탭에서 내부 라이브러리의 라이브러리 추가하기 하단에 Arduino(Firmata) 가 편입 정의되어 있어야 한다. Arduino(Firmata)가 정의되어 있지 않은 경우 라이브러리 추가하기를 실행하자.
영문버전일 경우에는 메뉴의 import Library에서 Add Library...을 통해 라이브러리 추가 작업을 하도록 한다.

noname09.png

창이 뜨면 Filter 란에 Arduino를 타이핑하여 Arduino(Firmata) 라이브러리가 나타나면 선택 체크하고 install을 클릭한다. 약간의 시간이 소요된다.

noname03.png

라이브러리 추가 작업이 끝난 후 다시 살펴 보면 Arduino(Firmata)가 설치되어 있음을 알 수 있다.

noname04.png

윈도우즈 PC에서 USB 케이블에 의한 시리얼 통신에 의해 아두이노 보드에 설치된 LED를 ON OFF 제어하기 위한 코드를 작성해 보자.

noname05.png

ledPin = 11은 아두이노 보드에 LED가 설치되어 있는 디지털 데이터 핀 번호를 뜻한다.

cc.arduino.*에 의해 아두이노 라이브러리가 설치되면 아두이노 자체 명령어와 구분하여 프로세싱에서 쓰게되는 arduino를 구분하여 쓸 수 있도록 개별 명령어 앞에 붙일 arduino 즉 클라스 명령을 선언한다.

Processing에서 size(400,400) 명령에 의하여 좌우 흑백 영역으로구성된 스크린 창을 구성한다.

noname06.png

background(0)은 스크린 왼쪽을 검은 배경색으로 설정한다. background(255)는 백색이며 background(1000)은 청색이다.
이렇게 배경색을 바꾸어도 프로그램 실행에 별 문제는 없다.

println 명령이 수행되면 프로세싱 하단 모니터링용 검은 색 콘솔 창에 현재 점유하여 사용되고 있는 COM 포트들이 인쇄된다. 이들을 제어판의 장치 관리자에서 체크해 보면 통신포트 하나와 프린터 포트 그리고 아두이노와 USB 커넥터로 연결된 포트를 나타내고 있다.

noname07.png

그 다음의 아두이노 new 명령문 줄에서 Arduino.list()[2]는 상기 출력된 3개의 포트 중에서 COM17을 의미하게 된다. 즉 COM 포트 넘버링은 반드시 0,1,2 순서에 따름에 유의하자.
이 부분에 관해서는 아두이노 스케치의 탭 툴에서도 보드 지정과 포트 지정에서 확인하여 일치시켜야 할 필요가 있다. 초기에 Procesing을 접하면 잘 이해하기 힘든 부분이 바로 이런 것들이므로 좀 더 익숙해져야 할 필요가 있다.

통신속도 57600 설정은 아두이노 프로그램에서의 Firmata.begin(57600); 설정과 일부러 일치시키도록 한다.

뒤따르는 명령들의 의미는 프로세싱에서 아두이노 명령을 직접 수행하기 위해서 이미 프로그램 초반에서 선언되었듯이 Arduino. + 아두이노 명령(pinMode) 형식으로 처리된다. 출력도 마찬가지로 Arduino.OUTPUT으로 선언된다.

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

마지막 루틴 mouseMoved는 마우스의 움직임을 감지하는 루틴이다. 마우스의 위치가 흑백 창의 왼쪽 즉 (mouseX<width/2)이라면 아두이노 보드에 설치된 LED 출력이 LOW 즉 소등된다. 그렇지 않으면 LED 출력이 ON 이 된다.

한편 아두이노 보드에 설치된 LED는 반드시 전류제한 저항 220Ω옴 저항과 직렬 연결하여 한쪽은 GND에 다른 한쪽은 디지털 데이터 핀에 연결해둬야 한다. 디지털 데이터 핀이 여럿 있으므로 반드시 11번 핀임을 배선 확인하기 바란다.

Processing에서 직접 아두이노의 데이터 핀을 직접 제어할 수 있는 장점이 있으나 아두이노 자체가 여러 가지 라이브러리들을 불러들여야 하는 복잡한 코딩 환경 하에서는 본 프로그래밍 기법은 적용하기 어려울 수도 있다는 점을 지적해 둔다. 필요하다면 StandardFirmata 코딩 구조를 그대로 유지하면서 사용자가 필요로 하는 루틴을 추가한 후 코드를 시험해볼 필요가 있다.

Processing 자체적으로도 상당한 기능들이 있기 때문에 앞으로 몇 개의 예제를 포스팅할 계획이다.

noname08.png

//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

Sort:  

짱짱맨 호출에 출동했습니다!!

Coin Marketplace

STEEM 0.18
TRX 0.16
JST 0.030
BTC 65921.21
ETH 2622.37
USDT 1.00
SBD 2.69