📱 AirMouse: Controle Remoto Inteligente Este projeto transforma um smartphone em um mouse sem utilizando o giroscópio do dispositivo e comunicação via WebSockets.
🚀 Funcionalidades Controle por Movimento: Utiliza os sensores de giroscópio (Pitch, Roll e Yaw) para traduzir inclinações do celular em deslocamento do cursor no PC.
Baixa Latência: Comunicação em tempo real via WebSockets para uma resposta instantânea.
Suavização Inteligente: Implementação de filtros de processamento de sinal (Low-Pass Filter) para eliminar tremores da mão e garantir um movimento estável em 60 FPS.
Cliques Remotos: Botões dedicados para clique esquerdo e direito integrados à interface.
🛠️ Tecnologias Utilizadas Flutter: Aplicativo mobile para captura e processamento de sensores.
Node.js: Servidor backend para recepção dos comandos. RobotJS: Biblioteca de automação para controle nativo do sistema operacional.
Além dos pacotes:
- provider;
- web_socket_channel;
- mobile_scanner;
- equatable;
- sensors_plus;
🧠 O Desafio Técnico
- O maior desafio foi a calibração dos eixos do giroscópio para que o movimento parecesse natural ao usuário, além do gerenciamento de pacotes para evitar o gargalo da rede Wi-Fi. Para alcançar uma suavidade mais aceitável, foram implementadas as seguintes técnicas:
- Low-Pass Filter Para eliminar os micro-tremores naturais da mão humana, utilizei uma técnica de suavização baseada em média ponderada entre o estado anterior e o atual:
SmoothValue = (PreviousValue * 0.15) + (CurrentRawValue * 0.85)
Isso cria uma "inércia virtual", garantindo que o cursor deslize de forma orgânica em vez.
- Throttling de Dados O sensor do smartphone opera em frequências altíssimas, o que poderia sobrecarregar a rede Wi-Fi e o servidor. Implementei um controle de fluxo que limita o envio de pacotes a cada 13ms, garantindo o equilíbrio perfeito entre baixa latência e estabilidade de rede.
"final now = DateTime.now();
if (now.difference(_lastSend).inMilliseconds < 13) return;
_lastSend = now;"
- Deadzone Dinâmica Para evitar o drift (quando o mouse se mexe sozinho devido ao ruído do sensor), configurei uma "Zona Morta". O sistema calcula o valor absoluto (abs) do movimento e pega a menor diferença entre os eixos X e Y e só assim envia o comando e dessa forma evitamos o drift.
"if (_smoothDx.abs() < 0.5 && _smoothDy.abs() < 0.5) return;"
-
Mapeamento de Eixos (Pitch & Yaw) Diferente de um touchpad comum, o AirMouse utiliza:
Eixo X (Pitch): Para o movimento vertical.
Eixo Z (Yaw): Para o movimento horizontal (estilo apontador laser).
Utilizei o Eixo Z porque se usassémos o Eixo Y o programa não iria conseguir identificar que o usuário está apontando o celular para a esquerda ou direita pois, o Eixo Y só funciona pensando na posição vertical do dispositivo, ou seja, com o celular em pé. Com o Eixo Z facilitamos esse movimento para que o cursor siga o dispositivo para que possamos apontar para a tela.
🛠️ Como Executar o Projeto
- Pré-requisitos Antes de começar, você precisará ter instalado:
Flutter SDK (para o aplicativo mobile).
Node.js (para o servidor).
RobotJS Dependencies: Dependendo do seu sistema operacional (Windows/Mac/Linux), o RobotJS pode exigir ferramentas de compilação (como Python ou Visual Studio Build Tools).
-
Configurando o Servidor (Node.js) Navegue até a pasta do servidor:
cd server/
Instale as dependências:
npm install
Inicie o servidor:
node src/index.js
O servidor ficará aguardando conexões na porta 8080.
-
Configurando o Aplicativo (Flutter) Navegue até a pasta do projeto Flutter:
cd airmouse_app/
Instale as dependências do Flutter:
flutter pub get
Importante: No código, altere o endereço IP para o IP local do seu computador (ex: 192.168.0.XX).
Rode o aplicativo em um dispositivo físico:
flutter run


