Como controlar motor dc com ESP8266 NodeMCU 35

O NodeMCU, amplamente falado no mundo maker, é uma das mais completas e interessantes placas / plataformas para desenvolvimento voltado a IoT. Entre suas grandes vantagens, está poder ser programado e usado como um Arduino convencional, conforme mostrado no post Como Programar o NodeMCU com IDE Arduino e no post NodeMCU com MQTT. Sendo assim, neste post iremos abordar como ler Inputs e como escrever em Outputs, e você verá como controlar motor DC com ESP8266 NodeMCU.

Controle de motor DC com ESP8266 NodeMCU

Inputs e Outputs no ESP8266 NodeMCU

Antes de começar a explicação propriamente dita, considerar neste artigo o seguinte termo:

  • GPIO (General Purpose Input / Output): Entrada / sáida de propósito geral. Nos microcontroladores, na grande maioria das vezes, um mesmo pino pode ser configurado tanto como input quanto output (não simultaneamente, claro). Por isso, é mais adequado usar esta notação.

No NodeMCU, os GPIO’s são programados exatamente da mesma forma que é feito no Arduino convencional. Ou seja, para o desenvolvedor, no aspecto de GPIO’s, não há diferença alguma entre qualquer Arduino do mercado e o NodeMCU!

Porém, no NodeMCU a (pouca) documentação existente não é tão clara quanto à numeração dos GPIO’s. Após algumas pesquisas em fóruns de ESP8266 e alguns testes, chegou-se ao seguinte pin mapping:

#define D0    16
#define D1    5
#define D2    4
#define D3    0
#define D4    2
#define D5    14
#define D6    12
#define D7    13
#define D8    15

Sendo D0..D8 os GPIO do NodeMCU, conforme pode ser observado na figura abaixo:

ESP8266 NodeMCU

IMPORTANTE: Há cuidados especiais quando se trata de GPIO’s no NodeMCU. Se estes cuidados não forem obedecidos, o NodeMCU pode ser danificado por completo. Observe:

  • O NodeMCU, quanto ao GPIO, trabalha-se com tensão de 3,3V somente. Portanto, os GPIO’s não são tolerantes a 5V!!
    Desta forma, nunca pode haver mais que 3,3V em um GPIO configurado como Input, assim como um Output irá ter tensão de 3,3V quando em nível alto.
  • Um GPIO do NodeMCU quando configurado como Output pode ter corrente máxima drenada de 12mA. Qualquer necessidade de corrente além desta requer uso de um circuito driver / circuito de acionamento eletrônico.

Obedecendo a estes cuidados, pode-se controlar I/O’s como em um Arduino. Desse modo, o céu é o limite!

Projeto exemplo motor DC com ESP8266

Para demonstrar o uso de GPIOs no NodeMCU, será feito um projeto-exemplo, usando a seguinte lista de material:

Tal projeto consiste em acionar dois motores DC (acionamento on/off, controlados pelos GPIOs D0 e D1) mediante leitura de dois GPIOs (D2 e D3). Se D2 estiver em nível baixo (0V), o motor 1 (controlado pelo GPIO D0) é ligado. Da mesma forma, se D3 estiver em nível baixo, o motor 2 (controlado pelo GPIO D1) é ligado.

Circuito esquemático motor DC com ESP8266

Agora começaremos a falar do projeto deste tópico, o qual objetiva mostrar na prática o controle de I/O’s no NodeMCU. Para este projeto, considerar o seguinte circuito esquemático:

Circuito Motores DC com ESP8266 NodeMCU

Observações:
1) Note que foram usados transistores para acionar o Shield de Relés. O motivo é que a tensão de acionamento e corrente de acionamento de cada relé do shield são superiores ao que o NodeMCU oferece (o shield precisa de 5V e corrente de 45mA). Por isso, foi implementado este circuito com transistores para interfacear o acionamento. O transistor é o BC548 (transistor NPN de uso geral, de baixíssimo custo).

2) O regulador de tensão utilizado é o 7805.
Portanto, se for utilizar este circuito como base para outro projeto, lembre-se: a máxima corrente que o 7805 pode disponibilizar na sua saída regulada (5V) é 1A (inclusive, para isso, usando dissipador).

Vamos ao código!

Agora é chegada a vez do código do projeto-exemplo. Observe-o abaixo:

// Programa: Controle de motor DC com ESP8266 NodeMCU
// Autor: Pedro Bertoleti

// Importa a Biblioteca ESP8266WiFi
#include <ESP8266WiFi.h> 

//defines - mapeamento de pinos do NodeMCU
#define D0    16
#define D1    5
#define D2    4
#define D3    0
#define D4    2
#define D5    14
#define D6    12
#define D7    13
#define D8    15
#define D9    3
#define D10   1

