ESP32 IDF

ESP32 IDF GPIO 핀 구성 및 활용 가이드

임베디드 친구 2024. 11. 2. 11:33
반응형

ESP32는 강력한 GPIO 기능을 제공하는 마이크로컨트롤러로, 다양한 주변 장치와 상호작용할 수 있습니다. 오늘은 ESP32의 GPIO 핀을 구성하고 활용하는 방법에 대해 알아보겠습니다. LED 점멸, 버튼 입력 처리, 그리고 GPIO 인터럽트를 사용하는 방법을 예제와 함께 설명합니다.

GPIO 핀 구성 방법

ESP32에서 GPIO를 사용하려면 먼저 핀을 설정해야 합니다. 이를 위해 esp-idf에서 제공하는 GPIO 관련 함수를 사용할 수 있습니다. 기본적으로 다음과 같은 단계를 거쳐 GPIO 핀을 구성합니다.

  1. GPIO 핀 번호 설정
  2. 핀 모드 설정 (입력/출력/양방향 등)
  3. 풀업 또는 풀다운 저항 설정

다음은 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