Arduino Robô controlado por Wifi com o Adafruit CC3000 Wifi-shield

Para um workshop onde ia falar sobre Arduino, tinha que mostrar um projeto mais interessante – então, nada como um robô controlado por Wifi.

Componentes usados

Se não sabem o que é o wifi-shield da Adafruit CC3000, podem consultar no Adafruit learning center, escrito por Rick Lesniak. Além de explicar como soldar, também explica as ligações e algumas das funções.

Para funcionar, não podem esquecer de efectuar o download das bibliotecas (podem consultar o github ou descarregar directamente a ultima versão) e adicionar ao vosso IDE do Arduino.

Após efectuarem o download e terem adicionado ao vosso IDE, podem executar os exemplos existentes.

Este tutorial para o Robô é baseado no existente no Adafruit Learning Center – WiFi controlled Mobile Robot – , escrito por Marco Schwartz. As diferenças é que o driver de motor que eu usei não é o mesmo, logo, há funções que no código não iriam funcionar, então, alterei e adicionei funções e instruções ao código que irei colocar aqui.

Podem sacar o codigo completo do projecto na minha página do bitbucket – arduino-wifi-robot

L298 Dual H-Bridge

L298

O driver de motores – L298 Dual H-Bridge – já o conheço e já anteriormente funcionei com ele, e este também pode usar PWM, mas só funciona a partir de um determinado valor do PWM (100), mas desta vez decidi não usar o PWM. Por causa disso e de outras funções, alterei grande parte do código que controla o movimento.

Ligações

Ligações necessárias no Wifi Shield CC3000

Wifi Shield CC3000 Arduino PINs
ADAFRUIT_CC3000_IRQ 3
ADAFRUIT_CC3000_VBAT 5
ADAFRUIT_CC3000_CS 10

Ligações para o L298 Dual H-Bridge

L298 Dual H-Bridge Arduino PINs
ENA 6
IN1 4
IN2 2
IN3 7
IN4 8
ENB 9
GND GND
+5V 5v

wifiRobotMotorConnections

O motor shield contêm ainda mais ligações, onde vamos ligar os motores – no caso da imagem em cima, Motor do lado esquerdo liguem em MOTORB e o do lado direito no MOTORA. Para este projeto, é necessário alimentar o motor shield com alimentação externa – Neste caso, liguem o GND ao GND e o VCC ONDE DIZ VMS .

Aqui fica um resumo das ligações e dos shields

RobotShields

 

RobotShieldsSide

 

Sketch

Podem encontrar o sketch na minha página do bitbucket. Irei apenas referir aqui as funções principais. Para saberem mais informações, irei colocar o atalho para a página da Adafruit onde é explicado esta parte do código.

Página da Adafruit onde podem ler mais informações sobre o código

Adicionar as bibliotecas necessárias

O servidor vai enviar parâmetros para o robot. Neste caso, como não usamos aceleração (PWM), alterei um pouco a variável para receber os valores da direção : esquerda, direita, avançar, recuar .

Estes valores vão ser guardados na seguinte variável – que é um array de quatro elementos.

Definir os PINs para os motores

Definir os vossos parâmetros de rede

Definir o porto para escutar ligações

Criar uma instância do CC3000

//Criar o servidor

A parte de setup do nosso sketch.

Primeiro, precisamos definir o tipo de PINs dos motores

Iniciar a rede wifi e obter um endereço IP

Quando ligado, mostrar os detalhes da ligação (IP / DNS / Gateway)

outputRobot
Detalhes da ligação – Guardem o IP – vão precisar

A ultima parte do setup é ficar à espera de ligações.

Extrair a informação que vem do client com a informação para os motores é realizada na função format_result. O resultado vem do cliente e a função separa e insere no array.

// Format result and extract the variables

Apenas para nossa informação, imprimimos as informações.

O array vai apenas conter 0 e 1s – O que estiver a 1 é a direcção para onde desejamos ir: esquerda, direita, frente, trás

Assim que a nossa função format_result() terminar de processar, enviamos os resultados aos motores.

A função dos motors, simplesmente vê onde está o valor 1 e avança conforme.

