Laser Controlled by Joystick Servos and Arduino

by CarlosVoltT in Circuits > Arduino

249 Views, 2 Favorites, 0 Comments

Laser Controlled by Joystick Servos and Arduino

IMG_20230612_091720280-820x461.jpg

In this tutorial, you will learn how to create a control system for a laser using a joystick, servos, and Arduino.

✅ Láser controlado por joystick servos y Arduino - PCBWay.es

In this tutorial, you will learn how to create a control system for a laser using a joystick, servos, and Arduino.

During this step by step, I will guide you through the entire process, from initial setup to final programming, so you can control a laser using a joystick and servos. We'll explore how to connect the servos in conjunction with the Arduino, so you can move the laser in any direction you want.

This tutorial is designed to be accessible and exciting for everyone. Additionally, you'll discover how to write simple but effective code in Arduino to synchronize the movement of the servos with the joystick inputs, allowing you to aim and control the laser with ease.

You'll be able to use your joystick-controlled laser to create interactive light shows, precision games, or even for educational purposes.

Electronic components

Arduino mini pro

female pins


Socket for arduino nano


dupont cables


Laser Module ky-008


This module specially designed for Arduino easily, quickly and accurately emits a laser beam produced by this component.

It is a Laser Emitting Diode that operates at 5V and emits at a wavelength of 650nm.

Technical characteristics:

Operating voltage: 5V

Wavelength: 650nm

Power 5 mW

Color: Red

Material: PCB

Dimensions: 2.3×1.5×0.9cm

A Servo sg90

Characteristics

  • Dimensions (L x W xH) = 22.0 x 11.5 x 27 mm (0.86 x 0.45 x 1.0 inches)
  • Weight: 9 grams
  • Weight with cable and connector: 10.6 grams
  • Torque at 4.8 volts: 16.7 oz/in or 1.2 kg/cm
  • Operating voltage: 4.0 to 7.2 volts
  • Turning speed at 4.8 volts: 0.12 sec / 60º
  • Universal connector for most radio control receivers
  • Compatible with boards such as Arduino and microcontrollers that operate at 5 volts.

How to control a servomotor?

You can position the servo axis at various angles from 0 to 180º. The servos are controlled using a pulse width modulation (PWM) signal. This means that the PWM signal sent to the motor will determine the position of the shaft.

male pins


A ky-023 Joystick module


The Joystick module allows you to build a manual controller in 2 directions: X and Y. It also has the push-button function that is activated when pressing the Joystick.

It has two potentiometers each with its analog outputs for the direction (VRx-VRy) and a digital output for the button (SW). To read the position it is necessary to convert the analog values ​​using a microcontroller ADC.

Used in robotics, control, automation, video game projects.

  • Operating Voltage: 3.3 – 5V DC
  • 2 Potentiometers
  • 1 Push Button

Description:

Two-axis joystick sensor module by using PS2 rocker potentiometer, with (X, y) 2-axis analog output, (Z) 1 digital output button. With the Arduino sensor expansion board you can produce remote control and other interactive works. In addition, this product to allow customers to more easily with the arduino expansion board and other standard interfaces, in the design of the X, Y, Z axis of the circuit are separate tracks, the user can use ARDUINO's special line of 3 pins on the expansion board.

Product performance:

  • Input voltage range: DC 3.3V to 5V
  • Output signal: the module two-way analog output and a digital output interface, the output value corresponding to the biaxial offset (X, Y), the type of analog; keys that user press Z axis, its type is digital switch.
  • Arduino controller, sensor expansion board connector can be programmed, complete with creative interactive works.
  • Cross joystick is a 10K bidirectional resistance, with the rocker in different directions, the resistance tap with changing. This module uses 5V power supply, the original state of Press arrows in the opposite direction, read the voltage decreases, the minimum is 0 V.

PCB

Download gerber file –> ir alarm pcb

3D Parts

Download STL files –> Laser_gun_bracket_501701



Source Code

#include <Servo.h>

const int X_PIN_A0 = A0; // Pin analógico para el eje X

const int Y_PIN_A1 = A1; // Pin analógico para el eje Y

const int BOTON_PIN_12 = 12; // Pin digital para el botón

const int LASER_PIN5 = 5; // Pin digital para el control del láser

int estado = 0;

Servo servoX;

Servo servoY;

int servoXPosPrev = 90; // Posición anterior del servo X

int servoYPosPrev = 90; // Posición anterior del servo Y

int servoIncrement = 1; // Incremento de posición para el serv

void setup() {

pinMode(BOTON_PIN_12, INPUT_PULLUP); // Configurar el pin del botón como entrada con resistencia pull-up interna

pinMode(LASER_PIN5, OUTPUT); // Configurar el pin del control del láser

servoX.attach(10); // Conectar el servo X al pin 10

servoY.attach(11); // Conectar el servo Y al pin 11

Serial.begin(9600); // Velocidad del puerto serial

}

void loop() {

// Leer los valores de los ejes X e Y

int xValue = analogRead(X_PIN_A0);

int yValue = analogRead(Y_PIN_A1);

// Convertir los valores a la posición del servo (0 a 180 grados)

int servoXPos = map(xValue, 0, 1023, 0, 180);

// Convertir los valores a la posición del servo (70 a 180 grados)

int servoYPos = map(yValue, 0, 1023, 70, 180);

// Mover los servos suavemente

if (servoXPos != servoXPosPrev) {

if (servoXPos > servoXPosPrev) {

for (int pos = servoXPosPrev; pos <= servoXPos; pos += servoIncrement) {

servoX.write(pos);

delay(5); // Ajusta el retraso para controlar la velocidad del movimiento

}

} else {

for (int pos = servoXPosPrev; pos >= servoXPos; pos -= servoIncrement) {

servoX.write(pos);

delay(5); // Ajusta el retraso para controlar la velocidad del movimiento

}

}

servoXPosPrev = servoXPos;

}

if (servoYPos != servoYPosPrev) {

if (servoYPos > servoYPosPrev) {

for (int pos = servoYPosPrev; pos <= servoYPos; pos += servoIncrement) {

servoY.write(pos);

delay(5); // Ajusta el retraso para controlar la velocidad del movimiento

}

} else {

for (int pos = servoYPosPrev; pos >= servoYPos; pos -= servoIncrement) {

servoY.write(pos);

delay(5); // Ajusta el retraso para controlar la velocidad del movimiento

}

}

servoYPosPrev = servoYPos;

}

// Leer el estado del botón

bool botonEstado = digitalRead(BOTON_PIN_12);

if (botonEstado == LOW) {//Si el botón ha sido precionado se cumple esta condición

if(estado ==0){//Si la variable estado es igual a 0 se cumple esta condición

digitalWrite(LASER_PIN5, HIGH);

estado =1;//Asignamos el valor 1 a la variable "estado"

} else{

digitalWrite(LASER_PIN5, LOW);

estado =0;

}

while(botonEstado == LOW){

botonEstado = digitalRead(BOTON_PIN_12);//Leemos el estado del botón nuevamente para ver si sigue precionado

}

}

// Mostrar los valores en el terminal serial

Serial.print("Eje X: ");

Serial.println(xValue);

Serial.print("Eje Y: ");

Serial.println(yValue);

Serial.print("Botón: ");

Serial.println(botonEstado);

delay(100); // Leve pausa entre las lecturas

}