Controle de servomotores com Arduino e ESP8266

Controle-de-servomotores-com-Arduino-e-ESP8266-destaque

Este artigo tem por objetivo mostrar mais uma alternativa de controle de servomotores, remotamente através de uma rede Wi-Fi®, fazendo-se o uso de um navegador de internet comum (neste artigo foi utilizado o Firefox). Dentre as aplicações possíveis destacamos: brinquedos, robôs, posicionamento de câmeras, entre outros. O controle para este servomotor será realizado através do Arduino Uno e a conexão com rede local será dada através do módulo ESP8266. A interface web a qual fará o controle foi projetada em HTML e jQuery.

Materiais utilizados

Para esse projeto os seguintes componentes são necessários:

  • Arduino Uno placa de microcontrolador baseado no ATmega328, com 14 pinos de entrada/saída digital, 6 entradas analógicas, conexão USB (Figura 1);
  • ESP8266 ESP-01 módulo wi-fi  capaz de realizar a interface do microcontrolador, através de comunicação serial, com uma rede 802.11b/g/n (Figura 2);
  • Servomotores SG90 (x2) – servomotor popular e bastante acessível (Figura 3);
  • Protoshield para facilitar a montagem do protótipo (Figura 4), simplificando assim a interligação dos componentes. Uma protoboard comum também pode ser utilizada para montagem dos componentes;
  • Resistores de 1 kOhm (x2) e de 10 kOhm (x1) – para compatibilizar os níveis de tensão entre o Arduino e o ESP8266;
  • Alguns fios para conectar os componentes;
  • Um computador (para compilar e fazer o upload do código para o Arduino).

Não é necessária a utilização de ferramentas específicas para conceber este projeto, além disso, os materiais citados podem ser encontrados facilmente.

A seguir listamos algumas opções em que o Arduino Uno pode ser alimentado: conectando-o a um computador por meio de um cabo USB tipo B, através de uma fonte externa 5Vcc com conector “Jack” tipo fêmea (vide figura 1) ou bateria.

Arduino Uno
Figura 1 – Arduino Uno
ESP8266 - módulo wi-fi
Figura 2 – ESP8266 – módulo wi-fi
 Servomotor SG90
Figura 3 – Servomotor SG90
Protoshield
Figura 4 – Protoshield

As figuras abaixo ilustram a interligação entre os componentes em um diagrama esquemático e ilustração da montagem dos componentes em protoboard.

Conecte todos os componentes de acordo com os esquemáticos (Figuras 5 e 6). Infelizmente, não é possível conectar o módulo ESP8266 diretamente à protoboard devido ao posicionamento dos pinos. Alguns resistores são utilizados para compatibilizar os níveis de tensão entre o Arduino (5V) e o módulo wi-fi (3.3V).

Além disso, os conectores dos servomotores são do tipo “fêmea”, o que pode dificultar um pouco a sua conexão. Por isso, serão necessários alguns fios para concluir a conexão dos componentes.

Montagem dos componentes em protoboard para controle de servomotores com Arduino e ESP8266
Figura 5 – Montagem dos componentes em protoboard
Esquemático do circuito com Arduino e ESP8266
Figura 6 – Esquemático do circuito

Programação do Arduino

Instale a última versão do Arduino IDE e e insira o código abaixo. Substitua XXXXX pelo SSID do seu roteador e YYYYY pela senha da sua rede. Verifique se o baudrate do ESP8266 está configurado corretamente. Conecte o Arduino à porta USB do computador e realize o upload do código.

// Wi-Servo v1.0 By Igor Fonseca Albuquerque

//incluir bibliotecas
#include <SoftwareSerial.h>
#include <Servo.h>

SoftwareSerial esp8266(5, 4); //definir pino RX = 5 e TX = 4 (do ESP8266)

//definir variáveis
#define DEBUG true //mostrar as mensagens do ESP8266 no Serial Monitor
#define SERV1 9  //servo 1 na porta digital 9
#define SERV2 10 //servo 2 na porta digital 10

Servo s1; //servo 1
Servo s2; //servo 2
int pos1 = 170; //posição atual do servo 1
int pos2 = 170; //posição atual do servo 2
int vel = 10; //velocidade dos servos (100 -> 90º in 1 s)(1 -> 90º in 9 s)
int pos1min = 20; //posição mínima do servo 1
int pos2min = 20; //posição mínima do servo 2
int pos1max = 160; //posição máxima do servo 1
int pos2max = 160; //posição máxima do servo 2


//*****************
// Setup do Arduino
//*****************
void setup()
{

  //definir servos e definir posição inicial
  s1.attach(SERV1);
  s2.attach(SERV2);
  s1.write(pos1max);
  s2.write(pos2max);
  s1.detach();
  s2.detach();

  //iniciar comunicação serial
  Serial.begin(9600);
  esp8266.begin(19200);

  sendData("AT+RST\r\n", 2000, DEBUG); //resetar modulo
  sendData("AT+CWMODE=1\r\n", 1000, DEBUG); //definir modo station
  sendData("AT+CWJAP=\"XXXXX\",\"YYYYY\"\r\n", 2000, DEBUG);   //conectar rede wi-fi
  while(!esp8266.find("OK")) { //aguardar conexão
  } 
  sendData("AT+CIFSR\r\n", 1000, DEBUG); //mostrar endereço IP
  sendData("AT+CIPMUX=1\r\n", 1000, DEBUG); //permitir múltiplas conexões
  sendData("AT+CIPSERVER=1,80\r\n", 1000, DEBUG); //iniciar web server na porta 80
}

//***************
// Loop Principal
//***************
void loop()
{
  if (esp8266.available())  //verificar se existem dados disponíveis no ESP8266
  {
    if (esp8266.find("+IPD,")) //se houver um novo comando
    {
      String msg;
      esp8266.find("?"); //correr o cursor até encontrar o conteúdo da mensagem
      msg = esp8266.readStringUntil(' '); //ler a mensagem
      String command = msg.substring(0, 3); //os comandos são informados nos três primeiros caracteres. "sr1" = comando para o servo #1 e "sr2" = comando para o servo #2
      String valueStr = msg.substring(4);   //os 3 caracteres seguintes informam o ângulo desejado
      int value = valueStr.toInt();
      if (DEBUG) {
        Serial.println(command);
        Serial.println(value);
      }
      delay(100);

      //****************
      // mover os servos
      //****************

      //mover o servo1 para o Ângulo desejado
      if(command == "sr1") {
        //limitar o ângulo
        if (value >= pos1max) {
          value = pos1max;
        }
        if (value <= pos1min) {
          value = pos1min;
        }
        s1.attach(SERV1);
        while(pos1 != value) {
          if (pos1 > value) {
            pos1 -= 1;
            s1.write(pos1);
            delay(100/vel);
          }
          if (pos1 < value) {
            pos1 += 1;
            s1.write(pos1);
            delay(100/vel);
          }
        }
        s1.detach();
      }

      //mover o servo2 para o ângulo desejado
      if(command == "sr2") {
        //limitar o ângulo
        if (value >= pos2max) {
          value = pos2max;
        }
        if (value <= pos2min) {
          value = pos2min;
        }
        s2.attach(SERV2);
        while(pos2 != value) {
          if (pos2 > value) {
            pos2 -= 1;
            s2.write(pos2);
            delay(100/vel);
          }
          if (pos2 < value) {
            pos2 += 1;
            s2.write(pos2);
            delay(100/vel);
          }
        }   
        s2.detach();     
      } 
    }
  }
}


//********************
// Funções auxiliares
//********************

//Enviar dados para o ESP8266
String sendData(String command, const int timeout, boolean debug)
{
  String response = "";
  esp8266.print(command);
  long int time = millis();
  while ( (time + timeout) > millis())
  {
    while (esp8266.available())
    {
      char c = esp8266.read();
      response += c;
    }
  }
  if (debug)
  {
    Serial.print(response);
  }
  return response;
}

Nesse projeto foi utilizada a biblioteca servo.h para controle de servomotores. Para evitar conflitos entre o módulo wi-fi e a porta USB do computador durante o upload do código, foi utilizada a biblioteca softserial.h, a qual simula uma porta serial em outros dois pinos diferentes dos normalmente utilizados para comunicação serial. Nenhuma biblioteca adicional foi utilizada para comunicação entre o Arduino e o módulo ESP8266.

Alguns servomotores podem começar a tremer e fazer ruído quando sua posição fica perto dos limites do servo (0 e 180 graus). Para evitar isso, o ângulo foi limitado entre 10 e 170 graus tanto no código do Arduino quanto na interface de controle que será apresentada posteriormente.

Infelizmente, as bibliotecas servo.h e softserial.h utilizam o mesmo timer do microcontrolador ATmega328. Isso pode causar falha nos servos quando o Arduino tenta se comunicar com o ESP8266. Para evitar essa interferência, os servos são desconectados do Arduino (via código) após o recebimento de cada comando. Você também pode contornar esse problema conectando o módulo diretamente aos pinos de comunicação serial padrão do Arduino. Nesse último caso, não esqueça de desconectar fisicamente o ESP8266 antes de fazer qualquer upload.

Interface de controle

Foi projetada uma interface de controle de servomotores em HTML utilizando-se um navegador comum (Firefox por exemplo). Foram utilizados nesse tutorial dois servos, porém podem ser utilizados mais motores (esta solução foi testada com até quatro dispositivos).

Faça o download dos arquivos do projeto no final do artigo. Salve os arquivos Wi-servo.html e jquery.js, ambos na mesma pasta e execute o arquivo html (Figura 7).

Esquemático do circuito
Figura 7 – Esquemático do circuito

Com o Arduino conectado ao computador, abra o Serial Monitor e reinicie o microcontrolador (botão de reset). Com isso o Arduino tentará se conectar com a rede wi-fi automaticamente e, se a conexão for bem sucedida, exibirá o IP que foi atribuído pelo roteador, conforme exemplo abaixo (Figura 8).

Endereço IP apresentado após estabelecimento da conexão.
Figura 8 – Endereço IP apresentado após estabelecimento da conexão.

Um campo de texto foi colocado na interface para entrada manual desse endereço (Figura 9).

Após esses passos, o sistema está pronto para funcionar. Escolha o ângulo dos motores nas barras de rolagem para realizar os movimentos (Figura 10).

Entrada do endereço IP atribuído ao módulo ESP8266.
Figura 9 – Entrada do endereço IP atribuído ao módulo ESP8266.
Seleção da posição de cada um dos servomotores.
Figura 10 – Seleção da posição de cada um dos servomotores.

O vídeo abaixo apresenta o funcionamento do sistema após os passos acima descritos.

Downloads

Faça o download dos arquivos do projeto aqui.

Referências

Tutorial do AllAboutEE sobre acionamento de LEDs usando o ESP8266 com Arduino

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Comentários:
Notificações
Notificar
24 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Ricardo Longo
Ricardo Longo
27/10/2020 09:30

Bom dia!!
Primeiramente parabéns pelo projeto. Estou dando os primeiros passos em programação do Arduino e gostaria de tirar uma dúvida. O upload do código da IDE é feito pelo módulo ESP01 diretamente pelo adaptador USB ou pela placa Arduino UNO R3? Selecionei a opção da placa ESP8266 e fiz o upload, porém no monitor serial aparece apenas lixo. Já mudei o baud rate para outros valores, mesmo assim não funciona. Fiquei na dúvida se o upload realmente foi feito para a ESP01. Poderia me ajudar?
Att,

lorran
lorran
14/06/2019 12:15

como que faço para contornar o problema de timer utilizando os pinos rx e tx no arduino? so ligandios em rx e tx e mudar a porta no codigo???

Alejandro Mesias
Alejandro Mesias
15/12/2016 23:01

Esse módulo do 8266 é programável ? ví que usa comandos para fazer chamadas AT para configurar o módulo. Mas até onde sei tem modelos dele que vc liga no nodeMcu e programa “de boa”.
Tenho interesse em usar ele para baixar dados da web para um microSd.

Igor
Igor
Reply to  Alejandro Mesias
16/12/2016 10:00

É possível programar o ESP8266-01 utilizando a IDE do Arduino, sendo necessário um conversor UART de 3,3V para conectar o módulo a porta USB do seu computador. Dessa forma é possível utilizar o próprio microcontrolador do ESP, porém há a limitação do número de I/Os. Existem módulos baseados no ESP8266 (nodeMCU, ESP8266 Thing, etc.) que já vem com a interface USB e possuem mais pinos de entradas e saídas digitais. No exemplo apresentado nesse tutorial o módulo ESP8266 foi utilizado apenas como um “modem Wi-fi” para o Arduino Uno. Por isso foi mantido o firmware padrão desse módulo (com os… Leia mais »

Franklin Bonfim
Franklin Bonfim
15/12/2016 18:06

Muito bom!

Érick
Érick
26/10/2016 14:00

Boa tarde, meu nome é Érick e nao estou conseguindo conectar a rede, esta tudo ok com o esp8266, notei que nao se pede o nome da rede e a senha, voce pode me ajudar ?

Igor
Igor
Reply to  Érick
30/10/2016 12:50

Boa tarde. Você verificou se o ESP8266 está respondendo aos comandos das linhas 43 e 44 (pelo Serial Monitor)? Você colocou o SSID e password do seu roteador no código (linhas 45)?

Érick
Érick
Reply to  Igor
30/10/2016 16:00

Verifiquei sim, está parecendo somente caracter sem sentindo no serial monitor, já testei com todos os valores de comunicação

Igor
Igor
Reply to  Érick
31/10/2016 16:44

Para verificar o módulo você pode proceder da seguinte maneira: fazer o uploado do bare-minimum.ino para o Arduino e conectar os pinos RX/TX do Arduino no TX/RX do ESP8266. Depois disso, abrir o Serial Monitor e enviar o comando “AT” e ver qual a resposta que você obtem. Caso retorne lixo, alterar o baudrate e tentar novamente. A opção “Both NL & CR” deverá ser selecionada.
Segue um tutorial que pode ser útil caso você deseje trocar o baudrate do seu ESP8266:
https://blog.filipeflop.com/wireless/esp8266-arduino-tutorial.html

Marcos Antonio Farias Costa
Marcos Antonio Farias Costa
17/10/2016 10:24

Bom dia Igor, você teria algum exemplo controlando leds com esp8266-01 e arduindo. Estou com um projeto do meu curso para desenvolver que consiste em controlar(acender e apagar) leds via browser usando o esp8266-01 e o Arduíno, mais mais estou conseguindo fazer. voce teria alguma postagem parecido para que eu posso ter uma ideia de como fazer?
Obrigado

Igor
Igor
Reply to  Marcos Antonio Farias Costa
17/10/2016 12:51

Olá! Eu segui o seguinte tutorial para desenvolver o meu projeto: https://allaboutee.com/2015/01/02/esp8266-arduino-led-control-from-webpage/
Nele o autor faz o controle de alguns LEDs usando o ESP8266-01, com comandos através do browser. Acredito que é exatamente o que você está precisando.

Marcos Antonio Farias Costa
Marcos Antonio Farias Costa
Reply to  Igor
18/10/2016 15:28

Valeu Igor,

vou tentar montar a partir desse exemplo e depois te falo se deu certo.
Muito obrigado pela atenção.

Geraldo Ramos
Geraldo Ramos
10/09/2016 19:02

Conectei tudo certinho seguindo o esquema de forma idêntica (conferi 3x) e os dados da rede wifi também conferidos (3x).

O serial monitor mostra apenas caracteres doidos:
�)��)����)�T������������)�)�ҩ��)�R������������R�)����)�J������������

Alguma ideia? Quando reinicio o UNO, somente mostra denovo esses caracteres, mas não conecta na rede nem faz o print da parte que deveria mostrar o IP que pegou na rede. Alguma sugestão de troubleshooting? A luz do vermelha do ESP8266 fica sempre acesa e dá uns blinks na azul quando reinicia, até parar e ficar só a vermelha e dai em diante o monitor serial não retorna mais nada.

Igor
Igor
Reply to  Geraldo Ramos
10/09/2016 21:19

Pelo que você falou, pode ser um problema relacionado ao baudrate do seu módulo ESP8266. No meu caso (como está no código), o ESP8266 se comunica à 19200 com o Arduino, e o Arduino em 9600 com o Serial Monitor. Pode ser que o seu módulo esteja com um baudrate diferente. Para testar você pode fazer o upload do “BareMinimum.ino” para o seu Arduino, conectar o RX/TX do ESP8266 no TX/RX do Arduino, abrir o Serial Monitor e enviar alguns comandos AT (ex.: AT, AT+RST ou AT+CWMODE=1) para ver qual a resposta. Se vier apenas lixo você pode alterar a… Leia mais »

