- Portada
- Ensamblaje mecánico
-
Montaje eléctrico y programación
-
Introducción al Montaje Electrónico
-
Resistencias y Ejemplos de cálculo
-
La protoboard y los LEDs
-
Motores DC
-
Puente en H
-
Actividad 1: Uso de los motores
-
El pulsador
-
Actividad 2: Uso de los motores con pulsadores
-
El Zumbador
-
Actividad 3: Uso del zumbador y el servomotor
-
El Servomotor
-
Actividad 4: El ascensor (básico)
-
Introducción a funciones
-
Las funciones
-
Actividad 5: El ascensor (con funciones)
-
- Para terminar
Actividad 4: El ascensor (básico)
Actividad 4

El ascensor
En esta actividad se plantea programar el microcontrolador para que el funcionamiento se asemeje al de un ascensor:
El ascensor debe de ser capaz de detenerse de forma autónoma en cada uno de los pisos sin la ayuda del usuario.
Se disponen de 3 pulsadores, cada uno correspondiente a un piso. Cuando se pulse un pulsador el ascensor debe ira piso indicado, encendiendo el led del piso y en caso de ser necesario, abrir la barrera (servo)
Se plantea que durante el movimiento del ascensor se haga uso del zumbador para emitir un aviso sonoro.
Seria conveniente disponer de un modo de ajuste manual para corregir las derivaciones en el offset de la altura.
Pista 1: Condicionales con más de una condición
Habrá ocasiones en las cuales sea necesario evaluar el estado de dos o mas pulsadores, esto se
puede hacer mediante la siguiente sentencia:
if(digitalRead(Boton2) == 0 && digitalRead(Boton3) == 0){...}
puede hacer mediante la siguiente sentencia:
if(digitalRead(Boton2) == 0 && digitalRead(Boton3) == 0){...}
Pista 2: Esperas en el código, uso de la función while
A veces solo queremos que se ejecute una vez una parte del código, independientemente de si
mantenemos un pulsador presionado. El siguiente código bloquea la ejecución del código hasta que
se deje de pulsar el botón. De esta forma podemos evitar que se ejecuten dos veces los mismos
comandos en el caso en el que se mantenga el botón presionado.
while(digitalRead(Boton)==1){}
mantenemos un pulsador presionado. El siguiente código bloquea la ejecución del código hasta que
se deje de pulsar el botón. De esta forma podemos evitar que se ejecuten dos veces los mismos
comandos en el caso en el que se mantenga el botón presionado.
while(digitalRead(Boton)==1){}
Pista 3: Guía lógica del ascensor
Para esta actividad en concreto será necesario implementar una lógica que permita al ascensor
identificar en que planta está. A continuación se muestra un ejemplo:
if (Planta == 2){
identificar en que planta está. A continuación se muestra un ejemplo:
if (Planta == 2){
if(digitalRead(boton1) == 0 && digitalRead(boton3) == 0){
...
}
}
if(digitalRead(boton1)==1){
...
}
else if(digitalRead(boton3)==1){
...
}
}
}
Solución código C++
// Se declaran las librerias que se van a utilizar en la practica
#include <Servo.h>
// Se definen los pines que se van a utilizar
#define BA1 13
#define BA2 12
#define BA3 3
#define vel 9
#define Gir1 10
#define Gir2 11
#define Led1 4
#define Led2 7
#define Led3 8
#define Zumbador 6
#define servo 5
Servo servoMotor;
int Planta = 1;
int Configurar = 1;
void setup() {
// Se configuran los pines como entradas
pinMode(BA1,INPUT);
pinMode(BA2,INPUT);
pinMode(BA3,INPUT);
// Se configuran los pines como salidas
pinMode(vel,OUTPUT);
pinMode(Gir1,OUTPUT);
pinMode(Gir2,OUTPUT);
pinMode(Zumbador,OUTPUT);
pinMode(Led1,OUTPUT);
pinMode(Led2,OUTPUT);
pinMode(Led3,OUTPUT);
servoMotor.attach(servo);
// Se apagan todas las salidas
digitalWrite(vel,LOW);
digitalWrite(Gir1,LOW);
digitalWrite(Gir2,LOW);
digitalWrite(Zumbador,HIGH);
digitalWrite(Led1,HIGH);
digitalWrite(Led2,LOW);
digitalWrite(Led3,LOW);
delay(500);
servoMotor.write(180);
digitalWrite(Zumbador,LOW);
digitalWrite(Led1,LOW);
digitalWrite(Led2,HIGH);
digitalWrite(Led3,LOW);
delay(500);
servoMotor.write(90);
digitalWrite(Zumbador,HIGH);
digitalWrite(Led1,LOW);
digitalWrite(Led2,LOW);
digitalWrite(Led3,HIGH);
delay(500);
servoMotor.write(180);
digitalWrite(Zumbador,LOW);
digitalWrite(Led1,LOW);
digitalWrite(Led2,LOW);
digitalWrite(Led3,LOW);
}
void loop() {
/*
Se añade un pequeño apartado para configurar el offset de la altura del ascensor
y corregir las desviaciones provocadas por diferentes cargas y/o tensiones de alimentacion
*/
if (Configurar == 1){
//El pulsador de la Planta 3 sube el ascensor
if(digitalRead(BA3)==1){
digitalWrite(Gir1, HIGH);
digitalWrite(Gir2, LOW);
analogWrite(vel, 255);
}
//El pulsador de la Planta 1 baja el ascensor
if(digitalRead(BA1)==1){
digitalWrite(Gir1, LOW);
digitalWrite(Gir2, HIGH);
analogWrite(vel, 255);
}
//Si no pulsamos nigún pulsador el ascensor se para
if(digitalRead(BA1) == 0 && digitalRead(BA3) == 0){
digitalWrite(vel,LOW);
digitalWrite(Gir1,LOW);
digitalWrite(Gir2,LOW);
}
// Si pulsamos el boton central se sale del modo de configuracion
if(digitalRead(BA2) == 1){
// Esperamos a que se deje de pulsar el boton
while (digitalRead(BA2) == 1){}
Configurar = 0;
}
}
// Entramos en el modo de funcionamiento normal
if (Configurar == 0){
// Si estamos en la primera planta
if (Planta == 1){
// Si no se pulsa el boton de ninguna otra planta
if(digitalRead(BA2) == 0 && digitalRead(BA3) == 0){
digitalWrite(Led1,HIGH); // Encender led de planta 1
digitalWrite(Led2,LOW); // Apagar el led de la planta 2
digitalWrite(Led3,LOW); // Apagar el led de la planta 3
//servoMotor.write(180);
// El motor DC no se mueve
digitalWrite(vel,LOW);
digitalWrite(Gir1,LOW);
digitalWrite(Gir2,LOW);
// El zumbador no pita
delay(250);
digitalWrite(Zumbador,LOW);
}
// Si se pulsa el boton de planta 2
if(digitalRead(BA2)==1){
// Esperar a que se deje de pulsar el boton 2
while(digitalRead(BA2)==1){}
// Apagar todos los leds
digitalWrite(Led1,LOW);
digitalWrite(Led2,LOW);
digitalWrite(Led3,LOW);
// Encender el motor DC
digitalWrite(Gir1,HIGH);
digitalWrite(Gir2,LOW);
analogWrite(vel, 255);
Planta = 2;
// Hacer sonido con el zumbador
digitalWrite(Zumbador,HIGH);
delay(435);
digitalWrite(Zumbador,LOW);
delay(435);
digitalWrite(Zumbador,HIGH);
//Parar el motor DC
digitalWrite(vel,LOW);
digitalWrite(Gir1,LOW);
digitalWrite(Gir2,LOW);
}
// Si se pulsa el boton de planta 3
else if(digitalRead(BA3)==1){
// Esperar a que se deje de pulsar el boton 3
while(digitalRead(BA3)==1){}
// Apagar todos los leds
digitalWrite(Led1,LOW);
digitalWrite(Led2,LOW);
digitalWrite(Led3,LOW);
// Encender el motor DC
digitalWrite(Gir1,HIGH);
digitalWrite(Gir2,LOW);
analogWrite(vel, 255 );
Planta = 3;
// Hacer sonido con el zumbador
digitalWrite(Zumbador,HIGH);
delay(430);
digitalWrite(Zumbador,LOW);
delay(430);
digitalWrite(Zumbador,HIGH);
delay(430);
digitalWrite(Zumbador,LOW);
delay(430);
digitalWrite(Zumbador,HIGH);
delay(215);
digitalWrite(Zumbador,LOW);
//Parar el motor DC
digitalWrite(vel,LOW);
digitalWrite(Gir1,LOW);
digitalWrite(Gir2,LOW);
}
}
// Si estamos en la segunda planta
if (Planta == 2){
// Si no se pulsa el boton de ninguna otra planta
if(digitalRead(BA1) == 0 && digitalRead(BA3) == 0){
digitalWrite(Led2,HIGH); // Se encoiende el led del piso 2
digitalWrite(Led1,LOW); // Se apaga el led del piso 1
digitalWrite(Led3,LOW); // Se apaga el led del piso 3
// El motor DC no se mueve
digitalWrite(vel,LOW);
digitalWrite(Gir1,LOW);
digitalWrite(Gir2,LOW);
// El zumbador no pita
delay(250);
digitalWrite(Zumbador,LOW);
// Se sube la barrera del servo
servoMotor.write(90);
}
// Si se pulsa el boton de planta 1
if(digitalRead(BA1)==1){
// Esperar a que se deje de pulsar el boton 1
while(digitalRead(BA1)==1){}
// Bajar la barrera del servo
delay(100);
servoMotor.write(180);
delay(100);
// Apagar todos los leds
digitalWrite(Led1,LOW);
digitalWrite(Led2,LOW);
digitalWrite(Led3,LOW);
// Encender el motor DC
digitalWrite(Gir1,LOW);
digitalWrite(Gir2,HIGH);
analogWrite(vel, 255 );
Planta = 1;
// Hacer sonido con el zumbador
digitalWrite(Zumbador,HIGH);
delay(200);
digitalWrite(Zumbador,LOW);
delay(200);
digitalWrite(Zumbador,HIGH);
delay(200);
digitalWrite(Zumbador,LOW);
delay(220);
digitalWrite(Zumbador,HIGH);
//Parar el motor DC
digitalWrite(vel,LOW);
digitalWrite(Gir1,LOW);
digitalWrite(Gir2,LOW);
}
// Si se pulsa el boton de planta 3
else if(digitalRead(BA3)==1){
// Esperar a que se deje de pulsar el boton 3
while(digitalRead(BA3)==1){}
// Bajar la barrera del servo
delay(100);
servoMotor.write(180);
delay(100);
// Apagar todos los leds
digitalWrite(Led1,LOW);
digitalWrite(Led2,LOW);
digitalWrite(Led3,LOW);
// Encender el motor DC
digitalWrite(Gir1,HIGH);
digitalWrite(Gir2,LOW);
analogWrite(vel, 255 );
Planta = 3;
// Hacer sonido con el zumbador
digitalWrite(Zumbador,HIGH);
delay(440);
digitalWrite(Zumbador,LOW);
delay(440);
//Parar el motor DC
digitalWrite(Zumbador,HIGH);
digitalWrite(vel,LOW);
digitalWrite(Gir1,LOW);
digitalWrite(Gir2,LOW);
}
}
if (Planta == 3){
// Si no se pulsa el boton de ninguna otra planta
if(digitalRead(BA2) == 0 && digitalRead(BA3) == 0){
digitalWrite(Led3,HIGH); // Se encoiende el led del piso 3
digitalWrite(Led1,LOW); // Se apaga el led del piso 1
digitalWrite(Led2,LOW); // Se apaga el led del piso 2
// El motor DC no se mueve
digitalWrite(vel,LOW);
digitalWrite(Gir1,LOW);
digitalWrite(Gir2,LOW);
// El zumbador no pita
delay(250);
digitalWrite(Zumbador,LOW);
}
// Si se pulsa el boton de planta 1
if(digitalRead(BA1)==1){
// Esperar a que se deje de pulsar el boton 1
while(digitalRead(BA1)==1){}
// Apagar todos los leds
digitalWrite(Led1,LOW);
digitalWrite(Led2,LOW);
digitalWrite(Led3,LOW);
// Encender el motor DC
digitalWrite(Gir1,LOW);
digitalWrite(Gir2,HIGH);
analogWrite(vel, 255 );
Planta = 1;
// Hacer sonido con el zumbador
digitalWrite(Zumbador,HIGH);
delay(200);
digitalWrite(Zumbador,LOW);
delay(200);
digitalWrite(Zumbador,HIGH);
delay(200);
digitalWrite(Zumbador,LOW);
delay(200);
digitalWrite(Zumbador,HIGH);
delay(200);
digitalWrite(Zumbador,LOW);
delay(200);
digitalWrite(Zumbador,HIGH);
delay(200);
digitalWrite(Zumbador,LOW);
delay(200);
digitalWrite(Zumbador,HIGH);
delay(220);
digitalWrite(Zumbador,LOW);
//Parar el motor DC
digitalWrite(vel,LOW);
digitalWrite(Gir1,LOW);
digitalWrite(Gir2,LOW);
}
// Si se pulsa el boton de planta 2
else if(digitalRead(BA2)==1){
// Esperar a que se deje de pulsar el boton 2
while(digitalRead(BA2)==1){}
// Apagar todos los leds
digitalWrite(Led1,LOW);
digitalWrite(Led2,LOW);
digitalWrite(Led3,LOW);
// Encender el motor DC
digitalWrite(Gir1,LOW);
digitalWrite(Gir2,HIGH);
analogWrite(vel, 255 );
Planta = 2;
// Hacer sonido con el zumbador
digitalWrite(Zumbador,HIGH);
delay(200);
digitalWrite(Zumbador,LOW);
delay(200);
digitalWrite(Zumbador,HIGH);
delay(200);
digitalWrite(Zumbador,LOW);
delay(220);
digitalWrite(Zumbador,HIGH);
//Parar el motor DC
digitalWrite(vel,LOW);
digitalWrite(Gir1,LOW);
digitalWrite(Gir2,LOW);
}
}
}
}
| Vistas | |
|---|---|
| 1 | Número de vistas |
| 1 | Vistas de miembros |
| 0 | Vistas públicas |
| Acciones | |
|---|---|
| 0 | Gustos |
| 0 | No me gusta |
| 0 | Comentarios |
Compartir por correo
Por favor iniciar sesión para compartir esto webpage por correo.