I24 - Apontador Laser Pan-Tilt com Arduino e Joystick

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:

  • esquerda
  • direita

TILT Movimento vertical:

  • cima
  • baixo

???? 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
  • botão (push button)

O que o Arduino lê?

O joystick envia tensões analógicas entre:

0V → posição mínima
2.5V → centro
5V → posição máxima

O Arduino converte a tensão em em números:

0 → mínimo
512 → centro
1023 → máximo

???? Esses valores serão convertidos em ângulos dos servos motores.

O Arduino lê o botão como:

0 → botão pressionado
1 → botão solto

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:

  • ligados diretamente à alimentação

  • controlados por um pino digital

No nosso sistema, o laser será usado como apontador visual, permitindo destacar elementos em uma apresentação.

Referências

I18 - Como usar o micro servo motor 9g SG90 com Arduino
I21 - Como usar o módulo Joystick com Arduino
I22 - Como Controlar 2 Micro Servos Motores 9g com Joystick e Arduino
S1 - Montagem Suporte Pan Tilt controlado com Arduino e Micro Servos Motores
I23 - Testando suporte pan tilt para Arduino

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 Resultado de imagem para protoboard 830v

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 , 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:

  1. Localize o parafuso de fixação do servo no suporte (indicado na imagem).
  2. Remova o parafuso com cuidado, utilizando uma chave adequada.
  3. Segure o conjunto firmemente para não forçar o suporte ou o eixo do servo.
  4. Reposicione o servo até que ele fique totalmente alinhado com a base (0º).
  5. Reencaixe corretamente no suporte e
  6. 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:
    • fita
    • abraçadeiras

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:

const int panMin = 60;
const int panMax = 120;

const int tiltMin = 70;
const int tiltMax = 110;

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:

servoPan.write(90);
servoTilt.write(90);

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:

const int deadZone = 30;

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:

posPan = map(x, 0, 1023, panMax, panMin);
posTilt = map(y, 0, 1023, tiltMin, tiltMax);

Para corrigir, basta inverter os limites no map():

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:

const int panMin = 60;
const int panMax = 120;

const int tiltMin = 70;
const int tiltMax = 110;

Como isso funciona

Normalmente, o joystick seria mapeado assim:

map(x, 0, 1023, 0, 180);

Mas no projeto usamos:

map(x, 0, 1023, panMin, panMax);

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:

const int deadZone = 30;

if (abs(x - 512) < deadZone) x = 512;
if (abs(y - 512) < deadZone) y = 512;

Como funciona

O valor central do joystick é aproximadamente:

512

Mas na prática, ele nunca fica exatamente nesse valor — há ruídos como:

508, 510, 515...

Isso faria o servo ficar tremendo.

Lógica aplicada

Se o valor estiver próximo do centro:

entre 512 ± deadZone

Então forçamos:

valor = 512 (centro fixo)

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

×

Infomações do site / SEO








×

Adicionar Marcadores