Robô Wi Fi controlado via Internet com Arduino e Shield Ethernet Robô Wi-Fi controlado via Internet com Arduino e Shield Ethernet 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. 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>" "<td><form method=get name=frente> <input type=hidden 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>" "</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.