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

Processing(프로세싱) 와이파이에 의한 아두이노 weMos 보드의 LED ON OFF 코딩

coding art 2018. 3. 31. 18:45
728x90

이 한권의 책으로 아두이노 엘렉트로닉스 코딩에서 시작하여 와이파이 코딩을 넘어 흥미로운 앱인벤터 코딩으로 넘어가보자. 특별한 컴퓨터 과학의 지식이 없어도 누구든지 코딩의 세계로 초대 받을 수 있습니다. 교보문고에서 판매 중입니다.


__________________________________________________________________________________________________________________________________

본문 시작


1년 하고도 2개월 전에 Standard Firmata 가 설치된 아두이노 우노 보드를 사용하여 USB 케이블로  PC에 연결한 상태에서 mouseMoved() 명령을 사용하는 Processing(프로세싱) 코드를 사용하여 유선으로 아두이노 빵판에 설치한 LED를 운 좋게 on OFF 할 수 있어 오늘의 이 블로그를 형성하게 되었던 아래의 작품을 기억해 본다.



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


1년 반의 기간 동안에 무선 wifi 또는 블루투스에 의한 방법으로 많은 종류의 코딩을 완성하였지만 지금까지 해결하지 못했던 프로세싱 코드에 의해서도  와이파이 사용이 가능하도록 아두이노 weMos 보드의 붙박이 LED를 on OFF 할 수 있는 코드를 선보이도록 한다.
이번 코딩은 아래의 Processing 싸이트를 참조하였다.



아두이노 호환 NodeMCU  보드나 weMos 보드는 무선 wifi  통신이 가능한 ESP8266 ESP-12E  칩 모듈이 장착되어 있어 ESP8266WiFi.h 라이브러리를 사용하여 웹서버 코딩이 가능하다. 웹서버 코딩이란 외부와의 유무선 통신이 가능한 아두이노 보드를 서버로 하여 외부의 클라이언트 즉 스마트폰이나 패드 컴퓨터, 앱 인벤터 또는 무선 공유기가 설치되어 있는 데스크 톱PC 의 웹에서 아두이노 서버 코드를 다운하여 입력을 가능케 하는 코드이다.
2017년 1월 10일자로 본 블로그에 게재되었던 아래의 예제를 참조하기 바란다.


   ESP8266WiFi NodeMCU 모듈사용 Web Server 예제:II
  
http://blog.daum.net/ejleep1/302



이 예제에서는 스마트 폰에서 아두이노 NodeMCU 의 웹서버 코드를 수신하여 NodeMCU 보드에 설치되어 있는 붙박이 LED를 스마트폰에서 무선wifi 에 의해 on OFF를 할 수 있었다. 아울러 거의 동일한 성능의 ESP8266 12 WiFi  모듈 칩을 사용하는 weMos 보드도 NodeMCU 와 거의 동일한 성능을 제공한다는 점을 상기하자.


아두이노 호환 NodeMCU 나 weMos 보드에서 클라이언트 디바이스로 송신하는 내용은 아두이노에서 ESP8266WiFi.h 라이브러리를 사용하여 아두이노 보드 자체를 WiFiServer server(80); 라는 명령에 의해 포트 번호가 80인 서버로 선언한다.



그렇다면 스마트 폰이나 무선 wifi  공유기가 설치된 데스크 톱 컴퓨터에서 수신하는 웹서버 코드의 내용은 무엇인지 알아보자. WiFi 통신이 가능한 서버로서의 아두이노가 외부의 디바이스와 통신하기 위해서는 loop()에서 불특정 외부 디바이스 클라이언트를 대상으로 WiFiClient 선언이 있어야 하며, 아울러 “client.println(⚫⚫⚫)” 명령에 의해 외부 디바이스의 웹에서 수신 및 실행이 가능한 예를 들자면 html 명령들이 전송되어야 한다.
그림이 “HTTP/1.1 200 OK” 부분은 웹 통신에서 알아들을 수 있는 표준적인 교신 신호이며 <!DOCTYPE HTML>부터 html 코드가 시작되는 부분이며 html 코드의 마지막 부분은 </html> 이 될 것이다.  이러한 구조로 아두이노의 loop()의 한 싸이클을 구성한다.



스마트폰, 패트형 컴퓨터, 앱 인벤터  또는 무선 wifi 공유기가 설치된 데스크 톱의 웹에서 아두이노 호환 보드에 설정된 가상 ip 즉 192.168.⚫⚫⚫ 를 url  창에 입력하면 자동적으로 클라이언트로부터의 request가 서버로 전송된다.

한편 클라이언트로 단순한 웹 화면만을 이용한다면 서버로부터 전송된 웹 화면에서 입력 작업 수행이 가능하지만 보다 복잡한 클라이언트가 있을 수 있다. 예를 들면 아두이노에서 온습도를 비롯한 기상 데이터를 수집하여 전송해서 실시간으로 모니터링 하거나 저장할 수 있는 ThingSpeak 과 같은 경우이다. ThingSpeak은 아두이노 초보자들이 사물인터넷 실습을 할 수 있는 MATLAB사에서 구축한 IOT 서버로 알려져 있다. 이 경우에는 아두이노가 클라이언트가 되고 ThingSpeak 이 서버가 된다. 따라서  아두이노에서 센서로부터 데이터를 수집하여 서버인 ThingSpeak 이 요구하는 규격에 맞춰 데이터를 송신하게 된다. 물론 전송이 시작되는 지점의 코드는 HTTP1.1 ⚫⚫⚫ 로 시작된다.


마찬가지로 무선 wifi 공유기가 설치된 데스크 톱의 Processing 코드를 사용해서 클라이언트 형으로 아두이노 weMos 보드에 붙박이로 설치된 LED를 on OFF 제어해 보기로 하자. 이러한 경우에 아두이노 웹서버 코딩에서는 웹 화면에서 볼 수 있도록 입력 버튼 부분이 없는 대신에 Processing 코드가 그 역할을 하게 된다.


아두이노 weMos 코드 시작 부분



아두이노 weMos 코드 setup() 부분
weMos 보드는 ESP8266 12E 와이파이 침을 사용하므로 통신속도를 좀 빠른 115200 으로 설정하는 것이 표준이다. 코드 실행 시에 시리얼 모니터를 켜면 가상 ip 가 출력됨을 확인할 수 있다.



아두이노 weMos 코드 loop() 전반부분
loop() 문은 서버가 준비된 상태에서 클라이언트 선언과 아울러 클라이언트 버퍼에 입력되는 클라이언트로부터의 request를 체크한다.



아두이노 weMos 코드 loop() 후반부분
버퍼에 입력된 request 의 문자열이 “ON”인지 “OFF”인지 indexOf() 명령을 사용하여 식별한다. 이와같이 loop() 문에서 반복적으로 클라이언트로부터 입력되는 문자열 명령을 체크하여 식별이 되면 정수형 변수 val의 값을 설정하고 digitalWrite(ledPin, val) 명령을 실행하여 LED를 on OFF 제어 하게 된다.



Processing 에 의한 클라이언트 코딩








클라이언트 선언 Client c 가 선해 되어야 서버와의 접속이 이루어진다.
 구체적인 접속 서버 정보는 new Client(this, “가상ip”, 포트번호) 형식으로 매번 실행된다.

포트 번호가 80 로 설정이 되어 있으면 아두이노 weMos 에서도 동일하게 80 이 선언되어 있어야 한다.

setup()에서 그래픽 화면 크기가 (100,100)을 설정된다. backgroun(255)는 흰색이며 반면에 background(0)은 흑색을 뜻한다.

아두이노의 loop(0 에 해당하는 draw() 는 아무런 실행 명령이 없는 상태이지만 마우스 입출력을 사용하기 위해서는 반드시 있어야 한다.

mousPressed() 명령은 마우스의 왼쪽 버튼을 누를 때와 오른쪽 버튼을 누를 때 if 문 내부에서 c,write(“⚫⚫⚫”) 명령을 실행시키게 된다. c,write(“⚫⚫⚫”) 명령은 현재 Processing  코드가 실행되는 클라이언트 PC에서 “⚫⚫⚫” 정보를 무선 wifi 공유기를 통해 아두이노 서버로 데이터를 전송하는 과정을 의미한다.
new Clint() 와 c.write() 사이에 c.write(“HTTP1.0\n);을 두는 것이 정석이지만 없어도 혼자서 사용하는 무선 wifi 공유기라면 jamming 이 없이 전달된다.


아두이노 weMos에서 엡서버 코드를 실행하고 시리얼 모니터를 관찰하면 그림과 같은 출력 결과를 볼 수 있으며 weMos의 디지털 데이터 핀 14번에 해당하는 붙박이 LED의 푸른빛이 on OFF 됨을 확인할 수 있다.














Webserver_weMos_Processing_01




#include <ESP8266WiFi.h>

 const char* ssid = "android1234";//무선 공유기 id로 수정
 const char* password = "dddddddddd";//무선 공유기 비빌번호

 String s;
 String strVolt;
 
 int ledPin = 14;
 
WiFiServer server(80);

void setup() {
  Serial.begin(115200);
  delay(10);

  // prepare GPIO2
   pinMode(ledPin, OUTPUT);
   digitalWrite(ledPin, LOW);
    
  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
 
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
 
  // Start the server
  server.begin();
  Serial.println("Server started");

  // Print the IP address
  Serial.println(WiFi.localIP());
}

void loop() {
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
 
  // Wait until the client sends some data
  Serial.println("new client");
  while(!client.available()){
    delay(1);
  }
 

  // Read the first line of the request
  String req = client.readStringUntil('\r');
  Serial.println(req);
  client.flush();
 
  // Match the request
  int val;
  if (req.indexOf("OFF") != -1)
    val = 0;
  else if (req.indexOf(on") != -1)
    val = 1;
  else {
    Serial.println("invalid request");
    client.stop();
    return;
  }

  // Set GPIO2 according to the request
  digitalWrite(ledPin, val);
  client.flush();
 
  delay(1);
  Serial.println("Client disonnected");

}//끝

Processing_client_weMos_Mouse_LED_ON_OFF_01

import processing.net.*;
Client c;

void setup() {
    size(100,100);
    background(255);
}
void draw() {
}
void mousePressed() {
  if (mouseButton == LEFT) {
  background(255);
  c = new Client(this, "192.168.0.11", 80);  // Connect to server on port 80
  c.write(on\n");
  delay(10);  

  } else {
  background(0);
  c = new Client(this, "192.168.0.11", 80);
  c.write("OFF\n");
  delay(10);
  }
}//end of program