Actividad. Estados de caja. Apertura y cierre

PROGRAMACIÓN EXTENDIDA


Montaje.

 

Montaje eléctrico. Conexiones.

En esta primera actividad, trataremos de emplear dos pulsadores para modificar el estado de la caja. En función del estado lógico de la caja (abierta o cerrada), encenderemos el led RGB de un color determinado, además de accionar el servomotor para bloquear y desbloquear la compuerta.

Durante el desarrollo de esta actividad, trabajaremos las entradas y salidas digitales, así como el uso de la librería servo.h y el uso de la pantalla LCD.

Tareas a realizar:

  1. Coloca dos botones en la protoboard y conéctalos a dos pines digitales, empleando una resistencia de pull-up (10k ohm)

  2. Coloca el led RGB en la protoboard de manera que conectes el diodo rojo y el diodo verde a dos pines digitales, pasando antes por una resistencia limitadora (220 ohm).

  3. Realiza las conexiones del servomotor. El cable de señal (amarillo/naranja) a un pin digital del Arduino Uno. El cable de alimentación (rojo) a el pin 5V del Arduino. El cable de tierra (negro o marrón) a tierra (GND).

Puedes utilizar el siguiente diagrama de ejemplo como ayuda a la hora de realizar las conexiones. Te invitamos a que seas lo mas autónomo posible, pudiendo cambiar la disposición de las conexiones si así lo deseas.


Programación

 

Explicación actividad a programar

Pulsadores

Los pulsadores se utilizan para cambiar el estado de la caja fuerte (abierta o cerrada). Cada pulsador está conectado a un pin digital del Arduino y se deberá configurar como entrada. Cuando se presione un pulsador, el Arduino deberá detectar la pulsación y ejecutar la acción correspondiente (Actualizar estado de la caja).

Estado de la caja

El estado de la caja (abierta o cerrada) se almacena en una variable booleana (isBoxOpen). Esta variable se actualiza cada vez que se presiona uno de los pulsadores y se utiliza para determinar la acción a realizar (encender el LED y mover el servo).

Servomotor

El servomotor se utiliza para bloquear y desbloquear la compuerta de la caja fuerte. Se controla mediante la librería Servo.h, que permite mover el servo a una posición específica (en grados). En este caso, la posición 90 grados desbloquea la caja y la posición 0 grados la bloquea.

LED RGB

El LED RGB tiene tres colores primarios (rojo, verde y azul), cada uno controlado de manera independiente. Para este caso particular, el LED se enciende en verde cuando la caja está abierta y en rojo cuando está cerrada.

Puedes comenzar el código realizando una declaración de todos los pines que vayas a utilizar, así como el #include de la librería Servo. Seguidamente, en la función setup(), deberás configurar los pines asociados a los pulsadores como entradas y los pines asociados a los leds como salidas. En el bucle loop(), deberás leer el estado de los pulsadoras, ejecutando ciertas acciones dependiendo del botón que se haya pulsado.

Recuerda que para utilizar un LED debemos configurar el Pin donde está conectado como Salida en el SetUp del código Arduino utilizando la función:

pinMode(pin, modo);

donde "pin" es el número del Pin que queremos configurar y "modo" es el cómo
queremos que funcione dicho pin, si como Salida (OUTPUT) o Entrada (INPUT) Dentro de setup(), deberás utilizar esta función para definir los pines conectados a los pulsadores como entradas y los pines conectados a los leds como salidas. 
Recuerda usar el método myServo.attach(pin) para poder utilizar el servo mas adelante en el código.  Recuerda que debes haber creado un objeto de la clase Servo previamente. Ejemplo: Servo myServo;
Recuerda que para encender y apagar una salida digital debemos utilizar la siguiente función:

digitalWrite(pin, estado);

donde "pin" es el número del Pin que queremos controlar y "estado" es cómo
queremos que ese Pin se establezca, si Encendido (HIGH) o Apagado (LOW). Usaremos esta función para encender y apagar los leds individuales presentes en el interior del led RGB de 5mm. Usa el método myServo.write(grados) para mover el servo, indicándole mediante el argumento "grados" la el ángulo al que deseas posicionar el servo. 
Recuerda que para leer el estado de un Pin digital debemos utilizar la siguiente función:

digitalRead(pin);

donde "pin" es el número del Pin que queremos leer. La función puede devolver "HIGH" o "LOW" según la tensión que se encuentre presente en ese momento en dicho Pin. Usa esta función en el bucle loop() para observar el estado de los pulsadores. Recuerda que al emplear resistencias de pull-up, normalmente leerás un valor lógico HIGH y, cuando oprimas el pulsador, leerás un estado lógico LOW.
Recuerda que en programación existen los Condicionales. Con ellos podemos alterar el flujo de ejecución de un programa estableciendo condiciones que controlen las líneas de código que se ejecutan o no.

En Arduino, debemos utilizar el condicional de la siguiente manera:

if(condición) {

    // Líneas a ejecutar

}

donde "condición" será una comparación o verificación (utilizando los operadores correspondientes como "==", ">=" o "<=") que de cumplirse, permitiría la ejecución de las líneas de código escritas entre los corchetes del condicional.
#include <Servo.h>

// Pines
const int openButtonPin = 2;
const int closeButtonPin = 3;
const int ledRedPin = 9;
const int ledGreenPin = 10;
const int ledBluePin = 11;
const int servoPin = 6;

Servo myServo;
bool isBoxOpen = false;

void setup() {
  pinMode(openButtonPin, INPUT_PULLUP);  // Conectar botón entre pin y GND
  pinMode(closeButtonPin, INPUT_PULLUP);
  pinMode(ledRedPin, OUTPUT);
  pinMode(ledGreenPin, OUTPUT);
  pinMode(ledBluePin, OUTPUT);
  myServo.attach(servoPin);

  // Inicializa estado
  setBoxState(false);

  myServo.write(90);
  delay(100);
  myServo.write(0);
}

void loop() {
  // Lógica con detección de pulsación (baja porque usamos INPUT_PULLUP)
  if (digitalRead(openButtonPin) == LOW && !isBoxOpen) {
    delay(50); // Debounce básico
    if (digitalRead(openButtonPin) == LOW) {
      setBoxState(true); // Abrir
    }
  }

  if (digitalRead(closeButtonPin) == LOW && isBoxOpen) {
    delay(50);
    if (digitalRead(closeButtonPin) == LOW) {
      setBoxState(false); // Cerrar
    }
  }
}

void setBoxState(bool open) {
  isBoxOpen = open;
  if (open) {
    analogWrite(ledRedPin, 0);
    analogWrite(ledGreenPin, 255);
    analogWrite(ledBluePin, 0);
    myServo.write(0);  // Desbloquear
  } else {
    analogWrite(ledRedPin, 255);
    analogWrite(ledGreenPin, 0);
    analogWrite(ledBluePin, 0);
    myServo.write(90); // Bloquear
  }
}
Vistas
5 Número de vistas
5 Vistas de miembros
0 Vistas públicas
Acciones
0 Gustos
0 No me gusta
0 Comentarios
Compartir en redes sociales
Compartir enlace
Compartir por correo

Por favor iniciar sesión para compartir esto webpage por correo.