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

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

coding art 2017. 5. 8. 22:24
728x90

초보자를 위한 “프로세싱과 아두이노의 통신에 의한 LED bar graph 제어 예제”  ( http://blog.daum.net/ejleep1/392 ) 에서 프로세싱에서 8비트 즉 한 바이트 데이타를 시리얼 포트에 .write() 함으로 인해서 아두이노에서는 시리얼 버퍼를 체크하여 전송된 데이터를 받아 LED를 제어 하였다.
이러한 코딩 기법 외에도 Firmata 기법에 의해서 프로세싱 코드가 직접 아두이노의 LED를 on OFF 제어하는 기법을 예전에 게재했었다.

“프로세싱 프로그램에 의한 아두이노 보드의 LED 제어”  http://blog.daum.net/ejleep1/296

이 Firmata  코딩 방식은 단순히 LED를 on OFF 하는 경우에는 모르겠지만 로봇이나 카메라 응용 시 부착된 서보 모터를 직접 PC에서 프로세싱 제어 코드에 의해 아두이노 보드에 설치된 LED 든 서보 모터든 직접 제어할 수 있는 이점이 있다.

이번 예제에서는 10개의 LED 중 LED를 2개 단위로 on OFF 하도록 코딩을 작성해 보기로 한다. 그렇게 되면 첫째와 마지막인 10번째 LED는 홀로 켜지게 될 수도 있다.
아울러 통신 속도 설정은 아두이노의 Standard Firmata를 조사해 보면 Serial.begin()과 유사하게 Firmata.begin()이 있어서 57600으로 설정되어 있다. 따라서 이 통신 속도는 변경하지 않는 것이 좋을 듯하다. 따라서 프로세싱 코드에서도 57600으로 설정하기로 한다.

10개의 LED를 지정하기 위한 수는 프로세싱에서 size(256,150) 그래픽 화면을 그대로 사용하기로 하자. 25로 나누어 주고 +1을 하면 1∼10까지의 LED 번호를 지정할 수 있다. 

이 프로그램은 웹에서 on OFF 버튼을 클릭하여 아두이노와 연결된 스위치 또는 LED를 on OFF 하는 사물인터넷 프로그램과 비교해 보면 무려 10개의 디바이스를 on OFF 할 수 있는 대단한(?) 제어 코드로 볼 수 있다.

아두이노 보드를 USB 커넥터에 의해 데스크 탑이나 노트북에 연결한 다음 아두이노 스케치를 열어서 파일 탭 예제의 Firmata의 StandardFirmata를 로딩하여 일차적으로 컴파일하여 업로딩 한다. 이는 아두이노가 외부의 호스트 컴퓨터와 통신하기 위한 프로토콜을 준비하는 단계이다. 말 그대로 표준이므로 아무것도 변경하지 않도록 주의한다. 실제 필요한 코드는 프로세싱 측에서 작성하면 된다.

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

한편 프로세싱 프로그램에서 import 명령은 아두이노의 include 와 마찬가지로서 라이브러리를 불러들이는 역할을 한다. 프로세싱에서 아두이노를 끌어들이기 위해서 다음의 네 가지 명령을 수행한다.


    import org.firmata.*;
    import processing.serial.*;
    import cc.arduino.*;
    Arduino arduino;
 
첫째 명령은 아래에 상세하게 기술되고 있는 라이브러리 추가 과정을 거치면 자동적으로 설치된다.
두 번째 명령은 아두이노와 연결된 USB-2-시리얼 커넥터를 통해 시리얼 통신에 의해 아두이노에서 실시간으로 생성되는 데이터를 받아들이기 위한 필수적인 명령이다.
세 번째 명령은 프로세싱 프로그램 코드 내에서 아두이노의 디지털 데이터 핀들과 아날로그 데이터 핀들을 통제하기 위한 라이브러리를 호출하는 명령이다.
네 번째는 프로세싱에서 아두이노 명령이었던 pinMode(), digitalWrite()을 직접 사용하기 위한 일종의 class 형 명령에 해당한다.

다음의 내용은 이미 “프로세싱 프로그램에 의한 아두이노 보드의 LED 제어” 에서 한번 설명이 이루어졌음을 참고하기 바란다. 내용이 거의 동일하지만 지난번 예제를 하지 않은 상태에서 직접 도전하는 분들이 있을 수 있으므로 다시 요약 기술하기로 한다.


StandardFirmata에 의해 프로세싱 코드를 작성하려면 프로세싱 스케치 탭에서 라이브러리 추가하기 하단에 Arduino(Firmata) 가 반드시 편입 정의되어 있어야 한다.

Arduino(Firmata)가 정의되어 있지 않은 경우 라이브러리 추가하기 작업이 필요하다.
 


오랜 기간 동안 쓰지 않다가 확인해 보면 사라져 있을 수 있으니 그때 그때 확인해보고 추가하기 바란다. 만약 이미 추가가 된 상태로 확인되면 import org.firmata.*; 가 자동적으로 삽입 될 수도 있다. 필자의 경우 두 번째이므로 이 첫 번째 명령이 자동으로 삽입 처리되었다.



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





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

음을 확인 할 수 있다.






그래픽 화면 크기는 (256,150)으로 설정한다. 아울러 시리얼 통신 포트 정의에서 통신 속도는 StandardFirmata 에서 설정했던 57600을 그대로 사용한다. for loop에서 1∼10번 디지털 핀들에 대해서 출력 모드를 설정한다.




아두이노의 loop()에 해당하는 draw()를 작성하자.

for loop에 의해 0∼255까지의 범위에 대해 수직선을 그어


흑백 명암이 진 그래픽 화면을 작성한다.

25로 나누고 +1을 해 주면 1∼10가지의 LED 번호에 해당하는 인덱스 변수ledPin_x 를 얻을 수 있다.


ledPin_x 에 해당하는 디지털 핀 번호의 LED를 on 하며 아울러 이 ledPin_x 가 9 미만이면 ledPin_x + 1에 해당하는 바로 인접한 LED까지를 on 시킨다. delay(50) 후 on 된 LED들을 OFF 시키다. 이렇게 한 싸이클이 끝나면 계속 무한 loop를 돌게 된다.


하지만 그래픽 화면에서 마우스를 좌우로 이동 시키면 지속적

으로 ledPin_x 값이 변동되어 LED 가 2개 씩 단위로 움직이면서 점멸하게 된다.


첨부된 동영상을 참조하기 바란다.

프로세싱에 의한 제어 기법은 NodeMCU 와이파이 웹서버 코딩에 의한 제어와 비교해보면 코딩은 대단히 단순하면서도 제어 성능은 스피드 측면에서 엄청나다고 볼 수 있다.






Processing_barGraph_LED_ON_01


import org.firmata.*;
import processing.serial.*;
import cc.arduino.*;
Arduino arduino;


void setup(){
    size(256,150);
      println(Arduino.list());
      arduino = new Arduino(this,Arduino.list()[2],57600);
     
      for( int i = 1 ; i<11 ; i++ )  {
      arduino.pinMode(i,Arduino.OUTPUT);
      }
}

void draw(){
   for (int i = 0; i < 256; i++) {
   stroke(i);
   line(i, 0, i, 150);
   }
    
   int ledPin_x = mouseX/25 + 1;

     arduino.digitalWrite(ledPin_x,Arduino.HIGH);
   if( ledPin_x < 9 ) {
     arduino.digitalWrite(ledPin_x+1,Arduino.HIGH);
   }
   delay(50);
   arduino.digitalWrite(ledPin_x,Arduino.LOW);
   if( ledPin_x < 9 ) {
     arduino.digitalWrite(ledPin_x+1,Arduino.LOW);
   }
   delay(50);
}// End of Coding