Carrinho Robótico Controlado por Node.js via Bluetooth: IoT em Tempo Real
Componentes e Materiais
| Arduino UNO | × | 1 |
| Driver de Motor Dual H-Bridge L298 (SparkFun) | × | 1 |
| Módulo Bluetooth HC-05 | × | 1 |
| Jumpers (genéricos) | × | 1 |
| Bateria 9V | × | 2 |
| Motor DC 12V | × | 2 |
Sobre o Projeto
Ideia do Projeto
Node.js é uma das melhores opções para aplicações em tempo real. Já trabalhei com apps real-time usando Sockets e, com o mesmo conceito, decidi criar projetos IoT com servidor Node.js para autoaprendizado.
Este Rover se comunica com meu servidor Node.js via Bluetooth; no front-end, envio comandos ao servidor usando Sockets.
Objetivo
Estudar e implementar comunicação sem fio entre servidor Node e hardware (o Rover), e controlar o Rover remotamente via página web móvel servida pelo Node usando Sockets.
Pré-requisitos
Conhecimento básico de Node, programação com sockets e funcionamento do Driver de Motor L298.
Lista de Materiais
- 1 Arduino Uno
- 1 Driver de Motor L298
- Módulo Bluetooth HC-05
- Jumpers
- 2 Baterias 9V
- 2 Motores de engrenagem (6-9V)
- 2 rodas compatíveis
- Chassi
- Computador com Node.js instalado (servidor)
Passo 1: Construindo o Rover
A montagem não é complicada: compre um "kit chassi 2 rodas" facilmente encontrado online, que já vem com tudo. Arduino Uno e Driver L298 ficam no topo do Rover, cada um alimentado por uma bateria 9V separada. O Arduino alimenta o módulo HC-05 que comunica com o servidor.
Diagrama de Circuito
O driver L298 é alimentado por bateria 9V; suas saídas de controle de motor conectam aos Motores A e B (polaridade não importa, mas ambos devem girar no mesmo sentido). Não remova o jumper do regulador 5V.
ATENÇÃO: Se alimentar o L298 com mais de 12V, o regulador 5V onboard será danificado.
O Arduino Uno também é alimentado por bateria 9V (positivo no pino Vin, negativo no GND comum). O Arduino por sua vez alimenta o Bluetooth: Vcc do HC-05 no 5V do Arduino, GND no GND.
Para comunicação serial: TXD do HC-05 → RX do Arduino; RXD do HC-05 → TX do Arduino.
Para controlar o L298: conecte EN1 e EN2 a pinos PWM do Arduino; pinos Input 1,2,3,4 a pinos digitais quaisquer.
Transmissão de Dados
- Usuário acessa a página web servida pelo Node (ex.:
192.XXX.XXX.129:8080) - Clique em botão na página → dispara função no servidor via Sockets
- Servidor Node (conectado ao HC-05 via Bluetooth) envia dados ao HC-05
- HC-05 transmite ao Arduino UNO via serial
- Arduino controla o módulo L298
Passo 2: Configurando o Servidor
Instale Node.js (versão estável; usei 11.15). Pacotes necessários:
- node-gyp
- express
- node-bluetooth
- socket.io
- ejs
Nota: Instalação do
node-gyppode ser complicada (não suporta algumas versões novas do Node). Recomendo Node 11.15.
Crie servidor e página web com express e EJS. Desenhe a página com os controles desejados e configure conexões Socket. Para Bluetooth, consulte a documentação do node-bluetooth. A cada clique em botão de controle, uma mensagem é enviada ao HC-05.
Passo 3: Código do Arduino
O Bluetooth comunica com Arduino via Serial. Enviamos uma string como comando + letra terminadora (T). Ex.: para frente → "forwardT". No Arduino, ao receber T, sabemos que a transmissão terminou.
Com o comando recebido, configuramos o L298 para frente, trás, esquerda, direita, alterar velocidade, etc. Código completo anexo.
Passo 4: Resultado Final
O Rover responde aos comandos da interface web em tempo real via Bluetooth.
Melhorias e Futuro
- Controle por comandos de voz
- Desvio de obstáculos
- Banco de dados com estatísticas: distância percorrida, velocidade máxima, média
- Sensores adicionais: temperatura, luz, umidade com logs periódicos no BD
Próxima Versão
Confira meu próximo projeto: "Rover Controlado por Voz via Mobile"
Código
Código Arduino do Node Rover Arduino
const int en1 = 9; const int en2 = 3;
const int inp1 = 2; const int inp2 = 4;
const int inp3 = 7; const int inp4 = 8;
char charRead;
String inputString = "";
void setup() {
Serial.begin(9600);
pinMode(en1, OUTPUT); pinMode(en2, OUTPUT);
pinMode(inp1, OUTPUT); pinMode(inp2, OUTPUT);
pinMode(inp3, OUTPUT); pinMode(inp4, OUTPUT);
}
void loop() {
if (Serial.available()) {
charRead = Serial.read();
if (charRead != 'T') {
inputString += charRead;
} else {
if (inputString == "forward") {
digitalWrite(inp1, HIGH); digitalWrite(inp2, LOW);
digitalWrite(inp3, HIGH); digitalWrite(inp4, LOW);
} else if (inputString == "backward") {
digitalWrite(inp1, LOW); digitalWrite(inp2, HIGH);
digitalWrite(inp3, LOW); digitalWrite(inp4, HIGH);
} else if (inputString == "fleft") {
digitalWrite(inp1, HIGH); digitalWrite(inp2, LOW);
digitalWrite(inp3, LOW); digitalWrite(inp4, LOW);
} else if (inputString == "fright") {
digitalWrite(inp1, LOW); digitalWrite(inp2, LOW);
digitalWrite(inp3, HIGH); digitalWrite(inp4, LOW);
} else if (inputString == "bleft") {
digitalWrite(inp1, LOW); digitalWrite(inp2, LOW);
digitalWrite(inp3, LOW); digitalWrite(inp4, HIGH);
} else if (inputString == "bright") {
digitalWrite(inp1, LOW); digitalWrite(inp2, HIGH);
digitalWrite(inp3, LOW); digitalWrite(inp4, LOW);
} else if (inputString == "break") {
analogWrite(en1, 50); analogWrite(en2, 50);
delay(550);
digitalWrite(inp1, LOW); digitalWrite(inp2, LOW);
digitalWrite(inp3, LOW); digitalWrite(inp4, LOW);
analogWrite(en1, 150); analogWrite(en2, 150);
} else if (inputString == "maxspeed") {
analogWrite(en1, 250); analogWrite(en2, 250);
} else if (inputString == "medspeed") {
analogWrite(en1, 180); analogWrite(en2, 180);
} else if (inputString == "lowspeed") {
analogWrite(en1, 90); analogWrite(en2, 90);
} else {
digitalWrite(inp1, LOW); digitalWrite(inp2, LOW);
digitalWrite(inp3, LOW); digitalWrite(inp4, LOW);
}
inputString = "";
}
}
}
Esquemáticos

Processo de manufatura
- Construa um Veículo Robótico sem Fio Controlado por Sensor IR
- Soluções Eficientes de Servidor Web para Microcontroladores com Recursos Restritos
- Implante um Servidor Web com TLS em um ESP8266 de $3 em Menos de 30 Minutos
- Monitoramento em Tempo Real de Temperatura e Umidade via Web no Raspberry Pi 4
- Ventilador Controlado por Temperatura: Sistema DIY com Relé para Resfriamento de Móveis de Mídia
- De Luz Solar de $4 a Nó de Sensor Sem Fio Inteligente: MSP430 + nRF24L01+ para Monitoramento de Jardim
- Transforme seu Raspberry Pi 4 em um Servidor Web e Crie Seu Próprio Site
- Transforme Seu Carro RC em um Veículo Controlado por Bluetooth
- Transforme um Carro RC Antigo em Veículo Controlado por Joystick com Arduino
- Carro RC Wi-Fi com Carregamento Qi: Construa um Kit de Carro Controle Remoto Sem Fio