json;
DeserializationError erro = deserializeJson(json, data, length);
// extrai os valores do JSON
int16_t angulo = json[ALIAS_ANGULO]; // [0;360]
int16_t velocidade = json[ALIAS_VELOCIDADE]; // [0;100]
// debug
Serial.print("Velocidade: ");
Serial.print(velocidade);
Serial.print(" | Angulo: ");
Serial.println(angulo);
// atualiza os motores
//curva frente para a esquerda
if((angulo >= 90) && (angulo <= 180)){
motores.turn(velocidade * (135 - angulo) / 45 , velocidade);
//curva frente para a direita
} else if((angulo >= 0) && (angulo < 90)){
motores.turn(velocidade, velocidade * (angulo - 45) / 45);
//curva tras esquerda
} else if((angulo > 180) && (angulo <= 270)){
motores.turn(-1 * velocidade, -1 * velocidade * (angulo - 225) / 45);
//curva tras direita
} else if(angulo > 270){
motores.turn(-1 * velocidade * (315 - angulo) / 45, -1 * velocidade);
} else {
motores.stop();
}
} else {
Serial.printf("Recebidos dados invalidos (%s)\n", data);
}
}
}
// --------------------------------------------------
// Manipulador dos eventos do WebSocket
void onEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type,
void *arg, uint8_t *data, size_t length) {
switch (type) {
case WS_EVT_CONNECT:
{
digitalWrite(PIN_LED, HIGH); // acende o LED
Serial.printf("Cliente WebSocket #%u conectado de %s\n", client->id(), client->remoteIP().toString().c_str());
break;
}
case WS_EVT_DISCONNECT:
{
if (ws.count() == 0) {
digitalWrite(PIN_LED, LOW); // apaga o LED
}
Serial.printf("Cliente WebSocket #%u desconectado\n", client->id());
break;
}
case WS_EVT_DATA:
{
handleWebSocketMessage(arg, data, length);
break;
}
case WS_EVT_PONG:
case WS_EVT_ERROR:
break;
}
}
// --------------------------------------------------
Explicação do Código
Neste código, a Vespa é responsável por criar uma rede Wi-Fi própria e um servidor web assíncrono. Com isso, podemos conectar celulares, tablets e até mesmo computadores à rede criada para acessar o servidor da placa. Após criar a sua rede, a placa também disponibiliza um endereço de IP, que será utilizado para acessar a página web do controle do robô.
A página web do servidor está inteiramente programada no código, e é graças à ela que a interface de controle é apresentada. Na página está presente, principalmente, a janela de exibição do vídeo coletado pelo ESP32-CAM e um joystick que direciona o robô. Ao mover o joystick, são enviados dados em formato JSON para a Vespa, que, por sua vez, os identifica e age de acordo com o que foi comandado pelo joystick.
Outra funcionalidade interessante da interface de controle está no medidor de bateria, que é uma das diversas funcionalidades da Vespa. A placa mede a tensão da bateria a cada 5 segundos e, em seguida, atualiza a tensão exibida na interface. Com isso, você sempre saberá quando é necessário trocar ou recarregar as baterias do robô.
A função mais importante deste código é a de controle dos motores, já que é ela a responsável por dar a direção ao robô. Nela, é verificado o ângulo em que o ponteiro do joystick está definido (tomando como referência os ângulos mostrados na imagem abaixo), e então os motores são acionados de acordo com o esperado. Por exemplo, quando o ponteiro está para cima/frente, ou seja, com um ângulo entre 80 e 100°, os motores são acionados para frente usando os comandos da biblioteca da placa.
Ângulos do Joystick
Grande parte das funções do projeto possuem monitoramento pelo monitor serial, então, se desejar, você pode acompanhar as informações da placa. Para isso, basta abrir o monitor serial na porta serial da sua placa, com a velocidade de 115200 bps.
Programação do ESP32-CAM
Após carregar o código na Vespa, utilize o seu celular ou seu computador para ver qual é o nome da rede gerada por ela, que deve ser algo parecido com Vespa-10:7C
, por exemplo. Com esta informação, podemos alterar o código que será gravado no ESP32-CAM.
Circuito para Gravação
Para gravar o código no ESP32-CAM, é necessário montar o circuito da imagem a seguir:
Circuito para Gravação de Código
Atente-se aos jumpers entre o IO0 e o GND no ESP32-CAM e o jumper no conversor USB-UART. Para o jumper do ESP32-CAM, é necessário que a placa entre em modo de gravação. Já o jumper do conversor USB-UART, deve estar conectado ao 3V3 para que ambas as placas operem na mesma tensão.
Com o circuito montado, selecione o modelo de placa como AI Thinker ESP32-CAM
para a gravação do código abaixo.
Código
Com o circuito montado, copie, cole e carregue o código abaixo para a sua placa. Apenas lembre-se de alterar a variável ssid
com o nome da rede Wi-Fi criada pela sua Vespa, como visto anteriormente.
Explicação do Código
Nesse código, o ESP32-CAM se conecta à rede criada pela Vespa e, assim que conectado, acessa o servidor assíncrono criado por ela. Com isso, o ESP32-CAM é capaz de enviar em tempo real a imagem coletada por sua câmera para a página Web de controle do Rocket Tank.
Como o servidor é assíncrono, o controle do robô e a exibição de vídeo são executados de forma paralela, não havendo interferência ou atraso no controle do robô ou na exibição da imagem.
Montagem do Rocket Tank
Com os códigos gravados em ambas as placas, podemos montar o Rocket Tank. Para isso, siga o manual de montagem do Rocket Tank através do botão a seguir:
Manual de Montagem do Rocket Tank
A Vespa possui o mesmo padrão de furação de fixação que as placas da plataforma Arduino UNO, portanto é mais simples utilizar esses furos para fixá-la. Já para a fixação do suporte das baterias, você pode seguir o manual de montagem abaixo:
Manual de Montagem do Suporte de Bateriais ao Rocket Tank
Montagem Eletrônica do Projeto
Com a estrutura montada e as placas programadas, monte o circuito a seguir:
Circuito Elétrico do Projeto
O Que Deve Acontecer
Com o robô montado, ligue a Vespa e, consequentemente, o ESP32-CAM, movendo a chave liga-desliga da Vespa para a posição ON com as baterias 18650 conectadas ao seu suporte no robô. Após alguns instantes, a rede Wi-Fi da Vespa será gerada, o ESP32-CAM se conectará à ela e o controle com monitoramento de imagem estará disponível para acesso. Se conecte à rede da Vespa utilizando a senha robocore
e, assim que estiver conectado, acesse o endereço de IP 192.168.4.1
. Ao acessar o endereço de IP pelo seu navegador, será aberta a página Web de controle, como na imagem abaixo:
Página de Controle com Imagem
Neste momento, mova o joystick da página para que o robô se mova e você consiga ver pela transmissão ao vivo do ESP32-CAM por onde está passando, como no GIF abaixo:
// Seu navegador não suporta vídeos em HTML5. Atualize seu navegador para ver este vídeo. //
Resultado Final
A transmissão de vídeo também pode ser diretamente acessada enquanto estiver conectado à rede da Vespa. Para isso, basta acessar o IP 192.168.4.2
.
Conclusão
Neste tutorial, vimos como realizar o controle do Web de um robô com a Vespa e como exibir em tempo real o vídeo coletado pelo ESP32-CAM.
Indo Além
Por mais que o uso da Vespa com o Access Point funcione consideravelmente bem, o seu alcance não é dos melhores. Uma solução que pode aumentar o alcance do controle do robô é a conexão da Vespa e do ESP32-CAM em uma rede local gerada por um roteador, já que estes dispositivos possuem antenas mais robustas para maior alcance.