Geraldo Ramos
Geraldo Ramos
Reply to  Igor
11/09/2016 22:38

funfou mudando pra 115200. Valeu mestre 🙂

Igor
Igor
Reply to  Geraldo Ramos
12/09/2016 13:00

Boa! Agora é só diversão!

Geraldo Ramos
Geraldo Ramos
Reply to  Igor
12/09/2016 23:33

Valeu velho. Agora ta rolando um outro problema, não sei se acontece com voce, mas nem todo comando get que é feito, é processado. As vezes só vai depois de tentar algumas vezes. E também não tem resposta nenhuma do servidor. Quando tentei fazer o get usando Node, fica eternamente esperando resposta ( e as vezes processa o comando e as vezes não). Exemplo via jquery (ignorando return results) https://d.pr/v/ZXKD/3NR5ZflX , note que nem sempre o comando chega. E aqui um exemplo usando node: https://d.pr/v/19a4b/5IwivnIi (note que depois de rodar, nunca vem nenhum response, é necessário matar a aplicação e… Leia mais »

Igor
Igor
Reply to  Geraldo Ramos
13/09/2016 18:53

Faz um testr: coloca um Serial.println(msg); entre as linhas 64 e 65 para a gente ver o que está chegando.
Pode ser que a mensagem que o Arduino esteja recebendo esteja meio corrompida e por isso aparece aquele lixo que a gente no finalzinho do primeiro vídeo.
Se for isso mesmo, uma possibilidade seria tentar mudar o baudrate do ESP 8266 para diminuir a chance da mensagem ser corrompida.

Geraldo Ramos
Geraldo Ramos
Reply to  Igor
13/09/2016 21:17

eu acho que é isso. Esse baud rate pode tá afetando geral. Aqui ta o teste que vc pediu: https://d.pr/i/15th1/3WvquXHi (adicionei o print entre a linha 64/65 e mandei vários comandos pra mudar o angle do sr1). Como de costume, alguns rolaram, outros não e deu pra ver lixos chegando. Acho que é uma questão de consistência na comunicação. Tentei investigar como mudar o baud rate de 115200 pra 9600 (e vi que tem mta gnt fazendo isso e teoricamente ja sei uma forma certa de fazer), mas, não sei como me comunicar com o ESP8266, já que não tem… Leia mais »

Geraldo Ramos
Geraldo Ramos
Reply to  Geraldo Ramos
13/09/2016 22:36

só agora percebi que esse ESP8266MOD que tenho é um board completo hehehehe (n00b). Terminei conseguindo fazer funcionar tudo com ele, sem usar o arduino UNO. O bom é que o projeto ficou mais compacto. De todo jeito, queria arrumar uma solução pro baud rate, pois pretendo usar o ESP8266(wifi only) com o UNO pra outro projeto. Suspeito que preciso pegar um FTDI pra poder comunicar direto com o ESP8266 e fazer a mudança. Acho que temos praticamente certeza agora que o problema na instabilidade na comunicação é devido ao baud rate alto (se conseguir mudar pra 9600 acredito que… Leia mais »

Igor
Igor
Reply to  Geraldo Ramos
13/09/2016 23:10

Eu troquei o baudrate do meu módulo de acordo com as instruções desse blog e deu certo: https://blog.filipeflop.com/wireless/esp8266-arduino-tutorial.html

Geraldo Ramos
Geraldo Ramos
Reply to  Igor
14/09/2016 01:14

vou tentar! Valeu brother 🙂

Nicholas Eduardo
Nicholas Eduardo
07/09/2016 12:59

Muito bom o artigo, parabéns pelo trabalho no robô da alegria.

Igor
Igor
Reply to  Nicholas Eduardo
09/09/2016 11:01

Obrigado! 😀

Home » Arduino » Controle de servomotores com Arduino e ESP8266

EM DESTAQUE

WEBINARS

VEJA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Talvez você goste: