Maquina de reciclaje semiautomática

Debido a la cantidad de residuos que genera el ser humano decidimos realizar una máquina que clasifique dichos residuos para poder reciclar de una manera más eficiente. Separando entre plástico, papel y vidrio y depositando cada uno en un apartado diferente.

Para la parte hardware usaremos el kit suministrado por el profesor y diversos componentes comprados a través de internet. Para la parte software tendremos que buscar información en internet y en los apuntes. Finalmente, para montar lo que es la máquina de reciclaje tendremos que comprar diversos materiales y ver como lo montamos todo.

Tendremos un láser que clasificará los distintos materiales y en algunos casos contará con la ayuda de un sensor ultrasónico. Una vez detectado el material, tendremos que reciclar manual o automáticamente los materiales.

Objetivos de nuestro proyecto

Crear una maquina transportadora que mueva objetos.
Diseñar un sistema que nos permita la clasificación de los objetos dependiendo de su material.
Organizar y colocar los diferentes elementos de la manera más limpia y clara posible.



Reparto de tareas/ Planificación

A la hora de hacer este proyecto hemos trabajado algunos días en un aula de trabajo y otros días online, desde casa. Cuando trabajamos desde casa nos hemos centrado más en buscar información sobre el código y los distintos materiales que vamos a usar.

Los días que trabajábamos presencialmente, nos centramos más en la parte del hardware y en hacer las pruebas necesarias para solucionar los problemas que nos fueron surgiendo. 

Coste de Materiales

ReferenciaCoste (total de unidades)
Silicona3 €
Madera de contrachapado10 €
Palos de madera2 €
Tubos de PVC1,5 €
Goma Eva1 €
Láser2 €
Motor12 €
Servomotores10 €
Cables2 €
Pilas 4,5V6 €
Fotodiodo0,5 €
Coste total50 €

Hardware

Para mover la cinta hemos conectado un pin digital de Arduino a un transistor una resistencia de 330Ω que funciona como interruptor, también tenemos un diodo que funciona como salvaguarda para no quemar el Arduino ni los cables. Hemos utilizado un mecanismo de engranajes conectado al motor que nos proporciona el torque necesario para que la cinta se mueva a la velocidad adecuada. A su vez tenemos un láser y un fotodiodo que miden si hay un objeto entre ellos y la opacidad de este. El láser está conectado al GND de Arduino y el positivo a la placa puesto que el láser necesita 5V para funcionar.

Imagen 1. Vista del motor y la placa de arduino

En la parte de la derecha del circuito, tendremos una pantalla LCD que reflejará el tipo de material que estamos reciclando, esta utilizará seis pines digitales e irá conectado al GND, a la tensión y a un potenciómetro que regulará la intensidad de esta.

Contaremos con un sensor IR que detectará la señal del mando correspondiente cuando entremos en el modo manual, siendo 0 para clasificar papel y 1 para clasificar plástico. Este modo manual está implementado para que cuando llegue un material con total opacidad, podamos clasificar manualmente de si trata de un papel o de una lata, por ejemplo.

Tendremos dos servomotores que utilizarán un pin digital cada uno y cada uno estará asociado a un material para que cuando lo tenga que clasificar lo arrastre y lo conduzca a su rampa correspondiente.

Un problema que teníamos era el momento de clasificar el vidrio ya que este material a ojos del láser era completamente invisible, por lo que implementamos el sensor ultrasónico del kit de Arduino. Este componente utilizará dos pines digitales, por uno de ellos emitirá un pulso y lo recogerá por el otro, así podremos detectar a la distancia a la que tenemos un objeto.

Por último, contamos con dos pilas conectadas en serie que alimentarán todo lo mencionado anteriormente y el fotodiodo.

Imagen 2. Vista de la placa protoboard y las conexiones de todos los elementos

Software

A continuación mostramos el código comentado, explicando lo que hacen las líneas mas relevantes en cada caso.

#include "Servo.h"
#include "LiquidCrystal.h"
#include "IRremote.h"

//Definimos pines analogicos
int pinFotoDiodo = A0;
int pinLaser = A2;

//Definimos pines digitales
int trig = 2;
int echo = 3;
int pinMotor = 4;
int servoMotorPl = 5;
int servoMotorPa = 6;
int receptorIR = 7;


