brunch

You can make anything
by writing

C.S.Lewis

by 하이경 Mar 03. 2024

ESP8266 릴레이 모듈

Web 기반의 IOT Resource에 대하여

  사물 인터넷(IOT: Internet Of Things)은 지금의 시대에 일상의 다반사가 되었다. 다만, 대부분의 사람들은 이것을 실감하지 못하고 있거나 아직은 활용도가 저조하여 이것을 도입해야 하나 어쩌나 망설이고 있을 따름이다. 실은 필자가 이곳 브런치 플랫폼에 그들만의 리그에서나 통할까 말까 하는 한참 기울어진 내용의 콘텐츠를 여기 공개해야 하나 말아야 하나를 망설인 유와 흡사하다. 내용이 전문적인 까닭에 대중성이 빈약할뿐더러 일반인들에게는 생소한 용어와 텍스트가 난무하기 때문이다.  


  사실, 이번 칼럼은 매우 공돌이스러운 현장 분위기를 심하게 풍기므로 불특정 문돌이 다수를 대상으로 공개를 한다는 점은 다소 유감스럽게 생각한다. 그러나 불특정 다수의 건너편에 암약하는(?) 특정 다수의 공돌이도 함께하므로 상호 존중과 배려의 차원에서 공개를 작심하였다. IOT는 우리주변과 일상에 매우 근접해 있지만 아쉽게도 이 분야의 공학기술자가 아니라면 함부로 접근이 쉽지만은 아니한 이유에서 이다.

  따라서 이번 글은 불특정 대다수 여러분에게는 하품을 동반한 소나기성 졸음을 제공할 소지가 있음을 사전에 공지하고 싶다. 더구나 이 프로젝트를 온전히 이해하려면 다음과 같은 사전지식의 보유를 전제로 하기에 이 글을 접하는 구독자는 더욱더 제한적일 수밖에 없다고 판단하며, 사전에 필요한 지식은 다음에 열거한 3개 항목 중에서 적어도 하나 이상을 만족하면 충분하다고 본다.


(1) 기계공학, 메카트로닉스, 로봇시스템공학 내지는 이공계열의 유사 학과를 전공하고, 메이커 프로젝트 관련지식 보유자 이거나 기계시스템 설계 유경험자 및 네트위크통신 관련 기초 지식 보유자.

(2) 비록 위에 언급한 분야를 전공하지는 않았지만, 실무차원에서 계측제어 분야나 AVR MCU 따위를 응용 수 있는 지식이 있거나, IOT시스템 설계 기술로 대체 가능한 현장 실무 지식 보유자.

(3) 학, 경력과 무관하게 C 혹은 C++, HTTP, 파스칼, 파이썬, 비주얼 스튜디오 등의 고급언어를 해독할 수 있고, 코드 편집을 포함하여 ATmega, Atmel, 아두이노, 라즈베리파이, 파이페이스 따위의 하드웨어 플랫폼의 입출력(GPIO) 처리 관련 기초 지식 보유자.


  자! 피곤 무쌍한 사전 보유지식의 전제조건까지 포설하였으니, 본론으로 들어가 사물 인터넷의 기본인 스마트 원격제어에 관하여 언급하도록 하자.

  시중에는 휴대폰이나 구글스피커, 지니, 알렉사 따위의 편의 보조기기를 사용하여 가전제품을 손쉽게 제어하는 스마트플러그가 상용화되어 있다. 그래서 음성으로 실행하는 원격제어가 상식으로 알려져 있지만 그것은 오해이다. 이 분야의 전공자를 제외한다면 정작 IOT 기기들의 작동 메커니즘이나 시스템의 알고리즘을 이해하기가 만만치 않기 때문에 그렇다고 본다.

  따지고 사용자는 골치 아프게 이것들의 작동원리 따위는 전혀 이해할 필요가 없으며, 필요에 따라 유용하고 적절하게 사용하면 그만이다. 마치 하드 디스크의 작동원리를 모르지만 컴퓨터를 곧잘 사용하듯이. 그까짓 원리나 메커니즘 따위야 알건 모르건 전혀 상관이 없지만 문제는 경제적인 차원으로 견주어 투입된 자원대비 IOT 장치의 성능에 주목할 필요가 있다는 점이다.

  시중에서 유통되는 대부분의 스마트플러그는 ESP32, ESP8285, ESP8266, ESP01 S, ESP-01F, ESP-01M 따위의 저렴한 초소형 제어부품을 채용하고 있으며, 소비자 가격에도 거품이 많아 기능과 내구도에 따른 선택에 주의를 요한다는 점이다.

  이 중에서 주목할 만한 부품은 블루투스나 와이파이 기반의 범용 제어모듈인 ESP32와 ESP8266이 거의 대부분이므로 ESP8266을 기반으로 하는 ESP01 S WiFi 릴레이 모듈을 사용한 스마트플러그를 본인이 스스로 제작(DIY)할 수 있도록 기술적인 지침을 제공하도록 한다. 혹자는 겨우 릴레이 모듈 한 개의 제어로 사물 인터넷을 운운하는 것이 지나친 비약이 아니냐는 이견을 제시할 수도 있겠지만, 천만에! 

  IOT의 정체는 놀랍게도 그만큼 단순하고 명료하다. 우리가 알고 있는 PLC(Programerble Logic Controller)라는 제어기기도 엄밀하게는 연산 제어기를 탑재한 초소형 릴레이들의 군집에 불과하여 단순하기 짝이 없다.

  다만, 벽돌 몇 개를 대충 쌓아 올렸다고 해서 멀쩡한 건물이 되는 것은 아니지만 말하자면 극명한 비유는 그렇다는 얘기다.


  칼럼은 GitHub의 공개 소프트웨어를 참조하여 Prototype을 완성하였으나 제한된 실용성으로 하여금 수차례 Revision을 수행하여 완성한 착오와 경험을 바탕으로 과정을 기록해 둔 실무 수준의 문건을 공개하는 형식을 취하고 있으니, 상식적인 차원의 용어해설과 구구절절 세한 설명은 과감히 생략하도록 한다. 다만, 이 분야에 관심이 있거나 펌웨어 혹은 미들웨어나 하드웨어 제작에 취미를 지닌 엔지니어들을 위하여 시스템 설계 프로세스 구축과정 등은 가급적 생략하지 않도록 하였다.


