ESP32

ESP32 Serial 통신 라이브러리

기하 2021. 8. 17. 13:46

1. 설명

ESP32와 ESP8266은 아두이노처럼 쓸 수 있지만

와이파이와 블루투스(ESP8266에는 없음)가 포함되어있어서

IOT를 구현할 때 편하고, 속도가 훨씬 빨라서 고성능이 필요할 때는 사용하기 좋다.

 

ESP32와 ESP8266은 ESPRESSIF라는 회사에서 만들어 졌는데
ESP8266이 더 구형 버전이고 ESP32가 ESP8266의 단점을 보완해서 만들어진 것이다.

 

이 사진처럼 개발 보드에 ESP32 칩이 들어있는 것이다.
ESP32 보드도 종류가 많은데 크게 그냥 위 사진처럼 생긴 일반 개발 보드,

카메라가 달린 개발보드, 배터리홀더가 달린 개발보드, 화면이 달린 개발 보드 등이 있다.

 

참고로 일반 개발 보드를 살 때 핀 수가 더 많고 5v 핀이 있는 것이 있고 아닌 것도 있다.
핀 수가 더 많은 것이 5v가 있어서 사용하기 편하므로 5v핀이 있는 것으로 사는 것을 추천한다.

 

2. ESP32 / ESP8266 차이점 및 스펙

이름 ESP32 ESP8266(nodemcu)
마이크로컨트롤러 Xtensa Dual-core LX6 Xtensa Single-core L106
작동전압 3.3v 3.3v
GPIO 36 17(실제로 쓸 수 있는건 더 없음)
PWM 디지털 핀 16 8
Flash Memory 4~16MB 4MB
SRAM 512KB 160KB
Clock Speed 160~240MHz 60~160MHz
내장된 LED핀 번호(LED_BUILTIN) 2 2
WiFi O O
블루투스 Bluetooth 4.2, BLE X
터치센서 O X
온도센서 O X
홀센서 O X

A. 핀 개수
    ESP8266이 보기에는 아두이노 우노보다도 핀 개수가 더 많아 보이지만

   대부분이 내부적으로 쓰고 있는 핀이어서 쓸 수 있는 핀이 너무 적었다.
  이 문제는 ESP32에서는 핀 개수가 확 늘면서 해결되었다.
B. 성능
    성능도 ESP32가 더 좋다.
C. 블루투스
    ESP32에는 ESP8266에는 없던 블루투스가 추가되었다.
D. 그 외 터치센서, 온도센서, 홀 센서 등 다양한 것들이 추가되었다.

나는 가격을 생각하더라도 ESP32를 쓰는 것을 더 추천한다.
*그래서 이 아래부터는 ESP8266 이야기는 없고, ESP32에 대한 이야기이다.

 

3. 핀맵

ESP32 핀맵(같은 ESP32인데 핀 배치가 다를 수 있다.)

 

4. 전원 공급 방법

A. 업로드할 때도 사용하는 USB 포트를 이용
    전압 : 4.5~5.5v
B. 그냥 3.3v나 5v 핀에 맞는 전압 연결
   3.3v핀에 3.3v를 연결하거나, 5v핀에 5v를 연결한다.
   -는 GND핀에 연결

 

5. 통신 핀

A. UART(Serial) 통신
    ESP32에는 Serial 통신 핀이 3가지가 있ek.

    Serial (UART0), Serial1 (UART1), Serial2 (UART2)

 

    ① Serial (UART0)  : 업로드때 사용해서 못 쓰고,

    ② Serial1 (UART1) : 쓸 수 없는 핀에 연결되어 있어서 다른 방법으로 핀을 바꿔줘야 쓸 수 있어서

    ③ Serial2 (UART2) : 사용가능.


    Serial
        RX0 : RXD (GPIO03)
        TX0 : TXD (GPIO01)
    Serial1 *이거 쓰고 싶으면 핀을 바꿔야 한다.
       RX1 : SD2 (GPIO09)
       TX1 : SD3 (GPIO10)
    Serial2
        RX2 : GPIO16
        TX 2: GPIO17


*컴퓨터에서 소스코드를 업로드할 때 RXD, TXD를 이용해서 통신하고,

SD2, SD3는 ESP32 Flash 메모리와 연결되어있어서 RXD, TXD, SD2, SD3를 이용하면

업로드 오류가 날 수도 있어서 ESP32에서는 보통 Serial2를 이용해야 한다.


*ESP32에서는 SoftwareSerial을 지원하지 않음



B. i2c
    SDA : 21번
    SCL : 22번
   *i2c통신을 이용할 때는 맨 위에 #include <Wire.h>를 써주어야 한다.
   (라이브러리 사용 시에는 보통 라이브러리에 포함되어있어서 상관없음)

C. SPI
    MOSI : 23번
    MISO : 19번
    SCK : 18번
    SS : 5번
   *SPI 통신을 이용할 때는 맨 위에 #include <SPI.h>를 써주어야 한다.

   (라이브러리 사용 시에는 보통 라이브러리에 포함되어있어서 상관없음)

 

6. 핀 설명

1. 정전식 터치 입력 지원 핀 : GPIO 4,0,2,15,13,12,14,27,33,32
2. 입력만 받을 수 있는 핀(PULLUP, PULLDOWN 저항이 없음)(출력 불가) : GPIO 34~39(34,35, SVP, SVN)
3. PWM 이용 가능한 핀 : 출력을 사용할 수 있는 모든 핀(위에서 말한 입력만 받을 수 있는 핀은 사용불가)
4. 사용 불가한 핀 : GPIO 6~11(SLK, SD0, SD1, SD2, SD3, CMD), RXD, TXD
5. 내장 LED(BUILTIN_LED) : GPIO 2
*32번 핀이 시작될 때 HIGH이면 부팅 실패

7. 주의할 점(esp32 기준)

GND핀 중에 GND역할을 하지 못하는 핀이 하나 있을 수 있다.(핀맵 참고)
일반 아두이노 우노 등에서 사용하는 부저 사용법이 통하지 않는다.
pwm, 부저를 사용할 수 있는 함수가 일반 아두이노 우노 등과 다르다.
위에서 말한 것처럼 쓸 수 없는 핀들이 조금 있는 편이다.
일반적인 방법으로는 Software Serial을 쓸 수 없다
처음 사용할 때 간단한 등록이 필요하다.

약간의 쓰기에 주의할 점들과 못쓰는 핀들이 있긴 하지만 기능이 다양한 만큼 정말 좋은 보드인 것 같다.

 


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 SerialDeviceName(0), 핀번호 변경 불가  

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

 

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

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

 

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

GPIO16 RX2 - HardwareSerial SerialDeviceName(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번을 사용자 핀번호 지정으로 사용할 경우
   연결장치의 전원을 끄거나 시리얼 통신의 연결을 제거하고 스케치를 업로드 해본다. 


출처: https://postpop.tistory.com/35