본문 바로가기
HW 프로그래밍/아두이노

ESP32 자료정리

by N2info 2021. 1. 26.

당분간 일반 Controller로 ESP32모듈을 사용하려고 합니다.

ESP32-WROOM-32D 와 ESP32-WROVER-B 모듈 입니다.

ESP32-WROVER-B 모듈은 내부에 8MByte의 PSRAM을 추가로 내장하고 있습니다.

나머지는 WROOM 모듈과 같습니다.

모듈에는 기본 4MByte의 SPI Flash Memory를 갖고 있습니다.

ESP32 CPU내부의 메모리는 위와 같습니다.

448KB의 ROM 이 있는데 이는 주로 Boot loader를 저장 하는데 사용합니다.

사용자 프로그램은 외부에 달려 있는 SPI Flash를 사용해서 저장 하게 됩니다.

520KB의 on-chip SRAM을 내장하고 있습니다.

여기에 WROVER 모듈에는 외부에 8MByte의 PSRAM을 추가로 장착 할 수 있습니다.

따라서 사용자가 일반적으로 가용할 수 있는 메모리의 크기는

4MByte(16MByte 모듈도 있음)의 프로그램 메모리 520Kbyte의 프로그램 데이타 추가로 외부에 8MByte의 PSRAM을 사용할 수 있습니다.

여기에 추가로 SD/MMC를 달아서 확장할 수도 있을 것이구요.

일반적으로는 크게 부족함이 없는 양이지만 TFT LCD등을 달경우 이미지 처리를 위한 버퍼메모리가 부족할수 있습니다.

이때 PSRAM을 사용하면 좋을 것 같은데 퍼포먼스가 얼마정도 나올지는 시험을 해봐야 할 것 같습니다.

다음은 핀 펑션 정리 입니다.

모듈을 사용할때 사용자가 사용할 수 있는 핀들과 주의해서 사용할 핀들을 정리 해 보았습니다.

BOOT 관련 핀들정리

ESP32의 경우 Booting에 관련된 핀들은 위 5개의 핀들 입니다.

1) EN : 일반적인 Reset 과 같은 기능의 핀입니다.

내부에 일반적으로 RC Reset회로로서 구성되어 있고 Pull-up 되어 있습니다.

2) GPIO0 : Boot Mode를 선택하는 핀입니다.

HIGH 일때는 일반적인 부트모드로서 SPI Flash에 있는 사용자 프로그램이 실행이 됩니다.

LOW 일때는 내부 ROM에 있는 Serial Boot loader가 실행이 됩니다.

사용자 프로그램을 전송하거나 부트로더를 기동시킬때 사용하게 됩니다.

내부에서 pull-up 되어 있습니다.

 

ESP32는 EN핀이 Deactive 될때 (Low --> High) GPIO0의 상태를 읽어 부팅 모드를 결정하게 됩니다.

 
 
 

Dev Kit의 경우 위와 같은 스위치로 구성할 수 있습니다.

 
 

일반적으로 USB Serial로 부트로더를 운용하게 되는데 DTR과 RTS핀으로 위와 같은 회로를 만들어 EN과 GPIO0를 제어 합니다.

TR을 사용한 이유는 스위치와 GPIO0를 사용할때를 대비해 로직에 영향을 주지 않기 위함 입니다.

3) GPIO2 : Serial Boot mode로 들어갈때 GPIO2는 플로팅되거나 Low여야만 합니다.

입력으로 사용할 경우 부팅시 High가 되면 부트로더 모드로 들어가지 못할 수 있습니다.

출력으로 사용할 경우는 Pull Down 시켜주는 것이 안정적 일 것 같습니다.

하지만 초기 상태가 High 이어야만 하는 출력의 경우 사용에 조심을 해야만 합니다.

4) GPIO12 : 부팅시 내부 SPI Flash의 구동전압을 결정 합니다.

High일 경우 내부 SPI Flash의 구동전압을 1.8V로 결정 합니다.

Low일 경우 내부 SPI Flash의 구동전압을 3.3V로 결정 합니다.

내부에 Pull-down 되어 있어 기본은 3.3V로 정해 지게 됩니다.

GPIO12를 사용할 경우 이점을 주의해서 사용해야 합니다.

가급적이면 출력으로 사용하고 Pull down 시켜서 사용해서 부팅에 방해가 되지 않도록 해주는 것이

좋을 것 같습니다.

5) GPIO15 : 부팅시 부팅log 출력모드선택

High 일경우 Serial로 Booting log를 출력 합니다. (기본입니다.)

Low 일경우 Serial로 Booting log를 출력하지 않습니다.

내부에 Pull-up 되어 있어 기본적으로는 부팅로그를 출력하게 되어 있습니다.

역시 GPIO15를 사용할 경우 이를 참조해서 사용해야 합니다.

SPI FLASH관련 핀들

ESP32는 내부에 사용자 프로그램 저장용 메모리가 없습니다.

외부에 SPI Flash를 장착해서 사용자 프로그램을 저장해야만 합니다.

 

여기에는 6개의 핀들을 사용하게 됩니다.

 

Quard SPI Flash를 사용하고 있습니다.

즉 4bit(SD0~SD3) 버스폭의 SPI Flash를 사용합니다.

Single bit SPI도 사용할 수 있어 3개의 핀을 절약 할 수 있지만 속도 감소는 감소해야 겠지요.

외부 PSRAM 관련 핀들

ESP32는 내부에 520KByte의 SRAM을 가지고 있습니다만 부족할 경우 외부에 SPI PSRAM을 추가해 사용할 수도 있습니다.

이때는 추가로 2개의 핀이 들어가게 됩니다.

 

GPIO16과 GPIO17을 사용하게 됩니다.

Chip selecter와 CLK핀입니다.

PSRAM의 억세스 속도가 궁금합니다.

모듈의 경우 ESP32-WROVER-B 모듈이 PSRAM을 장착한 모듈입니다.

기본 UART

Boot loader나 일반 기본 시리얼 포트로 GPIO1 과 GPIO3을 사용한 TXD0, RXD0를 사용합니다.

ESP32에는 3개의 UART가 있습니다만.

UART1의 경우는 내부 SPI Flash에 핀을 할당해 버려서 사용이 불가능 합니다.

UART2의 경우 IO16, IO17을 사용하는데 만약 WROVER모듈을 사용할 경우 PSRAM용으로 핀이 할당되어서 사용이 불가능 합니다.

제 경우 UART를 많이 사용하는 편인데 이리 되버리면 기본 하나 WROVER모듈을 안쓸경우 추가로 하나더 해서 두개 밖에 사용을 못하게 됩니다.

일반 GPIO

이리 빼고 저리 빼서 확실하게 쓸수 있는 핀들은 위와 같습니다.

여기서도 GPIO39, GPIO36의 경우 내부에 콘덴서가 연결 되어 있어 민감한 외부 회로의 경우 설계시 참고를 해야 합니다.

C16과 C17인데 NC(Not Connect)로 마킹되어 있어서 실제로는 부품 장착은 되어 있지 않은 것 같습니다. ^^

첨부파일
esp32-wroom-32d_esp32-wroom-32u_datasheet_en.pdf
파일 다운로드
첨부파일
esp32-wrover-b_datasheet_en.pdf
파일 다운로드

ESP32-WROOM-32D와 ESP32-WROVER-B의 데이터 시트를 첨부 합니다.

첨부파일
esp32_hardware_design_guidelines_en.pdf
파일 다운로드

ESP32 Hardware design guideline 문서도 첨부해 둡니다.

일반적으로는 Devkit를 많이 사용합니다.

기능은 PSRMA의 차이이고 이때문에 PCB 형상이 다르지만 베이스 보드는 같은 것을 사용하므로 PSRAM 때문에 달라지는 2개의 핀만 참고해서 사용하면 됩니다.

 

첨부파일
esp32_devkitc_v4-sch-20180607a.pdf
파일 다운로드