1. 프로젝트에 진입하기

  스마트제어용 IOT 시스템 구축에 필요한 준비물은 극도로 간단하여, Hardware 2종과 Software 1종이면 충분하다. 물론 시스템을 구체화하는데 필수요소인 잡다한 조립용 공구나 간단한 연장들은 이미 확보하였다고 가정을 한다면 아래의 BOM 목록을 참조하면 된다.      


1-1. Bill Of Material

1-1-1. ESP01 S Relay Module: 1 Set / 가격 미화 1.5불 내외(₩2,300-)

1-1-2. ESP01 USB Serial Adapter: 1 Ea / 가격 미화 1.0불 내외(₩1,500-)

1-1-3. Flash Program: Node MCU-Py Flasher(파이썬) 또는 Arduino IDE     


2, 제어구조

2-1. 목적 및 개요

   이 프로젝트는 IOT 시스템 구축을 위하여 단순한 해결방안의 예를 제시하고 실제상황의 이해를 도모하는 것을 목적으로 하기에 상업적 차원을 완전히 배제하였다. 그러나 현존하는 모든 프로젝트에는 비로소 자원의 지배구조를 벗어날 수 없으므로 BOM 목록에 참고로 가격을 제시하고 있으니 이 부분에 오해가 없도록 당부하고 싶다.

  제어구조는 지극히 단순하여 아래의 그림과 같은 내용으로 ESP01 S Relay Module을 사용하여 인터넷(Web)이나 스마트스피커 등으로 원하는 제품을 원하는 만큼 제어가 가능하도록 하는 Schematic이다. 혹여, 비전공자를 위하여 회로도를 지양하고 이해가 쉽도록 그래픽으로 표현하였다.(회로도는 하단을 참조)

<  Basic Schematic for IOT Sample Project >


2-2. 동기에 따른 결론의 도출

  이 프로젝트를 공개하고자 하는 동기와 목적이 불분명한 결론은 실로 하찮은 아이디어에서 출발하였다. 시중에서 판매되고 있는 대부분의 IOT 접속용 스마트플러그는 가성비가 왜 그 모양일까? 고심하던 차에, 그렇다면 직접 제작을 하면 되지 않겠느냐는 생각으로 관련 정보를 수집한 결과 수명이 다한 누더기 정보 대부분이었고, 짜임새 있는 코드나 과정 설명이 전무하다는 것을 파악하고 적지 아니 허무하다는 생각이 들었다. - 실망할 것은 없고 본시 인터넷의 정보 공유가 그렇고, 그 정보가 검증되지 아니하고 비틀어져 있다는 것은 익히 오래전 부터 알려져온 사실이다.

  세상에는 뛰어난 기술자들도 허다하고 GitHub와 같은 개발용 플랫폼의 공유지에는 공개 프로그램이나 공지된 기술들이 모래알처럼 많음에도 불구하고, 즉시 실현 가능하고 실제 상황의 구현을 위한 내용이 아직 없다는 사실이 안타까웠기 때문이다. 누군지는 필자가 정리한 문건 정보를 바탕으로 보다 진보적이고 알찬 콘텐츠의 IOT 관련 고급정보를 공개할 수 있을 것으로 기대한다.