//defines - pinos aos quais estão ligados os drivers dos motores
#define MOTOR1_PINO    D0
#define MOTOR2_PINO    D1

//defines - pinos que conterão os botões para 
//controlar o acionamento dos motores
#define BOTAO_ACIONA_MOTOR1   D2
#define BOTAO_ACIONA_MOTOR2   D3

/*
 * Implementação das funções
 */
void setup() 
{
  //direção dos pinos
  pinMode(MOTOR1_PINO,OUTPUT);
  pinMode(MOTOR2_PINO,OUTPUT);
  pinMode(BOTAO_ACIONA_MOTOR1,INPUT);
  pinMode(BOTAO_ACIONA_MOTOR2,INPUT);
  
  //inicializações dos motores
  digitalWrite(MOTOR1_PINO,LOW);
  digitalWrite(MOTOR2_PINO,LOW);
}

void loop() 
{
    //verifica se deve ligar ou desligar motor 1
    if (digitalRead(BOTAO_ACIONA_MOTOR1) == LOW)
        digitalWrite(MOTOR1_PINO,HIGH);
    else
        digitalWrite(MOTOR1_PINO,LOW);

    //verifica se deve ligar ou desligar motor 2
    if (digitalRead(BOTAO_ACIONA_MOTOR2) == LOW)
        digitalWrite(MOTOR2_PINO,HIGH);
    else
        digitalWrite(MOTOR2_PINO,LOW);            
}

Agora basta montar o experimento e se divertir!

Gostou? Deixe seu comentário logo abaixo.

Faça seu comentário

Acesse sua conta e participe

