viernes, 18 de diciembre de 2015

Hago presente mi cuarta entrega de mi prototipo, bueno empecemos por los materiales que se utilizó:

-Arduino mega: Placa fundamental y principal para dar el funcionamiento al circuito.












-Placa L298N: Es el controlador principal para hacer funcionar los motores DC.












-Kit de motores DC: Un kit de motores de corriente alterna, con su base diseñada.









-Sensor ultrasónico: Sensor que nos permite captar una determinada distancia para que el prototipo esquive el obstáculo.








-Sensor TSC3200 o detector de color: Detecta la cantidad de rojo, verde y azul de un objeto.









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




-Modulo DF Player mini: Módulo reproductor de archivos mp3 o wav.
-Speaker o parlante: Nos sirve para dar la salida del audio del módulo mp3.
-Cables.- Para las conexiones de los pines de los componentes.
--Led RGB con tres resistencias para cada color: Permitirá encender el color rojo, verde o azul, según detecte el sensor TSC3200, cada pin con su respectiva resistencia de 220 o 330 Ohmios.

Diagrama de conexión de los componentes:


Código empleado:

//Librerías necesarias para el funcionamiento del módulo mp3
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>

//Variables de los pines del sensor de distancia
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 = 0;
int direccion;
int giros;
int sonido=0;
int colores=0;

//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 leds rojo verde y azul
int redLed = 2;
int greenLed =3;
int blueLed = 4;

// Variables que almacenan la cantidad de color rojo, verde y azul
int red = 0;
int green = 0;
int blue = 0;

void setup() {
  Serial.begin(9600);
  //Iniciamos el funcionamiento del módulo mp3 con volumen de sonido: 50
  mp3_set_serial (Serial);
  delay(1);
  mp3_set_volume (50); 
  
  //Configuración de pines del sensor de distancia
  pinMode(trigger, OUTPUT);
  pinMode(echo, INPUT);

  //Configuración de los pines del controlador de motores L298N
  pinMode(ENA, OUTPUT);
  pinMode(ENB, OUTPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  
  //Iniciamos el random
  randomSeed(analogRead(0));

  //Llamamos método apagar, que apaga los motores durante 2 segundos para despues iniciar
  apagar();
  delay(2000);

  //Configuración de pines del sensor de color
  pinMode(s0, OUTPUT);
  pinMode(s1, OUTPUT);
  pinMode(s2, OUTPUT);
  pinMode(s3, OUTPUT);
  pinMode(out, INPUT);

  //Configuración del led RGB
  pinMode(redLed, OUTPUT);
  pinMode(greenLed, OUTPUT);
  pinMode(blueLed, OUTPUT);

  //Encendemos el pin s0 y s1 del sensor de color
  digitalWrite(s0, HIGH);
  digitalWrite(s1, HIGH);

  //Iniciamos con una canción de fondo del prototipo
  mp3_play(8);}


void loop() {
  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;

  if ((distancia >= 15) && (distancia <= 40)) {
    estado = 0;}

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

  switch (estado) {
    //Conforme a la condición de arriba, si el estado es 0 el robot disminuye un poco su velocidad
    case 0:
      digitalWrite(IN1, LOW);
      digitalWrite(IN2, HIGH);
      analogWrite(ENA, 200);
      digitalWrite(IN3, HIGH);
      digitalWrite(IN4, LOW);
      analogWrite(ENB, 200);
      break;
    
    //Si el estado es 1: el robot avanza normalmente su trayecto
    case 1:
      avanzarA();
      avanzarB();
      break;
    /*Si el estado es 2: El robot pasa a esquivar el obstáculo y a través del random elije si girar a la
    izquierda o derecha*/
    case 2:
      direccion = random(2);

      if (direccion == 0) {
        retroDerecha();}
      else {
        retroIzquierda();}
      break;}}

//Método: Avanza el motor A(izquierdo) a velocidad normal
void avanzarA() {
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  analogWrite(ENA, 255);}

//Método: Avanza el motor B(derecho) a velocidad normal
void avanzarB() {
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
  analogWrite(ENB, 255);}

//Método para girar a la derecha
void retroDerecha() {
  digitalWrite(IN1,HIGH);
  digitalWrite(IN2,LOW);
  analogWrite(ENA,255);

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

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

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

  //Variable que nos permite contar 10 esquivos del robot
  cont++;
  Serial.println(cont);

  /*Si el contador llega a 10 llama al método apagarTodo donde apaga los motores y da paso al    funcionamiento del sensor de color*/
  if (cont == 10){
    apagarTodo();}}

//Método que gira a la izquierda
void retroIzquierda(){
  digitalWrite(IN1,HIGH);
  digitalWrite(IN2,LOW);
  analogWrite(ENA,255);

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

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

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

  cont++;
  Serial.println(cont);

  if (cont == 10){
    apagarTodo();}}

//Método apagar
void apagar() {
  analogWrite(ENA, 0);
  analogWrite(ENB, 0);
  delay(100);}

//Método apagarTodo
void apagarTodo() {
  cont=0;
  analogWrite(ENA, 0);
  analogWrite(ENB, 0);
  
  /*Reproducción de sonidos donde pide que coloquemos el color que diga el robot a través del    random el elije que color pedir*/
  mp3_play(0);
  delay(2000);
  sonido=random(1,4);
  mp3_play (sonido);
  delay(2000);

  //Ejecuta el sensor de color y empieza con la lectura
  int sensorColor = 0;
  while (sensorColor != 1) {
    color();
    Serial.print("R Intensity:");
    Serial.print(red, DEC);
    Serial.print(" G Intensity: ");
    Serial.print(green, DEC);
    Serial.print(" B Intensity : ");
    Serial.print(blue, DEC);
    Serial.println();
    delay(100);
    
    //Condición para detectar color rojo
    if (red < blue && green > red && red < 20) {
      digitalWrite(redLed, HIGH); //Encendemos led rojo si la condición se cumple
      delay(3000);
      digitalWrite(greenLed, LOW);
      digitalWrite(blueLed, LOW);
      Serial.println("Se ha detectado el color rojo");
      sensorColor = 1;
      colores=1;}

    //Condición para detectar color verde
    else if (green < red && green < blue) {
      digitalWrite(redLed, LOW);
      digitalWrite(greenLed, HIGH); //Encendemos led verde si la condición se cumple
      delay(3000);
      digitalWrite(blueLed, LOW);
      Serial.println("Se ha detectado el color verde");
      sensorColor = 1;
      colores=2;}

    //Condición para detectar color azul
    else if (blue > red && blue > green) {
      digitalWrite(redLed, LOW);
      digitalWrite(greenLed, LOW);
      digitalWrite(blueLed, HIGH);  //Encendemos led azul si la condición se cumple
      delay(3000);
      Serial.println("Se ha detectado el color azul");
      colores=3;
      sensorColor = 1;}

    //Apagamos todos los leds
    digitalWrite(redLed, LOW);
    digitalWrite(greenLed, LOW);
    digitalWrite(blueLed, LOW);}

    /*Si la variable colores que almacena el color que pone el usuario en el sensor es igual a la variable     sonido que es el color que pidió el robot entonces*/
    if (colores==sonido){ 
      //Se ejecutan sonidos de exitoso dando a saber que ingreso bien el color pedido por el robot
      mp3_play(7);
      delay(4000);
      mp3_play (4);
     delay (3000);
     mp3_play(8);}
    
    //Caso contrario si no acierta el color manda un sonido erroneo
    else{
      mp3_play (6);
      delay (3500);
      mp3_play (5);
      delay (3000);
      mp3_play(8);}}

//Método para detectar la cantidad de cada color: rojo, verde y azul
void color() {
  digitalWrite(s2, LOW);
  digitalWrite(s3, LOW);
  //Capta el color rojo
  red = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH)
  digitalWrite(s3, HIGH);
  //Capta el color azul
  blue = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);
  digitalWrite(s2, HIGH);
  //Capta el color verde
  green = pulseIn(out, digitalRead(out) == HIGH ? LOW : HIGH);}

Imágenes prototipo:






Video del funcionamiento:


Podcast:

1 comentario:

Datos personales:

Entradas populares