[아두이노#559] ESP32에 내장된 ESPNOW통신을 이용해서 보드끼리 1:1통신하는 방법 알아보기!(녹칸다ESP32#9)
프로그래밍/ESP32와 아두이노 2023. 5. 3. 23:18
https://youtube.com/live/IFGayJATEIM
[아두이노#559] ESP32에 내장된 ESPNOW통신을 이용해서 보드끼리 1:1통신하는 방법 알아보기!(녹칸다ESP32#9)
녹칸다의 ESP32시리즈이다!
제목 그대로 과거의 녹칸다는 IoT보드로 ESP8266보드만 활용했다!
ESP32에 대한 수요도 늘어나는것 같고 제일 중요한 것은 지금의 녹칸다가 ESP32보드가 필요하게 되었다!
ESP8266으로 만들어진 예제들을 ESP32버전으로 바꾸는게 주요 주제라고 할 수 있다!
그와 동시에 약간의 설명도 첨가해서 이것저것 예제를 만들어보도록 하자!
(ESP8266과 ESP32의 차이점을 강조해서 진행해보도록함!)
(근데 거의 80~90%는 거기서 거기인듯!)
ESP보드는 보드들끼리 아무런 장치를 하지 않고 ESPNOW라는 통신으로 데이터를 주고 받을 수 있다!
원래부터 인터넷에 연결가능하기에 WiFi를 이용해서 서로간에 통신을 하는 제조사 자체 프로토콜이라 할 수 있다!
과거 녹칸다가 ESP8266버전으로 ESPNOW 예제를 많이 만들어두었다!
그러나 ESP32는 ESP8266과 사용하는 코드가 서로 맞지 않아서 방법을 따라 알아내야한다!
(라이브러리, 콜백함수 뭐하나라도 같은게 없음)
ESPNOW라는 이름만 같을뿐 EPS8266과 ESP32는 코드가 완전 다르다!
이번편에서는 ESP32와 ESP32간의 1:1 통신을 주요 주제로 해서 아래와 같은 순서로 접근해보도록 한다!
1.ESP32보드 끼리 text를 주고받아보기!(작동 테스트 개념)
2.데이터 형별 값을 주고받는 방법 알아보기!
3.원격으로 LED 제어해보기!
4.센서데이터 송수신 해보기!
5.ESPNOW에서 전송할때 체크해야할 사항 알아보기!(상대방이 수신했냐?)
(참고자료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.ESPNOW는 WiFi공유기에 연결하는 것과 똑같은 개념으로 보드와 보드사이에 메시지를 주고받을 수 있는 무선통신 기술이다!
2.WiFi칩이 들어간 모든 IoT보드는 각자 고유의 주소를 가지고 있고 그것을 MAC어드레스라고 부른다!(6개의 byte로 구성이 되어있다)
3.확률적으로 모든 보드는 서로다른 MAC주소를 가지고있다!
4.ESPNOW에서 peer를 등록한다는 것의 의미는 내가 누구에게 전송할 것인가?를 의미한다! 다른 누군가가 나한테 보낼때는 보내는 녀석이 나의 주소를 peer로 등록해야한다!
5.ESPNOW는 WiFi하고 통신방식이 동일하기 때문에 채널을 동일하게 설정해야 통신이가능하다!
6.송신콜백함수(OnDataSent) 나의 ESP32보드가 데이터를 전송하고 데이터가 성공적으로 다 송신이 되었을때 호출되는 함수이다! -> 상대방보드가 성공적으로 데이터를 수신했는지 아닌지를 확인할 수 있음!
7.수신콜백함수(OnDataRecv) 다른 ESP32보드가 나의 보드에 데이터를 전송했을때 호출되는 함수이다!
8.ESPNOW에서 메시지를 전송하는 함수가 TCP나 UDP처럼 byte array를 전송하는 형식이기 때문에 어렵다고 느낄 수 있다!
9.ESPNOW를 포함한 모든 통신의 기본단위는 1byte이다!
10.보내는쪽에서 1byte를 전송하면 받는쪽에서 1byte를 수신하면 된다!
11.보내는쪽에서 uint16_t를 2byte를 쪼개서 전송하면 수신하는쪽에서는 2byte를 받은다음에 합치는 작업을 해야한다!
12.배열의 이름은 배열의 첫번째값의 주소와 같으나 구조체의 이름은 그런거와 전혀관련없다!
13.ESPNOW로 데이터를 완벽하게 전송하기전에 새로운데이터를 전송시도하면 문제가 생긴다!
14.데이터를 고속으로 전송할때 송신콜백함수가 호출되어야 그다음 데이터를 전송할 수 있다!
(예제)
1.각자가 가진 ESP32보드의 MAC주소를 확인하는 예제!
2.ESP32보드 2대에 서로가 서로에게 메시지를 전송하는 예시를 업로드해서 text메시지를 주고받는 예시를 보이시오!
3.보드B가 보드A에게 데이터를 전송하는 상황이다! 보내는 데이터가 1byte일때 예시를 보이시오!
4.보내는 데이터가 int(정수)일때 예시를 보이시오!
5.보내는 데이터가 float(실수)일때 예시를 보이시오!
6.보내는 데이터가 여러가지 자료형이 섞여있을때 예시를 보이시오!
7.보드A에 버튼 2개가 18번핀과 19번핀에 연결되어있고 보드B에 15번핀에 LED가 연결되어있을때 보드A가 18번핀의 버튼을 누르면 '0'을 전송하고 보드B의 LED는 꺼진다! 19번핀의 버튼을 누르면 '1'을 전송하고 보드B의 LED는 켜진다!
8.보드A와 보드B에 15번핀에 LED를 1개씩 연결하고 ESPNOW로 통신을 할때 보드A가 1초간격으로 'A'라는 메시지를 전송하면 보드B가 'A'메시지를 수신하면 LED를 토글한다! 보드A가 보드B쪽으로 메시지를 전송했을때 B가 성공적으로 수신했다면 LED를 켜고 실패했다면 LED를 끈다!(보드A가 보드B에게 수신체크)
9.보드B에 가상의 온습도센서가 있다고 할때 랜덤한 측정값을 ESPNOW로 전송해서 보드A의 시리얼모니터에 출력하는 예시를 보이시오!
10.(예제9에서) 수신한 데이터와 함께 ESPNOW로 송신한 보드의 MAC주소와 일치하는 보드를 시리얼 모니터에 출력하시오!
11.(예제9에서) 보드B가 송신체크를 하면서 자기가 가진 최대의 속도로 전송시키시오!