Welcome to Hackster!
Hackster is a community dedicated to learning hardware, from beginner to pro. Join us, it's free!
carlosvolt
Published

Laser controlled by joystick servos and Arduino

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

IntermediateProtip163
Laser controlled by joystick servos and Arduino

Things used in this project

Story

Read more

Code

Source code

C/C++
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
}

Credits

carlosvolt
34 projects • 4 followers
Contact

Comments

Please log in or sign up to comment.