1. ESP-NOW 소개
Espress 사에서 개발한 ESP8266및 ESP32에는 독특한 통신 기법인 ESP-NOW라는 통신 프로토콜을 지원한다. ESP-NOW는 라우터(=인터넷 공유기) 등을 거치지 않고, ESP 개발 보드들끼리 직접 통신할 수 있는 기능을 의미한다. 때문에, 넓은 지역에 분산된 센서들과 연결된 ESP 보드들의 데이터를 네트워크에 전달하는데 저비용, 고 신뢰성의 통신이 가능하다.
ESP-NOW는 다음과 같은 장점 들이 있다고 한다.
* 인터넷 중계기 없이 ESP 보드들끼리 직접 (peer-to-peer) 통신 가능
* 저전력 소비
* 장거리 통신 (200m 이상) – 최대 480m까지 가능하다는 문헌도 있음
* Wifi 및 블루투스와 혼용 가능
* 소형화에 유리
* 1:1 및 1:복수 통신 가능
참고로 개발사인 Espress 사의 ESP-NOW의 여러 장점에 대한 공식 소개 자료는 다음과 같다.
https://www.espressif.com/en/solutions/low-power-solutions/esp-now
2. 마이크로파이썬에서의 ESP-NOW
기존에는 마이크로파이썬 펌웨어에서 ESP-NOW를 직접 지원하지는 않아 추가적인 라이브러리들이 필요한 것으로 알려져 있으나, 현재 기준 최신 버전의 마이크로파이썬 펌웨어들(2023-10-5일 버전)에서는 ESP-NOW 기능을 기본으로 지원한다. 물론 ESP32나 ESP8266보드에서만 지원한다.
자신의 ESP32보드가 ESP-NOW를 지원하는지를 확인하는 방법은 다음과 같이, thonny IDE 화면에서 “import espnow”명령을 입력해 보면 알 수 있다. 정상적이라면 다음과 같이 아무런 에러가 발생하지 않는다.
만일 이 단계에서 error가 발생한다면, 자신이 보유한 ESP32(ESP8266) 보드의 펌웨어를 최신 버전으로 다시 Update 해 주는 게 필요하다. 이 부분에 대해서는 다음 링크로 연결되는 이전 글을 참조하면 된다.
https://blog.naver.com/mythee1/223271251974
3. ESP-NOW 적용 예제
다음과 같이 2개의 ESP32보드를 브레드 보드에 부착하고, 이 두 개의 보드가 ESP-NOW로 통신하도록 설정하였다.
이 에제에서는 오른쪽의 ESP32보드에 버튼스위치를 설치하고, 이 버튼이 눌려질 때마다, 자체적으로 LED가 켜짐과 동시에 ESP-NOW로 메시지를 보내고, 수신 측 보드에서도 통신 메시지를 받아 연동하여 LED가 켜지거나 꺼지도록 설정했다.
ESP-NOW를 사용해서 송신하려면 다음과 같은 명령어들이 필수이다.
import espnow 먼저 espnow 라이브러리 사용을 선언해 준다.
sta = network.WLAN(network.STA_IF) 통신 네트워크를 만들어준다.
sta.active(True) 통신 네트워크를 활성화시켜준다.
sta.disconnect() ESP8266인 경우 필요하다고 한다
esp = espnow.ESPNow() ESP-NOW 사용 Class를 만들어준다.
esp.active(True) ESP-NOW 서비스를 활성화시킨다.
peer = b’xe4exb8rTxf4′ 접속할 대상의 MAC 주소를 지정해 준다
esp.add_peer(peer) ESP-NOW로 지정 대상에 접속한다
(참고: 접속 대상의 MAC 주소 확인 방법은 이전 글 참조( https://blog.naver.com/mythee1/223290411017)
결과적으로 오른쪽의 버튼스위치가 있는 송신 측 ESP 보드에 사용한 코드는 다음과 같다.
import network
from machine import Pin
import espnow
import utime
sta = network.WLAN(network.STA_IF)
sta.active(True)
sta.disconnect()
esp = espnow.ESPNow()
esp.active(True)
peer = b'xe4exb8rTxf4' #E4:65:B8:0D:54:F4
esp.add_peer(peer)
button = Pin(23, Pin.IN, Pin.PULL_DOWN)
led = Pin(22, Pin.OUT)
buttonwas = 0
while True:
buttonnow = button.value()
if buttonnow != buttonwas:
if buttonnow == 1:
message = "SWOn"
led.value(1)
else:
message = "SWOff"
led.value(0)
print("Sending command : ", message)
esp.send(peer, message)
buttonwas = buttonnow
반면 ESP-NOW를 통해 전달되어 오는 메시지를 수신하려면 해당 ESP 보드에서 다음과 같은 명령어들이 필요하다.
import espnow 먼저 espnow 라이브러리 사용을 선언해 준다.
sta = network.WLAN(network.STA_IF) 통신 네트워크를 만들어준다.
sta.active(True) 통신 네트워크를 활성화시켜준다.
sta.disconnect() ESP8266인 경우 필요하다고 한다
esp = espnow.ESPNow() ESP-NOW 사용 Class를 만들어준다.
esp.active(True) ESP-NOW 서비스를 활성화시킨다.
_, msg = esp.recv() ESP-NOW로 수신되는 메시지를 msg 변수에 저장
결과적으로, ESP-NOW로 연결될 메시지를 수신해야 하는 왼쪽 ESP32보드에 사용한 코드는 다음과 같다.
import network
import espnow
from machine import Pin
sta = network.WLAN(network.STA_IF)
sta.active(True)
sta.disconnect()
esp = espnow.ESPNow()
esp.active(True)
led = Pin(22, Pin.OUT)
while True:
_, msg = esp.recv()
if msg:
if msg == b'SWOn':
print("Turn on SW")
led.on()
elif msg == b'SWOff':
print("Turn off SW")
led.off()
else:
print("Unknown")
그리고, 동작 상황을 확인하기 위해 두 개의 Thonny IDE 창을 이용하여 다음과 같이 배치하고 실행했다.
(참고로 동시에 복수의 Thonny IDE를 여는 방법은 이전 글 https://blog.naver.com/mythee1/223289757168 을 참고하기 바란다.)
동작하는 동영상 모습은 다음과 같다.