Dev kit 메뉴얼도 첨부해 둡니다.

크게 신경쓸 것은 없지만 핀수가 좀 작아서 다양한 기능을 구사하기는 힘들어 보입니다.

Pinmap을 작성하다 보면 위에 나열한 System 기능핀들을 제외하면 딱히 남는 핀들이 빈약해 버리게 되네요.

개인적으로는 nRF52(nRF52832/nRF52840)의 핀맵기능이 아주 좋은 것 같습니다.

거의 대부분의 기능들을 대부분의 핀들에 재매핑 시킬수 있기 때문입니다.

회로도 그리기 전에 가장 먼저 해야 할 것이 내가 쓸 펑션들을 다 뽑아 낼수가 있어야 하는데 기능이 아무리 많아도 핀수가 작아서 겹치는 경우 포기해야할 펑션들이 마구 늘어나게 됩니다.

정리

일단 시험용 PCB를 작성할 정리는 대충 된 것 같습니다.

위에 정리한 핀맵들을 기준으로 해서 회로도 심벌을 최종 정리 해 보았습니다.

이제 하나하나 펑션들을 정리해 가면서 분석을 해나가야 할 것 같습니다.

1. 개발환경구축

2. 부팅 및 사용자 프로그램 전송

3. 기능 펑션 사용법

1) GPIO

2) ADC, DAC

3) UART

4) TOUCH

5) SPI

6) I2C

7) I2S

8) PWM

9) Timer Counter

10) RTC

11) SLEEP Mode

12) Wi-Fi

13) Bluetooth

첫번째 부딪치는 문제는 개발환경입니다.

가장 편한 모드는 Arduino IDE 환경에서 개발하는 것입니다.

다음은 Espressif IDF 환경입니다.

불편하기는 하지만 라이브러리가 가장 최적화 되어 있어 퍼포먼스가 뛰어 납니다.

예제도 가장 알찬 것 같아 보이구요.

세번째는 MS의 VC 환경에서 사용이 가능한 Platfomio IDE환경입니다.

이쪽도 상당한 매력이 있어 보입니다.

마지막은 MicroPython 환경 입니다.

위에것들은 C,C++환경인데 반해 마지막은 요즘 대세언어인 Python 입니다.

대충 라이브러리들을 살펴보았는데 나름 상당한 발전이 있었던 것 같습니다.

안전성만 확보되어 있다면 쓸만할 것 같습니다.

개인적으로는 Python이 언어문법은 마음에 들지만 인터프리터란 점 때문에 퍼지지 않을 줄 알았습니다.

하지만 제 예상은 완전히 빗나가 버리고 말았습니다.

요즘 가장 핫한 개발언어로 등극해 버렸기 때문입니다.

결국 기분은 찝찝 하지만 대세를 따라야 하기 때문에 저도 자존심을 버리고 익힐려고 합니다.

아직 정확히 파악을 하지 못해서 사실 모두 다 깔아서 직접 x인지 된장인지 확인해 봐야 할 듯 합니다.

일단 손쉬운 Arduino IDE , micropython을 병행 하면서 Espressif IDF를 시간내 시험해보고 마지막으로 PlatformIO IDE환경에서 작업을 해보는 것으로 할려고 합니다.

사족

ESP32의 터치펑션이 생각보다 무척 좋아 보이더군요.

유튜브에서 동영상 몇개 보았는데 아주 동작을 잘하는 것 같습니다.

지금 계획중인 조명 컨트롤러의 입력 스위치를 터치로 구성해야 하는데 지금까지는 전용칩을 사용했었는데 내장 펑션기능을 이용해 보아야 겠습니다.

첨부파일
ESP32-PIN.pdf  파일 다운로드

마지막으로 매번 참조해야 하는 Pin Function 을 정리한 파일을 올려 놓습니다.

공부할양은 많지만 이제는 머리가 많이 굳었음을 느낌니다.

하는대 까지는 해봐야 겠지요.^.^

 

출처 : m.blog.naver.com/cimygy/221677513320