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

Processing 클라이언트에 의한 이더넷 보드의 HTTP LED analogWrite 제어

coding art 2018. 7. 8. 13:40
728x90

______________________________________________________________________________________________________________________________




HTTP 제어에 있어서  두 가지 방법이 가능하다. 하나는 무선 공유기에 의한 와이파이 제어가 가능하며 반면에 두번째로는 유선 방식의 이더넷 제어도 가능하다. WeMos 와이파이 보드를 사용하여 LED 의 밝기를 아날로그 방식으로 제어하여 본 결과 ESP8266 의 처리 속도 한게로 인하여 4.8초 단위로 LED 밝기를 불연속적으로 제어할 수 있었다. 로봇 댄스를 슬로우 비데오로 보는 듯한 느김의 속도감이다. Processing 클라이언트 코드를 사용한 무선 WiFi 방식에 의한 WeMos 보드의 LED 제어는 이미 아래 사이트에서 시현이 되었으므로 참고하기 바란다.

https://steemit.com/kr/@codingart/80-processing-http-led-analogwrite



이번 블로그에서는 Processing 클라이언트는 동일한 코드를 사용하되 원격으로 아두이노 이더넷 보드에 설치된 빨간색 소형 LED를 anlogWrite() 명령을 사용하여 제어하도록 하자. LED 설치 위치는 아두이노 우노 보드의 핀 다이아그램에서 PWM 이 가능한 즉 물결(“∼”) 표시가 있는 핀으로 한다. 예를 들어 핀 번호 2번은 analogWrite() 명령을 실행해도 아무런 효과 없으며 단순한 on OFF 가 가능할 따름이다. 따라서 3번 핀에 LED를 설치하기로 한다.

아울러 클라이언트 웹서버간의 적절한 통신시간지연을 경험적으로 설정해야 한다. 이미 ThingSpeak 응용에서도 HTTP 방식으로 클라이언트가 하나의 데이터를 보내는데 적어도 수초 정도의 시간이 소요되며 WeMos 보드와의 와이파이 통신에서도 약 4800 msec 가 소요되었다. 하지만 이더넷 통신에 있어서는 다른 코드 내용은 동일하지만 반응 시간에서 변화가 예상된다. 어쨌든 이 통신시간지연이 너무 짧은 경우 Processing의 명암진 색상 화면 스캔하는 속도와 이더넷이 설치된 아두이노 보드의 시리얼 모니터 반응이 불균형을 이루어 통신이 제대로 되는지 않되는지 파악하기가 어려워진다.
 
한편 이번 블로그에서는 HTTP 프로토콜을 사용함에 있어서 PC상에서 명암진(Gradient) Processing  화면을 생성한 후 마우스를 스캔하여 얻어지는 0∼512 범위의 마우스의 위치 값을 2로 나누어  0∼256 범위로 만든 후 적절한 속도로 이더넷(ethernet) 보드로 송신하자. 아울러 이더넷 보드와 PC Processing 코드 사이의 HTTP 통신 속도를 파악하기 위해서 millis() 명령을 사용하는 특별한 코딩을 추가 사용한다.



헤더 영역에서 와이파이 지원을 위해 processing.net 라이브러리를 불러 오고 Client 의 클라스 명령 접두어를 간단하게 c 로 정의한다.



setup()에서 그래픽 화면 크기를 가로 512 세로 400으로 정의한다. background(255)는 흰색 바탕을 뜻한다. for looping을 i=0에서 511까지 돌려 수직선을 그래픽 화면 상단 즉 (i,0)에서 아래쪽으로 (i,150)까지 긋는다. 이때 stroke(255,i/2,i/2) 는 붉은 색으로서  i = 511이 되면 stroke(255,255,255) 는 RGB  빛의 합성이므로 백색이 된다. 즉 왼쪽은 순수 100% 진한 빨간색이고 오른쪽은 백색이며 그 사이는 점차 색이 옅어지는 gradient 가 된다.

한편 빨갛게 명암진 그래픽 화면에서 0∼512사이의 현재 마우스 위치 값을 스캔하여 그래픽 화면 하단 영역에서 띠 형태로 스캔 색상 변화를 표사한다.

HTTP 통신 시간지연 요소는 웹서버 클라이언트 실행을 통해 조사해본 결과 Processing 측에서 30 msec 가 적절한 값으로 얻어졌다. 이에 상응한 아두이노 이더넷 쉴드에서 소요되는 시간은 40∼45 msec 정도이다.  이 시간 지연 값이 적절하다면 정확하게 LED 의 밝기를 조절할 수 있게 된다.

다음 동영상을 통해 analogWrite() 명령에 의한 LED 의 밝기 변화를 관찰해 보도록 한다.

https://youtu.be/CON3kVCqnx4


//Client_analogWrite_long_LED_01



Client c;

void setup() {
size(512, 400);
background(255);
 for (int i = 0; i < 512; i++) {
 stroke(255,i/2,i/2);
 line(i, 0, i, 300);
 }
}

void draw() {
   c = new Client(this, "192.168.0.11", 80);
   int x = mouseX/2;
   String s = "";
   s += "GET /";
   if( x < 10 ) {
     s += "0";s += "0";
     s += str(x);
   }
   else if( x >= 10 && x < 100 ) {
     s += "0";
     s += str(x);
   }
   else if( x >= 100 ) {
     s += str(x);
   }
   else  {
   }
   s += "  HTTP/1.0\r\n";
   c.write(s);
   c.write("\r\n");

   for (int i = 0; i < 512; i++) {
    stroke(255,x,x);
    line(i, 300, i, 400);
   }
   delay(30);
}//End

//Webserver_ethernet_analogWrite_from_Processing_01


#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
byte ip[] = { 192, 168, 0, 11 }; // fixed IP addr in LAN

EthernetServer server(80); //server port
String readString;
int ledPin = 3;
 long current_Millis = 0;
 long previous_Millis = 0;
 long del_T = 0;
 
void setup(){
  pinMode(ledPin, OUTPUT); //pin selected to control LED
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.begin(9600);
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}

void loop(){
EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (readString.length() < 100) {
          readString += c;
        }
  if (c == '\n') {
       current_Millis = millis();
       del_T =current_Millis - previous_Millis;
       previous_Millis = current_Millis;
       Serial.println(readString); //print input buffer
       String result = readString.substring(5,8);
       int brightness = result.toInt();
       Serial.println(brightness);
       Serial.println(del_T);
       analogWrite(ledPin, brightness);
    delay(1);
client.stop();
    readString=""; //clear string for next read
    }//if (c == '\n')
      }//if (client.available())
    }//while (client.connected())
  }// if (client)
}//끝