Intermediário - Projeto 24
Controle um laser em tempo real usando Arduino, joystick e servomotores
Objetivo
Imagine controlar um apontador laser apenas movimentando um joystick analógico.
Neste projeto, vamos construir um sistema pan-tilt com Arduino UNO capaz de movimentar um laser horizontalmente e verticalmente com precisão.
✅ Controle proporcional
✅ Movimento suave
✅ Sistema pan-tilt real
✅ Introdução prática à robótica
✅ Controle de servomotores com joystick analógico
Como o projeto funciona
O joystick controla:
- Movimento horizontal → Servo PAN
- Movimento vertical → Servo TILT
O laser acompanha os movimentos do suporte pan-tilt em tempo real.
Além disso:
✅ O botão do joystick liga/desliga o laser
✅ O sistema reduz tremores usando dead zone
✅ O movimento fica limitado à área útil da tela
O que você vai aprender
Ao final deste projeto você será capaz de:
- Controlar 2 servomotores simultaneamente
- Ler sinais analógicos do joystick
- Movimentar um sistema pan-tilt
- Utilizar a função
map()
- Aplicar zona morta (dead zone)
- Criar movimentos estáveis
- Controlar um laser com botão push button
Definições
1. Entendendo o sistema Pan-Tilt

Um sistema pan-tilt é uma estrutura mecânica capaz de realizar movimentos em dois eixos.
PAN → Movimento horizontal:
TILT → Movimento vertical:
No projeto, o laser será fixado na parte superior do suporte Pan-Tilt
Para montagem do suporte Pan-Tilt, leia: S1 - Montagem Suporte Pan Tilt controlado com Arduino e Micro Servos Motores
2. Micro Servo Motor 9g

O micro servo motor 9g é um pequeno atuador eletromecânico capaz de controlar a posição do seu eixo com precisão através de sinais digitais enviados pelo Arduino UNO.
Os servos mais utilizados com Arduino possuem rotação aproximada de: 0° → 180°
O controle é realizado por sinais PWM (Pulse Width Modulation), permitindo movimentos precisos e suaves.
Por isso, servomotores são amplamente utilizados em:
- robótica
- automação
- mecatrônica
- sistemas pan-tilt
No projeto
Serão utilizados dois servos:
- Servo PAN
→ movimento horizontal
- Servo TILT
→ movimento vertical
Eles serão responsáveis por movimentar o laser em dois eixos.
Para saber mais como usar um micro servo motor 9g, leia: I18 - Como usar o micro servo motor 9g SG90 com Arduino
3. Entendendo o joystick KY-023

O módulo joystick KY-023 possui:
- 2 potenciômetros analógicos que controlam os eixos x e y
- 1 botão push button que controla o eixo z (circuito pull up)
Eixos do joystick
- X
→ movimento horizontal
- Y
→ movimento vertical
- Z
→ botão (push button)
O que o Arduino lê?

O joystick envia tensões analógicas entre:
O Arduino converte a tensão em em números:
4. A função map()
A função map() converte uma faixa numérica em outra proporcionalmente.
No projeto, ela é utilizada para transformar a leitura do joystick em um ângulo do servo.
Exemplo do projeto
posPan = map(x, 0, 1023, panMin, panMax);
Isso significa:
valor do joystic mínimo → leitura 0 → servo em panMin graus
valor do joystic máximo → 1023 → servo em panMax graus
4a. Dido Laser (cru): Um diodo laser "cru" (geralmente referido como bare diode ou raw diode em inglês) é o componente semicondutor básico sem lentes de correção e sem circuito de proteção.

Diferente de um módulo laser completo, o diodo cru é apenas a "pastilha" semicondutora montada em um invólucro metálico simples. Suas principais características são:
- Feixe Divergente: A luz sai em um formato oval e se espalha rapidamente, exigindo lentes externas para focar ou colimar o feixe.
- Sem Driver: Não possui circuito para regular a corrente, podendo queimar nstantaneamente se ligado diretamente ao Arduino sem o uso de um resistor.
- Sensibilidade Extrema: É altamente vulnerável a eletricidade estática e variações térmicas.
4b. Módulo Laser 3 pinos KY-008 (recomendado): O módulo laser é um dispositivo que emite um feixe de luz altamente concentrado e com circuito interno integrado de controle de corrente.

Nos projetos com Arduino, normalmente utilizam-se módulos de 5V, que podem ser:
No nosso sistema, o laser será usado como apontador visual, permitindo destacar elementos em uma apresentação.
Referências
Aplicações
Este projeto funciona tanto como um apontador laser para apresentações quanto como uma plataforma didática completa para aprendizado de eletrônica, controle de movimento e introdução à robótica.
Componentes necessários
Referência
|
Componente
|
Quantidade
|
Imagem
|
Observação
|
| Protoboard |
Protoboard 830 pontos |
1 |
 |
No mínimo utilizar protoboard com 400 pontos
|
| Jumpers |
Kit cabos ligação macho / macho |
1 |
 |
|
| Micro Servo Motor |
Micro Servo 9g SG90
|
2 |

|
Voltagem de Operação 3,0 - 7,2V Ângulo de rotação 180 graus Velocidade 0,12 seg/60Graus (4,8V) sem carga Torque 1,2 kg.cm (4,8V) e 1,6 kg.cm (6,0V) Temperatura de Operação -30C ~ +60C Tipo de Engrenagem Nylon Tamanho cabo 245mm Dimensões 32 x 30 x 12mm Peso 9g
(datasheet)
|
| Suporte Pan Tilt |
Suporte Pan Tilt plástico
|
1 |
 |
Suporte plástico para sistema Pan Tilt Deverão ser utilizados 2 micros servos motores 9G como atuadores
S1 - Montagem Suporte Pan Tilt
|
| Diodo Laser "cru" |
Diodo Laser 5v 6MM
|
1 |
 |
Pode ser utilizado um módulo Laser 5V abaixo
|
| Módulo Laser (recomendado) |
Módulo Laser 6mm 5mW Vermelho KY-008
|
|
 |
- Tensão de operação: 3,3 - 5VDC; - Potência: 5mW; - Comprimento da onda: 650nm; - Corrente de operação: < 40mA; - Temperatura de operação: -10°C < 40°C; |
| Resistor |
Resistor 150Ω
|
1 |
|
1 Resistores de 150Ω ou superior
Será utilizado somente na opção do projeto com diodo laser "cru"
|
| Módulo Joystick 3 eixos |
Módulo Joystick KY-023
|
1 |

|
- Tensão de Operação: 3,3-5V - Modelo: KY-023 - Fácil instalação: 4 Furos - Dimensões: 3.7 x 2.5 x 3.2cm - Peso: 15g
Sinal de saída (Eixo X e Y): Saída analógica; Sinal de saída (Eixo Z): Sinal digital (0 ou 5V);
Datasheet: Módulo Joystick 3 eixos
|
| Arduino UNO |
Arduino UNO R3 |
1 |
 |
Você poderá utilizar uma placa Arduino UNO original ou similar
|
Montagem do Circuito

Atenção
1. Faça a montagem do suporte "pan tilt" conforme o tutorial: S1 - Montagem Suporte Pan Tilt controlado com Arduino e Micro Servos Motores.

⚠️ Observação importante:
Para que o sistema tenha maior alcance na projeção do laser na tela, o micro servo do eixo vertical deve ser montado com ângulo inicial de 0º em relação à base, diferente da montagem apresentada no tutorial.
Quando montado inclinado (como ~60º), o movimento fica limitado (≈120º), reduzindo a área de atuação. Ajustando para 0º, o servo aproveita melhor seu curso, permitindo uma amplitude maior e mais eficiente de apontamento.
Para garantir maior alcance do laser, ajuste o servo vertical para iniciar em 0º (alinhado à base). Para isso:
- Localize o parafuso de fixação do servo no suporte (indicado na imagem).
- Remova o parafuso com cuidado, utilizando uma chave adequada.
- Segure o conjunto firmemente para não forçar o suporte ou o eixo do servo.
- Reposicione o servo até que ele fique totalmente alinhado com a base (0º).
- Reencaixe corretamente no suporte e
- Reaperte o parafuso, garantindo fixação firme, sem excesso de força.
Com esse ajuste, o servo passa a utilizar melhor seu curso, aumentando a amplitude vertical do movimento e melhorando significativamente a cobertura do laser na tela.
2. A montagem dos módulos micro servo motor 9g SG90 deve seguir a configuração abaixo:
- Cabo marrom (ou preto em algumas marcas) - Deve ser conectado ao pino GND do Arduino ou ao polo negativo de uma fonte de alimentação externa
- Cabo vermelho - Deve ser conectado a um pino 5V do Arduino ou ao polo positivo de uma fonte de alimentação externa
- Cabo laranja - Deve ser conectado a um pino digital do Arduino configurado como saída. No projeto, utilizamos o pino 9 do Arduino para o motor 1 (motor pan - horizontal) e o pino 10 para o motor 2 (motor tilt - vertical).

2.1. Utilize "jumpers" macho-macho para fazer as conexões com o Arduino.
2.2. No projeto usamos as seguintes conexões:
| Micro Servo Motor |
Pino Digital Arduino |
| (Servo 1) base (pan) |
9 |
| (Servo 2) inclinação (tilt) |
10 |
3. Para a montagem do módulo joystick no circuito faça a conexão como mostra a figura abaixo:

Pinos do Arduino utilizados no projeto
| Joystick |
Descrição |
Arduino
|
| GND |
Conexão com o GND |
GND |
| Vcc |
Conexão com o pino 5V |
Vcc (5V) |
| VRx |
Eixo x - porta analógica (INPUT) |
A0 |
| VRy |
Eixo y - porta analógica (INPUT) |
A1 |
| SW |
Push button - sinal digital (INPUT_PULLUP) |
2 |
3.1. Veja abaixo a montagem do módulo Joystick no Arduino, conforme determinamos neste projeto:

4. Montagem do diodo laser
4.1. Posicionamento do diodo laser
O diodo laser deve ser fixado na parte superior do mecanismo pan-tilt (eixo TILT), pois é essa região que define a direção final do feixe.
Recomendações:
- Posicione o laser alinhado com o eixo central do suporte
- O feixe deve sair reto e paralelo à base
- Utilize:
- cola quente
- abraçadeiras
- fita adesiva (só para teste)
- suporte impresso 3D (ideal)
4.2. Organização dos fios (muito importante)
O movimento do pan-tilt exige atenção com os cabos.
Obs.: Se estiver utilizando um diodo lazer ("diodo cru") faça a emenda dos fios com um conector 2 vias, como por exemplo:

Regras fundamentais:
- Use fios com comprimento suficiente para o movimento total
- Evite fios:
- muito curtos → podem puxar o conjunto
- muito longos → podem enroscar
Boa prática
- Deixe uma folga leve em forma de curva
- Posicione os fios pela lateral do suporte
- Se possível, prenda com:
Isso evita interferência mecânica no movimento.
4.3. Montagem com o arduino
a) Se você estiver usando diodo laser sem módulo, é obrigatório usar resistor (150Ω ou superior) - recomendado 220Ω (No projeto usamos um resistor de 220Ω e não ocorreu danos ao componente).
ATENÇÃO
Mesmo com resistor, ainda existe risco porque:
- o diodo laser não é linear
- a corrente pode variar com temperatura
- pequenas variações podem queimar o componente
- Ideal é usar 1 transistor, que protege o laser e ainda permite controle por PWM. (Leia o próximo projeto)
Montagem
Indentificação dos terminais do diodo laser (polaridade)
- Ânodo (+) → terminal positivo → cabo vermelho
- Cátodo (–) → terminal negativo → cabo azul
Montagem do diodo laser "cru" sem módulo e o resistor com o Arduino:

b) Se você estiver usando um módulo laser KY0008 não será necessário o uso de resistor.

MÓDULO LASER KY-008
Montagem do módulo SKY-008 com Arduino:

Código do Projeto (Sketch)
1) Faça o download e abra o arquivo projetoI24.ino no IDE do Arduino: DOWNLOAD - projetoI24.ino
Se preferir, copie e cole o código abaixo no IDE do Arduino:
/*******************************************************************************
*
* I24: Apontador Laser Pan-Tilt com Arduino e Joystick
* Autor: Angelo Luis Ferreira
* Data: 21/03/2026
*
* http://squids.com.br/arduino
*
*******************************************************************************/
#include <Servo.h>
// Servos
Servo servoPan;
Servo servoTilt;
// Joystick
int pinX = A1;
int pinY = A0;
// Botão e laser
int pinButton = 2;
int pinLaser = 7;
// Posição dos servos
int posPan;
int posTilt;
// Estado do laser
bool estadoLaser = false;
bool ultimoBotao = HIGH;
// Controle de tempo
unsigned long tempoBotao = 0;
unsigned long tempoServo = 0;
const int debounceDelay = 200;
const int intervaloServo = 20;
// LIMITES DE MOVIMENTO (ajuste fino aqui)
const int panMin = 60;
const int panMax = 120;
const int tiltMin = 70;
const int tiltMax = 110;
// Zona morta do joystick
const int deadZone = 30;
void setup()
{
servoPan.attach(9);
servoTilt.attach(10);
pinMode(pinButton, INPUT_PULLUP);
pinMode(pinLaser, OUTPUT);
digitalWrite(pinLaser, LOW);
// Centraliza os servos
servoPan.write((panMin + panMax) / 2);
servoTilt.write((tiltMin + tiltMax) / 2);
}
void loop()
{
unsigned long agora = millis();
// Atualização dos servos
if (agora - tempoServo >= intervaloServo)
{
tempoServo = agora;
int x = analogRead(pinX);
int y = analogRead(pinY);
// Aplica zona morta
if (abs(x - 512) < deadZone) x = 512;
if (abs(y - 512) < deadZone) y = 512;
// Mapeamento com faixa reduzida
posPan = map(x, 0, 1023, panMin, panMax);
posTilt = map(y, 0, 1023, tiltMin, tiltMax);
servoPan.write(posPan);
servoTilt.write(posTilt);
}
// Leitura do botão
bool leituraBotao = digitalRead(pinButton);
if (leituraBotao == LOW && ultimoBotao == HIGH && (agora - tempoBotao > debounceDelay))
{
tempoBotao = agora;
estadoLaser = !estadoLaser;
digitalWrite(pinLaser, estadoLaser);
}
ultimoBotao = leituraBotao;
}
Como o projeto deve funcionar
Ao ligar o sistema, o Arduino inicializa os servomotores e posiciona o conjunto pan-tilt no centro da área de atuação, fazendo com que o laser aponte inicialmente para o centro da tela.
1. Controle do laser (liga/desliga)
O botão integrado ao joystick permite controlar o estado do laser:
- Ao pressionar uma vez → o laser liga
- Ao pressionar novamente → o laser desliga
Esse comportamento funciona em modo toggle, facilitando o uso durante a apresentação.
2. Controle pelo joystick
O joystick é responsável por comandar o movimento do laser:
- Movimento para a esquerda/direita → controla o servo PAN (horizontal)
- Movimento para cima/baixo → controla o servo TILT (vertical)
Esses movimentos são lidos pelo Arduino como sinais analógicos e convertidos em ângulos de posicionamento dos servos.
Como o sistema utiliza limites de movimento reduzidos, o laser permanece restrito a uma área específica, evitando sair da região da tela.
3. Movimento do laser
Os servos movimentam o suporte pan-tilt, direcionando o laser de forma:
- razoavelmente suave
- proporcional ao movimento do joystick
- precisa dentro da área definida
Isso permite ao usuário apontar exatamente para:
- textos
- gráficos
- elementos específicos da apresentação
4. Controle de tempo do sistema
O projeto utiliza controle de tempo com millis(), permitindo:
- leitura contínua do joystick
- resposta imediata ao botão
- movimentação fluida dos servos
Tudo isso ocorre sem travar o funcionamento do sistema.
5. Comportamento esperado
Durante o uso, o sistema deve apresentar:
- Laser estável e sem tremores excessivos
- Movimento controlado dentro da tela
- Resposta rápida ao joystick
- Facilidade de uso durante apresentações
Observações Importantes e Ajustes do Projeto
1. Ajuste da área de atuação (ângulos dos servos)
A área onde o laser atua é definida diretamente no código:
Como ajustar:
- Aumentar a área → ampliar os valores (ex: 40 a 140)
- Diminuir a área (mais precisão) → reduzir os valores (ex: 80 a 100)
Esse ajuste deve ser feito de acordo com:
- distância da tela
- posição do equipamento
- tamanho da projeção
2. Calibração mecânica (muito importante)
Antes de ajustar via código, verifique:
- posição inicial dos servos
- alinhamento do laser com a tela
- montagem do pan-tilt
Se o servo não estiver alinhado corretamente (ex: não começa em 0º), o movimento pode ficar limitado ou impreciso.
Como fazer a calibração mecânica passo a passo:
a. Ligue o Arduino com este código:
b. Com os servos centralizados:
- solte o parafuso do braço (horn)
- reposicione o braço na posição correta (alinhado com a base/tela)
- aperte novamente
c. Ajuste o laser para apontar para o centro da tela
Resultado: movimento simétrico e preciso
3. Ajuste da sensibilidade do joystick
A zona morta pode ser alterada:
Ajustes:
- Menor valor (ex: 10) → mais sensível
- Maior valor (ex: 50) → mais estável
Ideal para eliminar tremores no centro.
5. Inversão de movimento (caso necessário)
Se o movimento estiver invertido:
Isso corrige:
- esquerda/direita invertida
- cima/baixo invertido
6. Alimentação dos servos
Servos podem causar instabilidade se alimentados direto do Arduino.
Recomenda-se:
- usar fonte externa 5V
- conectar GND em comum com o Arduino
6. Segurança com o laser
- Nunca aponte para os olhos
- Evite superfícies refletivas
- Use apenas em ambientes controlados
7. Organização dos fios
- Evite fios tensionados
- Deixe folga para o movimento do pan-tilt
- Prenda os cabos para evitar interferência
Explicando o código (ajuste fino do projeto)
Para que o apontador funcione de forma precisa, estável e mais profissional, dois ajustes são fundamentais no código:
- Limitação da faixa de ângulos (janela de atuação)
- Aplicação de zona morta (dead zone)
Esses dois conceitos trabalham juntos para melhorar o controle do laser.
1. Faixa de ângulos (controle da área de atuação)
No código, os servos não utilizam toda a faixa de 0° a 180°. Em vez disso, foi criada uma faixa reduzida:
Como isso funciona
Normalmente, o joystick seria mapeado assim:
Mas no projeto usamos:
Ou seja:
- quando o joystick está no mínimo → servo vai para
panMin
- quando está no máximo → vai para
panMax
2. Lógica empregada
Em vez de usar todo o curso do servo, limitamos o movimento para: apenas a região útil da tela
Isso traz vantagens:
- evita que o laser saia da tela
- aumenta a precisão do apontamento
- reduz movimentos exagerados
Ajuste prático
- Quer mais área? → aumente a faixa
- Quer mais precisão? → diminua a faixa
3. Zona morta (dead zone)
A zona morta evita que pequenas variações do joystick causem tremores no laser.
No código:
Como funciona
O valor central do joystick é aproximadamente:
512
Mas na prática, ele nunca fica exatamente nesse valor — há ruídos como:
Isso faria o servo ficar tremendo.
Lógica aplicada
Se o valor estiver próximo do centro:
Então forçamos:
Resultado
- elimina tremores
- mantém o laser parado quando o joystick está no centro
- melhora a estabilidade visual
O anúncio abaixo ajuda a manter o Squids Arduino funcionando
Comentários