As funções enable(), disable(), backward(), forward(), turnRight(), turnLeft() são as que dão movimento aos motores e consequentemente ao robô ! Estão programadas para este driver de motor – L298 Dual H-Bridge

Interface Web

A página principal chama-se robot.html e tem o seguinte aspeto:

RobotOffile

Adicionei uma pequena coisa que é o status da ligação ao robot. Assim que houver ligação, a bolinha vermelha fica verde !

Isto é uma pequena parte efetuada em AJAX que permite apenas saber quando já há ligação com o robô !

O ficheiro é pingPHP.php e a linha que tẽm que alterar é:

Quando então houver ligação, altera-se o icon:

RobotOnline

Aqui está a parte do código que controla o movimento.

As setas de direção controlam o movimento do robô ! Para qualquer direção, clicar na seta (imagem) correspondente –  O seguinte código – javascript – controla estas operações.

Cada uma destas funções está definida no ficheiro script.js – que simplesmente atualizam o ficheiro update_state.php que contêm as instruções para ligação ao servidor (robô).

Estas funções passam os argumentos (a direção que desejamos), para o ficheiro robot_state.json usando a função $.get do jquey, consequentemente alterando o ficheiro robot_state.json

O ficheiro update_state.php não é mais que o ficheiro que se vai ligar ao servidor (o robô) e envia as informações dos movimentos.

Começa por abrir o ficheiro robot_state.json (que contém apenas uma string em formato JSON)

Ir buscar os valores do movimento

E atualizar o ficheiro JSON

No sketch do arduino foi visto a parte do código que aguarda ligações de clientes – que o ficheiro update_state.php vai fazer. Em cima, está o código que vai buscar o movimento que desejamos, carregando o conteúdo do ficheiro JSON, atualizando-o conforme desejamos e ligar-se ao arduino.

No final, recebemos a resposta do Arduino e fechamos a ligação

Nota: No ficheiro update_state.php também têm que alterar o IP para o vosso arduino. A seguinte linha:

Alterem o IP “172.20.1.109” para o endereço do Arduino

Neste momento, temos o robot funcional e ao nosso comando !

Para que isto tudo funcione têm que ter um servidor Web a correr com suporte PHP e JSON.

 

Referências

Fantástico tutorial do Adafruit escrito por Marco Schwartz de onde grande parte do código foi retirado e usado.

5 thoughts on “Arduino Robô controlado por Wifi com o Adafruit CC3000 Wifi-shield

  1. Excelente tutorial, tava quebrando a cabeça com isso… mas so uma dúvida, o IP do arduino, que no seu caso foi 172.20.1.109 eu descubro o meu como?

    1. Olá Guilherme ! Obrigado pelo comentário.

      Existem duas formas de ver o IP – uma, logo no inicio, no serial monitor do editor do Arduino (Ctrl + shift + M) ou Tools -> Serial Monitor, quando se acabou de enviar o sketch para o Arduino, pode-se abrir o Serial Monitor e ver as mensagens que lá aparecem, uma delas é o IP do Arduino.

      Ou entao, no router wireless onde o arduino se liga, é possivel ver os clientes e qual o IP (agora onde já depende de router para router).

      Aqui no tutorial está uma janela do Serial Monitor com o endereço IP dado ao Arduino.

      Cumprimentos

      1. Blz, é isso mesmo. Confundi um pouco pois os IPs do pingPHP e uptate_state estavam diferentes, mas é o mesmo. O que ocorreu comigo e deu problema, é que meu servidor local (Wamp Serv) não permitia sockets por padrão, ai tinha que ir no arquivo php.ini e descomentar a linha “extension=php_sockets.dll”.
        Ai rolou beleza. Tutorial muito bacana ^^

  2. Cara, vou te incomodar mais uma vez. Funcionou certinho aqui, o site hospedado no pc ta mandando os comando pro arduino, mas sabe como se faz o inverso? Tipo o arduino manda o valor de uma variavel pra uma pagina, ou pra um banco de dados pelo wifi sem usar a porta serial? Vi que vc é bom nisso, e talvez possa me ajudar.

Leave a Reply

Your email address will not be published. Required fields are marked *