//Definimos variables de control
int valorPHD;
long tiempo;
float d;
float distancia;
int isVidrio;
int umbralPlastico = 850;
int umbralPapel = 100;
int pos = 0;


//Definimos objetos de las clases importadas
LiquidCrystal lcd(12,13, 8, 9, 10, 11);
Servo servoMotorPapel;
Servo servoMotorPlastico;
IRrecv mando(receptorIR);


//Definimos funciones que vamos a utilizar en loop para evitar escribir codigo repetido y modularizar el codigo

//funcion que inicia la cinta y reseta los servomotores
void iniciarSketch() {
  digitalWrite(pinMotor, HIGH);  //poner cinta a correr
  lcd.begin(16, 2);
  servoMotorPapel.write(0);
  servoMotorPlastico.write(0);
}

//funcion que define el movimiento de los servomotores en funcion de cuales sean
void moverServo(int pinServoMotor) {

  if (pinServoMotor == servoMotorPa) {
    for (pos = 0; pos <= 75; pos += 1) {  
      servoMotorPapel.write(pos);  
      delay(10);                   
    }
  } else {
    for (pos = 0; pos <= 75; pos += 1) {  
      servoMotorPlastico.write(pos);  
      delay(10);                      
    }
  }
}

//funcion que lanza un trigger para obtener un pulso en el sensor ultrasonico, lo recibe en echo y retorna la distancia que hay
float obtenerDistancia(){
  //ponemos trig a LOW por si estaba HIGH
  digitalWrite(trig, LOW);
  delayMicroseconds(4);

  //ahora lanzamos el pulso poniendo a HIGH trig esperamos 10 ms y lo ponemos en LOW
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);

  tiempo = pulseIn(echo, HIGH);  //medimos el tiempo que tarda en volver el pulso, en microsegundos
  
  d = tiempo * 10 / 292/ 2;   //formula que aparece en internet para obtener la distancia en cm
  return d;
}

//funcion que se ejecuta cuando sea un plastico
void isPlastico() {
  //Esta funcion tiene que poner la cinta en marcha de nuevo y mover el servomotor del plastico a su posicion
  //posteriormente se queda a la espera de que el plastico se mueva hasta que caiga al contenedor, tambien tiene que poner
  //antes de mover la cinta en la pantalla que es un plástico

  lcd.write("PLASTICO");         //Escribo plastico
  analogWrite(pinLaser, 0);

  moverServo(servoMotorPl);             //muevo el servomotor
  delay(500);
  digitalWrite(pinMotor, HIGH);  //muevo la cinta
  delay(4500);                         //tiempo que hemos medido que tarda hasta que cae
  for (pos = 75; pos >= 0; pos -= 1) {  
    servoMotorPlastico.write(pos);  
    delay(10);                      
  }                                 //retorno el estado inicial
}

//funcion que se ejecuta cuando sea un papel
void isPapel() {
  //Esta funcion tiene que poner la cinta en marcha de nuevo y mover el servomotor del papel a su posicion
  //posteriormente se queda a la espera de que el papel se mueva hasta que caiga al contenedor, tambien tiene que poner
  //antes de mover la cinta en la pantalla que es un papel

  lcd.write("PAPEL");            //Escribo papel
  //No hace falta que apague el laser porque ya lo he apagado seguro en manual, no puedo llegar a esta funcion si no es desde manual()

  moverServo(servoMotorPa);             //muevo el servomotor
  delay(1000);
  digitalWrite(pinMotor, HIGH);  //muevo la cinta

  delay(5000);                         //tiempo que hemos medido que tarda hasta que cae
  for (pos = 75; pos >= 0; pos -= 1) {  
    servoMotorPapel.write(pos);  
    delay(10);                   
  }                              //retorno el estado inicial
}

void manual() {
  //En esta funcion como no sabemos si es papel o plastico opaco(lata) queremos incluir un mando que cuando detecte que el objeto es opaco
  //tu le des a un boton y digas si es papel o plastico opaco entonces la cinta esta parada
  //y hasta que no se pulse el boton del mando diciendo si es papel, vidrio o plastico no se va a mover
  //Apago el laser antes de ponerme a la espera de que pulsen el boton para no quemar el objeto
  analogWrite(pinLaser, 0);

  while (true) { //esto simula un loop() y dentro lo que hacemos es comprobar cada segundo si se pulsa el mando, saliendo cuando hayamos encontrado el 
  // hexadecimal correspondiente a los botones que pulsamos despues de ejecutar la funcion de cada material
    if (mando.decode()) { 
      //A partir de aqui se ha pulsado el mando o no, y tengo que distinguir si se ha pulsado papel o se ha pulsado plastico
      Serial.println(mando.decodedIRData.decodedRawData, HEX);
      if (mando.decodedIRData.decodedRawData == 0xE916FF00) {         //He pulsado 0 y es papel
        isPapel();                                                    //Si es papel tengo que poner la cinta en marcha apagar el laser
        break;
      } else if (mando.decodedIRData.decodedRawData == 0xF30CFF00) {  //He pulsado 1 y es plastico
        isPlastico();                                                 //Aqui puedo llamar directamente a la funcion isPlatico que lo hace todo
        break;
      }
      delay(1000);
      mando.resume(); //esto da paso a que se vuelva a recibir un valor
    }

  };
  //vuelvo a llamar a resume porque al salir con un break del while no lo llamo
  mando.resume();
}

//no hay funcion cuando sea vidrio porque no hay que hacer nada solo dejar correr la cinta unos segundos hasta que llegue
//el vidrio y escribir por pantalla que hay vidrio 


void setup() {
  Serial.begin(9600);
  
  pinMode(pinMotor, OUTPUT);
  pinMode(pinFotoDiodo, INPUT);
  pinMode(pinLaser, OUTPUT);
  pinMode(trig, OUTPUT);
  pinMode(echo, INPUT);

  servoMotorPapel.attach(servoMotorPa);
  servoMotorPlastico.attach(servoMotorPl);
  mando.enableIRIn();


  //llamamos a funcion iniciarSketch() para que se inicie todo correctamente y evitar escribir mucho codigo en las funciones principales que ejecuta
  //arduino para que sea mas legible
  iniciarSketch();
}

void loop() {  //en el loop queremos encender el laser al principio para detectar un cambio en el valor leido
  delay(1750);
  analogWrite(pinLaser, 255); //encendemos el laser
  delay(250); //Le doy tiempo al laser a encenderse antes de ponerme a medir
  lcd.clear(); //limpiamos lo que habia en la pantalla por si venimos de algun caso 
  while (analogRead(pinFotoDiodo) > umbralPlastico && analogRead(pinFotoDiodo) <= 1023) { //nos ponemos a leer del fotodiodo
    Serial.println(analogRead(pinFotoDiodo)); //Linea para depurar, no es util
    delay(75);
    distancia = obtenerDistancia(); //obtenemos la distancia
    //Serial.print(distancia); Serial.println(" cm"); //Depuracion
    if(distancia <= 6 && analogRead(pinFotoDiodo) > umbralPlastico + 50){
      lcd.write("VIDRIO");
      delay(2500);
      lcd.clear();
    }
  };
  //Paramos la cinta
  valorPHD = analogRead(pinFotoDiodo);
  digitalWrite(pinMotor, LOW);
  delay(500);
  //Aqui pasamos el while si no es igual el valor medido que el que hemos leido al principio
  //O bien es vidrio lo cual seguiria la cinta corriendo y el vidrio se colocaria o bien no ha leido nada
  //Una vez pasemos el while tenemos que distinguir 2 casos, papel(o cualquier objeto opaco) o plástico translúcido

  if (valorPHD <= umbralPapel) {  //Estamos en el caso de papel o un objeto opaco
    Serial.println("MANUAL");
    manual();                                                         //Llamo a las funciones que hacen el trabajo para mantener el loop limpio
  } else if (valorPHD > umbralPapel && valorPHD <= umbralPlastico) {  //Caso de plastico
    Serial.println("PLASTICO");
    isPlastico();  //Llamo a las funciones que hacen el trabajo para mantener el loop limpio
  }
  //Si por lo que sea hemos superado este umbral es que no ha medido bien, por lo que no hariamos nada
  digitalWrite(pinMotor, HIGH);
}

Problemas encontrados y nuestras soluciones

Problema 1

A la hora de montar la estructura física tuvimos diferentes dificultades como cortar la madera en líneas rectas, hacer círculos en la madera, hacer agujeros, pegar los trozos de madera, etc. Así como hacer que la cinta girase correctamente. 

Solución:​ Para solucionar este problema, tuvimos que pedir herramientas para poder cortar todo de una manera más precisa, a pesar de contar con las herramientas adecuadas tuvimos que realizar todo varias veces hasta que logramos conseguir exactamente lo que queríamos. 

Problema 2

A la hora de usar el láser tuvimos dificultades para conseguir que este impactara de lleno en el receptor y así le llegase toda la luz posible, porque si no las mediciones iban a variar cada vez que lo probásemos.

Solución:​ Para solucionar este problema tuvimos que pegar el fotodiodo a la máquina de reciclaje de forma que se quedase fijo y no se moviese. Después de hacer esto ya nos centramos en colocar bien el láser y dejarlo pegado sin que se mueva mientras que íbamos mirando en el programa de Arduino si los valores medidos por el fotodiodo eran constantes y tenían sentido, después de tenerlo todo definimos los umbrales de los materiales.

Problema 3

Al conectar el motor y el láser a los 5 voltios y el GND de Arduino, nos dimos cuenta de que cuando el motor estaba en funcionamiento el láser no tenía suficiente potencia a pesar de que estaba conectado en paralelo y teóricamente llegaban 5 voltios a cada uno.

Solución:​ Conectamos solo el motor a los 5 voltios de Arduino, de esta forma lo aislamos y el láser lo alimentamos externamente junto al resto de cosas que no habíamos puesto en ese momento. No pudimos hacerlo al revés porque el motor dejaba de funcionar cuando lo alimentábamos externamente.

Problema 4

Al colocar las puertas para clasificar los residuos y enviarlos al lugar correcto teníamos el problema de que el objeto se salía de la cinta, se quedaba pillado o simplemente rodaba sin parar.

Solución: Aunque a veces se quede pillado, redujimos bastante la probabilidad de esto ajustando el ángulo de movimiento de los servomotores tras hacer varias pruebas con la cinta y conseguimos la orientación perfecta para que el objeto fuera movido al lugar adecuado. 

Problema 5

Después de tener todo montado, quisimos añadir un sensor HC-SR04 (ultrasónico) para poder comprobar si había algo corriendo por la cinta, cosa que no podemos hacer solo con el láser por si hay corriendo algo transparente (no lo detecta el láser), nos encontramos con que no teníamos los pines digitales suficientes, nos faltaba 1 pin.

Solución: Pensamos varias cosas, pero nos decantamos por cambiar el láser a un pin analógico y tratarlo como tal, lo probamos y vimos que funciona por lo que decidimos dejarlo así, y conectamos el sensor ultrasónico a los dos pines digitales.

Problema 6

Al conectar el sensor HC-SR04 de repente empezó todo a volverse loco, dejo de funcionar por completo (el láser no se encendía, la cinta no giraba, los servos tenían tics o daban vueltas sin parar).

Solución: Nos dimos cuenta después de horas mirándolo de que no teníamos un cable que uniera al pin GND de Arduino el circuito aislado que teníamos (donde está todo menos el motor), no supimos saber porque nos estaba funcionando correctamente hasta que conectamos el sensor ultrasónico.

Casos de uso

A continuación adjuntamos un video sobre los casos de uso que hemos propuesto.

Vídeo explicativo

El siguiente video es el que hemos generado para la entrega del proyecto, en el que explicamos todo lo que hemos explicado aquí.

Conclusiones

Encontrar los materiales no resulta sencillo debido a que los que pedimos por Amazon no siempre funcionaban como esperábamos y tuvimos que recurrir a tiendas físicas de electrónica. Han surgido muchos más problemas de los esperados por cosas que al principio nos parecían sencillas (como cortar la madera y que todo cuadre bien, calibrar el láser, que la potencia del ordenador no fuera suficiente), y sobre todo lo que más problemas nos ha causado es que al ser todo tan sensible ( si el láser se mueve no mide bien, la cinca debe girar correctamente, los servos estar ajustados exactamente en un punto) lo que nos ha hecho darnos cuenta de la gran dificultad que tiene convertir tus ideas y pensamientos en un objeto real, lo cual nos hace valorar mucho más que antes la labor de los ingenieros en la sociedad al construir todo lo que se imaginan (aviones, puentes, ordenadores, máquinas industriales…). 

También te podría gustar...

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *