ESP32는 강력한 GPIO 기능을 제공하는 마이크로컨트롤러로, 다양한 주변 장치와 상호작용할 수 있습니다. 오늘은 ESP32의 GPIO 핀을 구성하고 활용하는 방법에 대해 알아보겠습니다. LED 점멸, 버튼 입력 처리, 그리고 GPIO 인터럽트를 사용하는 방법을 예제와 함께 설명합니다.
GPIO 핀 구성 방법
ESP32에서 GPIO를 사용하려면 먼저 핀을 설정해야 합니다. 이를 위해 esp-idf
에서 제공하는 GPIO 관련 함수를 사용할 수 있습니다. 기본적으로 다음과 같은 단계를 거쳐 GPIO 핀을 구성합니다.
- GPIO 핀 번호 설정
- 핀 모드 설정 (입력/출력/양방향 등)
- 풀업 또는 풀다운 저항 설정
다음은 GPIO를 출력으로 설정하는 예제입니다:
#include "driver/gpio.h"
void configure_gpio() {
gpio_config_t io_conf;
io_conf.intr_type = GPIO_INTR_DISABLE; // 인터럽트 비활성화
io_conf.mode = GPIO_MODE_OUTPUT; // 출력 모드 설정
io_conf.pin_bit_mask = (1ULL << GPIO_NUM_2); // GPIO2 설정 (LED 핀)
io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;// 풀다운 비활성화
io_conf.pull_up_en = GPIO_PULLUP_DISABLE; // 풀업 비활성화
gpio_config(&io_conf); // 설정 적용
}
위 코드에서는 gpio_config_t
구조체를 사용하여 핀 번호, 모드, 풀업/풀다운 저항 등을 설정한 후 gpio_config()
함수를 호출하여 설정을 적용합니다.
LED 점멸 예제
다음은 GPIO를 이용해 LED를 점멸하는 예제입니다. 여기서는 GPIO 2번 핀에 연결된 LED를 제어하는 방법을 설명합니다.
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#define LED_PIN GPIO_NUM_2
void app_main() {
// GPIO 핀 구성
gpio_pad_select_gpio(LED_PIN);
gpio_set_direction(LED_PIN, GPIO_MODE_OUTPUT);
while (1) {
// LED 켜기
gpio_set_level(LED_PIN, 1);
vTaskDelay(1000 / portTICK_PERIOD_MS);
// LED 끄기
gpio_set_level(LED_PIN, 0);
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
위 코드에서는 gpio_pad_select_gpio()
함수를 사용하여 GPIO 핀을 선택하고, gpio_set_direction()
함수를 통해 핀의 방향을 출력으로 설정합니다. 이후 gpio_set_level()
함수를 사용하여 핀의 값을 1 또는 0으로 설정하여 LED를 켜거나 끕니다.
버튼 입력 처리 예제
GPIO를 입력으로 구성하여 버튼의 상태를 읽는 방법을 알아보겠습니다. 여기서는 버튼이 GPIO 0번 핀에 연결되어 있다고 가정합니다.
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#define BUTTON_PIN GPIO_NUM_0
void app_main() {
// GPIO 핀 구성
gpio_pad_select_gpio(BUTTON_PIN);
gpio_set_direction(BUTTON_PIN, GPIO_MODE_INPUT);
gpio_pullup_en(BUTTON_PIN); // 풀업 활성화 (버튼이 눌리지 않았을 때 HIGH 상태 유지)
while (1) {
// 버튼 상태 읽기
int button_state = gpio_get_level(BUTTON_PIN);
if (button_state == 0) {
printf("Button Pressed\n");
} else {
printf("Button Released\n");
}
vTaskDelay(100 / portTICK_PERIOD_MS);
}
}
위 예제에서는 gpio_set_direction()
함수를 사용하여 버튼이 연결된 핀을 입력으로 설정하고, gpio_pullup_en()
을 사용해 풀업 저항을 활성화합니다. 이후 gpio_get_level()
함수를 통해 버튼의 상태를 읽어옵니다.
GPIO 인터럽트 처리 예제
GPIO 인터럽트를 사용하면 버튼과 같은 입력 장치에서 발생하는 이벤트를 처리할 수 있습니다. 다음은 버튼을 눌렀을 때 인터럽트를 발생시켜 처리하는 예제입니다.
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_log.h"
#define BUTTON_PIN GPIO_NUM_0
static const char *TAG = "GPIO_INTERRUPT";
// 인터럽트 핸들러
static void IRAM_ATTR gpio_isr_handler(void* arg) {
uint32_t gpio_num = (uint32_t) arg;
ESP_LOGI(TAG, "GPIO %d interrupt triggered", gpio_num);
}
void app_main() {
// GPIO 핀 구성
gpio_config_t io_conf;
io_conf.intr_type = GPIO_INTR_NEGEDGE; // 하강 엣지 트리거 설정
io_conf.mode = GPIO_MODE_INPUT; // 입력 모드 설정
io_conf.pin_bit_mask = (1ULL << BUTTON_PIN); // 버튼 핀 설정
io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;// 풀다운 비활성화
io_conf.pull_up_en = GPIO_PULLUP_ENABLE; // 풀업 활성화
gpio_config(&io_conf);
// 인터럽트 서비스 설치
gpio_install_isr_service(0);
// 버튼 핀에 인터럽트 핸들러 추가
gpio_isr_handler_add(BUTTON_PIN, gpio_isr_handler, (void*) BUTTON_PIN);
while (1) {
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
이 예제에서는 gpio_config_t
를 사용하여 인터럽트를 설정하고, gpio_install_isr_service()
를 호출하여 인터럽트 서비스를 설치한 후, gpio_isr_handler_add()
를 통해 특정 핀에 대한 인터럽트 핸들러를 등록합니다. 핸들러 함수는 인터럽트가 발생했을 때 호출되며, 여기서 GPIO 핀 번호와 관련된 작업을 처리할 수 있습니다.
결론
이번 포스팅에서는 ESP32의 GPIO 핀을 구성하는 방법과 이를 이용해 LED를 제어하고 버튼 입력을 처리하는 방법, 그리고 GPIO 인터럽트를 사용하는 방법에 대해 알아보았습니다. GPIO는 외부 장치와 상호작용하기 위한 중요한 인터페이스로, 다양한 입력 및 출력 기능을 수행할 수 있습니다.
요약
- GPIO 핀 구성: 출력 또는 입력 모드로 설정하고 풀업/풀다운 저항을 설정합니다.
- LED 점멸: 출력 모드로 설정한 GPIO 핀을 통해 LED를 켜고 끄는 예제입니다.
- 버튼 입력 처리: 입력 모드로 설정한 GPIO 핀을 통해 버튼의 상태를 읽는 예제입니다.
- GPIO 인터럽트 처리: GPIO 인터럽트를 설정하여 버튼과 같은 장치에서 발생하는 이벤트를 처리하는 방법을 설명했습니다.
'ESP32 IDF' 카테고리의 다른 글
ESP32 IDF 웹 서버(Web Server) (0) | 2024.11.04 |
---|---|
ESP32 IDF Wi-Fi 기능 살펴보기 (0) | 2024.11.03 |
ESP32 IDF 프로젝트 생성 및 구조 이해 (0) | 2024.11.01 |
ESP32 IDF 개발 환경 설정하기 (0) | 2024.10.31 |
ESP32 IDF 소개 (0) | 2024.10.31 |