ESP8266 nodeMCU, D1 mini 개발환경 시작하기 만들기 2019. 2. 18. 23:22

이제 때가 되었다 싶어서 IoT 프로젝트를 시작해 보려고, ESP8266 칩을 사용한 IoT 오픈소스 플랫폼인 nodeMCU를 만지기 시작했다. 국문으로 된 글이 꽤있지만 2016년 전후로 작성된 글이 많고, 현재 상황과 맞지 않는 글이 많아 아주 간단하게나마 정리를 해서 올려보려 한다.

ESP8266 과 nodeMCU 소개

이걸 접하게 된 것은 꽤나 오래되었지만, 이 프로젝트가 인기를 끌었던 것은 더 오래전 2015년 언저리인것 같다. 당시에는 굉장히 센세이셔녈했던것 같은데, 지금까지도 여전히 감동적인 가성비를 뽐내고 있다.

ESP8266은 WiFi 모듈을 포함한 초저가 IoT SoC이며, nodeMCU는 ESP8266을 기반으로한 오픈소스 IoT 플랫폼이다. 플랫폼이라는 말에서 알 수 있듯이 칩부터 보드, lua 스크립트 언어가 구동되는 VM을 포함하는 펌웨어와 주요 라이브러리 모듈에 IDE까지 모두 제공한다. 등장 초반에는 도전 정신이 필요했지만 지금은 문서화도 잘되어 있고, 툴들이 워낙 정리가 잘 되어 있어서 실험 정신만 있으면 누구나 시도해 볼 수 있는 수준이다.

상대적으로 유명한 라즈베리파이나 아두이노와 비교해서 장점을 소개해 보자면, 해당 보드들은 코딩 교육이나 DIY IoT 기기용으로 인기를 끌었는데, 막상 실전에 투입하기엔 비용, 네트워크, 전력등의 어려움이 있다. 일단 가격이 너무 비싸서, 순수하게 교육 목적이 있지 않는한 차라리 기성품을 사는 것이 낫기 때문에 DIY 덕후가 아닌한 쉽게 손이 가지 않는다. 두번째로 네트워크인데, 아두이노의 경우 WiFi를 사용하기 위해서는 별도의 모듈을 사서 부착하고 코드작업도 따로 해줘야 한다. IoT의 핵심은 네트워크이 아닌가? 그 부분에서 탈락!ㅋ 마지막으로 전력이 문제다. 간단한 역할의 IoT 기기를 구성할 때 라즈베리파이나 아두이노의 경우 전력소모가 너무 커서 배터리만으로 운용하기 힘들다. 절전 모드를 충분히 활용한다고 하더라도 기본 소비량에서 많은 차이가 나기에 최종 사용량에서 그 차이를 좁히기 힘들다. 참고-아두이노 등 MCU의 소비 전류량 측정

nodeMCU 생태계

nodeMCU는 다양한 보드와 펌웨어, 툴들을 제공하고 있다. 성능도 조금씩 다르고 가격도 조금씩 다르기 때문에 상황에 맞는 보드를 선택해서 개발하면 된다.

선택에 참고가 될만한 글을 몇 개 소개한다.
ESP8266 활용 가이드 - Overview 편
ESP8266 IoT 개발: 소개
NodeMcu or Wemos D1 Mini?

나는 USB를 바로 연결해서 사용 할 수 있으면서도 작고, 호환성이 높은 D1 mini를 선택했다. 집에 남는 휴대폰 보조 배터리로 전원도 공급할 수 있고 크기도 작아서 마음에 쏙 들었다.

개발환경 구축

물건을 받아서 펌웨어 업데이트 후 built-in led를 켜고 꺼는 동작까지의 경험을 공유해 본다.

순서는 아래와 같다.

  1. 보드를 PC와 연결하고
  2. 펌웨어를 올리고
  3. 내 코드를 올려서 동작하기!

펌웨어 빌드, 설치 관련된 옛날 문서나 블로그 글이 많아서 좀 혼란을 겪다가 레퍼런스 사이트에 잘 정리된 문서를 찾았다. 짱이다. 블로그 글은 참고만하고 꼭 레퍼런스를 찾아보는 것을 권한다. 레퍼런스 사이트에도 오래된 글들과 유지보수되지 않는 툴들에 주의하라고 경고하고 있다.ㅎ 언젠가 이 글도 쓰레기가 될지도...

NodeMCU Documentation

0. 납땜하기

납땜 안되어 있는 보드를 샀다. 이것 저것 만들다 보면 결국은 납땜이 필요한 때가 생길 것 같아서 그냥 인두와 납 세트를 구입해서 직접 납땜을 했다.ㅋㅋㅋ

나는 경험이 거의 없는데, 생각보다 여럽지 않다. 유툽 영상 한번 보고 대충해도 납땜되어서 온 물건처럼 깔끔하게 할 수 있다. 워낙 난이도가 쉬운거라.ㅎ 단, 잘 못 되면 되돌리는 것이 더 어려우니 조금씩 천천히 스킬을 늘려가자.

사진을 보면 처음에 한거랑 나중에 한거랑 좀 차이가 난다.ㅋㅋㅋ 그래도 5 핀 정도 해보니 바로 감이오더라. 요령이 있다면, 납을 핀의 끝이 아니라 보드 쪽에 녹이면 더 잘된다. 납이 녹으면 물처럼 동그랗게 뭉쳐지려는 성질이 생기는데, 그걸 이용해 보드에 동그란 쇠 부분에 녹이면 알아서 촥! 이쁘게 모인다. 납은 생각보다 조금만 녹여도 된다! 반대로, 이런 성질 때문에 잘 못 붙였을때 납을 제거하는 것은 좀 어려운것 같다. 녹인다음 떼내고 싶어도 기판에서 떼내기가 쉽지 않다. 그래서 제거할 때는 흡착하는 기구가 필요하다.

1. PC 연결하기

PC와 연결은 그냥 USB 연결하면 된다. 아무런 설정이 필요없다. 굳이 연결이 잘된 것인지 확인해 보고 싶다면 장치 관리자에서 확인해 보면 된다.

2. 펌웨어 빌드 및 설치 Flashing

빌드할 수 있는 방법은 다양한데, Cloud Build Service가 있다는 것이 넘 좋았다. 내가 원하는 모듈을 선택하고 빌드를 요청하면 email로 바이너리를 보내준다.

설치는 레퍼런스 사이트에서 추천한 GUI툴 NodeMCU PyFlasher를 이용하였다. D1 mini를 사용할 경우 별도로 flash mode 진입은 필요없다. 그냥 연결하고, 펌웨어 바이너리 선택하고, Go!

3. lua 코딩하여 실행하기

이제 나의 코드를 실행 하면 된다. 벌써?!!! 준비가 이렇게 금방 끝나다니...ㅋ

코드를 편집하고 실행하기 위해 사용할 툴은 ESPlorer를 사용하였다. 넘 깔끔하고, 잘 동작해서 또 한번 놀랐다.

왼쪽은 코딩하는 쪽이고, 오른쪽은 콘솔 화면이다. 오른쪽에서 바로 타이핑해서 코드를 실행 할 수도 있다. GPIO 를 실시간으로 바꾸는 일이 이렇게 쉬울 수가... 펌웨어 재설치나 재부팅 없이도 슈슈슈슉 코딩을 할 수 있다! lau 스크립트 코드는 정말 쉽다. 아래 몇 줄이 타이머를 등록하고, 2초마다 built-in led 를 켜고, 끄는 코드이다.

lighton=0
led_pin=4
gpio.mode(led_pin,gpio.OUTPUT)
tmr.alarm(1,2000,1,function()
    if lighton==0 then
        lighton=1
        gpio.write(led_pin,gpio.HIGH)
    else
        lighton=0
        gpio.write(led_pin,gpio.LOW)
    end
end)

핀 배치는 아래와 같다.

각각의 핀은 아래와 같이 설정되어 있다.

init.luamain 함수 또는 window.onload 같은 역할을 한다. 부팅 이후에 자동으로 실행될 코드를 init.lua에 저장해두면 된다.

전원만 연결하면 2초마다 built-in led가 꺼지고, 켜지기를 반복하는 동작을 완성하였다.

후기

넘 쉽게 잘 되고, lua 스크립트로 코딩해서 업로드 하기도 편해서 좋았다. 기초 지식이 조금씩 필요하긴 하지만 누구나 쉽게 해볼만 한 것 같다! 이제 뭘 만들어 볼까~ㅎ