Hola buenos días, hacía tiempo que no pasaba por el foro ya que he estado muy ocupado.
Previamente escribí sobre el funcionamiento de las unidades nRF24L01+, y gracias a los compañeros del foro lo pude solucionar
Estoy haciendo un sistema domótico en el cual quiero controlar unas persianas que ya tienen instalado un motor.
Componentes usados
- Fuente alimentación AC-5v 1A
- Diseño placa propia por Fritzing: Arduino + rf24
- Módulo de 2 relés de bobina
Arduino sirve como controlador de la persiana. Esta se puede accionar de forma inalámbrica a través del RF24 enviándole una instrucción desde otro dispositivo o bien de forma física a través del interruptor que previamente ya estaba instalado en la pared.
El diseño de la placa en principio es correcta, ya que las pruebas así lo indican. Estas pruebas si hicieron a con leds simulando la persiana.
PROBLEMA:
Vídeo en youtube
Al accionar el interruptor de pared, Arduino lo interpreta de forma correcta y envía la señal al módulo de relés. Ahora bien, uno de los canales, el 1, que es el de bajada me salta el contacto de la bobina. En cambio canal 2, que es el de subida funciona correctamente.
En el vídeo no se ve del todo, pero el led de la bobina de la derecha se activa y desactiva casi instanteamente.
Por otro lado alguna vez, muy pocas, si funciona conrrectamente, por lo que he descartado fallos en la programación de arduino
Conjunto:
Conexionado de la placa de relé:
JDVCC:
- JD-VCC a 5v de la fuente de alimentación (la cual alimenta a arduino)
- VCC sin conectar
- GND sin conectar
Control:
- GND a GND arduino
- IN1 a pin 6
- IN2 a pin 7
- VCC a 5V de arduino
En los foros es contradictorio, debería conectar GND de JD-VCC a GND de la fuente de alimentación?
Esquemático de conexionado:
Programación arduino:
La parte del control de posición de la persiana la tengo comentada ya que no me funciona la solución que había pensado y no es algo que me sea prioritario
// Librerias para RF
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <RF24_config.h>
/********************* Config *****************************/
//Variables para RF
const int pinCE = 9;
const int pinCSN = 10;
RF24 radio(pinCE, pinCSN);
//Canal comunicación con el nodo 'p''e''r'sianas'h''a'bitacion
const byte pipe[5]={'p','e','r','h','a'};
//Variable que guardará lo enviado por el emisor
char data[2];
/* Variables control Switch
* El switch estará con resistencias en PULL DOWN
* Cuando circula corriente HIGH, si no circula corriente LOW
*/
const int interruptorSubida = 2;
const int interruptorBajada = 3;
//Variables Control rele
const int relSubida = 6;
const int relBajada = 7;
/* Control de posición de la persiana
* La función millis() retorno el tiempo desde que el sketch funciona
* en milisegundos, reiniciandose cada 50 días mas o menos.
* La mejor manera de guardar es con un unsigned long ya que así utilizamos
* toda la precisión en positivo.
*/
/*
volatile char accionActualMotor;
volatile unsigned long momentoUltimaAccion;
volatile long posicionActual;
volatile unsigned long tiempoTranscurrido;
*/
//Variable auxiliar mostrar datos pantalla
String msg;
/********************* Config *****************************/
void setup() {
//Configuración Pins switch
pinMode (interruptorSubida,INPUT);
pinMode (interruptorBajada,INPUT);
/*Configuramos interrupciones para que el interruptor mande
sobre el rf. Se controlará con cambios de estado.*/
attachInterrupt(digitalPinToInterrupt(interruptorBajada),interruptInterruptorBajada,CHANGE);
attachInterrupt(digitalPinToInterrupt(interruptorSubida),interruptInterruptorSubida,CHANGE);
//Configuración Pins rele
pinMode(relSubida,OUTPUT);
pinMode(relBajada,OUTPUT);
/*Recordemos que el relé funciona al revés que la lógica
* HIGH posición del relé a Normally Opened
*/
digitalWrite(relSubida,HIGH);
digitalWrite(relBajada,HIGH);
//Configuración RF
radio.begin();
radio.openReadingPipe(1,pipe);
radio.startListening();
//Configuramos en posicion cacnelar
data[0] = 'C';
/*Configuración de la posición del motor
momentoUltimaAccion = millis();
*/
Serial.begin(9600);
}
void loop() {
comprobarRF();
}
/*
* Comprobamos si se ha recibido alguna instrucción por RF
* return: Char con la captura de RF
*/
char comprobarRF () {
if (radio.available()) {
/* Le hemos de pasar una variable* donde guarde el resultado y el tamaño de ella
* En este caso le indicaremos que sólo queremos el primer byte.
*/
radio.read(data, 1);
Serial.print("RF disponible. Dato: ");
Serial.println(data[0]);
accionarMotor(data[0]);
} else {
Serial.println("No Radio");
}
}
/*
* Asegurar que sólo se produza una acción en el motor
* Parám: (char) accion: 'S'ubir, 'B'ajar, 'C'ancelar
*/
void accionarMotor (char accion) {
if (accion == 'S') {
digitalWrite(relBajada,HIGH);
digitalWrite(relSubida,LOW);
/* Control de posición
momentoUltimaAccion= millis();
msg =(String) "Accionar Motor SUBIR: accionActualMotor: "+accionActualMotor+" Tiempo: "+momentoUltimaAccion;
Serial.println (msg);
accionActualMotor = 'S';
*/
}
else if (accion=='B') {
digitalWrite(relSubida,HIGH);
digitalWrite(relBajada,LOW);
/* Control de posición
momentoUltimaAccion=millis();
msg = (String) "Accionar Motor BAJAR: accionActualMotor: "+accionActualMotor+" Tiempo: "+momentoUltimaAccion;
Serial.println(msg);
accionActualMotor = 'B';
*/
}
else if (accion=='C') {
digitalWrite(relSubida,HIGH);
digitalWrite(relBajada,HIGH);
/* Control de posición
msg = (String) "Accionar Motor CANCELAR: accionActualMotor: "+accionActualMotor+" Tiempo transcurrido: "+tiempoTranscurrido;
Serial.println(msg);
if (accionActualMotor == 'S') {
posicionActual = posicionActual + tiempoTranscurrido;
if (posicionActual > 24000) {posicionActual = 24000;}
}
else if ( accionActualMotor == 'B') {
posicionActual = posicionActual - tiempoTranscurrido;
if (posicionActual < 0) {posicionActual = 0;}
}
accionActualMotor = 'C';
msg = (String) "Posicion actual: "+posicionActual;
Serial.println(msg);
*/
}
}
/* Interrupciones
* De esta manera conseguimos la inmediatez de las acciones
* de subir y bajar presionando el interruptor
*
*/
void interruptInterruptorBajada() {
if (digitalRead(interruptorBajada) == HIGH ){
accionarMotor('B');
}
else {
accionarMotor('C');
}
}
void interruptInterruptorSubida() {
if (digitalRead(interruptorSubida) == HIGH ){
accionarMotor('S');
}
else {
accionarMotor('C');
}
}
Primeramente pensé que la bobina del relé estaba fundida, y cambié el módulo ya que tenía otro y me hace lo mismo. La mayoría de veces salta y en algún caso funciona. El caso que el que funciona es el de subir persiana que es en teoría el motor hace mas fuerza.
El cableado usado en la parte de potencia es para mas de 10A y en la parte de control es 24AWG (0,6A)