Robô Wi-Fi controlado via Internet com Arduino e Shield Ethernet
Insônia: Antes que eu me esqueça, achei alguns sites interessantes que vendem peças, placas, etc a preços interessantes, enfim, o que precisar para montar robôs ou eletrônicos. caso próximo a você seja mais barato que nos lugares que indiquei, poste aqui no site pra divulgarmos. Segue a lista:
***** Lojas Online *****Placas de Circuito Impresso (protótipos)
- pci.eletronica.org
Componentes Eletrônicos
- www.soldafria.com.br
- www.compomil.com.br
- www.casanovatron.com.br
Robótica/Módulos de arduino/Prototipagem/Sensores
- www.robocore.net
- www.webtronico.com
- http://tato.ind.br/
- www.sparkfun.com
Peças de computadores, eletrônicos, ferramentas, brinquedos geeks
- www.dealextreme.com
Agora nossa programação normal ;)
Esse é um robô com 3 rodas feito com motores DC e controlado pelo Arduino com Shield Ethernet. As duas rodas da frente possuem tração, cada uma está ligada a um motor DC, a de trás gira e vira livremente.
Se os dois motores girarem para frente, o robô anda para frente, se o motor da direita gira para frente e o motor da esquerda gira para trás, o robô vira para a esquerda, e vice-versa para virar para a direita.
O robô é comandado por uma página HTML que ele mesmo gera trabalhando como webserver. Ou seja, você acessa o endereço IP configurado no programa feito para o Arduino e abre a página HTML que ele gera. Ela contém 3 botões: “esquerda”, “frente” e “direita”. Quando se aperta um botão, o formulário da página HTML envia os dados via ethernet para o arduino+shield que interpreta e manda sinais para uma placa controladora. Essa placa foi feita com transistores operando como chave e relês de dois pólos e dois terminais, que invertem a polaridade dos motores conforme a direção que se pretende que eles girem.
O arduino é programado para emitir 4 sinais digitais de saída, 2 para cada motor, sendo 1 para acionar o motor (liga/desliga através dos transistores) e outro para dizer a direção (“0” para a frente, e “1” para trás), esse último sinal aciona o relê que inverte a polaridade do motor.
Cada vez que o usuário aperta o botão, o programa aciona os motores de acordo com a direção a ser seguida por 1 segundo para virar e 2 segundos para andar para frente. Isso evita que o robô ande indefinidamente caso haja perda de conexão. Já que foi desenvolvido para operar remotamente em rede wi-fi (ele possui um access point acoplado) com câmera IP e via internet (basta configurar o roteador onde ele será instalado para fazer encaminhamento de porta). Além disso existe o atraso da câmera e da internet. Para que seja viável sua operação, o usuário terá que dar o comando e aguardar a resposta do sistema. Acompanhando via câmera IP. Dessa maneira pode-se controlar o robô de qualquer lugar no planeta.
Em caso de dúvida, é só escrever.
Veja abaixo o diagrama de blocos, as imagens e o programa para o Arduino:
Diagrama de blocos
Robô (caixa plástica, câmera IP, rodízios de carrinho de mão, switch e access point)
Robô aberto mostrando a montagem (tosca eu sei! Hehehe... mas foi só para brincar)
Placa controladora dos motores. Transistores operando como chave e relês 2 terminais e 2 posições para inversão da polaridade do motor (andar para trás)
Placa reguladora de tensão, alimenta o Switch e a Câmera. O resto trabalha em 12V, que é a tensão da bateria.
Arduino com Ethernet Shield
Programa para o arduino. Usa biblioteca para o Ethernet Shield:
#include <Ethernet.h>
#include <WString.h>
// network configuration. gateway and subnet are
optional.
optional.
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 0, 177 };
byte gateway[] = { 192, 168, 0, 1 };
byte subnet[] = { 255, 255, 255, 0 };
boolean esquerda = false;
boolean direita = false;
boolean frente = false;
boolean primeiralinha = true;
Server server = Server(80);
void setup()
{
// initialize the ethernet device
Ethernet.begin(mac, ip, gateway, subnet);
// start listening for clients
server.begin();
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
}
void loop()
{
Client client = server.available();
esquerda = false;
direita = false;
frente = false;
// Aguarda o fim da HTML request do cliente
if (client) {
boolean NEW_LINE = false;
boolean primeiralinha = true;
String linha = "";
// Aguarda a chamada HTML e extrai dela a resposta do formulario
while (client.connected()) {
char c = client.read(); // Le os caracteres da chamada HTML um a um
linha.append(c); // Monta a string 'linha' com os caracteres lidos
if (c == '\n') { // Se for fim da linha
if (linha.contains("esquerda=esquerda") && primeiralinha) esquerda = true; // Se a string (linha) tiver o termo e for a 1a linha da chamada HTML
if (linha.contains("direita=direita") && primeiralinha) direita= true; // idem
if (linha.contains("frente=frente") && primeiralinha) frente =true; // idem
linha = ""; // apaga linha para receber a proxima linha
NEW_LINE = true; // comecou nova linha
primeiralinha = false; // a proxima nao sera a primeira linha
} else if (c != '\r') {NEW_LINE = false;} //ainda nao acabou o texto
if (c == '\r' && NEW_LINE) { // acabou a chamada porque a ultima linha eh vazia 'carriage return'
break; // Interrompe o loop do while
}
}
}
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
client.write("<html><head></head><body>Controle de Robo atraves de Rede Ethernet<br><br>");
if (direita) { client.write("Direita...");
digitalWrite(2, HIGH); digitalWrite(3, LOW);
digitalWrite(4, HIGH); digitalWrite(5, HIGH); delay(1000);
} else {digitalWrite(2, LOW); digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, LOW);}
if (esquerda) { client.write("Esquerda...");
digitalWrite(2, HIGH); digitalWrite(3, HIGH);
digitalWrite(4, HIGH); digitalWrite(5, LOW); delay(1000);
} else {digitalWrite(2, LOW); digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, LOW);}
if (frente) { client.write("Frente...");
digitalWrite(2, HIGH); digitalWrite(3, LOW);
digitalWrite(4, HIGH); digitalWrite(5, LOW); delay(2000);
} else {digitalWrite(2, LOW); digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, LOW);}
client.println(
"<table><tr>"
"<td><form method=get name=esquerda><input type=hidden name=esquerda
value=esquerda><input style=width:60pt type=submit
value=esquerda></form></td>"
value=esquerda><input style=width:60pt type=submit
value=esquerda></form></td>"
"<td><form method=get name=frente> <input type=hidden
name=frente value=frente> <input style=width:60pt type=submit
value=frente></form></td>"
name=frente value=frente> <input style=width:60pt type=submit
value=frente></form></td>"
"<td><form method=get name=direita> <input type=hidden name=direita value=direita> <input style=width:60pt
type=submit value=direita></form></td>"
type=submit value=direita></form></td>"
"</tr></table></body></html>");
client.stop();
}
Atenção! De tempos em tempos a Arduino altera algumas bibliotecas. Não copie e cole o programa acima apenas, analise-o e entenda-o. Assim, você será capaz de fazer qualquer atualização necessária. Ah! E claro. Caso faça alguma atualização, compartilhe-a conosco aqui.
Muita gente tem me perguntado diversas coisas sobre esse projeto, demosntrando dificuldades variadas. Para que seu projeto evolua de maneira a manter a sua motivação do começo ao fim, sugiro que comecem do mais básico e vão expandindo conforme a grana e as dificuldades técnicas. Assim, não importa até onde cheguem, sempre terão algo interessante (e funcionando) alcançado.
Sugiro as seguintes etapas:
Etapa 1 - Parte mecânica
- Com peças usadas de bicicleta, vocês podem construir as esteiras, que seriam movimentadas por motores DC com caixa de redução. Acessa esse endereço: http://labdegaragem.com/profiles/blogs/esteira-para-robo-com-corrente
Se essa parte estiver muito difícil ou faltar ferramentas, coloque rodas simples mesmo.
Faça um controle remoto simples para controlar o robô.
Etapa 2 - Parte eletrônica
- Faça uma plaquinha simples com transistores de potência para controlar o acionamento dos motores a partir de baixa corrente em 5V. Com isso, qualquer sinal digital TTL poderá controlar o seu robô, sem risco de queimar o equipamento que emite o sinal. Use transistores de portência, MOSFETs, ou mesmo relês. Atenção a corrente que esses componentes irão drenar, mesmo na base.
Alimente esse circuito com uma fonte de tensão adequada para os motores, ou mesmo uma bateria. Evite baterias muito pesadas.
Etapa 3 - Integração com o Arduino
- Faça a integração do que foi feito acima com um Arduino. Escreva um programa que controle o seu robô a partir de portas de entrada do Arduino, ou o que é mais interessante, a partir de comandos de texto que você envia via porta serial (USB) do Serial Monitor da IDE do Arduino para o seu robô.
Etapa 4 - Conexão Ethernet
- Adicione um Shield Ethernet ao Arduino, conecte o seu robô ao seu Roteador (via cabo de rede). O seu robô ainda não é wi-fi, mas já estará em rede. Programe um webserver como descrito no Projeto Robô Wi-Fi para que os controles sejam feitos através de form HTML. Existem outras formas de fazer esse controle, se descobrir alguma bacana, posta pra gente aí.
Etapa 5 - Wi-Fi
- Configure um Access Point (não use um de apenas 1 porta, você precisará de 2 se quiser colocar câmera) para acessar a sua rede wi-fi. Desative a conexão wi-fi do seu notebook, se usar Desktop, desconecte o cabo de rede e conecte ao Access Point. Se a configuração estiver correta, o seu computador deve ser capaz de acessar a rede via wireless. Configurado o AP, conecte o shield ethernet ao Access Point, e tente acessar o seu IP do seu computador (reconectado a rede, claro). Se tudo funcionar, o seu Robô já terá acesso a rede (e a internet) via wireless.
Etapa 6 - Câmera IP
- Prenda uma câmera IP no seu robô e conecte-a ao Access Point. Agora seu robô tem 2 IPs, um para acessar o Arduino (webserver) e outro para a câmera. Desse jeito, para controlar o robô, você precisa abrir 2 janelas de browser para ver e controlar o robô.
Etapa 7 - Parte elétrica
- Seu robô já está wi-fi, mas ainda está conectado a rede elétrica através das fontes de alimentação do Arduino, do AP e da placa que alimenta os motores. Agora é hora de adicionar a bateria e fazer um circuito regulador de tensão para alimentar esses dispositivos. Verifique qual é a tensão de alimentação de cada um, e a corrente que cada um puxa. Geralmente, cada dispositivo não deve puxar muita coisa, mas é preciso medir para ter certeza. CIs da linha 78XX devem resolver (até 1A cada).
Etapa 8 - Port Forwarding
- Agora seu robô está livre de fios e cabos e já pode ser acessado via rede local wi-fi. Para que ele possa ser controlado de qualquer lugar do planeta, é preciso que o roteador permita que acessos externos a sua rede sejam encaminhados para o seu robô, onde o webserver irá responder. Para isso, configure um "encaminhamento de portas" no seu roteador, por exemplo, quando alguém acessar o seu IP externo 201.xx.yy.z:porta, o seu robô será acessado pelo webserver que você programou no Arduino, onde "porta" é a porta configurada no roteador, que é encaminhada para o IP do webserver (ou o da câmera). Seu robô usará 2 portas (1 para a câmera e outra para o webserver no Arduino).
Pronto! Caso surjam dúvidas, pode mandar que vou ajudar no que estiver ao meu alcance. Caso faça melhorias nesse projeto, poste aqui para a gente aprender com você também.
Chupado no labdegaragem e postado originalmente por Marcelo Rodrigues
3 comentários:
Estou montando um parecido mas vai conter um braço robotico a mais no carrinho. vou tentar montar um programa q envie os codigos para o shield sem precisar ser pela pagina
Se entendi bem eu vou poder controlar ele por qualquer notebook que se conectar ao roteador dele é isso??
Se você estiver em uma rede local sim, nocaso de ip fixo, poderá acessar vi web de qualquer lugar.
Postar um comentário