Pages: [1]   Go Down
Author Topic: [Solucionado] Problema con relés y bluetooth  (Read 1038 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Muy buenas.

Estoy haciendo un proyecto en el que manejo un motor con 3 relés y un módulo bluetooth, al cual le trasmito datos desde un movil android.

Todo funciona a la perfección excepto una cosa bastante importante:

Cuando desconecto el arduino de la corriente y lo vuelvo a conectar, los relés se activan solos como si los hubiera activado manualmente.

Tengo un Switch-case donde contemplo las diferentes órdenes que se le envían al arduino desde un movil vía bluetooth y es como si pasara al primer "case" directamente.

Alguna solución?

Si hace falta puedo pegar el código.

Gracias de antemano smiley
« Last Edit: May 19, 2013, 10:24:35 am by Ivantj » Logged

MEXICO
Offline Offline
Newbie
*
Karma: 0
Posts: 42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Buenas compañero.
Claro que siempre es muy necesario que agregues el código y una descripción de tal, para poder ayudarte.
que arduino utilizas? saludos
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Utilizo un Arduino UNO con un modulo Bluetooth

El circuito que uso es el siguiente:

Debo controlar un motor de 24V, para ello usé 3 relés SPDT, uno para ON/OFF y los otros dos para regular el giro (no encontré ningún relé DPDT que me sirviera). Para gobernar los relés uso un transistor y un LED que me indica si el relé está activo.
Ahora mismo no puedo colgar el circuito, en cuanto pueda lo subo.

El código es el siguiente:

Code:
int fca;
int fcc;
int pulsador;

void setup()
{
   Serial.begin(9600);  //LECTURA BLUETOOTH
   pinMode(5, OUTPUT); //ON-OFF
   pinMode(7, OUTPUT); //GIRO
   pinMode(10, INPUT); //Final de carrera 1
   pinMode(11, INPUT); //Final de carrera 2
   pinMode(12, INPUT); //Pulsador
 
}

void loop() {
   byte dato;
   
   if(Serial.available()>0)
   {
     dato=Serial.read();
       switch(dato)
       {       
        case 116: {    //ABRIR
             
                if(digitalRead(10)==LOW)
                {   
                fca=digitalRead(10);  // leemos el valor del final de carrera
                 pulsador=digitalRead(12);
                 Serial.println("ABRIENDO\n\n");
                 while(fca==LOW && pulsador==LOW)
                 {
                 digitalWrite(7,HIGH);  //GIRO
                 digitalWrite(5, HIGH); //Abrimos
                 fca=digitalRead(10); //Y leemos el valor del final de carrera
                 pulsador=digitalRead(12);
                 }  //Fin while 
                 digitalWrite(5,LOW); //Paramos motor
                 Serial.println("ABIERTO\n\n");
                }
                else
                Serial.println("YA ESTA ABIERTO\n\n");
                  break;
       } // fin case
       
       pulsador=LOW;
          case 122: { //CERRAR
         
       if(digitalRead(11)==LOW)
       {
           fcc=digitalRead(11);
           pulsador=digitalRead(12);
           Serial.println("CERRANDO\n\n");
           while(fcc==LOW && pulsador==LOW)
           {
             digitalWrite(7,LOW);
             digitalWrite(5,HIGH);
             fcc=digitalRead(11);
             pulsador=digitalRead(12);
           }
           digitalWrite(5,LOW); //Paramos motor
           Serial.println("CERRADO\n\n");
       }
       else
        Serial.println("YA ESTA CERRADO\n\n");
        break;
       }   
       
} //fin switch
   } //fin if

   }

Si se desconecta el arduino y se vuelve a conectar se activan solos los relés, como si se hubiera mandado por bluetooth el código 116. Si se presiona el final de carrera "fca" todo funciona como es debido.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

podria explicar mejor que quieres hacer exactamente, es decir, no se exactamente para que usas el bluetooht, si he entendido bien el programa, para poder abrir la puerta es necesario, tener activado la orden por bluetooht ademas de pulsar un boton fisico y tener en posicion correcta el final de carrera.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Casi casi.

El código es para controlar una puerta.

Dispongo de dos finales de carrera, uno que se activa cuando la puerta está completamente abierta y otro cuando está completamente cerrada.

Pretendo controlar la apertura/cierre vía Bluetooth desde un movil Androidy la app BlueTerm, y el proceso sería el siguiente:
  • Si desde el móvil escribo una "t" (116) y el final de carrera "fca" está desactivado, la puerta se abre mientras no active un pulsador físico (pulsador de emergencia).
  • Si escribo una "t" y  "fca" está activado, quiere decir que la puerta está abierta y manda al móvil el mensaje "YA ESTA ABIERTO"
  • Si escribo una "z" y el final de carrera "fcc" está desactivado, la puerta se abre mientras no active el pulsador físico de emergencia.
  • Por otro lado, si escribo una "z" y el final de carrera está activado, quiere decir que la puerta ya está cerrada y manda al móvil el mensaje "YA ESTA CERRADO"

Todo funciona y cumple con su cometido. Seguro que el código se puede optimizar y no he usado las funciones adecuadas, pero funciona.

El problema es que cuando desconecto el Arduino UNO de la corriente eléctrica, al volver a conectarlo la puerta empieza a abrirse sola, como si hubiera pulsado una "t" en el móvil.




Logged

Palencia, Spain
Offline Offline
Sr. Member
****
Karma: 19
Posts: 385
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

En el setup tienes que establecer el valor por defecto de las salidas. El problema es que no indicas qué hacer con ellas al arrancar y Arduino por lo visto te pone ambas en high. Creo que directamente podrías poner ambas en LOW y debería funcionar.
Saludos.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

creo que podrias evitar el problema nombrando una nueva variable llamada "estadopulsador" est la podrias al inicio del programa de la siguiente forma:
 estadopulsador= digitalRead(pulsador);
y despues sustituir la variable pulsador de los if y los while por la variable "estadopulsador" y tambien lo haria lo mismo con los finales de  carrera, no se si me explico bien.                                     
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

creo que me explicado mal lo que se conseguiria creando las nuevas variables seria hacer que el programa al iniciarse leiera las entradas del arduino.
Quote
int fca;
int fcc;
int pulsador;
int estadopulsador;
int estadofca;
int estadofcc;

void setup()
{
   Serial.begin(9600);  //LECTURA BLUETOOTH
   pinMode(5, OUTPUT); //ON-OFF
   pinMode(7, OUTPUT); //GIRO
   pinMode(10, INPUT); //Final de carrera 1
   pinMode(11, INPUT); //Final de carrera 2
   pinMode(12, INPUT); //Pulsador
 
}

void loop() {
   byte dato;
estadopulsador=pulsador;
estadofca=fca;
estadofcc=fcc;
   
   if(Serial.available()>0)
   {
     dato=Serial.read();
       switch(dato)
       {       
        case 116: {    //ABRIR
             
                if(estadofca==LOW)
                {   
                 Serial.println("ABRIENDO\n\n");
                 while(estadofca==LOW && estadopulsador==LOW)
                 {
                 digitalWrite(7,HIGH);  //GIRO
                 digitalWrite(5, HIGH); //Abrimos
               
                 }  //Fin while 
                 digitalWrite(5,LOW); //Paramos motor
                 Serial.println("ABIERTO\n\n");
                }
                else
                Serial.println("YA ESTA ABIERTO\n\n");
                  break;
       } // fin case
       
       
          case 122: { //CERRAR
         
       if(estadofcc==LOW)
       {
           Serial.println("CERRANDO\n\n");
           while(estadofcc==LOW && estadopulsador==LOW)
           {
             digitalWrite(7,LOW);
             digitalWrite(5,HIGH);
           }
           digitalWrite(5,LOW); //Paramos motor
           Serial.println("CERRADO\n\n");
       }
       else
        Serial.println("YA ESTA CERRADO\n\n");
        break;
       }   
       
} //fin switch
   } //fin if

   }
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

prueba si funciona, pero esa creo que es la idea para que funcione mas o menos puede que tengas que depurar alguna cosilla, un saludo.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

prueba si funciona, pero esa creo que es la idea para que funcione mas o menos puede que tengas que depurar alguna cosilla, un saludo.

Creo que falta algo en el While. Faltaría leer el valor del final de carrera, no?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 42
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Prueba a leer las   entradas dentro del while, de esa manera te evitas que pueda quedarse el while siempre funcionando un saludo.
« Last Edit: May 14, 2013, 01:06:29 am by apolo150 » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Prueba a leer las lecturas de entradas dentro del while, de esa manera te evitas que pueda quedarse el while siempre funcionando un saludo.

Ahora mismo estoy de viaje y no puedo probar. En cuanto llegue lo pruebo y comento smiley-wink
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 22
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ya está solucionado el problema. No era problema de código propiamente dicho, simplemente era que en el "handshake" que hacía el módulo bluetooth con Arduino mandaba justamente los caracteres que yo había puesto en el "switch-case". Los he cambiado por otros y todo funciona a la perfección smiley-wink
Logged

Pages: [1]   Go Up
Jump to: