ESP32 Start-Up & 메모리 시스템 + Buzzer, Touch, LED Matrix 제어

공부하자·2022년 9월 20일
0

ESP32 Start-Up 절차

Arduino ESP32 실행

  • Arduino 프로그램의 시작
    • hardware\espressif\esp32\cores\esp32\main.cpp

ESP32 Start-Up 단계

  • 함수 app_main() 실행 전 ESP32는 다양한 동작 실행
    • 함수 app_main()은 ESP-IDF application의 entry point
  • ESP32 시작 단계
    • Power Up
    • 1’st stage bootloader 실행
    • 2’nd stage bootloader 실행
    • Application startup 실행
    • 함수 app_main() 호출

ESP32 Start-Up 단계 이해

  • 1’st stage bootloader 실행
    • ROM에 저장된 reset vector를 포함하는 minimal boot loader. 2’nd stage boot loader 이미지를 Flash 0x1000에서 RAM(IRAM & DRAM)으로 loading
  • 2’nd stage bootloader 실행
    • 파티션 테이블 정보 및 앱 이미지를 Flash에서 읽어 RAM에 loading한 후 프로그램 동작에 필요한 RW 및 RO 영역 매핑. OTA app이 있는지 체크하여 OTA 실행
  • Application Start-up
    • IO 포트 초기화, 시스템 초기화, RTOS 초기화 후 app_main() 호출
  • 함수 app_main() 실행
    • Arduino 앱 실행하기 위한 loopTask 생성. 생성된 Task에서 Aruino setup() 함수와 loop() 함수를 호출

1st Stage Boot Loader
2nd Stage Boot Loader
Application Start-up
app_main() 실행

참고 : SW 동작에 필요한 메모리 구조

메모리 구조 잘 뫄두기


Flash에서는 Read/Write를 마음대로 할 수 없어서 RAM으로 옮겨서 사용한다.

TEXT: code와 ro(read only) data.
RW DATA: global 변수 중 초기값이 있으면 R/W 데이터에 저장
BSS: global 변수 중 초기값 없거나 0으로 초기화되어 있으면 BSS에 저장
Heap: 메모리를 할당해주는 영역
Free MEMORY
Stack : 프로그램을 실행하면서 필요한 메모리 공간을 쌓았다가 끝나면 나옴. FIFO 형태 구조.

local value, argument는 기본적으로 cpu 내부의 register에 있다. 빠르게 접근 수 있다. global 변수는 메모리를 할당 받아서 사용해야 하기 때문에 load store 동작을 한다. 단, register의 영역이 제한적이다. 남은 변수 공간을 stack 영역에서 할당해서 쓴다. 그때 memory access가 이루어진다.

local value, argument 조금만 쓰고 argument도 structure로 써서 성능개선을 꾀하기도.

임베디드 메모리 시스템

  • 프로세서는 명령이나 데이터를 읽거나 쓸 때 주소 정보와 제어신호를 구동
  • MMU(Memory Management Unit)는 가상주소(Virtual Address)를 물리주소(Physical Address)로 변환
  • 메모리제어기(Memory Controller) 입력된 주소(Physical Address) 정보를 보고 FLASH 장치 영역인지 DRAM 장치 영역인지를 판단(Address Decoding)하고 해당하는 제어 신호를 구동

MMU : 가상주소를 물리주소로 변환
메모리제어기 입력된 주소 정보를 보고 해당하는 제어 신호 구동


virtual address. pysical address.
OS를 쓰는 경우. 내 app에서 쓰는 address 공간이 있는데, 실질적으로 물리 공간에서 사용할 필요가 생긴다. 그래서 app단에서는 주소를 가상으로 할당해서 쓰게 된다. 하지만 나중에 실질적 쓸때는 pysical memory에 mapping 써야 한다.
OS를 쓸 때 반드시 필요한 기능이다.
rtos는 필요 없다. 보통은 MMU를 가지고 있다.

Cache는 변수를 쓰는데 global 변수는 memory 공간에 있다. 쓸때 마다 불러오는 것은 속도가 늦어진다. cpu가 빨라봤자 소용이 없다.
해결을 위해 중간에 아주 고속의 메모리를 가지고 있다. 이를 cache라고 한다.
최근 access한 코드나 데이터를 일시적으로 보관해서 cpu가 빠르게 쓸 수 있게 해준다

메모리 종류

  • 휘발성 메모리
    • 전원이 인가되어 있는 동안에만 기록된 자료를 보관
    • RAM : DRAM과 SRAM
  • 비휘발성 메모리
    • 전원이 없는 상태에서도 유효한 자료를 보관
    • ROM : 마스크 ROM, PROM, EPROM, FLASH 등

휘봘성: RAM
비휘발성: ROM

Buzzer DAC

Buzzers

  • Piezoelectric(압전식) Buzzer
    • 피에조 효과로 소리를 내는 능동 부저(Active Buzzer)및 수동 부저(Passive Buzzer)로 구분
    • 압전기(壓電氣)(Piezoelectricity, /piˌeɪzoʊˌilɛkˈtrɪsɪti/)란 기계적 일그러짐을 가함으로써 유전 분극을 일으키는 현상을 말한다. (Wikipedia)
  • 능동 부저
    • 내장된 회로를 통해 외부에서 전류가 흐르면 소리가 나는 부저
  • 수동 부저
    • 별도 내장된 회로 없이 미세한 진동으로 소리를 내는 장치

압전식 부저
압전기: 기계적 일그러짐을 가하여 유전 분극 일으킴
능동 부저 : 내장된 회로를 통해 전류가 흐르면 소리
수동 부저 : 내장 회로 없이 미세한 진동으로 소리 냄

Buzzer 동작 원리

  • 능동 부저
    • 동작 전압(ex 3.3~5V)을 인가하면 약 2KHz대역의 단일음 소리가 발생
    • 경보음 또는 알림 용도로 사용
  • 수동 부저
    • 주파수를 활용하여 소리를 내기 때문에 음계 별 표준 주파수로 다양한 음역대의 소리 가능

능동 부저 : 단일음 소리 발생
수동 부저 : 주파수로 다양한 음역대의 소리 가능

Kepler ESP-A 보드에서의 Buzzer

  • 보드 뒷면에 부저장치가 포함되어 있으며, 하드웨어 정보를 살펴보고 구조를 이해
  • GPIO(GPIO2)에 의해 전원 제어가 되며 DAC1(Digital to Analog 변환기)를 통해 ESP32 내부에서 아날로그 신호로 변환하여 장치에 해당 동작을 수행

보드 뒤에 부저장치 포함.
GPIO에 의해 전원 제어. DAC1을 통해 아날로그 신호로 변환하여 수행

PWM을 활용한 Buzzer 동작 code

  • PWM 변수 설정
    • int freq; // PWM 주파수
    • int channel; // PWM 채널 설정: 0--15
    • int resolution; // 해상도 설정: 8-bit (0--255)
  • PWM 초기화 in setup()
    • ledcSetup(channel, freq, resolution)
  • 마이크로컨트롤러 핀-PWM 채널 연결 in setup()
    • ledcAttachPin(gpio_pin, channel)
  • Buzzer tone 설정
    • ledcWriteTone(channel, target_freq) // See Table in page 8 for target_freq
    • ledcWrite()

PWM

Touch Sensor

Touch Sensor

  • 터치 센서는 접촉식 정전 용량 방식(Capacitive Overlay), 압력식 저항막 방식(Resistive Overlay), 적외선 감지 방식(Infrared Beam)등 입력 방식 및 감지 방식에 따라 분류
  • Kepler-ESP A장치의 터치센서는 접촉식 정전용량 방식의 Capacitive Touch Sensing 방식 이용
  • Capacitive Sensor는 전도성이 있는 물체 혹은 공기 중의 유전체를 감지하는 센서로 접근, 위치, 변위, 습도, 유체면, 가속도 등을 감지하거나 측정하는 많은 종류의 센서로 사용
  • 동작 원리를 살펴보면 PCB(Printed Circuit Board, 인쇄회로기판)상의 센서 PAD와 그라운드(Ground)간의 캐패시턴스(CPAD)와 손가락 센서 패드 간의 캐패시턴스(CFINGER)간의 차이 때문에 발생하는 에너지 변화를 입출력 I/O PIN을 통해서 감지
  • 이를 통해서 PCB상에서 직접적으로 센서 패드에 전도성이 있는 물체의 터치 유무를 판별

정전 용량 방식 (Capacitive Overlay)
압력식 저항막 방식 (Resistive Overlay)
적외선 감지 방식 (Infrared Beam)

ESP A는 정전 용량 방식. Capacitive Touch Sensing

Capacitive Sensor는 전도성이 있는 물체 혹은 공기 중의 유전체를 감지함.
PCB 상의 센서 PAD와 그라운드 간의 캐패시턴스(CPAD)와 손가락 센서 패드 간의 캐패시턴스(Ground) 간의 차이 때문에 발생하는 에너지 변화를 I/O 핀을 통해 감지
-> 전도성이 있는 물체의 터치 유무 판별

Kepler ESP-A 보드에서의 Touch Sensor

  • 개발보드에는 Touch Sensor장치가 포함되어 있으며, 하드웨어 정보를 살펴보고 구조를 이해
  • Touch Sensor 회로 정보는 2개의 GPIO핀으로 연결되었으며, 각각 오른쪽, 왼쪽 터치를 인식

  • Touch Sensor 전하량 read
    • touchRead(gpio_num)

Object는 Input이다. Digital이 아니라 Analog 값을 읽는다.

LED Matrix

LED Matrix

  • LED Matrix(도트매트릭스)는 출력 장치 중 하나로써 문자, 숫자, 이모티콘 등을 표시하기 위해 사용되는 장치
  • LED가 여러 개의 행과 열의 점으로 위치해 있으며 각 픽셀마다 색상을 뿌려줌으로써 다양한 연출 효과 기능제공

여러 개의 행과 열. 픽셀.

  • Kepler-ESP A에 탑재되어 있는 LED Matrix는 총 72개(8x9) LED가 포함되어 있으며, LED Matrix 드라이버(IS31FL3731)를 통해 총 9개의 핀을 통해 제어가 가능

72개 LED. 9개의 핀으로 제어.

(추가) PIN을 제어하는 컨트롤러가 존재한다. 보드의 경우 외부에 IS31FL3731 칩이 있다. 드라이버 IC에 GPIO가 쭉 있고 GPIO에 연결해서 LED를 켰다가 껐다가 하는 작업을 반복한다.
CPU interface는 신호는 많이 없지만 I2C_SDA, I2C_SCL 등의 신호를 가지고 데이터값을 써주면 driver IC에서는 동시에 하드웨어를 구동하면서 LED가 켜지도록 만든다.
clock과 data는 각각 IO21,22에 연결되어 있다.

  • LED Matrix 드라이버와 I2C인터페이스(I2C_SDA, I2C_SCL) 통신하며 9개의(CA1~CA9) 출력 포트를 사용한다.

I2C인터페이스로 통신. 9개의 출력 포트 사용.

LED Matrix Driver Overview

LED Matrix 구동 SW

  • Reference
    • Arduino\hardware\espressif\esp32\libraries\Adafruit_IS31FL3731-master
    • #include <Adafruit_GFX.h>
    • #include <Adafruit_IS31FL3731.h>
  • 초기화
    • matrix.begin(); // I2C주소값 선언, begin(uint8_t addr = ISSI_ADDR_DEFAULT);
  • Text 설정
    • matrix.setTextSize(1); // Text 크기
    • matrix.setTextColor(100); // Text 밝기
  • 화면 초기화
    • matrix.clear(); // LED Matrix 화면 초기화
  • 출력 좌표
    • matrix.setCursor(1,1); // LED Matrix 출력의 좌표값(x, y)
  • 출력
    • matrix.printf("%c",text[i]); // 문자 배열값 출력(%c=문자1개)

LED Matrix 구동 라이브러리

Low-Level 드라이버 구현

I2C Bus

  • I2C(Inter-Integrated Circuit) 버스
    • 여러 개의 저속의 주변 기기를 연결하기 위해 사용
  • 2 개의 라인을 이용한 I2C 통신
    • SDA (Serial DAta)
      • 데이터의 직렬 전송에 사용된다.
    • SCL (Serial CLock)
      • 디바이스간 신호 동기화에 사용되는 클럭이다.
  • Address & Data 전송
    • 7비트 Address와 R/W 비트를 포함하여 8비트 전송 후 Data 송수신

I2C 버스. 여러 개의 저속의 주변 기기를 연결하기 위해 사용.
2개의 라인을 이용한 I2C 통신 : SDA(데이터 직렬 전송), SCL(디바이스 간 신호 동기화)
Address & Data 전송 : 7비트 Address와 R/W 비트를 포함하여 8비트 전송 후 Data 송수신


센서 연결할 때 가장 많이 사용하는 사용자 인터페이스. serial bus 사용.
데이터 요청하는 Master는 CPU에, 데이터를 입력하는 slave는 센서에 있다.

lighting edge(clodck이 튕길 때)
데이터는 8bit씩 이동한다.

profile
아주대학교 수업 기록

0개의 댓글