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.

IntermediateProtip150
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 • 3 followers
Contact

Comments

Please log in or sign up to comment.