반응형

ESP32 DevKit 

 

ESP-WROOM-32 core를 장착하고 듀얼 CPU, Clock Speed가 240 Mhz인 아두이노 IDE 개발환경에서 사용할 수 있는 개발보드이다. 보드의 성능과 각종 기능 및 GPIO 핀 갯수등이 NodeMcu보다 좋지만, NodeMcu와는 달리 아두이노 우노에서 사용했던 몇몇 라이브러리등은 바로 사용할 수가 없고 라이브러리 이름이나 설정방법등이 상이한게 있어 ESP32 아두이노 코어에서 제공하는 기본 예제를 확인하고 코딩해야만 한다. 이런 불편한 점이 있기는 하지만 저렴한 가격대의 성능과 확장성 면에서 이보다 좋은 개발보드는 없을 것 같다.

 

시리얼 통신의 경우 아두이노 우노는 하드웨어 시리얼 1개를 제공하고 소프트웨어 시리얼 라이브러리를 통해 추가로 시리얼을 사용할 수 있도록 했다면 ESP32는 하드웨어 시리얼 3개를 제공하면서 소프트웨어 시리얼 라이브러리 대신 하드웨어 시리얼 라이브러리를 통해 시리얼 관련 설정을 하도록 하고 있다. ESP32에는 아두이노에서 익숙한 소프트웨어 시리얼 라이브러리가 없는 것이다. 

 

#include <HardwareSerial.h> // 하드웨어 시리얼 라이브러리

 

ESP32에서 시리얼을 사용하기 위해서는 하드웨어 시리얼을 상황에 맞게 설정해주는 방법을 알아아만 한다.

 

시리얼 통신: Serial (UART0), Serial1 (UART1), Serial2 (UART2) 3개의 하드웨어 시리얼을 제공한다. 

 

UART Any GPIO Pins  "Two UART devices with hardware flow-control and DMA"

 

"ESP32 has three UART interfaces, i.e., UART0, UART1 and UART2, which provide asynchronous communication (RS232 and RS485) and IrDA support, communicating at a speed of up to 5 Mbps. UART provides hardware management of the CTS and RTS signals and software flow control (XON and XOFF). All of the interfaces can be accessed by the DMA controller or directly by the CPU"  

 

시리얼 통신에 할당된 기본 핀번호

GPIO01 TX0 - HardwareSerial (0), 핀번호 변경 불가  

GPIO03 RX0 - HardwareSerial (0), 핀번호 변경 불가    

GPIO10 TX1 - HardwareSerial (1), FLASH 연결에 사용, 핀번호 변경 가능

GPIO09 RX1 - HardwareSerial (1), FLASH 연결에 사용, 핀번호 변경 가능 

GPIO17 TX2 - HardwareSerial (2), 핀번호 변경 가능   

GPIO16 RX2 - HardwareSerial (2), 핀번호 변경 가능

 

하지만 GPIO 6, 7, 8, 9, 10, 11 (the integrated SPI flash)은 플레시 메모리연결에 할당되어 있어서 해당핀을 사용할 수 없는데, 하드웨어 Serial1의 TX1과 RX1에 할당된 GPIO 핀의 번호는 10번과 9번이다. 이 핀을 이용해서는 Serial1을 사용할 수 없다. 그러므로 Serial1을 위한 TX1과 RX1에 플래시 메모리에 사용되지 않은 핀을 할당해주어야 한다. 이를 위한 규칙이 있는데 아래와 같다. 

 

 

 

1. 시리얼 장치의 이름으로 Serial, Serial1, Serial2를 사용하고 기본 할당핀을 사용 할 경우 setup() 함수에서만 시작하면 된다.

 

Serial.begin(115200);   // UART0 -> usb 연결과 공유, 핀번호 변경 불가

Serial1.begin(115200); // 통신에 할당된 기본핀이 플래시 메모리에 할당된 GPIO 10번과 9번이므로 사용불가

Serial2.begin(115200); // UART2 

 

2. 시리얼 장치의 이름을 Serial, Serial1, Serial2이 아닌 사용자 이름을 사용할 경우 장치명을 선언해주고 setup() 함수에서 시작시 핀번호를 포함하는 통신 규칙을 설정해주어야 한다. 

 

HardwareSerial mySerial(1);  // 장치명 선언(시리얼 번호)

HardwareSerial dfSerial(2);  // 장치명 선언(시리얼 번호)

 

mySerial.begin(115200,SERIAL_8N1, 4, 2);  // (통신속도, UART모드, RX핀번호, TX핀번호) - 핀번호 지정가능

dfSerial.begin(115200, SERIAL_8N1, 16, 17);  // 핀번호는 기본으로 할당된 번호도 사용할 수 있다. 

 

하드웨어 시리얼 3개를 동시에 사용하기 위해서는 Serial1을 사용자 장치명으로 선언해주고 시작시 규칙을 설정 해주어야 하는데, 이 때에는 사용상 주의가 필요하다.

 

스케치 업로드시 발생할 수 있는 "A fatal error occurred: Timed out waiting for packet header" 에러

 

상기에러는 하드웨어 "Serial1"을 사용하기 위해 gpio 6 ~ 11번을 제외한 핀번호를 할당하고 사용할 때 전원이 들어가 있는 연결된 장치의 통신용 핀이 스케치 업로드시 연결되어 있을경우 발생 한다. 기본 할당된 시리얼 통신용 핀에서는 연결장치가 연결되고 전원이 들어가 있는 상태에서도 오류없이 스케치 업로드가 잘된다. 

 

mySerial.begin(115200,SERIAL_8N1, 4, 2); // "Serial1"을 시리얼 통신용 사용자 핀번호(4, 2)로 지정하고 전원이 인가된 연결장치의 통신선이 연결되어 있다. -> 스케치 업로드시 오류 발생

 

해결 방법

1. 꼭 필요한 경우가 아니면 하드웨어 시리얼 1번을 사용하지 않는다.  

2. 시리얼 1번을 사용자 핀번호 지정으로 사용할 경우 연결장치의 전원을 끄거나 시리얼 통신의 연결을 제거하고 스케치를 업로드 해본다. 

 

 

+ Recent posts