Processing 클라이언트에 의한 Ethernet 웹서버 Red & Blue LED analogWrite 밝기 제어

in #kr6 years ago (edited)

noname01.png
이더넷 쉴드가 설치된 아두이노 우노 보드에 설치된 2개의 LED 즉 Red LED 와 Blue LED의 밝기를 연속적으로 제어하여 보자. Dimmering 또는 Fading 이라고도 한다. 물론 LED를 아날로그적으로 밝기를 조절하는 정도이지만 실제 응용에서는 서보 모터나 스텝 모터를 0∼256까지의 해상도로 제어할 수도 있는 있을 것이다.

이더넷 쉴드가 설치된 아두이노 우노 보드에서 아래처럼 LED를 배선하자.
noname02.png

이 베선에서 주의할 점은 analogWrite 명령을 실행시키기 위해서는 LED가 PWM 이 가능한 핀 즉 아두이노 우노의 핀 다이아그램에서 물결 표시 “∼”가 있는 핀을 선택해야 한다. 아울러 analogWrite 명령에 따른 LED 의 밝기 변화를 보려면 Red 와 Blue 가 밝기 변화가 뚜렷한 반면에 Green이나 Yellow 는 밝기가 상대적으로 약하다.

LED 1개를 이더넷을 통래 밝기를 제어하는 코딩 문제와 본질적인 차이는 없으나 LED 가 2개이므로 Processing 코드에 의한 디지털 제어라는 측면에서 경우의 수를 정확히 따져서 여 코드를 수정하도록 하자.

noname03.png

Processing 그래픽 화면에서 입력 방법을 고려해 보자. 그래픽 스크린을 size(512, 400)으로 설정하자. 실제로 x축 방향으로 256 크기의 그래픽 화면을 선택하면 크기가 너무 작으므로 아예 512 크기의 스크린에서 얻어지는 mouseX 의 값을 2로 나누어 x 값으로 사용하자.
y축 방향으로는 0< mouseY< 150을 Red, 150< mouseY< 300을 Blue 영역으로 설정한다.
2개의 직사각형 영역이 설정되면 수평으로 스캔할 때에 x 값과 y축 값이 연속적으로 얻어진다.
300< mouseY< 400 영역은 Red 또는 Blue 색상이 결정된 상태에서 현재 스캔된 0∼256 색상 값을 보여주게 된다.

x축 값은 analogWrite 명령의 밝기 값 변수가 되며 y축 값 범위에 따라 Red 인지 Blue 인지 즉 문자 “R” 또는 “B”인지 결정한다.

3자리 정수 값으로 처리한 밝기 데이터와 “R” 또는 “B” 에 해당하는 문자 데이터를 사용하여 url 주소를 통해 GET 방식으로 전달하기 위한 문자열을 준비한다. 다음과 같은 형식이 될 것이다.
GET /###R HTTP/1.0 또는 GET /###B HTTP/1.0

