ÍNDICE DE CONTEÚDO
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.
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 |
// 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:
http://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: http://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) http://d.pr/v/ZXKD/3NR5ZflX , note que nem sempre o comando chega. E aqui um exemplo usando node: http://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: http://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: http://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! 😀