Go Down

Topic: BANDA SELECTORA DE COLORES TCS230 (Read 291 times) previous topic - next topic

lacurvamva

Buenas tardes compañeros estoy con un pequeño dilema el cual tengo este código que encontré en la red y lo modifique un poco, el funcionamiento es que la banda este en funcionamiento y cuando detecte el sensor ir se detenga y el sensor tcs230 pueda leer el color y encienda de nuevo la banda y mueva el servo correspondiente al color detectado el segundo ir sera para cuando el objeto de color ya halla pasado para la salida y regresara ala posición original   el problema es que no hace que regrese ala posición original  si alguien tiene una idea como solucionar este problema se los agradeceria mucho.

Code: [Select]

#include <Servo.h>
#define S0 2
#define S1 3
#define S2 4
#define S3 5
#define BANDA 13
#define R2 12
#define IR1 11
#define IR2 10
#define sensorOut 6
Servo AZUL;
Servo ROJO;
int frequency = 0;
int color=0;

void setup() {
  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);
  pinMode(BANDA, OUTPUT);
  pinMode(R2, OUTPUT);
  pinMode(IR1, INPUT);
  pinMode(IR2, INPUT);
  pinMode(sensorOut, INPUT);
  // Setting frequency-scaling to 20%
  digitalWrite(S0, HIGH);
  digitalWrite(S1, LOW);
 digitalWrite(BANDA, LOW);
 ROJO.attach(9);
 AZUL.attach(10);
 ROJO.write(180);
 AZUL.write(180);
  Serial.begin(9600);
}


void loop() {
  if(IR1==LOW)
  {
ROJO.write(180);
AZUL.write(180);
  Serial.print("IR");
 
  }
 
 
  color = readColor();
  delay(10); 
  switch (color) {
    case 1:
    ROJO.write(135);
    break;
    case 2:
    AZUL.write(135);
    break;
    case 0:
    break;
  }
  delay(300);
 
  color=0;
}
// Custom Function - readColor()
int readColor() {
  // Setting red filtered photodiodes to be read
  digitalWrite(S2, LOW);
  digitalWrite(S3, LOW);
  // Reading the output frequency
  frequency = pulseIn(sensorOut, LOW);
  int R = frequency;
  // Printing the value on the serial monitor
  Serial.print("R= ");//printing name
  Serial.print(frequency);//printing RED color frequency
  Serial.print("  ");
  delay(50);
  // Setting Green filtered photodiodes to be read
  digitalWrite(S2, HIGH);
  digitalWrite(S3, HIGH);
  // Reading the output frequency
  frequency = pulseIn(sensorOut, LOW);
  int G = frequency;
  // Printing the value on the serial monitor
  Serial.print("G= ");//printing name
  Serial.print(frequency);//printing RED color frequency
  Serial.print("  ");
  delay(50);
  // Setting Blue filtered photodiodes to be read
  digitalWrite(S2, LOW);
  digitalWrite(S3, HIGH);
  // Reading the output frequency
  frequency = pulseIn(sensorOut, LOW);
  int B = frequency;
  // Printing the value on the serial monitor
  Serial.print("B= ");//printing name
  Serial.print(frequency);//printing RED color frequency
  Serial.println("  ");
  delay(50);
  if(R<27 & R>20 & G<55 & G>47& B<47 & B>34){
    color = 1; // Red
    Serial.print("ROJO");
   
  }
 
  if (R<42 & R>35 & G<55 & G>35 & B<39 &B>30){
    color = 2; // Blue
     Serial.print("AZUL");

  }
 
  return color; 
}

surbyte

Lee de nuevo tu explicación y dinos? Como quieres que se detenga la banda, no lo has explicado con claridad.

Quote
cuando detecte el sensor ir se detenga
Esa es tu condición y yo encuentro dos IR, IR1 y IR2 entonces?

Copias un código, dices que lo modificaste, qué modificaste? Los pines para que funcione con tus sensores?

Lo que debes hacer es entenderlo.
Para ello tomas la parte de servo y usando los ejemplos de servo aprendes como se pone en movimiento y como se detiene.
Lo mismo con los IR y con el sensor color.

Cuando dominas las 3 cosas entonces puedes interactuar.

YO haría esto con tu código

Code: [Select]
void loop() {
  if(IR1==LOW) {
     Serial.println("Detecta IR");
  }
}


Funciona, bien, sigo

Ahora pruebo el movimiento del motor o servo que no esta claro como funciona

No se si esto es parte del código

Code: [Select]
  digitalWrite(S0, HIGH);
  digitalWrite(S1, LOW);
 digitalWrite(BANDA, LOW);


Ahi te falta algo que probar.

lacurvamva

#2
Apr 08, 2018, 12:00 pm Last Edit: Apr 08, 2018, 12:02 pm by lacurvamva
buen día  surbyte lo que pasa es que me equivoque en copiar el código mira actualmente tengo el problema en la detección del color  ya que tengo una sensor conectado ala entrada análoga 0 es una fotoresistencia con láser, el funcionamiento seria que al detectar el objeto a detectar el color parara la banda después de 2 segundo encienda esta y según el color el servo correspondiente  se moverá  y están otros sensores el IR1 Y IR2 regresaran ala posición inicial  del servo de cada color.

la detección del color la hace y mueve los servos ala posición y los regresa cuando pasa por los infrarrojos el único destalle es como realizar  parado de  la banda y temporizado para que lo analice la pieza.

sin mas muchas gracias por darte un tiempo por checar este código.
 
Code: [Select]


#include <Servo.h>
#define S0 2
#define S1 3
#define S2 4
#define S3 5
#define BANDA 13
#define IR1 12
#define IR2 11
#define sensorOut 6
Servo AZUL;
Servo ROJO;
int frequency = 0;
int color=0;


void setup() {
  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);
  pinMode(BANDA, OUTPUT);
  pinMode(IR1, INPUT);
  pinMode(IR2, INPUT);
  pinMode(sensorOut, INPUT);
  // Setting frequency-scaling to 20%
  digitalWrite(S0, HIGH);
  digitalWrite(S1, LOW);
  digitalWrite(BANDA, LOW);      // arranque de banda
 ROJO.attach(9);
 AZUL.attach(10);
 ROJO.write(180);
 AZUL.write(180);
  Serial.begin(9600);
}


void loop()
{

if(analogRead(A0) <800)   //detecta objeto y para la banda
  {
digitalWrite(BANDA, HIGH);             


}



  if(digitalRead(IR1)==HIGH)    // regresa el servo ala posición original
  {

AZUL.write(180);
 // Serial.print("IR1");
 
  }
   if(digitalRead(IR2)==HIGH)     // regresa el servo ala posición original
  {
ROJO.write(180);

 // Serial.print("IR1");
 
  }
 

  // Setting red filtered photodiodes to be read
  digitalWrite(S2, LOW);
  digitalWrite(S3, LOW);
  // Reading the output frequency
  frequency = pulseIn(sensorOut, LOW);
  int R = frequency;
  // Printing the value on the serial monitor
  Serial.print("R= ");//printing name
  Serial.print(frequency);//printing RED color frequency
  Serial.print("  ");
  delay(50);
  // Setting Green filtered photodiodes to be read
  digitalWrite(S2, HIGH);
  digitalWrite(S3, HIGH);
  // Reading the output frequency
  frequency = pulseIn(sensorOut, LOW);
  int G = frequency;
  // Printing the value on the serial monitor
  Serial.print("G= ");//printing name
  Serial.print(frequency);//printing RED color frequency
  Serial.print("  ");
  delay(50);
  // Setting Blue filtered photodiodes to be read
  digitalWrite(S2, LOW);
  digitalWrite(S3, HIGH);
  // Reading the output frequency
  frequency = pulseIn(sensorOut, LOW);
  int B = frequency;
  // Printing the value on the serial monitor
  Serial.print("B= ");//printing name
  Serial.print(frequency);//printing RED color frequency
  Serial.println("  ");
  delay(50);

  if(R<50 & R>40 & G<110 & G>95& B<90 & B>78){
 ROJO.write(120);
  analogWrite(BANDA,LOW);                  // arranca banda cuando ha detectado el color
    Serial.print("ROJO");
   
  }
 
  if (R<95 & R>80 & G<95 & G>85 & B<55 &B>45){
    AZUL.write(120);
    analogWrite(BANDA,LOW);                // arranca banda cuando ha detectado el color
   
     Serial.print("AZUL");

  }

}

lacurvamva

buenas tardes surbyte mil disculpa por lo sucedido  el problema que tengo es en parar la banda para detectar el color, lo hice con delay() pero al hacer esto no me reconoce el color la otra es hacerlo con millis pero al momento de programar el if del sensor para saber que esta el objeto como aplico los millis para detener la banda 2 segundos y pasados estos 2 segundos vuelva arrancar o que puedo hacer en este caso

Code: [Select]

#include <Servo.h>
#define S0 2
#define S1 3
#define S2 4
#define S3 5
#define BANDA 13
#define sensorOut 6
Servo AZUL;
Servo ROJO;
int frequency = 0;
int color=0;


void setup() {
  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);
  pinMode(BANDA, OUTPUT);
  pinMode(sensorOut, INPUT);
  // Setting frequency-scaling to 20%
  digitalWrite(S0, HIGH);
  digitalWrite(S1, LOW);
  digitalWrite(BANDA, LOW);
 ROJO.attach(9);
 AZUL.attach(10);
 ROJO.write(180);
 AZUL.write(180);
  Serial.begin(9600);
}


void loop()
{
//Serial.print("banda  ");
 // Serial.println(analogRead(A0));
 //Serial.print("servos  ") ;
  //Serial.println(analogRead(A1));

if(analogRead(A0) <800)
  {
digitalWrite(BANDA, HIGH);
//Serial.print("BANDA PARADA") ;
  delay(2000);
 digitalWrite(BANDA,LOW);
  delay(1000);
}



if(analogRead(A1) <800)
  {
//Serial.print("SERVOS EN POSICION") ;
AZUL.write(180);
ROJO.write(180);
 // Serial.print("IR1");
 
  }

  // Setting red filtered photodiodes to be read
  digitalWrite(S2, LOW);
  digitalWrite(S3, LOW);
  // Reading the output frequency
  frequency = pulseIn(sensorOut, LOW);
  int R = frequency;
  // Printing the value on the serial monitor
 Serial.print("R= ");//printing name
  Serial.print(frequency);//printing RED color frequency
  Serial.print("  ");
  delay(50);
  // Setting Green filtered photodiodes to be read
  digitalWrite(S2, HIGH);
  digitalWrite(S3, HIGH);
  // Reading the output frequency
  frequency = pulseIn(sensorOut, LOW);
  int G = frequency;
  // Printing the value on the serial monitor
  Serial.print("G= ");//printing name
  Serial.print(frequency);//printing RED color frequency
  Serial.print("  ");
  delay(50);
  // Setting Blue filtered photodiodes to be read
  digitalWrite(S2, LOW);
  digitalWrite(S3, HIGH);
  // Reading the output frequency
  frequency = pulseIn(sensorOut, LOW);
  int B = frequency;
  // Printing the value on the serial monitor
  Serial.print("B= ");//printing name
  Serial.print(frequency);//printing RED color frequency
  Serial.println("  ");
  delay(50);
  if(R<50 & R>40 & G<120 & G>95& B<120 & B>78){
 ROJO.write(120);
digitalWrite(BANDA,LOW);
    Serial.print("ROJO");
   
  }
 
  if (R<95 & R>80 & G<95 & G>85 & B<55 &B>45){
    AZUL.write(120);
 digitalWrite(BANDA,LOW);
   
     Serial.print("AZUL");

  }


surbyte

A ver como se comporta esto

Code: [Select]
#include <Servo.h>
#define S0        2
#define S1        3
#define S2        4
#define S3        5
#define BANDA     13
#define sensorOut 6
Servo AZUL;
Servo ROJO;
int frequency   = 0;
int color       = 0;
int R, G, B;
byte estado = 0;

void setup() {
  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);
  pinMode(BANDA, OUTPUT);
  pinMode(sensorOut, INPUT);
  // Setting frequency-scaling to 20%
  digitalWrite(S0, HIGH);
  digitalWrite(S1, LOW);
  digitalWrite(BANDA, LOW);
  ROJO.attach(9);
  AZUL.attach(10);
  ROJO.write(180);
  AZUL.write(180);
  Serial.begin(9600);
}


void loop() {
 
  if (analogRead(A0) < 800) {
      switch (estado) {
          case 0: digitalWrite(BANDA, HIGH);
                  estado = 1;
                  start = millis();
                  break;
          case 1: if (millis() > start + 2000) {
                      estado = 2;
                      digitalWrite(BANDA, LOW);
                      start = millis();
                  }
                  break;
          case 2: if (millis() > start + 1000) {
                      estado = 0;
                  }
                  break;
      }
  }

  if (analogRead(A1) < 800)  {
      //Serial.print("SERVOS EN POSICION") ;
      AZUL.write(180);
      ROJO.write(180);
      // Serial.print("IR1");
  }
 
  sensor_color();
 
  if (R<50 & R>40 & G<120 & G>95 & B<120 & B>78) {
      ROJO.write(120);
      digitalWrite(BANDA, LOW);
      Serial.print("ROJO");
  }

  if (R<95 & R>80 & G<95 & G>85 & B<55 & B>45) {
      AZUL.write(120);
      digitalWrite(BANDA, LOW);
      Serial.print("AZUL");
  }
}

void sensor_color() {
  // Setting red filtered photodiodes to be read
  digitalWrite(S2, LOW);
  digitalWrite(S3, LOW);
 
  // Reading the output frequency
  frequency = pulseIn(sensorOut, LOW);
  R = frequency;
    delay(50);

  // Setting Green filtered photodiodes to be read
  digitalWrite(S2, HIGH);
  digitalWrite(S3, HIGH);
 
  // Reading the output frequency
  frequency = pulseIn(sensorOut, LOW);
  G = frequency;
  delay(50);
 
  // Setting Blue filtered photodiodes to be read
  digitalWrite(S2, LOW);
  digitalWrite(S3, HIGH);
 
  // Reading the output frequency
  frequency = pulseIn(sensorOut, LOW);
  B = frequency;
 
  // Printing the value on the serial monitor
  char buffer[30];
  sprintf(buffer, "R =%d G= %d B=%d", R, G, B);
  Serial.println(buffer);
  delay(50);
}





lacurvamva

#5
Apr 09, 2018, 06:38 am Last Edit: Apr 09, 2018, 06:39 am by lacurvamva
buenas noche surbyte cheque el código funciona la primera ves cuando detecta la tapa y para la banda pero la segunda no para hasta la tercera vez para pero ya no enciende tengo que resetear el arduino

surbyte

Esplica bien la secuenca paso a paso... porque tu código no tiene secuencia esta todo junto y no deben superponerse tareas.

Go Up