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:
#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.
pinMode(rele, OUTPUT);
digitalWrite(rele, HIGH);
Si quiero activar el relay uso digitalWrite(rele, LOW);