Buenas a todos, ante todo soy nuevo en el foro y disculpadme si incumplo alguna norma, si me avisáis corrijo lo que haga falta.
Mi intención es probar de hacer una puerta enrollable estilo a la que podéis conocer como la adjuntada llamada "Puerta enrollable.jpg", pero mis conocimientos técnicos son un poco escasos aunque llego a defenderme. Sobre Arduino, aún no tengo mi kit inicial para empezar a hacer pruebas, pero después de haber leído el "Libro de proyectos de Arduino Starter Kit", me he animado a llegar hasta lo que voy a compartir en este post.
Cuando lo tenga más avanzado y pueda probar algo, subiré el código a Github para que sea más fácil compartirlo públicamente y que podamos compartir cambios y mejoras.
Por el momento me lo he planteado cogiendo ideas del proyecto para la puerta de gallinero, donde la puerta sube y baja hasta unos finales de carrera, a lo que le he añadido un control de presencia (Laser Break Beam Sensor según Fritzing, en la vida real creo que son como la imagen adjuntada llamada "Sensor.jpg") en la zona de la persiana para que no baje en caso de haber alguien en su zona, y 2 botones de subir y bajar para ponerlos a ambos lados, en substitución de su sensor lumínico para determinar cuando es de día o noche para que se abra o cierre.
Esto me gustaría complementarlo con otros sensores de presencia, para que no sea necesario pulsar los botones de abrir y cerrar, pero para empezar ya tengo algo con que ir probando. A la vez el propio Arduino controlaría 2 relés que activarían un motor (todavía por determinar cual) para que este pueda subir o bajar, por ahora me he basado en la explicación para un motor de lavadora, que creo que será lo más similar, aunque no sé si será el más adecuado.
El esquema del circuito que llevo preparado hasta ahora es la imagen adjuntada con nombre "Persiana.png"
/*
* Control automático y manual para subir y bajar una puerta enrollable con finales de carrera y
* control de presencia en medio de la puerta.
*
* Ideas extraídas de:
* - Controlar motor lavadora con Arduino Teensy 2.0 ++: http://forum.arduino.cc/index.php?topic=198833.0
* - Proyecto puerta de gallinero con BH1750 y Arduino Pro Mini: http://forum.arduino.cc/index.php?topic=430607.0
*
* Materiales:
* - 4 Pulsadores
* - 2 Resistencias de 10K
* - 1 Imán de neodimio
* - 2 Reed Swith
* - 2 Resistencias de 1K
* - 2 Led Verde
* - 2 Led Naranja
* - 2 Led Rojo
* - 3 Resistencias de 220
* - 2 Reles
* - 1 Motor (No se cual aún, que permita enroscar una PuertaEnrollable)
* - 1 Detector de presencia (No se cual aún)
*/
const int PulsadorArriba = 2;
const int PulsadorAbajo = 3;
const int LedVerde = 4;
const int LedNaranja = 5;
const int LedRojo = 6;
const int Rele1 = 7;
const int Rele2 = 8;
const int Rele3 = 9;
const int DetectorPresencia = 11;
const int FinCarreraInferior = 12;
const int FinCarreraSuperior = 13;
int pulsadorArribaEstado = 0;
int pulsadorAbajoEstado = 0;
void setup() {
// Inicialización
pinMode(PulsadorArriba, INPUT);
pinMode(PulsadorAbajo, INPUT);
pinMode(Rele1, OUTPUT);
pinMode(Rele2, OUTPUT);
pinMode(Rele3, OUTPUT);
pinMode(DetectorPresencia, INPUT_PULLUP);
pinMode(FinCarreraSuperior, INPUT_PULLUP);
pinMode(FinCarreraInferior, INPUT_PULLUP);
pinMode(LedVerde, OUTPUT);
pinMode(LedNaranja, OUTPUT);
pinMode(LedRojo, OUTPUT);
}
// Código principal
void loop() {
// Leemos estado pulsados ARRIBA / ABAJO
pulsadorArribaEstado = digitalRead(PulsadorArriba);
pulsadorAbajoEstado = digitalRead(PulsadorAbajo);
FinCarreraSuperiorEstado = digitalRead(FinCarreraSuperior);
FinCarreraInferiorEstado = digitalRead(FinCarreraInferior);
// Damos prioridad al pulsador de subir!
if (pulsadorArribaEstado == HIGH) {
// El pulsador de subir está pulsado
subirPuertaEnrollable();
} else if (pulsadorAbajoEstado == HIGH) {
// El pulsador de bajar está pulsado
bajarPuertaEnrollable();
} else {
// Si no hay orden de subir o bajar, revisamos los finales de carrera para saber donde estamos
if (FinCarreraSuperiorEstado == LOW) {
// La PuertaEnrollable esta subida
Serial.print("Puerta enrollable subida...");
} else if (FinCarreraInferiorEstado == LOW) {
// La PuertaEnrollable esta bajada
Serial.print("Puerta enrollable bajada...");
} else {
// En caso de duda, la subimos para evitar posibles accidentes
subirPuertaEnrollable();
}
}
}
void subirPuertaEnrollable() {
// Subir hasta fin carrera
subirHastaFinCarrera();
// Aviso lumínicio
lucesPasoAbierto();
}
void bajarPuertaEnrollable() {
// Aviso lumínicio
lucesPasoCerrado();
// Bajar hasta fin carrera
bajarHastaFinCarrera();
}
void subirHastaFinCarrera() {
Serial.print("Subiendo puerta enrollable...");
FinCarreraSuperiorEstado = digitalRead(FinCarreraSuperior);
while(FinCarreraSuperiorEstado == LOW) {
conectarMotor();
digitalWrite(Rele1, HIGH); // Rele1 ON
digitalWrite(Rele2, LOW); // Rele2 OFF
}
desconectarMotor();
}
void bajarHastaFinCarrera() {
Serial.print("Bajando puerta enrollable...");
FinCarreraInferiorEstado = digitalRead(FinCarreraInferior);
DetectorPresenciaEstado = digitalRead(DetectorPresencia);
while(FinCarreraInferiorEstado == LOW) {
if(DetectorPresenciaEstado == LOW) {
conectarMotor();
digitalWrite(Rele1, LOW); // Rele1 OFF
digitalWrite(Rele2, HIGH); // Rele2 ON
} else {
subirPuertaEnrollable();
}
desconectarMotor();
}
}
void desconectarMotor() {
digitalWrite(Rele3, LOW);
}
void conectarMotor() {
digitalWrite(Rele3, HIGH);
}
void lucesPasoAbierto() {
digitalWrite(LedVerde, HIGH); // enciende el LED
digitalWrite(LedNaranja, HIGH); // enciende el LED
digitalWrite(LedRojo, LOW); // apaga el LED
}
void lucesPasoCerrado() {
digitalWrite(LedVerde, LOW); // apaga el LED
digitalWrite(LedNaranja, LOW); // apaga el LED
digitalWrite(LedRojo, HIGH); // enciende el LED
}
Las funciones de subirHastaFinCarrera y bajarHastaFinCarrera son en las que tengo que entretenerme un poco más, para valorar mejor como subir y bajar hasta el final de carrera, controlando además que no se haya interrumpido el sensor de presencia. Pero así lo comparto con vosotros y si hay alguien que domine mejor el tema, ya puedo empezar a recibir feedback para replantearme hacer cambios.