[아두이노#560] ESP32에 내장된 ESPNOW통신을 이용해서 보드끼리 1:N통신하는 방법 알아보기!(녹칸다ESP32#10)
프로그래밍/ESP32와 아두이노 2023. 5. 4. 22:59
https://youtube.com/live/55d6UUi-hfA
[아두이노#560] ESP32에 내장된 ESPNOW통신을 이용해서 보드끼리 1:N통신하는 방법 알아보기!(녹칸다ESP32#10)
녹칸다의 ESP32시리즈이다!
제목 그대로 과거의 녹칸다는 IoT보드로 ESP8266보드만 활용했다!
ESP32에 대한 수요도 늘어나는것 같고 제일 중요한 것은 지금의 녹칸다가 ESP32보드가 필요하게 되었다!
ESP8266으로 만들어진 예제들을 ESP32버전으로 바꾸는게 주요 주제라고 할 수 있다!
그와 동시에 약간의 설명도 첨가해서 이것저것 예제를 만들어보도록 하자!
(ESP8266과 ESP32의 차이점을 강조해서 진행해보도록함!)
(근데 거의 80~90%는 거기서 거기인듯!)
직전편에서 인터넷 공유기 없이 ESP보드들끼리 직접 통신할 수 있는 ESPNOW에 대해서 알아보았다!
이번편에서는 ESP32보드를 여러대 준비해서 1:N통신을 하는 방법에 대해서 알아보도록 한다!
크게 아래와 같은 내용을 극복해야한다!
1.한대의 보드가 다른 여러대의 보드에게 선택적으로 메시지를 전송하는 방법!(fixed trasmission)
2.한대의 보드가 다른 여러대의 보드에게 동시에 메세지를 전송하는 방법!(broadcasting)
3.여러대의 보드가 한대의 보드로 메시지를 전송하는 방법!(monitoring)
4.모니터링하는 보드가 누구로부터 메시지가 왔는지 인식시키는 방법!
5.보드A,B,C 3개가 있을때 A가 B에게 보내고 B가 C에게 보내서 네트웍을 형성하는 방법!
(참고자료1 ESP32핀맵)
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/hw-reference/esp32/user-guide-devkitm-1.html
(참고자료2 INPUT_PULLUP가능핀)
불가능 34,35,2,36,39
가능 32, 33,25,26,14,27,12,13,22,23,19,21,5,18,16,17,4,15
(참고자료3 ESP32의 I2C핀)
SDA : 21
SCL : 22
(참고자료4 ESP32의 SPI핀)
SCK : 18
MOSI : 23
MISO : 19
CS : 5
(참고자료5 ESP32의 Serial핀)
RX : 16
TX : 17
(참고자료6 녹칸다의 ESP8266 ESPNOW시리즈#469)
https://bota.tistory.com/1955
(참고자료7 ESP32와 ESP8266간 ESPNOW#497)
https://bota.tistory.com/1986
(깨알지식)
1.ESP32보드 하나하나를 "노드"라고 부르도록 한다!
2.녹칸다가 보유한 노드는 총 3개이므로 노드A, 노드B, 노드C라고 부르도록 한다!
3.데이터를 전송하는 노드를 "트랜스미터"라고 부르고 데이터를 수신하는 노드를 "리시버"라고 부르도록 한다!
4.노드A가 노드B에게 주소를 이용해서 데이터를 전송할때는 "fixed transmission"이라고 한다!
5.노드A가 노드B와 노드C에게 동시에 데이터를 전송할때 "broadcasting"이라고 한다!
6.노드A가 노드B와 노드C로부터 데이터를 수신할때를 "monitoring"이라고 한다!
7.이때 노드B와 노드C는 노드A에게 fixed transmission으로 데이터를 전송한다!
8.여러대의 노드가 보낸 데이터를 모니터링할때 누가 전송했는지를 알아내야하는데 그것을 MAC주소로 하기보다는 애초에 보내는 데이터에 나는 누구다라는 ID값을 전송하는게 더 편하지 않을까 하는 개인적인 생각을 함!
9.ESPNOW로 여러대의 보드에 동시에 데이터를 보낼때 fixed transmission으로 데이터를 전송할 경우 동시에 보내더라도 송신콜백함수를 체크해서 보낼수 있는 타이밍에 보내어야한다!
10.그러나 여러대의 보드에 메시지를 동시에 보낼 수 있는 broadcasting방법이 있으므로 그렇게 할 필요가없다!
11.브로드캐스팅은 주변에 등록된 노드에게 전송하는 행위이기 때문에 송신콜백함수가 데이터를 다 전송했다는 의미로만 적용되고 어떤 노드가 메시지를 수신했냐 아니냐는 모른다!
12.브로드캐스팅의 mac주소는 0xff로 6바이트로 구성되고 브로드캐스팅주소를 peer로 등록해놓아야 가능하다!
(예제)
1.각 보드의 MAC주소를 알아내는 예제!
2.노드A가 리시버가 되고 노드B와 노드C가 트랜스미터가 되었을때 노드B와 노드C가 전송하는 메시지를 노드A의 시리얼모니터에 출력하는 예시를 보이시오!(text 메시지)

3.(예제2에서) 보드B와 보드C의 가상의 온습도센서가 있고 온도와 습도값을 float데이터로 전송하고자할때 각각의 데이터를 A로 전송해서 시리얼모니터에 출력하시오!
4.(예제3에서) 보드B와 보드C가 똑같은 간격으로 전송되는 것을 피하기 위해서 전송간격을 의도록으로 비껴나가도록 하는 예시를 보이시오!
5.노드A가 트랜시버가 되고 노드B와 노드C가 리시버가 되었을때 fixed transmission으로 하나의 문자를 전송한다! 노드A가 'A'를 espnow로 전송할때 B와 C가 성공적으로 수신하면 LED(15번핀)를 토글시키시오!(전송간격이 빠르지 않기 때문에 송신콜백함수 부분은 처리하지 않는다)

6.(예제5)에서 노드A가 브로드캐스팅으로 B와 C에게 동시에 메시지를 전송하시오!
7.노드A가 노드C에게 메시지를 전송할때 노드 B가 "리피터"역할을 한다! 그리고 노드C가 노드A에게 메시지를 전송할때 노드B가 "리피터"역할을 수행하도록 하시오!

8,노드C가 노드B를 경유해서 노드A에게 가상의 온습도값을 전송하는 상황이다! 이때 C의 현재 millis값과 중간에 경유하는 B의 millis()값을 전송하는 데이터에 포함해서 A의 시리얼 모니터에 출력하시오!


