Introdução
No post passado foram apresentadas algumas especificações gerais de pinout e modelos mais populares do ESP32. Neste post faremos a instalação do ESP32 na arduino IDE assim como detalharemos algumas funções das portas GPIO disponíveis no ESP32.
Instalação do ESP32 no arduino IDE
Antes de começar com as portas GPIO e como usa-las será necessário a arduino IDE instalado em seu computador. Se não o tem instalado, baixe e instale a versão mais recente no site do arduino. Para usar e programar ESP32 na IDE do Arduino, será necessario adicionar os modelos do ESP32 a IDE.
Com a Arduino IDE aberta, primeiramente navegue o menu Arquivo -> Preferências:
Depois cole a URL abaixo no campo de URLs adicionais:
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
Após concluir essa etapa adicione as placas ESP32 pelo menu Ferramentas -> Placa -> Gerenciador de Placas.
Insira na pesquisa “ESP32″e instale a versão mais recente das placas da opção “esp32 by Espressif Systems”.
Após a conclusão da instalação verifique se os modelos de ESP32 estão disponíveis no menu de placas
Escolha um modelo de ESP32, e verifique se o nome do modelo irá aparecer no canto inferior direito da Arduino IDE.
Pinos GPIO do ESP32
Os pinos GPIO (General Purpose Input Output) são portas que servem como interface entre o microcontrolador e periféricos como sensores, atuadores ou até outros circuitos integrados e microcontroladores. A imagem abaixo a pinagem de um DOIT Esp32 DevKit v1 de 30 pinos. Ele tem 25 pinos GPIOs com níveis de tensão 0V e 3.3V (não tolera 5V) para níveis digitais 0 e 1 respectivamente, com corrente máxima de 12mA por GPIO.
A maioria desses 25 pinos GPIO do ESP32 pode funcionar como entrada ou saída digital simples. Essas funções de entrada e saída podem ser acessadas através do framework arduino pelas funções pinMode(), digitalRead() e digitalWrite().
1 2 3 4 5 6 7 8 9 10 11 12 | //Defina o pino 32 como saida. pinMode(32, OUTPUT); //Defina o pino 32 com nivel alto(3.3V). //A funçao aceita os seguintes opçoes (HIGH ou LOW). digitalWrite(32, HIGH); //Defina o pino 32 como entrada. pinMode(32, INPUT); //Salve o estado(LOW ou HIGH) do pino 32 na variável pinStatus int pinStatus = digitalRead(32); |
Vale destacar que as opções disponíveis para pinMode() são INPUT, OUTPUT, INPUT_PULLUP, INPUT_PULLDOWN.
Pinos PWM
O controlador ESP32 LED PWM possui 16 canais independentes que podem ser configurados para gerar sinais PWM com propriedades diferentes. Todos os pinos que podem atuar como saídas podem ser usados como pinos PWM (apenas os pinos GPIOs 34 a 39 não podem gerar PWM).
A forma de configurar o PWM nos pinos do ESP32 difere um pouco da forma de configurar do Arduino UNO.
- Primeiramente escolha um canal PWM, o ESP32 tem 16 disponíveis de 0 a 15. Usaremos nesse exemplo o canal 1
- Em seguida, você precisa definir a frequência do sinal PWM. Para este exemplo, arbitrei uma frequência de 1000 Hz.
- Você também precisa definir a resolução do ciclo do sinal. Você tem resoluções de 1 a 16 bits. Neste exemplo usaremos uma resolução de 8 bits 0 a 255.
- Em seguida, você precisa especificar em quais GPIO ou GPIOs o sinal será exibido. Vamos reutilizar o pino 32 nesse exemplo.
- Finalmente, para controlar o brilho do LED usando PWM, usamos a função ledcWrite().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | //Exemplo de leitura do sensor toque capacitivo T5 // GPIO 32 será utilizada const int ledPin = 32; // variaveis de configuração const int freq = 1000; const int ledChannel = 1; const int resolution = 8; void setup(){ // Configuraçao do LED PWM (Passos 1, 2, 3) ledcSetup(ledChannel, freq, resolution); // Conecte o canal ao GPIO a ser controlado (passo 4) ledcAttachPin(ledPin, ledChannel); } void loop(){ // Aumente o brilho do led for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){ //Controle do sinal PWM (passo 5) ledcWrite(ledChannel, dutyCycle); delay(5); } // Diminua o brilho do led for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){ //Controle do sinal PWM (passo 5) ledcWrite(ledChannel, dutyCycle); delay(5); } } |
Pinos GPIO Touch
Esses pinos funcionam como sensores capacitivos, são sensíveis a objetos com alguma carga elétrica como a pele humana. Com isso podem ser utilizados para detectar o toque dos dedos. Os pinos disponíveis nessa placa são:
- GPIO 4 (T0)
- GPIO 2 (T2)
- GPIO 15 (T3)
- GPIO 13 (T4)
- GPIO 12 (T5)
- GPIO 14 (T6)
- GPIO 27 (T7)
- GPIO 33 (T8)
- GPIO 32 (T9)
1 2 3 4 5 6 7 8 9 10 11 12 | //Exemplo de leitura do sensor toque capacitivo T5 const int sensor = T5; //GPIO 12 void setup() { Serial.begin(115200); } void loop() { Serial.println(touchRead(sensor)); // Retorne o valor Touch5 delay(50); } |
Nesse exemplo enviamos pela porta serial a função o retorno da função touchRead(). Esta aceita tanto o numero do pino, nesse caso pino 12, como o numero do sensor que aqui seria T5.
Pinos GPIO ADC
O ADC (Analog Digital Converter), é o circuito capaz de converter uma grandeza analógica de entrada (tensão) em uma representação digital (valor inteiro). No ESP32 existem 2 conversores AD, ADC1 com 8 canais e o ADC2 com 10 canais. Ambos os conversores possuem resolução de 12 bits alcançando 4096 valores distintos. A faixa de entrada pode ser alternada opcionalmente para níveis entre 0-1V, 0-1.34V, 0-2V ou 0-3.6V. O ESP32 DevKit v1 tem 15 pinos disponíveis para esta função:
- GPIO 36 (ADC1_CH0 )
- GPIO 39 (ADC1_CH3)
- GPIO 32 (ADC1_CH4)
- GPIO 33 (ADC1_CH5)
- GPIO 34 (ADC1_CH6)
- GPIO 35 (ADC1_CH7)
- GPIO 4 (ADC2_CH0)
- GPIO 2 (ADC2_CH2)
- GPIO 15 (ADC2_CH3)
- GPIO 13 (ADC2_CH4)
- GPIO 12 (ADC2_CH5)
- GPIO 14 (ADC2_CH6)
- GPIO 27 (ADC2_CH7)
- GPIO 25 (ADC2_CH8)
- GPIO 26 (ADC2_CH9)
1 2 3 4 5 6 7 8 9 10 | //Exemplo de leitura simples da GPIO 34 const int sensor = 34; //GPIO 34 void setup() { Serial.begin(115200); } void loop() { Serial.println(analogRead(sensor)); // Retorne o valor analógico de 12 bits delay(50); } |
Alguns detalhes sobre os conversores AD do ESP32 devem ser observados.
As leituras analógicas podem apresentar uma diferença de +/- 6% de um chip para outro.
A conversão não possui uma resposta linear por toda faixa disponível para leitura, e o fabricante recomenda alguns métodos de calibração que não serão detalhados neste post.
O conversor ADC2 é compartilhado com o driver do módulo de comunicação sem fio, portanto as leituras desse ADC não podem ser realizadas enquanto WiFi esta ativo. Além disso as leituras do ADC1 podem ficar ruidosas durante o uso do WiFi. Recomendado que o WiFi seja desligado durante as leituras e reativado dependendo da necessidade.
Pinos GPIO DAC
Existem 2 pinos DAC (Digital to Analog Converter) de 8 bits no ESP32 para converter valores digitais em saídas com níveis de tensão analógica. Estes são os pinos disponíveis:
- GPIO 25 (DAC1)
- GPIO 26 (DAC2)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | //Exemplo de conversão digital/analogica const int dac_pin = 25; // GPIO 25 será utilizada void setup(){ } void loop(){ // Aumente o brilho do led for(int value = 0; value <= 255; value++){ //Controle da saida analogica dacWrite(dac_pin, value); delay(5); } // Diminua o brilho do led for(int value = 255; value >= 0; value--){ dacWrite(dac_pin, value); delay(5); } } |
Neste exemplo usamos a função dacWrite() para uma conversão digital-analógica. São passados como parâmetros o pino GPIO de saída, no caso 25, e um valor de 0 (0V) a 255 (3.3V).
Outras funções
Todos os pinos GPIOs também podem ser configurados como fontes de interrupções externas. Interrupções “interrompem” a tarefa que o processador está executando para atender a rotina correspondente aquela interrupção. Após concluir a rotina ele retorna a tarefa anterior.
O pino GPIO 0 compartilha algumas funções como Touch e ADC porém é utilizado no modo de gravação e em alguns casos ele é até omitido da placa para o usuário.
Alguns GPIO podem ser usados somente como pinos entrada:
- GPIO 34
- GPIO 35
- GPIO 36
- GPIO 39
Alguns GPIOs alteram seu estado lógico ou emitem sinais PWM durante a inicialização causando resultados inesperados. Considere utilizar outros pinos se precisar de uma saída mais confiável mesmo durante o tempo de inicialização.
A versão da placa de 38 pinos possui as GPIO 6 até GPIO 11 disponíveis ao programador, porém elas são conectadas a memória flash integrada e o fabricante recomenda não utilizar estes pinos.
Também existem pinos disponíveis que não fazem parte do GPIO do ESP32 como:
- VIN: Entrada de alimentação. Faixa recomendada de 7-12V.
- GND: Ground.
- EN(Enable): Pino de ativação do regulador de 3,3V. Levando esse pino ao GND, o ESP32 será desligado.
- 3V3: Saída de 3.3V. Corrente máxima de 500mA.
Além de operações individuais em cada pino, alguns GPIOs podem ser utilizados em combinação para proporcionar conexões seriais como SPI, I²C e CAN 2.0, que serão discutidas em um post futuro.
Por hoje é só, aguardo você no próximo post. Qualquer dúvida ou sugestão deixe registrado no campo de comentários.
Muito interessante, pois facilita o aprendizado para aqueles que estão começando… como eu, por exemplo!!!
Bom dia Castelo!
Agradeço pelo comentário, estamos sempre buscando trazer um conteúdo relevante para nossos leitores.
Abraço.
Muito bom a descrição do ESP32, um dos melhores e mais completos que já vi na internet. Obrigado por compartilhar.
Bom dia.
O Artigo esta muito bom.
Como este tipo de tecnologia muda muito rápido seria interessante colocar a data de postagem para que no futuro possamos saber o quão recente esta o artigo.
no esp8266 e no arduino as portas podem ser nomeadas por D2… etc mas o esp32 nao funciona dessa forma apenas com numeros sem o “D”?
Olá Roberto! Você esta certo, usa-se a notação sem o “D” exatamente como vem impresso na placa.
Abraço.
Gostaria saber quantas portas de energia tem esp32. Meu esp32 só achei 2. Tem mais alguma? Pois encontrei 3 gnc
Bom dia Anderson, o DOIT Esp32 DevKit v1 tem três pinos de alimentação:
VIN – entrada de alimentação. Faixa recomendada de 7-12V.
GND – Ground.
3V3 – Saída de 3.3V. Corrente máxima de 500mA.
Oi, uma consulta, quais são os pinos do ESP32 usados para programar ele?, o PC envia os dados do codigo para programar ele pelo cabo USB, a plaquinha do ESP32 tem um conversor USB/Serial, mas quais são ps pinos usados oara programar o chip?.
Olá Ed, os pinos são os GPIO1(TX0) e GPIO3(RX), além de ser necessario manter o GPIO0 em 0V durante a reinicialização.
Parabéns pelo artigo. Excelente exploratório sobre o ESP32. Você escreve com excelente didática! abraço!
Boa noite. Parabéns, gostei bastante da publicação. Teria alguma recomendação de material para referência? Livro etc..
Agradeço muito pelo Post, Ajudou demais a esclarecer minhas dúvidas 🙂
Muito bom artigo.
Pergunto se é possivel redirecionar as portas UART (Serial 1 e 2) para outras GPIO.
Bom dia Lauro, é possivel sim. Se você usar o framework Arduino pode utilizar a biblioteca HardwareSerial.h
para configurar uma porta serial com os GPIOs que precisar(entre GPIO0 e GPIO31).
Gostei do artigo, algumas dúvidas foram esclarescidas.