2-3. 하드웨어의 간단한 설명

2-3-1. ESP01 S Relay Module

< ESP01 S + Relay Module과 실제 크기의 모습 >

  ESP01S는 ESP8266Wifi 모듈을 기반으로 재설계되어 5V 작동 Relay Module과 일체형으로 어셈블리가 가능하도록 제작된 소형 모듈이며, 상당히 저렴한 가격으로 구입이 가능하다.

< Detail Descriptions of ESP01 S + Relay Module >


2-3-2. ESP01 USB Serial Adapter

< ESP01 USB Serial Adapter >

  ESP01 USB Serial Adapter는 ESP01 및 ESP01S를 작동하는 코드를 ESP8266Wifi 모듈에 손쉽게 Flashing 할 수 있도록 설계된 USB 전용 Serial Adapter에 해당한다. 이 Serial Adapter를 사용하려면 별도로 CH340 내지 CH341 드라이버 파일이 필요하다. 이 드라이버 파일의 설명과 설치과정은 생략하므로, 광범위한 오픈소스를 공유하고 있는 GitHub나 유사한 Web에서 발굴하여 컴퓨터에 설치한 다음에 코딩을 시작하도록 하자. 아울러 여기에는 필수로 요구되는 라이브러리가 있으므로 지침에 따라 라이브러리 파일도 사전에 설치를 해야 한다.


3. 제어용 프로그램의 코딩과 업로딩

3-1. 알고리즘의 구성과 실행 코드 작성

   이 프로젝트의 알고리즘은 복잡하면서도 동시에 단순하기 짝이 없다. 그저 Web상에서 릴레이 모듈만 On-Off 할 수 있는 심플한 제어로직이기 때문이다. 그러나 말이 쉬울 뿐 실제로 코딩작업을 진행하다 보면 자잘한 버그 때문에 작동이 원만하지 못하는 오류가 발생하여 벌레를 잡아내느라 고독하고 지루한 시간을 하염없이 허비해야 하는 경우도 종종 발생한다.

<  ESP8266 릴레이 모듈 Schematic Circuit Diagram  >

  프로그램의 코딩에는 판에 박은 듯한 정석이란 없는 법이다. 각자의 개성이 있기에 선호하는 루틴이 다르고 즐겨 쓰는 연산자와 라이브러리가 판이하기 때문이다. 거의 대부분의 사용자는 파이썬으로 프로그래밍하고 작성된 코드를 NodeMCU-PyFlasher로 컴파일하여 보드에 업로딩 하는 방식을 취하고 있다. 그러나 필자의 경우에는 코딩을 전문으로 하거나 이것으로 먹이를 구하지(?) 않기 때문에 평소 취미로 즐겨 사용하는 Arduino IDE가 훨씬 친숙하므로 이 툴을 활용해서 코드를 편집하고 ESP8266 Wifi 보드에 업로드를 실시하였다.

  코드는 GNU 및 GPL(일반공중사용허가서)에 따라 전부를 공개해야 하지만 간단치 아니한 장문이기에 함수를 지정하는 Routing intro는 생략하였다. 그러나 코드 전체 이 글의 말미에 붙임 파일로 링크를 걸어 두었으니 관심이 있다면 이를 참조하도록 하고, 주로 웹구축에 필요한 주제 코드는 다음과 같다.

<!DOCTYPE HTML>
<html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <style>
    html {font-family: Arial; display: inline-block; text-align: center;}
    h2 {font-size: 3.0rem;}
    p {font-size: 3.0rem;}
    body {max-width: 600px; margin:0px auto; padding-bottom: 25px;}
    .switch {position: relative; display: inline-block; width: 120px; height: 68px}
    .switch input {display: none}
    .slider {position: absolute; top: 0; left: 0; right: 0; bottom: 0; background-color: #ccc;
order-radius: 34px}
    .slider:before {position: absolute; content: ""; height: 52px; width: 52px; left: 8px; bottom:
px; background-color: #fff; -webkit-transition: .4s; transition: .4s; border-radius: 68px}
    input:checked+.slider {background-color: #2196F3}
    input:checked+.slider:before {-webkit-transform: translateX(52px); -ms-transform:
ranslateX(52px); transform: translateX(52px)}
  </style>
</head>
<body>
  <h2>ESP01-S Relay</h2>
  %BUTTONPLACEHOLDER%
<script>function toggleCheckbox(element) {
  var xhr = new XMLHttpRequest();
  if(element.checked){ xhr.open("GET", "/update?relay="+element.id+"&state=1", true); }
  else { xhr.open("GET", "/update?relay="+element.id+"&state=0", true); }
  xhr.send();
}
</script>
</body>
</html>
)rawliteral";
String processor(const String& var){
  if(var == "BUTTONPLACEHOLDER"){
    String buttons ="";
    for(int i=1; i<=NUM_RELAYS; i++){
      String relayStateValue = relayState(i);
      buttons+= "<h4>Relay #" + String(i) + " - GPIO " + relayGPIOs[i-1] + "</h4><label
lass=\"switch\"><input type=\"checkbox\" onchange=\"toggleCheckbox(this)\" id=\"" +
tring(i) + "\" "+ relayStateValue +"><span class=\"slider\"></span></label>";
    }
    return buttons;
  }
  return String();
}
String relayState(int numRelay){
  if(RELAY_NO){
    if(digitalRead(relayGPIOs[numRelay-1])){
      return "";
    }
    else {
      return "checked";
    }
  }
  else {
    if(digitalRead(relayGPIOs[numRelay-1])){
      return "checked";
    }
    else {
      return "";
    }
  }
  return "";
}

// 이하 일반적인 내용 후략 //


3-2. 코드 업로딩 작업의 상세

3-2-1. Code Loading to Arduino IDE

  Arduino IDE를 열어 우선 Board 사양을 입력한다. 탑재하고 있는 하드웨어의 Board 사양은 Generic ESP8266 Module을 선택하고, Serial Adapter를 인식시키기 위한 CH340 포트 넘버를 지정하도록 한다. 만약 Arduino IDE 패널에 ESP8266 보드 관련 정보가 없다면 "보드정보 얻기" 항목으로 이동하여 ESP8266 보드에 관한 정보소스를 다운로딩하여 보드를 인식시켜야 한다.

< ESP8266 보드 정보에 대한 보드 인식 및 포트 설정 작업 >

  

3-2-2. USB Serial Adapter에 ESP01 칩을 탑재

  Arduino IDE에 해당 코드를 Loading 하고 USB Serial Adapter의 딥스위치는 "PROG" 위치로 설정한 다음 코드를 컴파일하고 ESP01 S 칩에 업로딩을 실시한다. 코드의 문법이 정상이고 Serial Adapter 보드 정보와 CH340 포트 넘버를 바르게 지정하였다면, Arduino IDE는 문제없이 업로딩이 될 것이다.  

< USB Serial Adapter에 ESP01 칩을 탑재한 상황 >


3-2-3. 시리얼 모니터로 ESP01 S 칩의 IP 주소를 확인

  컴퓨터에서 USB Serial Adapter를 탈거하여 Adapter의 점퍼 스위치를 "UART"로 옮기고 다시 USB에 삽입하여 Arduino IDE 시리얼 모니터 출력상 ESP01 S 칩의 IP 주소가 출력이 되는지를 확인한다.


3-2-4. ESP01 칩을 탈거하여 릴레이 모듈에 삽입

  컴퓨터로부터 USB Serial Adapter와 ESP01 S 칩을 탈거 후 분리하여 ESP01 S 칩을 릴레이 모듈에 삽입한 후 릴레이 모듈에 DC 5V를 인가하면 Wifi로 모듈을 인식하게 된다.


4. 프로젝트 탈출하기

4-1. 작동여부의 확인 및 시운전

  ESP01 칩이 릴레이 모듈에 삽입되어 있고 전원이 인가되어 정상적으로 IP 주소를 할당받았다면 작동여부를 확인해야 한다. 코드 내용에 이미 HTML로 작성된 해당 페이지가 있으므로 휴대폰이나 컴퓨터의 탐색기 주소창에 이전 단계에서 확인해 둔 ESP01 S 칩의 IP를 입력하면(ex: http://192.168.***.***) 아래와 같은 GUI 형태의 웹페이지가 구현될 것이다.

< GUI로 구현된 ESP01 S 모듈 웹페이지 >

4-2. 오류여부의 확인 및 디버깅

  릴레이 모듈의 작동여부를 확인하려면 페이지에서 청색버튼을 클릭하면 되는데, 버튼을 클릭해도 릴레이 모듈에 반응이 없고 먹통이라면 99.99%의 확률로 코딩에 문제가 있으니 벌레를 때려잡아야 한다. 특히 GPIO의 PIN 주소를 잘못 지정하였다면 필시 이런 현상이 나올 수 있다. 앞서 3-1. 항에서 언급했던 바 고독하고 지루한 시간을 할애하여 벅벅(?) 기어 다니는 벌레를 가차없이 때려 잡아야 한다.   


4-3. 정상작동 이후의 시운전  

  릴레이 모듈이 정상적으로 작동하면 출력단에(NO 또는 NC) 제어를 하고자 하는 제품을 론칭하여 시운전을 실시하도록 한다. 스마트 스피커와 연동시키면 "지니야 밥 좀 해라!"라든가 "오케이 구글! 방이 왜 이리 춥냐?"와 같이 가전제품에게 명령을 요청할 수도 있다. 아쉽게도 릴레이 모듈의 사양이 고용량이 아닌 까닭에, 15A 이상의 부하를 걸게 되면 모듈이 벽돌로 변할 가능성이 있다. 안전하게는 사양의 70% 이내에서 사용하면 적당하므로 10A 이하부하로 사용하기를 권장한다.


4-4. IP 주소 입력이 번거롭다면

  에디터를 사용하여 별도의 실행파일(exe)이나 배치파일(bat)을 생성해도 무방하겠지만, 네트워크 성격상 유동 IP를 사용한다면, ESP01 S 칩의 IP주소는 수시로 바뀌게 되므로 매우 귀찮은 문제에 봉착한다. 또한 Arduino IDE 시리얼 모니터를 벗어나면 변경된 ESP01 S 칩의 주소를 찾기가 불편하기도 하다. 이럴 경우에는 다음과 같은 코드를 추가하여 IP주소를 고정하도록 한다.  

  IPAddress ip (192, 168, 123, 123);  // 원하는 IP
  IPAddress gateway (192, 168, 0, 1);
  IPAddress subnet (255, 255, 255, 0);
  WiFi.config (ip, gateway, subnet); // 원하는 설정 반영
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP()); //예상되는 결과 : 192, 168, 123, 123

  이 작업마저 귀찮다면 Wifi 라우터 네트워크 환경을 건드려 DMZ 또는 포트포워딩으로 해결할 수도 있고 아예 유동 IP를 고정으로 할당하여 귀찮음을 해결하는 방법도 있다. 주소창에 IP주소를 입력하기 마저 번거롭다면 다음과 같이 배치파일을 만들어 두면 된다. 메모장을 열어 아래와 같이 입력하고 파일명을 ESP8266.bat로 저장한다.

@echo off
start explorer http://192.168.어쩌고.저쩌고/


4-5. 프로젝트 원시코드와 라이브러리 제공

  화자가 제 아무리 쉽게 설명을 한답시고 입에 게거품을 물어가며 악을 써본들, 청자가 느끼기에 그저 맛있게만 보이는 그림의 떡으로 남아 있다면 말짱 도루묵인 헛것에 불과하다.

  그리하여 하단의 링크로 실제 릴레이 모듈의 작동 구현에 필요한 완성된 코딩 파일과 라이브러리 파일을 제공하니 관심이 있는 구독자 제위께서는 파일을 다운로드하여 DIY로 직접 경험해 보시기를 다.

  제공된 코드에 혹여 놓친 벌레가 발견될 수 있으니 이점에 유의하시고, 더 나은 코드 기법이 있다면 응당 업그레이드를 실시함이 타당하다. 하지만 걱정마시라! 아래의 링크에 걸린 코드는 본인이 직접 핸들링하여 검증까지 완료하였으니 절대로 귀찮음은 제공하지 않을 것으로 감히 판단한다.

  직접 경험을 해본다면 AI 엔진과 결합한 에어컨과 냉장고가 말을 걸어오고, AI 엔진을 탑재한 산업장비가 인간들의 언어와 명령을 이해하는 사물 인터넷이 알고 보니 별것도 아니라는 사실을 실감하게 될 것이다.


  프로젝트에 적용한 원시코드와 라이브러리 파일링크는 아래와 같고, 현존하는 모든것들에는 수명이 존재하는 법. 아래 자료 링크의 유효수명은 60일로 제한 하였기에 혹여, 막차를 타신분은 필자에게 별도로 요청하세요.

URL:  Web Based IOT Resource

작가의 이전글 노출과 은둔에 대하여
작품 선택
키워드 선택 0 / 3 0
댓글여부
afliean
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari