본문 바로가기
아두이노/윈도우 절전모드 해제기

#1 기획 및 검토 - ESP-01

by songbum 2024. 2. 1.

보안 등의 이유로 사무실 PC 만을 이용해 업무를 처리해야 해서, 재택 근무중이거나 외부에서 갑자기 업무를 봐야 할 경우에는 윈도우 내장 원격 데스크톱 프로그램을 사용하고 있다.  이 때 문제가 되는게, 컴퓨터가 절전모드로 들어가버리면 원격 데스크톱 프로그램으로는 접속이 불가능해진다는 것이다.  다행히 사무실에 다른 사람이 있으면 키보드나 마우스를 조작해 절전모드를 해제해 달라고 할 수 있지만, 그렇지 않으면 사무실로 가야 한다.  WOL(Wake On Lan) 기능을 이용해 보려고 했으나, 내 PC 는 이 기능을 지원하지 않아서 다른 방법을 찾아야만 했다.

 

아두이노 보드를 인터넷에 연결해 외부에서 접근이 가능하게 하고, 외부에서 명령을 실행해 USB 케이블로 연결된 컴퓨터에 엔터키 신호를 주게 하면 되지 않나 싶어 제작을 결심하게 됐다.  컴퓨터에 엔터키 신호를 주는 건 '제품 검사 센서' 작업 때 해 본 것이라 문제가 없고, 인터넷에 연결하는 것도 와이파이 모듈이 많이 나와 있으니 별 어려움이 없을 거 같았다.  그리고 사무실 PC 는 공유기 아래 단에서 사설IP 를 가지고 있기 때문에, 공유기에서 포트포워딩 설정을 해줘야 외부에서 접근이 가능할 거 같다.

 

우선 아두이노를 인터넷에 연결하기 위해 와이파이 모듈을 테스트해봤다.  인터넷을 검색해보니 ESP-01 모듈이 많이 사용되는 거 같았다.  최초 셋팅 과정이 좀 복잡한데, 다행히 쉽게 사용할 수 있도록 해주는 ESP-01 용 어댑터가 함께 판매되고 있어서 이걸 사용하기로 했다.

 

ESP-01 용 어댑터에는 연결해야 할 핀이 총 4개 있다.  VCC 와 GND 는 각각 아두이노 보드의 5V 와 GND 핀에 연결했고, TX RX 는 아두이노의 디지털핀 2번과 3번에 연결했다. 

 

원래 아두이노 보드는 다른 장치와의 Serial 통신을 위해 디지털핀 0번이 수신용 RX 로, 1번이 송신용 TX 로 하드웨어적으로 할당돼 있다.  이걸 그대로 사용하면 편리하지만, USB 케이블로 PC 와 연결된 상태에서는 사용할 수 없다고 한다.  대신 다른 디지털핀을 사용해야 하는데, 이를 소프트웨어적으로 처리하기 위해서 SoftwareSerial 라는 라이브러리를 사용한다.

 

ESP-01 모듈의 RX 는 아두이노 보드의 TX 에 연결돼야 하고, ESP-01 모듈의 TX 는 아두이노 보드의 RX 에 연결돼야 한다.  위 사진에서 ESP-01 모듈의 TX 핀에 연결된 오렌지색 케이블이 아두이노 보드의 디지털핀 2번에 연결돼 있으므로, 이 아두이노 보드의 디지털핀 2번은 RX 라고 설정돼야 한다.  마찬가지로 ESP-01 모듈의 RX 핀에 연결된 갈색 케이블은 아두이노 보드의 디지털핀 3번에 연결돼 있으므로, 이 아두이노 보드의 디지털핀 3번은 TX 라고 설정돼야 한다.

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);   // RX핀, TX핀

void setup() {
   Serial.begin(9600);
   mySerial.begin(9600);
}

void loop() {
  if (mySerial.available()) {
    Serial.write(mySerial.read());
  }
  if (Serial.available()) {
    mySerial.write(Serial.read());
  }
}

 

우선 아두이노 보드와 ESP-01 모듈 사이의 통신이 되는 지를 확인해봤다.  지금까지는 시리얼 통신 속도를 9600 으로 설정하고 사용해왔었는데, 이 ESP-01 모듈은 공장 출하시 115200 으로 셋팅이 된 거 같다.  시험삼아 아래와 같이 9600 으로 설정하고 통신을 시도해 봤는데, 역시나 Serial Monitor 에서 명령어를 입력해봐도 아무 반응이 없다.  

 

주의할 점은 Seiral Monitor 에서 Message 창 옆을 Both NL & CR 로 선택해야 제대로 메세지가 나온다.

AT 명령을 입력하고 엔터를 눌렀지만, 아무런 응답이 없다.

 

그래서 다음과 같이 임시로 속도를 115200 으로 설정한 후 다시 연결을 시도했다.

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);   // RX핀, TX핀

void setup() {
   Serial.begin(9600);
   mySerial.begin(115200);
}

void loop() {
  if (mySerial.available()) {
    Serial.write(mySerial.read());
  }
  if (Serial.available()) {
    mySerial.write(Serial.read());
  }
}

 

AT 명령을 입력하자, OK 라고 응답이 온다.

 

ESP-01 모듈에 연결됐으니, 다음의 명령어를 입력해 ESP-01 보드의 통신 속도 설정을 9600 으로 변경한다.

AT+UART_DEF=9600,8,1,0,0

 

소스 코드를 아래와 같이 복원한 후 다시 테스트를 해보니 통신이 잘 되는 것을 확인할 수 있었다.

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);   // RX핀, TX핀

void setup() {
   Serial.begin(9600);
   mySerial.begin(9600);
}
void loop() {
  if(mySerial.available()) {
    Serial.write(mySerial.read());
  }
  if(Serial.available()) {
    mySerial.write(Serial.read());
  }
}

 

이후로는 아두이노 IDE 를 재시작하거나 아두이노 보드를 리셋해도 계속 9600 설정에서 정상 작동했다.

 

ESP-01 모듈의 동작모드를 확인해본다.
AT+CWMODE?
1이면 일반적인 client 모드, 2면 AP 모드, 3이면 client 와 AP 겸용이다.  나는 client 로서 사용할 것이기 때문에 client 모드로 변경해줘야 한다.
AT+CWMODE=1

 

이제 ESP-01 모듈을 인터넷에 연결시켜 줄 공유기를 찾아야 한다.  사무실에서 사용하는 공유기의 SSID 는 이미 알고 있지만 헷갈릴 수도 있어서 다음의 명령어로 주변의 모든 공유기를 검색해봤다.
AT+CWLAP
각 줄에서 "[air purifier] Samsung" 나 "SK_WiFiGIGA91BC" 등 따옴표로 감싸진 두 번째 항목이 SSID 이다.  이 중에서 내가 사용하는 SSID 가 있는지를 확인한 후, 와이파이 비밀번호와 함께 아래와 같이 실행시킨다.
AT+CWJAP="{SSID}","{비밀번호}"

 

아래의 두 메세지가 나오면, 와이파이로 연결됐고 공유기에서 아이피를 할당을 받는데 성공했다는 뜻이다.

WIFI CONNECTED
WIFI GOT IP

 

할당받은 아이피를 확인하는 방법은 다음의 명령어를 실행하면 된다.

AT+CIFSR

 

공유기 내부에 있기 때문에 192.168. 로 시작하는 아이피를 받았음을 알 수 있다.  현재 이 ESP-01 모듈은 인터넷에 연결된 상태이다.