Em ESP32 GPIO será feita uma análise de como é feita a configuração dos General Port Input Output, ou seja, dos GPIOs do módulo ESP32 utilizando as APIs disponíveis na biblioteca contida no ESP-IDF da empresa Espressif, isto mostrará as possibilidades oferecidas e que irão de encontro ao gosto do desenvolvedor da aplicação.
A seguir, os tópicos deste artigo:
5. Exemplo de aplicação
Para o melhor aproveitamento deste conteúdo e também para agilizar o acesso, aqui estão alguns artigos relacionados para auxiliar o desenvolvimento:
Artigos relacionados
1. Localização do arquivo do driver de GPIO no ESP-IDF
Tão importante quanto saber configurar e escolher as APIs corretas, é também conhecer a localização do arquivo o qual estão relacionadas as APIs de configuração do ESP32 GPIO, pois é neste arquivo que o desenvolvedor entenderá as necessidades para uso, assim como, o que essas APIs podem oferecer. Logo a seguir, é indicado a localização do arquivo header gpio.h no framework ESP-IDF, vide abaixo:
…\esp-idf\components\driver\include\driver
O endereço do arquivo inicia-se com reticências porque é de escolha do desenvolvedor onde instalar o framework da Espressif, deste modo, a melhor maneira de indicar a origem deste arquivo é referenciar o diretório esp-idf, pois a partir daí, todos os outros caminhos são idênticos. Assim, todos os periféricos disponíveis no ESP32, bem como, o ESP32 GPIO estão contidos no diretório driver conforme acima.
2. Configurando um GPIO usando a API
No projeto ESP32 blink LED, citado como material de apoio para desenvolvimento ou leitura complementar, configura-se o pino 2 como saída, ou seja, como output que é o mesmo pino do LED azul do kit de desenvolvimento ESP32 DevKitC v1. Este uso apenas alimenta os argumentos das APIs necessárias e já condiciona o pino citado para o devido uso, conforme a figura 1.
Na API gpio_pad_select_gpio(GPIO_NUM_2) seleciona-se o pino que será utilizado informando através do argumento da função, ou seja, o número do pino (definição).
Já para a determinação do sentido do bit ou comumente citado, a direção do pino, faz-se o uso da API gpio_set_direction (GPIO_NUM_2, GPIO_MODE_OUTPUT), aqui informa-se novamente a mesma definição utilizada na primeira API e também, no segundo argumento da função, o modo como o pino irá operar.
3. Configurando um GPIO usando a variável de estrutura e API
Há também outra forma de configurar o ESP32 GPIO: utilizar uma variável de estrutura a qual carregará todos valores de configurações pertinentes que possam implicar no funcionamento do pino escolhido. Abaixo na figura 2, verifica-se a estrutura mencionada, bem como, sua respectivas variáveis:
O arquivo que contém a estrutura da figura 2, ou seja, o arquivo gpio_types.h também contempla outras estruturas e definições relacionadas ao ESP32 GPIO e que também já foram utilizadas neste artigo, como é o caso da definição GPIO_MODE_OUTPUT. Este arquivo está localizado no seguinte diretório:
…\esp-idf\components\soc\include\hal
A seguir, uma análise de cada variável da estrutura mencionada:
- pin_bit_mask: é a indicação de qual pino está sendo configurado, normalmente utiliza-se o operador de deslocamento “<<“;
- mode: indica-se se o pino é um input ou output;
- pull_up_en: habilita ou não o resistor de pull-up do pino em questão;
- pull_down_en: habilita ou não o resistor de pull-down do pino em questão;
- intr_type: tipo da borda (subida, descida ou ambos) em que disparará a interrupção deste pino.
Claramente percebe-se, em comparação ao primeiro exemplo de configuração, a utilização menor de APIs, visto ao uso da variável de estrutura a qual já contém todas as variáveis necessárias. Além disso, para cada valor de configuração visto na figura 3, existem uma API equivalente na biblioteca da ESP-IDF, conforme a seguir:
- gpio_set_intr_type(gpio_num_t gpio_num, gpio_int_type_t intr_type);
- gpio_set_direction(gpio_num_t gpio_num, gpio_mode_t mode);
- gpio_pullup_en(gpio_num_t gpio_num);
- gpio_pulldown_en(gpio_num_t gpio_num).
Deste modo, observa-se um número maior de APIs para realizar a mesma configuração utilizando uma variável de estrutura dedicada ao ESP32 GPIO.
4. Configurando uma interrupção externa para a GPIO
A habilitação de uma interrupção externa para um pino da ESP32 GPIO também pode ser feita através de uma API, vide a seguir, a continuação do exemplo de aplicação (figura 4):
A API gpio_install_isr_service(ESP_INTR_FLAG_DEFAULT) instala o handle service para o GPIO ISR (Interrupt Service Routine), ou seja, o serviço de atendimento que gerou essa interrupção. Esta interrupção pode ser habilitada para cada pino que dispor deste recurso de interrupção externa.
Já a API gpio_isr_handler_add(BUTTON_1, gpio_isr_handler, (void*) BUTTON_1), indica o pino responsável pela interrupção, neste caso, o BUTTON_1, o segundo parâmetro gpio_isr_handler é a rotina de atendimento à interrupção aonde ocorrerá esse tratamento e, por fim, o argumento que alimentará com a informação do estado do pino essa ISR.
A ISR que conterá o codigo para tratamento quando houver a interrupção, pode ser vista a seguir na figura figura 5:
A gpio_isr_handler(void* arg) é a ISR responsável por tratar a interrupção causada pelo BUTTON_1. É static porque está apenas no escopo deste arquivo fonte, é void porque o returno é vazio e a atribuição IRAM_ATTR (Instruction RAM) significa que esta parte do código da aplicação está alocada em RAM (memória volátil), mais precisamente an SRAM0. Isto traz alguns benefícios, como: menor latência comparada com a alocação em memória Flash, além disso, um local seguro para alocação desse tipo de rotina.
5. Exemplo de aplicação
A seguir, uma aplicação em que acenderá o LED azul da placa mediante o acionamento do botão denominado BUTTON_1, neste caso, pode-se usar uma tact switch conectado ao pino D13 do kit ESP32 DevKitC v1 e o outro terminal desta chave ao GND. Vide abaixo: