jueves, 10 de diciembre de 2015

Hago presente mi tercera entrega de mi prototipo, empezando con los materiales que utilicé:

-Arduino Mega.- Placa principal para dar funcionamiento al circuito.












-Placa L298N.- Controlador de los motores DC.












-Kit Motores DC: Motores de corriente alterna, irán conectados a la placa L298N.









- Sensor Ultrasónico: Nos permite captar la distancia hacia un obstáculo








-Fuente de alimentación de 9V: Energía necesaria para que funcione la placa L298N.











-Sensor TSC3200 o detector de color.- Detecta la cantidad de rojo, verde y azul de un sólido.









-Cables.- Para las conexiones de los pines de los componentes.








-Led RGB con tres resistencias para cada color.- Permitira encender el color rojo, verde o azul, según detecte el sensor TSC3200.









Diagrama de conexión de los componentes:



Código empleado:
int trigger = 21;
int echo = 20;
//Motor Izquierdo
int ENA = 8;
int IN1 = 9;
int IN2 = 10;

//Motor Derecho
int ENB = 13;
int IN3 = 11;
int IN4 = 12;

int estado = 0;
int cont = 4;
int direccion;
int giros;

////////////////////////////////////////////////////
//Variables del sensor de color
const int s0 = 19;
const int s1 = 18;
const int s2 = 16;
const int s3 = 17;
const int out = 15;

// Variables de los led rojo verde y azul
int redLed = 2;
int greenLed =3;
int blueLed = 4;
// Variables del sensor de color
int red = 0;
int green = 0;
int blue = 0;
////////////////////////////////////////////////////

void setup() {
  Serial.begin(9600);
  pinMode(trigger, OUTPUT);
  pinMode(echo, INPUT);

  pinMode(ENA, OUTPUT);
  pinMode(ENB, OUTPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);

  randomSeed(analogRead(0));

  apagar();
  delay(3000);

  //////////////////////////////////////////////
  pinMode(s0, OUTPUT);
  pinMode(s1, OUTPUT);
  pinMode(s2, OUTPUT);
  pinMode(s3, OUTPUT);
  pinMode(out, INPUT);
  pinMode(redLed, OUTPUT);
  pinMode(greenLed, OUTPUT);
  pinMode(blueLed, OUTPUT);
  digitalWrite(s0, HIGH);
  digitalWrite(s1, HIGH);
  //////////////////////////////////////////////
}

void loop() {
  /////////////////////////////////////////////////////////////
  //Código para capturar la distancia
  digitalWrite(trigger, LOW);
  delayMicroseconds(5);
  // Comienzo de la medida
  digitalWrite(trigger, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigger, LOW);
  // Adquisición y conversión a centímetros
  float distancia = pulseIn(echo, HIGH);
  distancia = distancia * 0.01657;
////////////////////////////////////////////////////////////////////

  //Condicionales para la distancia de giro
  if ((distancia >= 15) && (distancia <= 50)) {
    estado = 0;
  }

  else if (distancia > 15.0) {
    estado = 1;
  }

  else {
    estado = 2;
  }

  switch (estado) {
    case 0:
      digitalWrite(IN1, LOW);
      digitalWrite(IN2, HIGH);
      analogWrite(ENA, 125);

      digitalWrite(IN3, HIGH);
      digitalWrite(IN4, LOW);
      analogWrite(ENB, 125);
      break;

    case 1:
      avanzarA();
      avanzarB();
      break;

    case 2:
      direccion = random(2);
      if (direccion == 0) {
        retroDerecha();
      }else {
        retroIzquierda();}
      break;}}

//Motor avanza normalmente
void avanzarA() {
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  analogWrite(ENA, 255);}

void avanzarB() {
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
  analogWrite(ENB, 255);}

//Motor gira a la derecha
void retroDerecha() {

   digitalWrite(IN1,HIGH);
   digitalWrite(IN2,LOW);
   analogWrite(ENA,255);

   digitalWrite(IN3,LOW);
   digitalWrite(IN4,HIGH);
   analogWrite(ENB,255);
   delay(250);
 
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  analogWrite(ENA, 255);

  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
  analogWrite(ENB, 255);
  giros=random(5);
  Serial.println(giros);
  delay(500);
  //Si el contador que es 4 coincide con el random giros entonces para los motores y se ejecuta el    //sensor de color
  if (cont == giros){
    apagarTodo();}}

//Motor gira a la derecha
void retroIzquierda(){
  digitalWrite(IN1,HIGH);
  digitalWrite(IN2,LOW);
  analogWrite(ENA,255);

  digitalWrite(IN3,LOW);
  digitalWrite(IN4,HIGH);
  analogWrite(ENB,255);
  delay(250);
 
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  analogWrite(ENA, 255);

  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
  analogWrite(ENB, 255);

  giros=random(5);
  Serial.println(giros);
  delay(500);
  if (cont == giros){
    apagarTodo();}}

void apagar() {
  analogWrite(ENA, 0);
  analogWrite(ENB, 0);
  delay(100);}

void apagarTodo() {
  analogWrite(ENA, 0);
  analogWrite(ENB, 0);

  int sensorColor = 0;

 //Mientras sensorColor diferente de 1 repite las capturas de los colores
  while (sensorColor != 1) {
    color();
    Serial.print("Intensidad de rojo:");
    Serial.print(red, DEC);
    Serial.print("Intensidad de verde:");
    Serial.print(green, DEC);
    Serial.print("Intensidad de azul: ");
    Serial.print(blue, DEC);
    Serial.println();

    //Si llega a detectar cualquiera de los colores el sensorColor cambia a 1 rompiendose el bucle y
    //los motores de nuevo avanza
    if (red < blue && red < green && red < 10) {
      digitalWrite(redLed, HIGH); // Se enciende el led rojo
      delay(3000);
      digitalWrite(greenLed, LOW);
      digitalWrite(blueLed, LOW);
      Serial.println("Se ha detectado el color rojo");
      sensorColor = 1;}

    else if (blue < red && blue < green) {
      digitalWrite(redLed, LOW);
      digitalWrite(greenLed, LOW);
      digitalWrite(blueLed, HIGH); //Se enciende el led azul
      delay(3000);
      Serial.println("Se ha detectado el color azul");
      sensorColor = 1;}

    else if (green < red && green < blue)  {
      digitalWrite(redLed, LOW);
      digitalWrite(greenLed, HIGH); // Se enciende el led verde
      delay(3000);
      digitalWrite(blueLed, LOW);
      Serial.println("Se ha detectado el color verde");
      sensorColor = 1;}
    else {
      Serial.println();}
 
    digitalWrite(redLed, LOW);
    digitalWrite(greenLed, LOW);
    digitalWrite(blueLed, LOW);}}

//Método para capturar el color rojo, verde y azul de un sólido
void color()  {
  digitalWrite(s2, LOW);
  digitalWrite(s3, LOW);

  red = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
  digitalWrite(s3, HIGH);

  blue = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
  digitalWrite(s2, HIGH);

  green = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
}

Imágenes prototipo:





Video del funcionamiento:


Podcast:



0 comentarios:

Publicar un comentario

Datos personales:

Entradas populares