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.
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.
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).
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).
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).
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


















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,
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???
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.
É 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 »
Muito bom!
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 ?
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)?
Verifiquei sim, está parecendo somente caracter sem sentindo no serial monitor, já testei com todos os valores de comunicação
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
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
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.
Valeu Igor,
vou tentar montar a partir desse exemplo e depois te falo se deu certo.
Muito obrigado pela atenção.
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.
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 »
funfou mudando pra 115200. Valeu mestre 🙂
Boa! Agora é só diversão!
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 »
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.
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 »
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 »
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
vou tentar! Valeu brother 🙂
Muito bom o artigo, parabéns pelo trabalho no robô da alegria.
Obrigado! 😀