Este ascensor está movido mediante un tambor que enrolla y desenrolla la cuerda que mueve la cabina arriba y abajo. Este tambor gira movido por un par de engranajes, en donde el piñón es accionado por un motor paso a paso 28BYJ-48. La cabina del ascensor va guiada en dos varillas de aluminio de 4 milímetros de diámetro y 423 milímetros de largo. Las piezas para imprimir en 3D se pueden encontrar en Thingiverse. En cada piso se encuentran un pulsador para llamar al ascensor y el final de carrera que detecta su llegada.
El piñón de 10 dientes que mueve el mecanismo va encajado al extremo del eje del motor paso a paso. La corona dentada de 70 dientes lleva en su interior dos rodamientos de bolas 684ZZ, separados por un pequeño tubo de plástico. La polea que soporta la cuerda en el soporte superior también dispone de dos rodamientos de bolas 684ZZ. Sobre el tambor unido a la corona dentada se sujeta la cuerda y se enrollan tres o cuatro vueltas por cada uno de los extremos en diferente sentido.
El driver del motor paso a paso, que utiliza un integrado ULN 2003 está conectado a los pines 8 (IN1), 9 (IN2), 10 (IN3) y 11 (IN4) de Arduino.
Los finales de carrera que detectan la llegada de la cabina a los distintos pisos están conectados a los pines 5 (Planta baja), 6 (Primer piso) y 7 (Segundo piso). Los pulsadores utilizados para solicitar el ascensor en los distintos pisos están conectados a los pines 1 (Planta baja), 2 (Primer piso) y 4 (Segundo piso).
Aquí se puede ver la estructura del ascensor casi completa.
Placa de soporte de la placa Arduino.
En este corte de la polea se pueden ver los alojamientos de los rodamientos de bolas 684ZZ.
Programación
Primer programa para probar el funcionamiento del motor
El valor de la velocidad myStepper.setSpeed(1) se puede variar entre 1 y 10, por encima de este valor no se gana en velocidad e incluso por encima de 15 se bloquea el motor.
//Incluye la librería de Arduino Stepper#include <Stepper.h>// Se define el número de pasos por vueltaconst int stepsPerRevolution = 2038;// Se crea un objeto de la clase stepper llamado myStepper// Se introducen los pines conectados a IN1-IN3-IN2-IN4 y el número de pasos a girar, definido por la variable stepsPerRevolutionStepper myStepper = Stepper(stepsPerRevolution, 8, 10, 9, 11);void setup() {// Utilizando la librería Stepper no es necesario configurar los pines 8, 9, 10 y 11 como OUTPUT}void loop() {// Giro lento de una vuelta en el sentido de las agujas del reloj a una velocidad de 5 RPMmyStepper.setSpeed(1);myStepper.step(stepsPerRevolution);delay(1000);// Giro rápido de una vuelta en sentido contrario al de las agujas del reloj a una velocidad de 10 RPMmyStepper.setSpeed(10);myStepper.step(-stepsPerRevolution);delay(1000);}
Mover arriba y abajo
En este programa cuando apretemos el pulsador de la Planta Baja subirá la cabina y cuando apretemos el pulsador del Primero bajará.
#include <Stepper.h>Stepper myStepper = Stepper(2038, 8, 10, 9, 11);void setup() {myStepper.setSpeed(10);}void loop() {if (digitalRead(1) == HIGH) {myStepper.step(1);}if (digitalRead(2) == HIGH) {myStepper.step(-1);}}
Programa para el ascensor de dos plantas
Ahora cuando apretemos el pulsador de la Planta Baja bajará la cabina y cuando apretemos el pulsador del Primero subirá. Dejará de subir cuando la cabina haya presionado el final de carrera del Primer piso y dejará de bajar cuando esta haya presionado el final de carrera de la Planta Baja.
#include <Stepper.h>Stepper myStepper = Stepper(2038, 8, 10, 9, 11);void setup() {myStepper.setSpeed(10);}void loop() {//Para subirif ((digitalRead(2) == HIGH) & (digitalRead(6) == LOW)) {myStepper.step(-1);}//Para bajarif ((digitalRead(1) == HIGH) & (digitalRead(5) == LOW)) {myStepper.step(1);}}
Para no tener que mantener apretado el pulsador
Con este programa podemos presionar el pulsador y soltarlo y el motor seguirá en marcha hasta llegar al punto deseado, arriba o abajo. Tiene un problema solo se puede utilizar una vez, después de subir o bajar la primera vez el motor se bloquea. Para poder seguir utilizándolo se ha de reiniciar Arduino para llevar a la situación de inicio las variables booleanas.
#include <Stepper.h>Stepper myStepper = Stepper(2038, 8, 10, 9, 11);boolean PB = false;boolean Primero = false;void setup() {myStepper.setSpeed(10);}void loop() {if (digitalRead(1) == HIGH) {PB = true;}if (digitalRead(2) == HIGH) {Primero = true;}//Para subirif ((Primero == true) & (digitalRead(6) == LOW)) {myStepper.step(-1);}//Para bajarif ((PB == true) & (digitalRead(5) == LOW)) {myStepper.step(1);}}
Resolviendo el problema del programa anterior
En este programa al presionar el final de carrera correspondiente vuelve a valor false la variable de piso correspondiente. De todas formas, si la cabina se encuentra en una posición intermedia, al apretar el otro pulsador el motor se bloquea.
#include <Stepper.h>Stepper myStepper = Stepper(2038, 8, 10, 9, 11);boolean PB = false;boolean Primero = false;void setup() {myStepper.setSpeed(10);}void loop() {if (digitalRead(1) == HIGH) {PB = true;}if (digitalRead(2) == HIGH) {Primero = true;}if (digitalRead(5) == HIGH) {PB = false;}if (digitalRead(6) == HIGH) {Primero = false;}//Para subirif ((Primero == true) & (digitalRead(6) == LOW)) {myStepper.step(-1);}//Para bajarif ((PB == true) & (digitalRead(5) == LOW)) {myStepper.step(1);}}
Evitando el bloqueo del motor
En este programa solamente se puede cambiar el estado de la variable booleana con el pulsador si además el final de carrera correspondiente está presionado. Tendrá efecto apretar el pulsador de la Planta baja si está presionado el final de carrera del primer piso. Por el contrario, tendrá efecto apretar el pulsador del Primer piso si está presionado el final de carrera de la Planta baja. Si la cabina del ascensor queda en una posición intermedia entre la Planta baja y el Primer piso al poner en marcha el programa no subirá ni bajará, aunque se apriete uno u otro pulsador. Presionando a mano el final de carrera correspondiente podremos salvar este inconveniente, y hecho esto, después ya funcionará arriba y abajo correctamente. Para solucionar este último problema se habría de introducir en el programa un elemento de puesta a cero del ascensor.
#include <Stepper.h>Stepper myStepper = Stepper(2038, 8, 10, 9, 11);boolean PB = false;boolean Primero = false;void setup() {myStepper.setSpeed(10);}void loop() {if ((digitalRead(1) == HIGH)&(digitalRead(6) == HIGH)) {PB = true;}if ((digitalRead(2) == HIGH)&(digitalRead(5) == HIGH)) {Primero = true;}if (digitalRead(5) == HIGH) {PB = false;}if (digitalRead(6) == HIGH) {Primero = false;}//Para subirif ((Primero == true) & (digitalRead(6) == LOW)) {myStepper.step(-1);}//Para bajarif ((PB == true) & (digitalRead(5) == LOW)) {myStepper.step(1);}}
Simplificación del programa anterior
En realidad en el programa anterior se pueden eliminar las dobles condicionales que ponen en marcha el motor paso a paso, convirtiéndolas en condicionales simples, ya que ello era una redundancia, puesto que al presionar la cabina el final de carrera correspondiente se pasaba la variable booleana a valor false.
#include <Stepper.h>Stepper myStepper = Stepper(2038, 8, 10, 9, 11);boolean PB = false;boolean Primero = false;void setup() {myStepper.setSpeed(10);}void loop() {if ((digitalRead(1) == HIGH)&(digitalRead(6) == HIGH)) {PB = true;}if ((digitalRead(2) == HIGH)&(digitalRead(5) == HIGH)) {Primero = true;}if (digitalRead(5) == HIGH) {PB = false;}if (digitalRead(6) == HIGH) {Primero = false;}//Para subirif (Primero == true) {myStepper.step(-1);}//Para bajarif (PB == true) {myStepper.step(1);}}
Programa con puesta a cero
Este código que consigue llevar al inicio de la operación la cabina hasta la Planta Baja está formado por las dos primeras estructuras condicionales incluidas dentro del void loop. En el listado del programa se puede ver esta parte resaltada. El primer condicional utiliza el valor true de la variable booleana Control. Mientras el final de carrera de la Planta baja no este presionado la cabina continuará bajando al ponerse en marcha el motor paso a paso. Una vez presionado el final de carrera de la Planta Baja, en el segundo condicional se pasa el valor de Control a false, para de esta forma desactivar el primer condicional.
#include <Stepper.h>Stepper myStepper = Stepper(2038, 8, 10, 9, 11);boolean PB = false;boolean Primero = false;boolean Control = true;void setup() {myStepper.setSpeed(10);}void loop() {if (Control==true) {if(digitalRead(5) == LOW){myStepper.step(1);}if(digitalRead(5) == HIGH){Control = false;}}if ((digitalRead(1) == HIGH)&(digitalRead(6) == HIGH)) {PB = true;}if ((digitalRead(2) == HIGH)&(digitalRead(5) == HIGH)) {Primero = true;}if (digitalRead(5) == HIGH) {PB = false;}if (digitalRead(6) == HIGH) {Primero = false;}//Para subirif (Primero == true) {myStepper.step(-1);}//Para bajarif (PB == true) {myStepper.step(1);}}
Programa para las tres plantas
Se ha creado otra variable booleana para el Segundo piso y una variable entera para el valor que los finales de carrera van asignando.
#include <Stepper.h>Stepper myStepper = Stepper(2038, 8, 10, 9, 11);boolean PB = false;boolean Primero = false;boolean Segundo = false;boolean Control = true;int Piso = 0;void setup() {myStepper.setSpeed(10);}void loop() {//Puesta a cero al poner en marcha el ascensorif (Control==true) {if(digitalRead(5) == LOW){myStepper.step(1);}if(digitalRead(5) == HIGH){Control = false;}}//Activación de pulsadores//Activación del pulsador de la Planta Bajaif ((digitalRead(1) == HIGH)&((digitalRead(6) == HIGH)or(digitalRead(7) == HIGH))) {PB = true;}//Activación del pulsador del Primer pisoif ((digitalRead(2) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(7) == HIGH))) {Primero = true;}//Activación del pulsador del Segundo pisoif ((digitalRead(4) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(6) == HIGH))) {Segundo = true;}//Desactivado de los pulsadores y asignación del valor de piso//Planta bajaif (digitalRead(5) == HIGH) {PB = false;Piso = 0;}//Primer pisoif (digitalRead(6) == HIGH) {Primero = false;Piso = 1;}//Segundo pisoif (digitalRead(7) == HIGH) {Segundo = false;Piso = 2;}//Subir la cabina//Con destino al Segundo pisoif (Segundo == true) {myStepper.step(-1);}//Desde la Planta baja al Primer pisoif ((Primero == true) & (Piso == 0)) {myStepper.step(-1);}//Bajar la cabina//Con destino a la Planta bajaif (PB == true) {myStepper.step(1);}//Desde el Segundo piso al Primer pisoif ((Primero == true) & (Piso == 2)) {myStepper.step(1);}}
A continuación se puede ver el mismo programa con los cambios resaltados en letra más grande y negrita.
#include <Stepper.h>Stepper myStepper = Stepper(2038, 8, 10, 9, 11);boolean PB = false;boolean Primero = false;boolean Segundo = false;boolean Control = true;int Piso = 0;void setup() {myStepper.setSpeed(10);}void loop() {//Puesta a cero al poner en marcha el ascensorif (Control==true) {if(digitalRead(5) == LOW){myStepper.step(1);}if(digitalRead(5) == HIGH){Control = false;}}//Activación de pulsadores//Activación del pulsador de la Planta Bajaif ((digitalRead(1) == HIGH)&((digitalRead(6) == HIGH)or(digitalRead(7) == HIGH))) {PB = true;}//Activación del pulsador del Primer pisoif ((digitalRead(2) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(7) == HIGH))) {Primero = true;}//Activación del pulsador del Segundo pisoif ((digitalRead(4) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(6) == HIGH))) {Segundo = true;}//Desactivado de los pulsadores y asignación del valor de piso//Planta bajaif (digitalRead(5) == HIGH) {PB = false;Piso = 0;}//Primer pisoif (digitalRead(6) == HIGH) {Primero = false;Piso = 1;}//Segundo pisoif (digitalRead(7) == HIGH) {Segundo = false;Piso = 2;}//Subir la cabina//Con destino al Segundo pisoif (Segundo == true) {myStepper.step(-1);}//Desde la Planta baja al Primer pisoif ((Primero == true) & (Piso == 0)) {myStepper.step(-1);}//Bajar la cabina//Con destino a la Planta bajaif (PB == true) {myStepper.step(1);}//Desde el Segundo piso al Primer pisoif ((Primero == true) & (Piso == 2)) {myStepper.step(1);}}
Utilización del display de 8X8
El siguiente código está copiado de ArduinoBlocks. La línea de código ledmatrix_1.setType(0); daba un mensaje de error en el IDE de Arduino y la he pasado a comentario y las dos siguientes también, ya que no se necesitan para el resultado de este programa. Al volver a cargar un programa, bien sea desde ArduinoBlocks o desde el IDE de Arduino, si el display ha quedado encendido algunas veces no permite la nueva carga, por lo que hay que retirar alguno de los cables del puerto i2C o de la alimentación del display para conseguir cargar el nuevo programa.
#include <SPI.h>
#include <Wire.h>#include <Adafruit_GFX.h>#include <Adafruit_LEDBackpack.h>Adafruit_8x8matrix ledmatrix_1 =Adafruit_8x8matrix();void setup(){ledmatrix_1.begin(0x70);//ledmatrix_1.setType(0);//ledmatrix_1.setTextWrap(false);//ledmatrix_1.setTextSize(1);ledmatrix_1.setRotation(2);
ledmatrix_1.drawRect(0,0,7,7,LED_ON);ledmatrix_1.drawRect(0,0,6,6,LED_ON);ledmatrix_1.writeDisplay();delay(5000);}void loop(){ledmatrix_1.clear();ledmatrix_1.writeDisplay();}
El resultado de este programa es el que se muestra a continuación.
Vamos a introducir algo gráfico en el programa final del ascensor
Para empezar el display mostrará una flecha hacia arriba mientras el ascensor esté subiendo.
#include <Stepper.h>Stepper myStepper = Stepper(2038, 8, 10, 9, 11);#include <SPI.h>#include <Wire.h>#include <Adafruit_GFX.h>#include <Adafruit_LEDBackpack.h>Adafruit_8x8matrix ledmatrix_1 =Adafruit_8x8matrix();boolean PB = false;boolean Primero = false;boolean Segundo = false;boolean Control = true;int Piso = 0;void setup() {myStepper.setSpeed(10);ledmatrix_1.begin(0x70);ledmatrix_1.setRotation(2);}void loop() {//Puesta a cero al poner en marcha el ascensorif (Control==true) {if(digitalRead(5) == LOW){myStepper.step(1);}if(digitalRead(5) == HIGH){Control = false;}}//Activación de pulsadores//Activación del pulsador de la Planta Bajaif ((digitalRead(1) == HIGH)&((digitalRead(6) == HIGH)or(digitalRead(7) == HIGH))) {PB = true;}//Activación del pulsador del Primer pisoif ((digitalRead(2) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(7) == HIGH))) {Primero = true;}//Activación del pulsador del Segundo pisoif ((digitalRead(4) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(6) == HIGH))) {Segundo = true;}//Desactivado de los pulsadores y asignación del valor de piso//Planta bajaif (digitalRead(5) == HIGH) {PB = false;Piso = 0;}//Primer pisoif (digitalRead(6) == HIGH) {Primero = false;Piso = 1;ledmatrix_1.clear();ledmatrix_1.writeDisplay();}//Segundo pisoif (digitalRead(7) == HIGH) {Segundo = false;Piso = 2;ledmatrix_1.clear();ledmatrix_1.writeDisplay();}//Subir la cabina//Con destino al Segundo pisoif (Segundo == true) {myStepper.step(-1);ledmatrix_1.drawLine(0,3,7,3,LED_ON);ledmatrix_1.drawLine(0,2,2,0,LED_ON);ledmatrix_1.drawLine(0,4,2,6,LED_ON);ledmatrix_1.writeDisplay();}//Desde la Planta baja al Primer pisoif ((Primero == true) & (Piso == 0)) {myStepper.step(-1);ledmatrix_1.drawLine(0,3,7,3,LED_ON);ledmatrix_1.drawLine(0,2,2,0,LED_ON);ledmatrix_1.drawLine(0,4,2,6,LED_ON);ledmatrix_1.writeDisplay();}//Bajar la cabina//Con destino a la Planta bajaif (PB == true) {myStepper.step(1);}//Desde el Segundo piso al Primer pisoif ((Primero == true) & (Piso == 2)) {myStepper.step(1);}}
El siguiente programa es idéntico pero muestra los cambios resaltados.
#include <Stepper.h>Stepper myStepper = Stepper(2038, 8, 10, 9, 11);#include <SPI.h>#include <Wire.h>#include <Adafruit_GFX.h>#include <Adafruit_LEDBackpack.h>Adafruit_8x8matrix ledmatrix_1 =Adafruit_8x8matrix();boolean PB = false;boolean Primero = false;boolean Segundo = false;boolean Control = true;int Piso = 0;void setup() {myStepper.setSpeed(10);ledmatrix_1.begin(0x70);ledmatrix_1.setRotation(2);}void loop() {//Puesta a cero al poner en marcha el ascensorif (Control==true) {if(digitalRead(5) == LOW){myStepper.step(1);}if(digitalRead(5) == HIGH){Control = false;}}//Activación de pulsadores//Activación del pulsador de la Planta Bajaif ((digitalRead(1) == HIGH)&((digitalRead(6) == HIGH)or(digitalRead(7) == HIGH))) {PB = true;}//Activación del pulsador del Primer pisoif ((digitalRead(2) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(7) == HIGH))) {Primero = true;}//Activación del pulsador del Segundo pisoif ((digitalRead(4) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(6) == HIGH))) {Segundo = true;}//Desactivado de los pulsadores y asignación del valor de piso//Planta bajaif (digitalRead(5) == HIGH) {PB = false;Piso = 0;}//Primer pisoif (digitalRead(6) == HIGH) {Primero = false;Piso = 1;ledmatrix_1.clear();ledmatrix_1.writeDisplay();}//Segundo pisoif (digitalRead(7) == HIGH) {Segundo = false;Piso = 2;ledmatrix_1.clear();ledmatrix_1.writeDisplay();}//Subir la cabina//Con destino al Segundo pisoif (Segundo == true) {myStepper.step(-1);ledmatrix_1.drawLine(0,3,7,3,LED_ON);ledmatrix_1.drawLine(0,2,2,0,LED_ON);ledmatrix_1.drawLine(0,4,2,6,LED_ON);ledmatrix_1.writeDisplay();}//Desde la Planta baja al Primer pisoif ((Primero == true) & (Piso == 0)) {myStepper.step(-1);ledmatrix_1.drawLine(0,3,7,3,LED_ON);ledmatrix_1.drawLine(0,2,2,0,LED_ON);ledmatrix_1.drawLine(0,4,2,6,LED_ON);ledmatrix_1.writeDisplay();}//Bajar la cabina//Con destino a la Planta bajaif (PB == true) {myStepper.step(1);}//Desde el Segundo piso al Primer pisoif ((Primero == true) & (Piso == 2)) {myStepper.step(1);}}
Añadimos la flecha hacia abajo
Ahora añadimos el código que muestra una flecha indicando hacia abajo cuando la cabina del ascensor baja.
#include <Stepper.h>Stepper myStepper = Stepper(2038, 8, 10, 9, 11);#include <SPI.h>#include <Wire.h>#include <Adafruit_GFX.h>#include <Adafruit_LEDBackpack.h>Adafruit_8x8matrix ledmatrix_1 =Adafruit_8x8matrix();boolean PB = false;boolean Primero = false;boolean Segundo = false;boolean Control = true;int Piso = 0;void setup() {myStepper.setSpeed(10);ledmatrix_1.begin(0x70);ledmatrix_1.setRotation(2);}void loop() {//Puesta a cero al poner en marcha el ascensorif (Control==true) {if(digitalRead(5) == LOW){myStepper.step(1);}if(digitalRead(5) == HIGH){Control = false;}}//Activación de pulsadores//Activación del pulsador de la Planta Bajaif ((digitalRead(1) == HIGH)&((digitalRead(6) == HIGH)or(digitalRead(7) == HIGH))) {PB = true;}//Activación del pulsador del Primer pisoif ((digitalRead(2) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(7) == HIGH))) {Primero = true;}//Activación del pulsador del Segundo pisoif ((digitalRead(4) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(6) == HIGH))) {Segundo = true;}//Desactivado de los pulsadores y asignación del valor de piso//Planta bajaif (digitalRead(5) == HIGH) {PB = false;Piso = 0;ledmatrix_1.clear();ledmatrix_1.writeDisplay();}//Primer pisoif (digitalRead(6) == HIGH) {Primero = false;Piso = 1;ledmatrix_1.clear();ledmatrix_1.writeDisplay();}//Segundo pisoif (digitalRead(7) == HIGH) {Segundo = false;Piso = 2;ledmatrix_1.clear();ledmatrix_1.writeDisplay();}//Subir la cabina//Con destino al Segundo pisoif (Segundo == true) {myStepper.step(-1);ledmatrix_1.drawLine(0,3,7,3,LED_ON);ledmatrix_1.drawLine(0,2,2,0,LED_ON);ledmatrix_1.drawLine(0,4,2,6,LED_ON);ledmatrix_1.writeDisplay();}//Desde la Planta baja al Primer pisoif ((Primero == true) & (Piso == 0)) {myStepper.step(-1);ledmatrix_1.drawLine(0,3,7,3,LED_ON);ledmatrix_1.drawLine(0,2,2,0,LED_ON);ledmatrix_1.drawLine(0,4,2,6,LED_ON);ledmatrix_1.writeDisplay();}//Bajar la cabina//Con destino a la Planta bajaif (PB == true) {myStepper.step(1);ledmatrix_1.drawLine(0,3,7,3,LED_ON);ledmatrix_1.drawLine(3,0,5,2,LED_ON);ledmatrix_1.drawLine(5,4,3,6,LED_ON);ledmatrix_1.writeDisplay();}//Desde el Segundo piso al Primer pisoif ((Primero == true) & (Piso == 2)) {myStepper.step(1);ledmatrix_1.drawLine(0,3,7,3,LED_ON);ledmatrix_1.drawLine(3,0,5,2,LED_ON);ledmatrix_1.drawLine(5,4,3,6,LED_ON);ledmatrix_1.writeDisplay();}}
A continuación se muestra el mismo programa con los cambios resaltados.
#include <Stepper.h>Stepper myStepper = Stepper(2038, 8, 10, 9, 11);#include <SPI.h>#include <Wire.h>#include <Adafruit_GFX.h>#include <Adafruit_LEDBackpack.h>Adafruit_8x8matrix ledmatrix_1 =Adafruit_8x8matrix();boolean PB = false;boolean Primero = false;boolean Segundo = false;boolean Control = true;int Piso = 0;void setup() {myStepper.setSpeed(10);ledmatrix_1.begin(0x70);ledmatrix_1.setRotation(2);}void loop() {//Puesta a cero al poner en marcha el ascensorif (Control==true) {if(digitalRead(5) == LOW){myStepper.step(1);}if(digitalRead(5) == HIGH){Control = false;}}//Activación de pulsadores//Activación del pulsador de la Planta Bajaif ((digitalRead(1) == HIGH)&((digitalRead(6) == HIGH)or(digitalRead(7) == HIGH))) {PB = true;}//Activación del pulsador del Primer pisoif ((digitalRead(2) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(7) == HIGH))) {Primero = true;}//Activación del pulsador del Segundo pisoif ((digitalRead(4) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(6) == HIGH))) {Segundo = true;}//Desactivado de los pulsadores y asignación del valor de piso//Planta bajaif (digitalRead(5) == HIGH) {PB = false;Piso = 0;ledmatrix_1.clear();ledmatrix_1.writeDisplay();}//Primer pisoif (digitalRead(6) == HIGH) {Primero = false;Piso = 1;ledmatrix_1.clear();ledmatrix_1.writeDisplay();}//Segundo pisoif (digitalRead(7) == HIGH) {Segundo = false;Piso = 2;ledmatrix_1.clear();ledmatrix_1.writeDisplay();}//Subir la cabina//Con destino al Segundo pisoif (Segundo == true) {myStepper.step(-1);ledmatrix_1.drawLine(0,3,7,3,LED_ON);ledmatrix_1.drawLine(0,2,2,0,LED_ON);ledmatrix_1.drawLine(0,4,2,6,LED_ON);ledmatrix_1.writeDisplay();}//Desde la Planta baja al Primer pisoif ((Primero == true) & (Piso == 0)) {myStepper.step(-1);ledmatrix_1.drawLine(0,3,7,3,LED_ON);ledmatrix_1.drawLine(0,2,2,0,LED_ON);ledmatrix_1.drawLine(0,4,2,6,LED_ON);ledmatrix_1.writeDisplay();}//Bajar la cabina//Con destino a la Planta bajaif (PB == true) {myStepper.step(1);ledmatrix_1.drawLine(0,3,7,3,LED_ON);ledmatrix_1.drawLine(3,0,5,2,LED_ON);ledmatrix_1.drawLine(5,4,3,6,LED_ON);ledmatrix_1.writeDisplay();}//Desde el Segundo piso al Primer pisoif ((Primero == true) & (Piso == 2)) {myStepper.step(1);ledmatrix_1.drawLine(0,3,7,3,LED_ON);ledmatrix_1.drawLine(3,0,5,2,LED_ON);ledmatrix_1.drawLine(5,4,3,6,LED_ON);ledmatrix_1.writeDisplay();}}
Suavizando el paso por el segundo piso
Con este pequeño código añadido se suaviza el paso por el Primer piso cuando va desde la Planta baja hacia el Segundo piso o viceversa. De esta forma se impide que se borre el display, cosa que también se nota en el funcionamiento del motor. Lo mismo se consigue a la salida del Segundo y de la Planta baja, mientras aun están presionados sus correspondientes finales de carrera.
#include <Stepper.h>Stepper myStepper = Stepper(2038, 8, 10, 9, 11);#include <SPI.h>#include <Wire.h>#include <Adafruit_GFX.h>#include <Adafruit_LEDBackpack.h>Adafruit_8x8matrix ledmatrix_1 =Adafruit_8x8matrix();boolean PB = false;boolean Primero = false;boolean Segundo = false;boolean Control = true;int Piso = 0;void setup() {myStepper.setSpeed(10);ledmatrix_1.begin(0x70);ledmatrix_1.setRotation(2);}void loop() {//Puesta a cero al poner en marcha el ascensorif (Control==true) {if(digitalRead(5) == LOW){myStepper.step(1);}if(digitalRead(5) == HIGH){Control = false;}}//Activación de pulsadores//Activación del pulsador de la Planta Bajaif ((digitalRead(1) == HIGH)&((digitalRead(6) == HIGH)or(digitalRead(7) == HIGH))) {PB = true;}//Activación del pulsador del Primer pisoif ((digitalRead(2) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(7) == HIGH))) {Primero = true;}//Activación del pulsador del Segundo pisoif ((digitalRead(4) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(6) == HIGH))) {Segundo = true;}//Desactivado de los pulsadores y asignación del valor de piso//Planta bajaif ((digitalRead(5) == HIGH) & (PB == true)) {PB = false;Piso = 0;ledmatrix_1.clear();ledmatrix_1.writeDisplay();}//Primer pisoif ((digitalRead(6) == HIGH) & (Primero == true)) {Primero = false;Piso = 1;ledmatrix_1.clear();ledmatrix_1.writeDisplay();}//Segundo pisoif (digitalRead(7) == HIGH & (Segundo == true)) {Segundo = false;Piso = 2;ledmatrix_1.clear();ledmatrix_1.writeDisplay();}//Subir la cabina//Con destino al Segundo pisoif (Segundo == true) {myStepper.step(-1);ledmatrix_1.drawLine(0,3,7,3,LED_ON);ledmatrix_1.drawLine(0,2,2,0,LED_ON);ledmatrix_1.drawLine(0,4,2,6,LED_ON);ledmatrix_1.writeDisplay();}//Desde la Planta baja al Primer pisoif ((Primero == true) & (Piso == 0)) {myStepper.step(-1);ledmatrix_1.drawLine(0,3,7,3,LED_ON);ledmatrix_1.drawLine(0,2,2,0,LED_ON);ledmatrix_1.drawLine(0,4,2,6,LED_ON);ledmatrix_1.writeDisplay();}//Bajar la cabina//Con destino a la Planta bajaif (PB == true) {myStepper.step(1);ledmatrix_1.drawLine(0,3,7,3,LED_ON);ledmatrix_1.drawLine(3,0,5,2,LED_ON);ledmatrix_1.drawLine(5,4,3,6,LED_ON);ledmatrix_1.writeDisplay();}//Desde el Segundo piso al Primer pisoif ((Primero == true) & (Piso == 2)) {myStepper.step(1);ledmatrix_1.drawLine(0,3,7,3,LED_ON);ledmatrix_1.drawLine(3,0,5,2,LED_ON);ledmatrix_1.drawLine(5,4,3,6,LED_ON);ledmatrix_1.writeDisplay();}}
A continuación se muestra el mismo programa con los cambios resaltados.
#include <Stepper.h>Stepper myStepper = Stepper(2038, 8, 10, 9, 11);#include <SPI.h>#include <Wire.h>#include <Adafruit_GFX.h>#include <Adafruit_LEDBackpack.h>Adafruit_8x8matrix ledmatrix_1 =Adafruit_8x8matrix();boolean PB = false;boolean Primero = false;boolean Segundo = false;boolean Control = true;int Piso = 0;void setup() {myStepper.setSpeed(10);ledmatrix_1.begin(0x70);ledmatrix_1.setRotation(2);}void loop() {//Puesta a cero al poner en marcha el ascensorif (Control==true) {if(digitalRead(5) == LOW){myStepper.step(1);}if(digitalRead(5) == HIGH){Control = false;}}//Activación de pulsadores//Activación del pulsador de la Planta Bajaif ((digitalRead(1) == HIGH)&((digitalRead(6) == HIGH)or(digitalRead(7) == HIGH))) {PB = true;}//Activación del pulsador del Primer pisoif ((digitalRead(2) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(7) == HIGH))) {Primero = true;}//Activación del pulsador del Segundo pisoif ((digitalRead(4) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(6) == HIGH))) {Segundo = true;}//Desactivado de los pulsadores y asignación del valor de piso//Planta bajaif ((digitalRead(5) == HIGH) & (PB == true)) {PB = false;Piso = 0;ledmatrix_1.clear();ledmatrix_1.writeDisplay();}//Primer pisoif ((digitalRead(6) == HIGH) & (Primero == true)) {Primero = false;Piso = 1;ledmatrix_1.clear();ledmatrix_1.writeDisplay();}//Segundo pisoif (digitalRead(7) == HIGH & (Segundo == true)) {Segundo = false;Piso = 2;ledmatrix_1.clear();ledmatrix_1.writeDisplay();}//Subir la cabina//Con destino al Segundo pisoif (Segundo == true) {myStepper.step(-1);ledmatrix_1.drawLine(0,3,7,3,LED_ON);ledmatrix_1.drawLine(0,2,2,0,LED_ON);ledmatrix_1.drawLine(0,4,2,6,LED_ON);ledmatrix_1.writeDisplay();}//Desde la Planta baja al Primer pisoif ((Primero == true) & (Piso == 0)) {myStepper.step(-1);ledmatrix_1.drawLine(0,3,7,3,LED_ON);ledmatrix_1.drawLine(0,2,2,0,LED_ON);ledmatrix_1.drawLine(0,4,2,6,LED_ON);ledmatrix_1.writeDisplay();}//Bajar la cabina//Con destino a la Planta bajaif (PB == true) {myStepper.step(1);ledmatrix_1.drawLine(0,3,7,3,LED_ON);ledmatrix_1.drawLine(3,0,5,2,LED_ON);ledmatrix_1.drawLine(5,4,3,6,LED_ON);ledmatrix_1.writeDisplay();}//Desde el Segundo piso al Primer pisoif ((Primero == true) & (Piso == 2)) {myStepper.step(1);ledmatrix_1.drawLine(0,3,7,3,LED_ON);ledmatrix_1.drawLine(3,0,5,2,LED_ON);ledmatrix_1.drawLine(5,4,3,6,LED_ON);ledmatrix_1.writeDisplay();}}
Añadiendo los números de piso
En este momento añadimos el código para que se visualicen los números del piso en cuanto la cabina llega a él.
#include <Stepper.h>Stepper myStepper = Stepper(2038, 8, 10, 9, 11);#include <SPI.h>#include <Wire.h>#include <Adafruit_GFX.h>#include <Adafruit_LEDBackpack.h>Adafruit_8x8matrix ledmatrix_1 =Adafruit_8x8matrix();boolean PB = false;boolean Primero = false;boolean Segundo = false;boolean Control = true;int Piso = 0;void setup() {myStepper.setSpeed(10);ledmatrix_1.begin(0x70);ledmatrix_1.setRotation(2);}void loop() {//Puesta a cero al poner en marcha el ascensorif (Control==true) {if(digitalRead(5) == LOW){myStepper.step(1);}if(digitalRead(5) == HIGH){Control = false;}}//Activación de pulsadores//Activación del pulsador de la Planta Bajaif ((digitalRead(1) == HIGH)&((digitalRead(6) == HIGH)or(digitalRead(7) == HIGH))) {PB = true;ledmatrix_1.clear();ledmatrix_1.writeDisplay();}//Activación del pulsador del Primer pisoif ((digitalRead(2) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(7) == HIGH))) {Primero = true;ledmatrix_1.clear();ledmatrix_1.writeDisplay();}//Activación del pulsador del Segundo pisoif ((digitalRead(4) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(6) == HIGH))) {Segundo = true;ledmatrix_1.clear();ledmatrix_1.writeDisplay();}//Desactivado de los pulsadores y asignación del valor de piso//Planta bajaif ((digitalRead(5) == HIGH) & (PB == true)) {PB = false;Piso = 0;ledmatrix_1.clear();ledmatrix_1.writeDisplay();ledmatrix_1.drawLine(0,0,6,0,LED_ON);ledmatrix_1.drawLine(0,1,1,2,LED_ON);ledmatrix_1.drawPixel(2,2,LED_ON);ledmatrix_1.drawPixel(3,1,LED_ON);ledmatrix_1.drawLine(0,4,6,4,LED_ON);ledmatrix_1.drawPixel(0,5,LED_ON);ledmatrix_1.drawLine(0,6,1,7,LED_ON);ledmatrix_1.drawLine(2,7,3,6,LED_ON);ledmatrix_1.drawPixel(3,5,LED_ON);ledmatrix_1.drawLine(4,7,5,7,LED_ON);ledmatrix_1.drawLine(6,5,6,6,LED_ON);ledmatrix_1.writeDisplay();}//Primer pisoif ((digitalRead(6) == HIGH) & (Primero == true)) {Primero = false;Piso = 1;ledmatrix_1.clear();ledmatrix_1.writeDisplay();ledmatrix_1.drawLine(0,3,6,3,LED_ON);ledmatrix_1.drawLine(1,2,2,1,LED_ON);ledmatrix_1.drawPixel(6,2,LED_ON);ledmatrix_1.writeDisplay();}//Segundo pisoif (digitalRead(7) == HIGH & (Segundo == true)) {Segundo = false;Piso = 2;ledmatrix_1.clear();ledmatrix_1.writeDisplay();ledmatrix_1.drawLine(6,2,6,6,LED_ON);ledmatrix_1.drawLine(5,3,2,6,LED_ON);ledmatrix_1.drawLine(1,6,0,5,LED_ON);ledmatrix_1.drawPixel(0,4,LED_ON);ledmatrix_1.drawLine(0,3,1,2,LED_ON);ledmatrix_1.drawPixel(2,2,LED_ON);ledmatrix_1.writeDisplay();}//Subir la cabina//Con destino al Segundo pisoif (Segundo == true) {myStepper.step(-1);ledmatrix_1.drawLine(0,3,7,3,LED_ON);ledmatrix_1.drawLine(0,2,2,0,LED_ON);ledmatrix_1.drawLine(0,4,2,6,LED_ON);ledmatrix_1.writeDisplay();}//Desde la Planta baja al Primer pisoif ((Primero == true) & (Piso == 0)) {myStepper.step(-1);ledmatrix_1.drawLine(0,3,7,3,LED_ON);ledmatrix_1.drawLine(0,2,2,0,LED_ON);ledmatrix_1.drawLine(0,4,2,6,LED_ON);ledmatrix_1.writeDisplay();}//Bajar la cabina//Con destino a la Planta bajaif (PB == true) {myStepper.step(1);ledmatrix_1.drawLine(0,3,7,3,LED_ON);ledmatrix_1.drawLine(3,0,5,2,LED_ON);ledmatrix_1.drawLine(5,4,3,6,LED_ON);ledmatrix_1.writeDisplay();}//Desde el Segundo piso al Primer pisoif ((Primero == true) & (Piso == 2)) {myStepper.step(1);ledmatrix_1.drawLine(0,3,7,3,LED_ON);ledmatrix_1.drawLine(3,0,5,2,LED_ON);ledmatrix_1.drawLine(5,4,3,6,LED_ON);ledmatrix_1.writeDisplay();}}
A continuación se muestra el mismo programa con los cambios resaltados.
#include <Stepper.h>Stepper myStepper = Stepper(2038, 8, 10, 9, 11);#include <SPI.h>#include <Wire.h>#include <Adafruit_GFX.h>#include <Adafruit_LEDBackpack.h>Adafruit_8x8matrix ledmatrix_1 =Adafruit_8x8matrix();boolean PB = false;boolean Primero = false;boolean Segundo = false;boolean Control = true;int Piso = 0;void setup() {myStepper.setSpeed(10);ledmatrix_1.begin(0x70);ledmatrix_1.setRotation(2);}void loop() {//Puesta a cero al poner en marcha el ascensorif (Control==true) {if(digitalRead(5) == LOW){myStepper.step(1);}if(digitalRead(5) == HIGH){Control = false;}}//Activación de pulsadores//Activación del pulsador de la Planta Bajaif ((digitalRead(1) == HIGH)&((digitalRead(6) == HIGH)or(digitalRead(7) == HIGH))) {PB = true;ledmatrix_1.clear();ledmatrix_1.writeDisplay();}//Activación del pulsador del Primer pisoif ((digitalRead(2) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(7) == HIGH))) {Primero = true;ledmatrix_1.clear();ledmatrix_1.writeDisplay();}//Activación del pulsador del Segundo pisoif ((digitalRead(4) == HIGH)&((digitalRead(5) == HIGH)or(digitalRead(6) == HIGH))) {Segundo = true;ledmatrix_1.clear();ledmatrix_1.writeDisplay();}//Desactivado de los pulsadores y asignación del valor de piso//Planta bajaif ((digitalRead(5) == HIGH) & (PB == true)) {PB = false;Piso = 0;ledmatrix_1.clear();ledmatrix_1.writeDisplay();ledmatrix_1.drawLine(0,0,6,0,LED_ON);ledmatrix_1.drawLine(0,1,1,2,LED_ON);ledmatrix_1.drawPixel(2,2,LED_ON);ledmatrix_1.drawPixel(3,1,LED_ON);ledmatrix_1.drawLine(0,4,6,4,LED_ON);ledmatrix_1.drawPixel(0,5,LED_ON);ledmatrix_1.drawLine(0,6,1,7,LED_ON);ledmatrix_1.drawLine(2,7,3,6,LED_ON);ledmatrix_1.drawPixel(3,5,LED_ON);ledmatrix_1.drawLine(4,7,5,7,LED_ON);ledmatrix_1.drawLine(6,5,6,6,LED_ON);ledmatrix_1.writeDisplay();}//Primer pisoif ((digitalRead(6) == HIGH) & (Primero == true)) {Primero = false;Piso = 1;ledmatrix_1.clear();ledmatrix_1.writeDisplay();ledmatrix_1.drawLine(0,3,6,3,LED_ON);ledmatrix_1.drawLine(1,2,2,1,LED_ON);ledmatrix_1.drawPixel(6,2,LED_ON);ledmatrix_1.writeDisplay();}//Segundo pisoif (digitalRead(7) == HIGH & (Segundo == true)) {Segundo = false;Piso = 2;ledmatrix_1.clear();ledmatrix_1.writeDisplay();ledmatrix_1.drawLine(6,2,6,6,LED_ON);ledmatrix_1.drawLine(5,3,2,6,LED_ON);ledmatrix_1.drawLine(1,6,0,5,LED_ON);ledmatrix_1.drawPixel(0,4,LED_ON);ledmatrix_1.drawLine(0,3,1,2,LED_ON);ledmatrix_1.drawPixel(2,2,LED_ON);ledmatrix_1.writeDisplay();}//Subir la cabina//Con destino al Segundo pisoif (Segundo == true) {myStepper.step(-1);ledmatrix_1.drawLine(0,3,7,3,LED_ON);ledmatrix_1.drawLine(0,2,2,0,LED_ON);ledmatrix_1.drawLine(0,4,2,6,LED_ON);ledmatrix_1.writeDisplay();}//Desde la Planta baja al Primer pisoif ((Primero == true) & (Piso == 0)) {myStepper.step(-1);ledmatrix_1.drawLine(0,3,7,3,LED_ON);ledmatrix_1.drawLine(0,2,2,0,LED_ON);ledmatrix_1.drawLine(0,4,2,6,LED_ON);ledmatrix_1.writeDisplay();}//Bajar la cabina//Con destino a la Planta bajaif (PB == true) {myStepper.step(1);ledmatrix_1.drawLine(0,3,7,3,LED_ON);ledmatrix_1.drawLine(3,0,5,2,LED_ON);ledmatrix_1.drawLine(5,4,3,6,LED_ON);ledmatrix_1.writeDisplay();}//Desde el Segundo piso al Primer pisoif ((Primero == true) & (Piso == 2)) {myStepper.step(1);ledmatrix_1.drawLine(0,3,7,3,LED_ON);ledmatrix_1.drawLine(3,0,5,2,LED_ON);ledmatrix_1.drawLine(5,4,3,6,LED_ON);ledmatrix_1.writeDisplay();}}
Generación de los gráficos del display
El código utilizado en el display permite encender y apagar todos sus LEDs, individualmente (ledmatrix_1.drawPixel(3,5,LED_ON);), en líneas rectas (ledmatrix_1.drawLine(3,0,5,2,LED_ON);) o formando texto. También hay un comando que permite borrar todo el display (ledmatrix_1.clear();). Después del borrado o la escritura se introducir la línea de código ledmatrix_1.writeDisplay();. Este componente se conecta a Arduino mediante un bus i2C, cuya dirección se puede configurar mediante tres mini interruptores. La posición que se muestra en la fotografía con los tres interruptores en OFF consigue la dirección (0x70) que se utiliza en los programas.
Para realizar los gráficos se han de tener en cuenta las coordenadas de los píxeles. El Led de la esquina superior izquierda es el 7, 0. Si bajamos una fila, el primero de la izquierda es el 0, 0. En la esquina inferior derecha está el led 6, 7. En la esquina inferior izquierda el 6, 0. En la esquina superior derecha el 7, 7.
ledmatrix_1.drawLine(0,3,7,3,LED_ON);ledmatrix_1.drawLine(3,0,5,2,LED_ON);ledmatrix_1.drawLine(5,4,3,6,LED_ON);ledmatrix_1.writeDisplay();
ledmatrix_1.drawLine(6,2,6,6,LED_ON);ledmatrix_1.drawLine(5,3,2,6,LED_ON);ledmatrix_1.drawLine(1,6,0,5,LED_ON);ledmatrix_1.drawPixel(0,4,LED_ON);ledmatrix_1.drawLine(0,3,1,2,LED_ON);ledmatrix_1.drawPixel(2,2,LED_ON);ledmatrix_1.writeDisplay();
ledmatrix_1.drawLine(0,3,6,3,LED_ON);ledmatrix_1.drawLine(1,2,2,1,LED_ON);ledmatrix_1.drawPixel(6,2,LED_ON);ledmatrix_1.writeDisplay();
ledmatrix_1.drawLine(0,3,7,3,LED_ON);ledmatrix_1.drawLine(0,2,2,0,LED_ON);ledmatrix_1.drawLine(0,4,2,6,LED_ON);ledmatrix_1.writeDisplay();
Las siglas PB se corresponden con el código:
ledmatrix_1.drawLine(0,0,6,0,LED_ON);ledmatrix_1.drawLine(0,1,1,2,LED_ON);ledmatrix_1.drawPixel(2,2,LED_ON);ledmatrix_1.drawPixel(3,1,LED_ON);ledmatrix_1.drawLine(0,4,6,4,LED_ON);ledmatrix_1.drawPixel(0,5,LED_ON);ledmatrix_1.drawLine(0,6,1,7,LED_ON);ledmatrix_1.drawLine(2,7,3,6,LED_ON);ledmatrix_1.drawPixel(3,5,LED_ON);ledmatrix_1.drawLine(4,7,5,7,LED_ON);ledmatrix_1.drawLine(6,5,6,6,LED_ON);ledmatrix_1.writeDisplay();
Programas realizados con Arduino Blocks
Mover arriba y abajo
En este programa cuando apretemos el pulsador de la Planta Baja bajará la cabina y cuando apretemos el pulsador del Primero subirá.
Programa para el ascensor de dos plantas
Ahora cuando apretemos el pulsador de la Planta Baja bajará la cabina y cuando apretemos el pulsador del Primero subirá. Dejará de subir cuando la cabina haya presionado el final de carrera del Primer piso y dejará de bajar cuando esta haya presionado el final de carrera de la Planta Baja.
Para no tener que mantener apretado el pulsador
Con este programa podemos presionar el pulsador y soltarlo y el motor seguirá en marcha hasta llegar al punto deseado, arriba o abajo. Tiene un problema solo se puede utilizar una vez, después de subir o bajar la primera vez el motor se bloquea. Para poder seguir utilizándolo se ha de reiniciar Arduino para llevar a la situación de inicio las variables booleanas.
Resolviendo el problema del programa anterior
En este programa al presionar el final de carrera correspondiente vuelve a valor false la variable de piso correspondiente. De todas formas, si la cabina se encuentra en una posición intermedia, al apretar el otro pulsador el motor se bloquea.
Evitando el bloqueo del motor
En este programa solamente se puede cambiar el estado de la variable booleana con el pulsador si además el final de carrera correspondiente está presionado. Tendrá efecto apretar el pulsador de la Planta baja si está presionado el final de carrera del primer piso. Por el contrario, tendrá efecto apretar el pulsador del Primer piso si está presionado el final de carrera de la Planta baja. Si la cabina del ascensor queda en una posición intermedia entre la Planta baja y el Primer piso al poner en marcha el programa no subirá ni bajará, aunque se apriete uno u otro pulsador. Presionando a mano el final de carrera correspondiente podremos salvar este inconveniente, y hecho esto, después ya funcionará arriba y abajo correctamente. Para solucionar este último problema se habría de introducir en el programa un elemento de puesta a cero del ascensor.
Simplificación del programa anterior
En realidad en el programa anterior se pueden eliminar las dobles condicionales que ponen en marcha el motor paso a paso, convirtiéndolas en condicionales simples, ya que ello era una redundancia, puesto que al presionar la cabina el final de carrera correspondiente se pasaba la variable booleana a valor false.
Programa con puesta a cero
Este código que consigue llevar al inicio de la operación la cabina hasta la Planta Baja está formado por las dos primeras estructuras condicionales incluidas dentro del void loop. El primer condicional utiliza el valor true de la variable booleana Control. Mientras el final de carrera de la Planta baja no este presionado la cabina continuará bajando al ponerse en marcha el motor paso a paso. Una vez presionado el final de carrera de la Planta Baja, en el segundo condicional se pasa el valor de Control a false, para de esta forma desactivar el primer condicional.
Programa para las tres plantas
Se ha creado otra variable booleana para el Segundo piso y una variable entera para el valor que los finales de carrera van asignando.
Repartiendo el trabajo en subprogramas
El mismo código del programa anterior lo vamos a dividir en subprogramas. Este programa lo podemos encontrar en ArduinoBlocks.
Vamos a introducir algo gráfico en el programa final del ascensor
Para empezar el display mostrará una flecha hacia arriba mientras el ascensor esté subiendo. Los bloques que se crean o se modifican son los siguientes:
Añadimos la flecha hacia abajo
Ahora añadimos el código que muestra una flecha indicando hacia abajo cuando la cabina del ascensor baja. Los bloques que se crean o se modifican son los siguientes:
Suavizando el paso por el segundo piso
Con este pequeño código añadido se suaviza el paso por el Primer piso cuando va desde la Planta baja hacia el Segundo piso o viceversa. De esta forma se impide que se borre el display, cosa que también se nota en el funcionamiento del motor. Lo mismo se consigue a la salida del Segundo y de la Planta baja, mientras aun están presionados sus correspondientes finales de carrera. El bloques que se modifica es el siguiente:
Añadiendo los números de piso
En este momento añadimos el código para que se visualicen los números del piso en cuanto la cabina llega a él. Este programa lo podemos encontrar en ArduinoBlocks.
Inicio con animación
En el programa definitivo que podemos encontrar en ArduinoBlocks se incluye una pequeña animación en la puesta a cero del inicio.
Generación de los gráficos del display con Arduino Blocks
El código utilizado en el display permite encender y apagar todos sus LEDs, individualmente, en líneas rectas, formando texto, o con Bitmap. También hay un comando que permite borrar todo el display. Al presionar con el botón derecho sobre el bloque Bitmap se abre un cuadro de diálogo y usando la opción Ayuda se nos abre el editor de pixeles.
Para realizar los gráficos manualmente se han de tener en cuenta las coordenadas de los píxeles. El Led de la esquina superior izquierda es el 0, 0. Si bajamos una fila, el primero de la izquierda es el 0, 1. En la esquina inferior derecha está el led 7, 7. En la esquina inferior izquierda el 0, 7. En la esquina superior derecha el 7, 7.
No hay comentarios:
Publicar un comentario