Go Down

Topic: Relay, no se desactiva nunca. (Read 426 times) previous topic - next topic

rknight

Dec 05, 2017, 07:44 am Last Edit: Dec 05, 2017, 04:24 pm by surbyte Reason: Solucionado
Buenas, estoy realizando un clasificador de colores (botones), mediante un servo se mueve el botón hacia el sensor de color, se lee el color del botón y nuevamente con el servo se mueve el botón hacia una cinta transportadora hecha de manera casera con un motor de 12V, la idea es activar y desactivar el motor con el relay para mover el botón a una posición determinada.

El sensor de color y el servo funcionan sin problemas.

Ya probé el relay de manera separada y si funciona (se activa y desactiva el motor), pero si lo conecto junto con los demás elementos no se comporta de la manera que espero en base al código, es mas ni bien conecto el Arduino a la PC el relay ya esta activo, es decir, el motor recibe corriente y esta funcionado. El relay no se desactiva nunca.

Este es el diagrama del circuito, y el código:




Code: [Select]

#include <Servo.h>

#define S0 2
#define S1 3
#define S2 4
#define S3 5
#define sensorOut 6
#define rele 13

Servo topServo;

int Red = 0;
int Green = 0;
int Blue = 0;
int color = 0;

int pos = 0;

// the setup function runs once when you press reset or power the board
void setup() {
  // Setting the outputs
  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);

  // Setting the sensorOut as an input
  pinMode(sensorOut, INPUT);

  // Setting the rele as an output
  pinMode(rele, OUTPUT);

  topServo.attach(9);

  // Setting frequency scaling to 20%
  digitalWrite(S0, HIGH);
  digitalWrite(S1, LOW);

  // Begins serial communication
  Serial.begin(9600);
  pinMode(10, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {

  topServo.write(0);
  delay(1500);
  // Desplazamos a la posición 35º para identificar el color
  //topServo.write(35);
  for (pos = 0; pos <= 35; pos += 1) {
    topServo.write(pos);              
    delay(15);                      
  }
  
  delay(500);
  color = readColor();
  delay(100);

  switch (color) {
    case 1:
      Serial.println("Amarillo");
      digitalWrite(rele, HIGH);
      delay(2000);
      digitalWrite(rele, LOW);
      delay(2000);
      break;
    case 2:
      Serial.println("Rojo");
      break;
    case 3:
      Serial.println("Azul");
      break;
    case 4:
      Serial.println("Verde");
      break;
    case 0:
      Serial.println("COLOR DESCONOCIDO");
      break;
  }
  
   for (pos = 35; pos <= 80; pos += 1) {
    topServo.write(pos);              
    delay(15);                      
  }
  delay(500);

  color = 0;

}


int readColor() {

  // Setting RED (R) filtered photodiodes to be read
  digitalWrite(S2, LOW);
  digitalWrite(S3, LOW);

  // Reading the output frequency
  Red = pulseIn(sensorOut, LOW);
  delay(100);

  // Setting GREEN (G) filtered photodiodes to be read
  digitalWrite(S2, HIGH);
  digitalWrite(S3, HIGH);

  // Reading the output frequency
  Green = pulseIn(sensorOut, LOW);
  delay(100);

  // Setting BLUE (B) filtered photodiodes to be read
  digitalWrite(S2, LOW);
  digitalWrite(S3, HIGH);

  // Reading the output frequency
  Blue = pulseIn(sensorOut, LOW);
  delay(100);


  if (Red <= 23 && Red >= 20 && Green <= 26 && Green >= 23 && Blue <= 24 && Blue >= 22) {
    color = 1; // yellow
  }
  if (Red <= 28 && Red >= 25 && Green <= 34 && Green >= 32 && Blue <= 26 && Blue >= 24) {
    color = 2; // red
  }
  if (Red <= 34 && Red >= 31 && Green <= 34 && Green >= 32 && Blue <= 25 && Blue >= 23) {
    color = 3; // blue
  }
  if (Red <= 33 && Red >= 30 && Green <= 32 && Green >= 29 && Blue <= 26 && Blue >= 24) {
    color = 4; // green
  }
  return color;
}



Ya lo solucione, la lógica del modulo relay era inversa. En setup() puse HIGH para que inicie apagado.
Code: [Select]

  pinMode(rele, OUTPUT);
  digitalWrite(rele, HIGH);

Si quiero activar el relay uso digitalWrite(rele, LOW);

Lucario448

Ya lo solucione, la lógica del modulo relay era inversa. En setup() puse HIGH para que inicie apagado.
Eso estaba a punto de decir, esos módulos siempre tienen en bajo el "estado activo", por eso la lógica se invierte.

A propósito, ya que estas en el tema: Desde el encendido del Arduino hasta poner el pin en estado alto, ¿el retraso es suficiente para que el relé no se active de primera entrada?

Armagedon13

A mi me pasaba que los reles se me activaban cuando prendia el arduino y la solucion era declarando el estado del rele en void setup ej:

Code: [Select]

int rele = 2; // ejemplo de salida hacia el rele

void setup{

pinMode(2, OUTPUT); // declaramos la salida del rele

digitalWrite(2,HIGH); // declaramos el tipo de inicio del rele

}

void loop{

}


Lo demas ya esta, yo tenia ese problema y algunos otros con reles de 12 V pero habia que poner una resistencia a positivo o usar el comando PULL_UP o PULL_DOWN no me acuerdo. Suerte

Go Up