Primer programa útil
Los pulsadores de los diferentes pisos están conectados a los pines digitales de Arduino de la siguiente manera: P1 (7), P2 (9) P3 (11) y P4 (13). Del mismo modo los finales de carrera están montados de la siguiente manera: F1 (6), F2 (8), F3 (10) y F4 (12).
Para mover el motor del ascensor arriba y abajo (También para pararlo) se usan los pines digitales 4 y 5 de la placa Arduino UNO. El pin 4 lleva la señal a la base del transistor BD 895 y el pin 5 a los dos relés que accionan un conmutador simple (Se podría hacer con un solo relé que accione un conmutador doble).
El transistor BD 895 es un transistor Darlington NPN, similar al BDX53.
Para subir el ascensor el motor ha de girar tal como le obligan el pin 4 en HIGH y el pin 5 también en HIGH.
Para bajar el ascensor el motor ha de girar en sentido contrario, tal como le obligan el pin 4 en HIGH y el pin 5 en LOW.
Para parar el ascensor el motor se detiene obligado por el pin 4 en LOW y el pin 5 también en LOW (De hecho el pin 5 puede estar en HIGH, ya que el pin 4 y , por tanto, el transistor BD 894, es el que corta o permite el paso de la corriente hacia los conmutadores de los relés y hacia el motor.
A parte de por programa, el sentido del giro del motor se puede invertir invirtiendo la conexión de los dos terminales del motor. De otra manera también se puede conseguir cambiar entre subir y bajar, cambiando el sentido en el que enrollamos la cuerda en el tambor.
En el lateral del ascensor se encuentra la placa de circuito impreso con el transistor BD 894 y los dos relés.
Aquí se puede ver en detalle la placa de los relés.
Este es el esquema del circuito electrónico.
Este es el programa que permite llamar desde cada uno de los cuatro pisos y para en el piso deseado. Dispone de una funcionalidad, ejecutada en el "setup", que hace bajar el ascensor al primer piso, al iniciarse el programa.
int F=0;
int P=0;
void setup() {
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, INPUT);
pinMode(7, INPUT);
pinMode(8, INPUT);
pinMode(9, INPUT);
pinMode(10, INPUT);
pinMode(11, INPUT);
pinMode(12, INPUT);
pinMode(13, INPUT);
inicio();
}
void inicio (){
if (digitalRead(6)==1){
F=1;
}
if(F==0){ //Al inicar el programa baja el ascensor al primer piso
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
delay(2000);
}
}
void loop(){
if (digitalRead(6)==1){
F=1;
}
if (digitalRead(8)==1){
F=2;
}
if (digitalRead(10)==1){
F=3;
}
if (digitalRead(12)==1){
F=4;
}
if (digitalRead(7)==1){
P=1;
}
if (digitalRead(9)==1){
P=2;
}
if (digitalRead(11)==1){
P=3;
}
if (digitalRead(13)==1){
P=4;
}
if ((F==1)&&(P==0)){ //Parada del ascensor en el piso 1 cuando está bajando por el subprograma inicio
digitalWrite(4, LOW);
digitalWrite(5, LOW);
}
if ((F<4)&&(P==4)){ //Subir hacia el piso 4
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
}
if ((F==4)&&(P==4)){ //Parar en el piso 4
digitalWrite(4, LOW);
digitalWrite(5, LOW);
}
if ((F<3)&&(P==3)){ //Subir hacia el piso 3
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
}
if ((F>3)&&(P==3)){ //Bajar hacia el piso 3
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
}
if ((F==3)&&(P==3)){ //Parar en el piso 3
digitalWrite(4, LOW);
digitalWrite(5, LOW);
}
if ((F<2)&&(P==2)){ //Subir hacia el piso 2
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
}
if ((F>2)&&(P==2)){ //Bajar hacia el piso 2
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
}
if ((F==2)&&(P==2)){ //Parar en el piso 2
digitalWrite(4, LOW);
digitalWrite(5, LOW);
}
if ((F>1)&&(P==1)){ //Bajar hacia el piso 1
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
}
if ((F==1)&&(P==1)){ //Parar en el piso 1
digitalWrite(4, LOW);
digitalWrite(5, LOW);
}
}
El display de 8 x 8
Los pines de Arduino que utiliza el display de 8 x 8 son el 1 (CS), el 2 (DIN) y el 3 (CLK).
Este es el programa que muestra en el display 8 x 8 el piso en el que se encuentra y hacia donde se mueve, arriba o abajo.
int F=0;
int P=0;
int indicelinea;
int indiceLED;
//Conexiones entre el display y Arduino
int pinCLK = 3;
int pinCS = 1;
int pinDIN = 2;
char archivo_fotogramas[6][8]={
{0x00,0x00,0x04,0x02,0x7F,0x02,0x04,0x00},//Flecha arriba
{0x00,0x00,0x20,0x40,0xFE,0x40,0x20,0x00},//Flecha abajo
{0x00,0x08,0x84,0x82,0xFE,0x80,0x80,0x00},//1
{0x00,0x00,0xE4,0x92,0x92,0x8E,0x00,0x00}, //2
{0x00,0x00,0x54,0x92,0x92,0x6C,0x00,0x00},//3
{0x00,0x30,0x28,0x24,0xFE,0x20,0x00,0x00},//4
};
void convertir_byte_a_bits(char DATA)
{
digitalWrite(pinCS,LOW);
for(indiceLED=8;indiceLED>=1;indiceLED--)
{
digitalWrite(pinCLK,LOW);
digitalWrite(pinDIN,DATA&0x80); //Extrae cada bit del byte "DATA"
DATA = DATA<<1;
digitalWrite(pinCLK,HIGH);
}
}
void Impresion_Linea(int indicelinea, char contenidolinea)
{
digitalWrite(pinCS,LOW);
convertir_byte_a_bits(indicelinea); //Envia el valor de la linea del display
convertir_byte_a_bits(contenidolinea); //Envia el valor de los LEDs de la
// linea del display
digitalWrite(pinCS,HIGH);
}
void puesta_en_marcha()
{
Impresion_Linea(0x09, 0x00); //Tipo de decodificado :BCD
Impresion_Linea(0x0a, 0x03); //Brillo de los LEDs
Impresion_Linea(0x0b, 0x07); //Cantidad de LEDs por linea :8 LEDs
Impresion_Linea(0x0c, 0x01); //Desconexion del display :0 Modo normal :1
Impresion_Linea(0x0f, 0x00); //Modo de prueba del display :1 Modo EOT
//del display :0
}
void setup() {
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, INPUT);
pinMode(7, INPUT);
pinMode(8, INPUT);
pinMode(9, INPUT);
pinMode(10, INPUT);
pinMode(11, INPUT);
pinMode(12, INPUT);
pinMode(13, INPUT);
pinMode(pinCLK,OUTPUT);
pinMode(pinCS,OUTPUT);
pinMode(pinDIN,OUTPUT);
delay(50);
puesta_en_marcha(); //Puesta en marcha del display 8x8
inicio();
}
void inicio (){
if (digitalRead(6)==1){
F=1;
}
if(F==0){ //Al inicar el programa baja el ascensor al primer piso
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
delay(2000);
}
}
void loop(){
if (digitalRead(6)==1){
F=1;
}
if (digitalRead(8)==1){
F=2;
}
if (digitalRead(10)==1){
F=3;
}
if (digitalRead(12)==1){
F=4;
}
if (digitalRead(7)==1){
P=1;
}
if (digitalRead(9)==1){
P=2;
}
if (digitalRead(11)==1){
P=3;
}
if (digitalRead(13)==1){
P=4;
}
if ((F==1)&&(P==0)){ //Parada del ascensor en el piso 1 cuando está bajando por el subprograma inicio
digitalWrite(4, LOW);
digitalWrite(5, LOW);
puesta_en_marcha();//Fotograma UNO
for(indicelinea=1;indicelinea<9;indicelinea++)
{
Impresion_Linea(indicelinea, archivo_fotogramas[2][indicelinea-1]);
}
delay(100); //Tiempo de espera entre fotograma y fotograma
}
if ((F<4)&&(P==4)){ //Subir hacia el piso 4
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
puesta_en_marcha();//Fotograma subir
for(indicelinea=1;indicelinea<9;indicelinea++)
{
Impresion_Linea(indicelinea, archivo_fotogramas[0][indicelinea-1]);
}
delay(100); //Tiempo de espera entre fotograma y fotograma
}
if ((F==4)&&(P==4)){ //Parar en el piso 4
digitalWrite(4, LOW);
digitalWrite(5, LOW);
puesta_en_marcha();//Fotograma CUATRO
for(indicelinea=1;indicelinea<9;indicelinea++)
{
Impresion_Linea(indicelinea, archivo_fotogramas[5][indicelinea-1]);
}
delay(100); //Tiempo de espera entre fotograma y fotograma
}
if ((F<3)&&(P==3)){ //Subir hacia el piso 3
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
puesta_en_marcha();//Fotograma subir
for(indicelinea=1;indicelinea<9;indicelinea++)
{
Impresion_Linea(indicelinea, archivo_fotogramas[0][indicelinea-1]);
}
delay(100); //Tiempo de espera entre fotograma y fotograma
}
if ((F>3)&&(P==3)){ //Bajar hacia el piso 3
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
puesta_en_marcha();//Fotograma bajar
for(indicelinea=1;indicelinea<9;indicelinea++)
{
Impresion_Linea(indicelinea, archivo_fotogramas[1][indicelinea-1]);
}
delay(100); //Tiempo de espera entre fotograma y fotograma
}
if ((F==3)&&(P==3)){ //Parar en el piso 3
digitalWrite(4, LOW);
digitalWrite(5, LOW);
puesta_en_marcha();//Fotograma TRES
for(indicelinea=1;indicelinea<9;indicelinea++)
{
Impresion_Linea(indicelinea, archivo_fotogramas[4][indicelinea-1]);
}
delay(100); //Tiempo de espera entre fotograma y fotograma
}
if ((F<2)&&(P==2)){ //Subir hacia el piso 2
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
puesta_en_marcha();//Fotograma subir
for(indicelinea=1;indicelinea<9;indicelinea++)
{
Impresion_Linea(indicelinea, archivo_fotogramas[0][indicelinea-1]);
}
delay(100); //Tiempo de espera entre fotograma y fotograma
}
if ((F>2)&&(P==2)){ //Bajar hacia el piso 2
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
puesta_en_marcha();//Fotograma bajar
for(indicelinea=1;indicelinea<9;indicelinea++)
{
Impresion_Linea(indicelinea, archivo_fotogramas[1][indicelinea-1]);
}
delay(100); //Tiempo de espera entre fotograma y fotograma
}
if ((F==2)&&(P==2)){ //Parar en el piso 2
digitalWrite(4, LOW);
digitalWrite(5, LOW);
puesta_en_marcha();//Fotograma DOS
for(indicelinea=1;indicelinea<9;indicelinea++)
{
Impresion_Linea(indicelinea, archivo_fotogramas[3][indicelinea-1]);
}
delay(100); //Tiempo de espera entre fotograma y fotograma
}
if ((F>1)&&(P==1)){ //Bajar hacia el piso 1
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
puesta_en_marcha();//Fotograma bajar
for(indicelinea=1;indicelinea<9;indicelinea++)
{
Impresion_Linea(indicelinea, archivo_fotogramas[1][indicelinea-1]);
}
delay(100); //Tiempo de espera entre fotograma y fotograma
}
if ((F==1)&&(P==1)){ //Parar en el piso 1
digitalWrite(4, LOW);
digitalWrite(5, LOW);
puesta_en_marcha();//Fotograma UNO
for(indicelinea=1;indicelinea<9;indicelinea++)
{
Impresion_Linea(indicelinea, archivo_fotogramas[2][indicelinea-1]);
}
delay(100); //Tiempo de espera entre fotograma y fotograma
}
}