이러한 문자열 데이터가 이더넷을 타고 아두이노 입력버퍼에 수신되면 일단 문자열 변수 readString에 읽은 후에 다음과 같은 방법으로 숫자 데이터와 문자 데이터를 추려낼 수 있다.
String result = readString.substring(5,8);
if( readString.indexOf(“R”) != -1) { ...
if( readString.indexOf(“B”) != -1) { ...

substring(5,8)은 정확하게 6째자리부터 8째자리까지의 문자 데이터를 추려내는 명령이다. 반면에 indexOf(“X”) 명령을 사용할 경우에는 HTTP 통신 내용 중에 문자나 문자열 X 와 중복되는 내용이 있는지 없는지 확인해 보아야 한다.

아울러 이더넷 통신은 속도가 대단히 빨라 Processing HTTP 통신을 연결 후 가질 수 있는 시간 지연 문제는 없으므로 Processing에서 적절하게 40 msec 로 부여한다. NodeMCU/WeMos 와 같은 무선 와이파이 통신에서는 처리 속도 영향이 수초에 달함에 유의하자.

아울러 반드시 두 LED의 밝기 값을 0을 주어 끈 후 indexOF 명령에 의해 R인지 B인지 판단 후 LED를 analogWrite 하도록 하자.

동영상을 통해 Red LED 와 Blue LED 의 밝기 조절을 관찰해 보자.

//Client_analogWrite_R_G_LED_01

//Webserver_ethernet_LED_analogWrite_R_G_from_Processing_01
Processing 의 HTTP 기능을 사용하여 이더넷 쉴드가 설치된 아두이노 우노 보드에 설치된 2개의 LED 즉 Red LED 와 Blue LED의 밝기를 연속적으로 제어하여 보자. Dimmering 또는 Fading 이라고도 한다. 물론 LED를 아날로그적으로 밝기를 조절하는 정도이지만 실제 응용에서는 서보 모터나 스텝 모터를 0∼256까지의 해상도로 제어할 수도 있는 있을 것이다.

이더넷 쉴드가 설치된 아두이노 우노 보드에서 아래처럼 LED를 배선하자.

이 베선에서 주의할 점은 analogWrite 명령을 실행시키기 위해서는 LED가 PWM 이 가능한 핀 즉 아두이노 우노의 핀 다이아그램에서 물결 표시 “∼”가 있는 핀을 선택해야 한다. 아울러 analogWrite 명령에 따른 LED 의 밝기 변화를 보려면 Red 와 Blue 가 밝기 변화가 뚜렷한 반면에 Green이나 Yellow 는 밝기가 상대적으로 약하다.

LED 1개를 이더넷을 통래 밝기를 제어하는 코딩 문제와 본질적인 차이는 없으나 LED 가 2개이므로 Processing 코드에 의한 디지털 제어라는 측면에서 경우의 수를 정확히 따져서 여 코드를 수정하도록 하자.

Processing 그래픽 화면에서 입력 방법을 고려해 보자. 그래픽 스크린을 size(512, 400)으로 설정하자. 실제로 x축 방향으로 256 크기의 그래픽 화면을 선택하면 크기가 너무 작으므로 아예 512 크기의 스크린에서 얻어지는 mouseX 의 값을 2로 나누어 x 값으로 사용하자.
y축 방향으로는 0< mouseY< 150을 Red, 150< mouseY< 300을 Blue 영역으로 설정한다.
2개의 직사각형 영역이 설정되면 수평으로 스캔할 때에 x 값과 y축 값이 연속적으로 얻어진다.
300< mouseY< 400 영역은 Red 또는 Blue 색상이 결정된 상태에서 현재 스캔된 0∼256 색상 값을 보여주게 된다.

x축 값은 analogWrite 명령의 밝기 값 변수가 되며 y축 값 범위에 따라 Red 인지 Blue 인지 즉 문자 “R” 또는 “B”인지 결정한다.

3자리 정수 값으로 처리한 밝기 데이터와 “R” 또는 “B” 에 해당하는 문자 데이터를 사용하여 url 주소를 통해 GET 방식으로 전달하기 위한 문자열을 준비한다. 다음과 같은 형식이 될 것이다.
GET /###R HTTP/1.0 또는 GET /###B HTTP/1.0

이러한 문자열 데이터가 이더넷을 타고 아두이노 입력버퍼에 수신되면 일단 문자열 변수 readString에 읽은 후에 다음과 같은 방법으로 숫자 데이터와 문자 데이터를 추려낼 수 있다.
String result = readString.substring(5,8);
if( readString.indexOf(“R”) != -1) { ...
if( readString.indexOf(“B”) != -1) { ...

substring(5,8)은 정확하게 6째자리부터 8째자리까지의 문자 데이터를 추려내는 명령이다. 반면에 indexOf(“X”) 명령을 사용할 경우에는 HTTP 통신 내용 중에 문자나 문자열 X 와 중복되는 내용이 있는지 없는지 확인해 보아야 한다.

아울러 이더넷 통신은 속도가 대단히 빨라 Processing HTTP 통신을 연결 후 가질 수 있는 시간 지연 문제는 없으므로 Processing에서 적절하게 40 msec 로 부여한다. NodeMCU/WeMos 와 같은 무선 와이파이 통신에서는 처리 속도 영향이 수초에 달함에 유의하자.

아울러 반드시 두 LED의 밝기 값을 0을 주어 끈 후 indexOF 명령에 의해 R인지 B인지 판단 후 LED를 analogWrite 하도록 하자.

동영상을 통해 Red LED 와 Blue LED 의 밝기 조절을 관찰해 보자.

//Client_analogWrite_R_G_LED_01
import processing.net.*;
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, 150);
stroke(i/2,i/2,255);
line(i, 150, i, 300);
}
}

void draw() {
c = new Client(this, "192.168.0.11", 80);
int x = mouseX/2;
int y = mouseY;
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 {
}

if( y <150 ) {
s += "R";
}
if( y>150 && y<300 ) {
s += "B";
}
s += " HTTP/1.0\r\n";
c.write(s);
c.write("\r\n");

for (int i = 0; i < 512; i++) {
if( y <150 ) {
stroke(255,x,x);
}
if( y>150 && y<300 ) {
stroke(x,x,255);
}
line(i, 300, i, 400);
}
delay(40);
}//End

//Webserver_ethernet_LED_analogWrite_R_G_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 red_Pin = 3;
int blue_Pin = 5;
long current_Millis = 0;
long previous_Millis = 0;
long del_T = 0;

void setup(){
pinMode(red_Pin, OUTPUT);
pinMode(green_Pin, OUTPUT);
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(red_Pin, 0);
   analogWrite(blue_Pin, 0);
   if ( readString.indexOf("R") != -1)  {
     analogWrite(red_Pin, brightness);
   }
   if ( readString.indexOf("B") != -1)  {
     analogWrite(blue_Pin, brightness);
   }
delay(1);
client.stop();
readString=""; //clear string for next read
}//if (c == '\n') 
  }//if (client.available()) 
}//while (client.connected()) 

}// if (client)
}//끝

Sort:  

(jjangjjangman 태그 사용시 댓글을 남깁니다.)
[제 0회 짱짱맨배 42일장]3주차 보상글추천, 1,2주차 보상지급을 발표합니다.(계속 리스팅 할 예정)
https://steemit.com/kr/@virus707/0-42-3-1-2

3주차에 도전하세요

그리고 즐거운 스티밋하세요!

pairplay 가 kr-dev 컨텐츠를 응원합니다! :)

Coin Marketplace

STEEM 0.18
TRX 0.13
JST 0.028
BTC 64275.79
ETH 3156.57
USDT 1.00
SBD 2.56