35 Comentários

  1. Boa tarde!

    Qual o software está usando para montar o circuito eletrônico? Preciso para montar as trilhas da placa… estou usando o proteus, mas não tem o esp8266.

  2. O transistor tem apenas a função de on/off ou nessa mesma configuração tbm consigo usar esses pinos com pwm?

  3. Ola pedro, como faço para quando faltar energia elétrica e voltar o motor não ser acionado na hora que o nodemcu ligar? Obrigado desde já.

    1. Antonio, boa tarde.

      Como os outputs os quais acionam os motores têm seu estado iniciado em LOW no setup, se nenhum dos botões estiver pressionado quando o NodeMCU for ligado os motores permanecerão desligados.
      Aconteceu algo diferente com você?

      Atenciosamente,
      Pedro Bertoleti

  4. Boa tarde, estou desenvolvendo um projeto cujo dois trens ou mais devem andar num circuito circular, sem por se colidirem, preciso de ajuda quanto a programação, não sei como fazer para controlar os motores para que diminuam ou aumentem a velocidade, usarei a Nodemcu embarcada no trem e embaixo dos trilhos estarão placas NFC, caso possa me ajudar, grato desde já.

    1. Damiati, boa tarde.

      Infelizmente não tenho algo pronto nessa linha, porém para controlar velocidades de motores DC, uma forma simples e eficaz é utilizar um sinal PWM amplificado ligado ao motor em questão. Quanto maior o duty cycle, maior a velocidade do motor (até duty cycle = 100%, onde a velocidade será a máxima possível do motor para a tensão de alimentação que estiver disponível a ele.

      Atenciosamente,
      Pedro Bertoleti

  5. Boa noite, estou fazendo esse procedimento mas com rele 3,3V. Qual o transistor recomendado para isso ?

    1. Leonardo, boa tarde.

      Imagino que o próprio BC548 seja adequado neste caso.

      Atenciosamente,
      Pedro Bertoleti

  6. Muito obrigado pela suas orientações… Ajudou bastante no Projeto de um Carro Elétrico que estou montando com meus alunos de Engenharia…. Abraços. Vou citá-lo como uma das fontes de referência.

    1. Márcio, fico feliz que o post lhe foi útil! Será muito bom ser citado como referência no seu projeto!

      Se possível, diga mais sobre o projeto, fiquei curioso.

      Atenciosamente,
      Pedro Bertoleti

  7. Olá Pedro tudo bem? Cara você poderia me ajudar com uma questão. Eu estou aprendendo a usar o ESP8266 nodeMCU V3. Em milhares de sites eu vi os programadores falando da superioridade do dispositivo. Ele já tem GRBL code gravado nele? Pesquisei um monte sobre isso e não encontrei. Eu montei uma laser engraver e agora estou selecionando as placas, já entendi sobre o GRBL no Arduino. Mas não achei em lugar nenhum (mesmo pesquisando em inglês) sobre usar apenas o ESP8266nodeMCU para controlar meus dois motores e o laser. Sabe sobre isso? Obrigado pelo conhecimento!

  8. great job , but how to control two motor DC has to upload in nodemcu ??

    1. Thanks!

      I didn’t understand your question, sorry. Please, would you rephrase it?

      Best Regards,
      Pedro Bertoleti

      1. Thanks
        Sorry , you use nodemcu esp12 to control 2 motor DC ,and then i still confused how to control 2 motor DC ? ex use android or PC

        1. I think I undersand now. You want to know how to control these motors, once they’re under NodeMCU command, don’t you?
          If yes, you can do it by using your browser (to access it locally or in a remote server, if you upload html, js files and image files there), by either an Android Phone/Tablet, PC, Smartphone, etc..

          1. thanks you understand ,
            and how to access it if use remote server , i dont understand to make it , if i want to control it use PC..
            can you explain for me ,
            Thanks

  9. Cara, consigo controlar 3 motores de passo de CD-ROM e usar grbl gcode, a intenção era fazer uma micro CNC… Fico muito agradecido se tirar essa dúvida é poder da fica como iniciar.
    Abraço

    1. Nunca fiz algo do gênero, mas acho plenamente possível.

      Para iniciar tal projeto, recomendo primeiro fazer programas isolados para controlar cada motor e periférico da forma desejada e, uma vez tendo sucesso, fazer um só programa que controla tudo o que deseja.

  10. poderia explicar o funcionamento dos resistores e transistores ?

      1. esses resistores e transistores estão mandando um sinal para o rele e tbm estao ligados a esp8266 a funcionalidade deles seria so para mandar um sinal para o rele ?

        1. O conjunto de resistores e transistores têm duas finalidades:

          1) Como os relés são acionados em 5V e o ESP8266 trabalha somente com 3,3V sem seus GPIOs, a compatibilização de tensões é feita por este conjunto.
          2) Os GPIOs (configurados como saída) do ESP8266 podem fornecer uma baixa corrente elétrica (no caso, muito inferior ao necessário para acionar os relés). Portanto, o conjunto de resistores e transistores também disponibiliza a corrente necessária para o correto acionamento dos relés

          1. e eu tenho mais perguntas desculpa por tantas perguntas pois estou conhecendo ainda e tenho muitas duvidas, e pq vc utilzou o rele para acionar os motores nao poderia ligar os motores direto a esp ?

    1. Sem problemas quanto às perguntas. Estamos aqui pra isso.

      Não é possível ligar o motor direto ao ESP pois este não tem nem tensão nem fornece corrente elétrica suficientes para acionar o motor. Portanto, o relé serve como acionamento do motor.

  11. Pedro, parabéns pelo artigo! Você poderia disponibilizar o arquivo do Fritzing? Um abraço!

    1. Rodrigo, boa tarde.

      Primeiramente, muito obrigado pela leitura e pelo elogio!
      Infelizmente não tenho mais o arquivo do Fritzing. O shield de relés foi desenhado manualmente e o circuito foi feito e uma screenshot foi tirada somente. Desculpa não ter este arquivo.

      Atenciosamente,
      Pedro Bertoleti

      1. Ok Pedro, obrigado pela resposta!

  12. Parabéns Pedro. Excelente post. Estou começando agora com o NodeMCU. Gostaria de dicas para usar um NodeMCU como ap (mestre) e outro(escravo) conectado na rede do mestre. Desde já agradeço, um abraço.

    1. Cara tente usar o protocolo mqtt usando um broker(server) e um client que ai se consegue rodar, em um nodemcu se configura pra client e outra pra broker, aqui em casa tenho um raspberry pra broker e 4 nodemcus pra client em topologia de estrela

  13. Realizarei um estudo deste artigo.

    Pedro, muito bom os artigos de vcs, me ajudam muito. Parabéns.

    1. Augusto, muito obrigado! Fico feliz que pude te ajudar de alguma forma.

  14. Poderiam fazer um tutorial para controle dos motores através de uma página web? Utilizando o módulo ESP8266? Seria ótimo. abraços

    1. Augusto, boa noite.

      Primeiramente, obrigado por ler e comentar. Sobre sua pergunta, em breve virá um post abordando justamente isso. Porém, se você quiser fazer isso desde já, una o conteúdo desta artigo com este daqui: https://www.makerhero.com/blog/controle-monitoramento-iot-nodemcu-e-mqtt/

      Desta forma, você conseguirá controlar o motor via uma página web, utilizando protocolo MQTT.

      Atenciosamente,
      Pedro Bertoleti

Trackbacks and Pingbacks

  1. […] Robô IoT com ESP8266 NodeMCU vai juntar os tópicos que foram vistos nos posts NodeMCU com MQTT e Como controlar motor dc com ESP8266 NodeMCU. O NodeMCU é uma placa / plataforma muito boa para prototipação rápida de soluções […]