Máquina expendedora por colores

Somos Antonio Adrián Bonilla, Javier García García, Inés Martínez Hontecillas y Gonzalo del Pozo Laso y somos el grupo 5.

INTRODUCCIÓN

Nuestro proyecto se trata de una máquina expendedora con un funcionamiento diferente, ya que el funcionamiento tradicional nos parecía muy simple y decidimos darle una vuelta. En nuestra máquina expendedora en vez de monedas utilizaremos colores que la propia máquina detectará y nos devolverá su producto asociado.

Dado que los usuarios no están acostumbrados a esta funcionalidad nueva, decidimos utilizar una pantalla para mostrar los mensajes correspondientes, además del propio color reconocido, para de esta manera lograr una buena comunicación con los usuarios.

COMPONENTES

COMPONENTEUNIDADESPRECIO
Arduino Uno R31Proporcionado por la universidad
Placa protoboard1Proporcionado por la universidad
Transistores PNP6Proporcionado por la universidad
Motores DC65’56
Batería 9V13’99
Resistencias6Proporcionado por la universidad
Pantalla TFT 1.77’’18’64
Detector de color19’70
          Cables+10Proporcionado por la universidad

COSTE TOTAL: 27’89

MATERIALESUNIDADES
Elementos de color6
Caja de espuma1
Cristal1
Soldador1
Bisagra2
Alambre6
Silicona1
Cúter1

CÓMO FUNCIONA

  1. El usuario decide el producto que desea y elige su color correspondiente.

La máquina consta de 6 productos asociados a diferentes colores: rojo, naranja, amarillo, verde, azul y morado. El usuario puede elegir cualquiera de ellos. Según el color que elija, la máquina dejará caer un producto u otro.

  1. El usuario acerca el color al detector de colores.

Los elementos de color consisten en unos rectángulos de los colores anteriormente mencionados, la máquina está calibrada para reconocerlos.

  1. La máquina detecta el color e imprime dicho color por la pantalla.

Para que el usuario sepa que su color se ha detectado correctamente, la pantalla imprime el nombre del color, así como el propio color del producto elegido para que sea más visual.

  1. La máquina deja caer el producto.

Se activa el motor correspondiente al producto seleccionado. El motor por tanto gira y el producto cae.

  1. El usuario recoge el producto.

El producto ha caído y el usuario puede recogerlo.

ESQUEMA DE CONEXIÓN

CONSTRUCCIÓN DE LA MÁQUINA

En cuanto a la parte de hardware, valoramos distintas posibilidades para su construcción. Finalmente nos decantamos por construir de cero una caja que posteriormente tendremos que modelar para adaptarla a una máquina expendedora. Para facilitar la manipulación de los elementos del circuito dentro de la caja, añadimos una puerta con el fin de poder abrir y cerrar sin deteriorar la caja.

Para realizar la estructura interna de la caja utilizamos una serie de paneles de espuma dispuestos de tal forma que queden 6 huecos para los productos. Dichos paneles no ocupan toda la parte interna de la caja, para el resto de la misma utilizamos otro panel de espuma más grande para cubrir todos los circuitos que vamos a tener que implementar, de modo que a simple vista el usuario no los vea.

En cada una de estas 6 celdas además colocamos un alambre enrollado con forma de muelle, que a su vez está conectado a su motor correspondiente. De este modo, cuando el motor se activa, el alambre gira y el producto cae.

Además añadimos una rampa en un lateral para asegurarnos de que los productos caigan en el mismo lugar para facilitar que el usuario los pueda recoger.

En la parte delantera, cortamos una parte para el cristal, que pegamos por detrás. Además dejamos un hueco en la parte de abajo para permitir que el usuario extraiga el producto una vez ha caído. Cortamos también un recuadro para colocar la pantalla y el detector de color.

En la parte de atrás, coincidiendo con los huecos destinados a los productos hacemos un agujero para poderle pasar a cada uno su motor correspondiente y lo pegamos con silicona. 

También hacemos un compartimento en la zona inferior, que se puede extraer y colocar de nuevo, teniendo así un hueco para facilitarnos el manejo con el arduino, el circuito y demás cables.

CÓDIGO

//Importamos las librerías
#include <Adafruit_GFX.h>    
#include <Adafruit_ST7735.h> 
#include <SPI.h>

//Definimos los puertos de la pantalla TFT
#define TFT_CS    10
#define TFT_RST   8  
#define TFT_DC    9 
#define TFT_SCLK 13   
#define TFT_MOSI 11   

//Constructor para la pantalla
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);

//Variables auxiliares para los colores
int color=0;
int frequency = 0;

//Definimos los puertos del sensor de color
#define S0 2
#define S1 3
#define S2 4
#define S3 5
#define sensorOut 6

//Definimos los puertos que controlan los motores
#define S4 A0
#define S5 A1
#define S6 A2
#define S7 A3
#define S8 A4
#define S9 A5

void setup() {
  //Inicializamos la pantalla TFT
  Serial.println("INICIO");
  tft.initR(INITR_BLACKTAB);  
  tft.fillScreen(ST7735_YELLOW); 
  tft.setTextColor(ST7735_BLACK);
  tft.setTextSize(3);
  tft.setCursor(10,60);
  tft.setRotation(3);
  tft.fillScreen(ST7735_WHITE); 
  
  //Establecemos todos los pines como salida de datos
  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);
  pinMode(S4, OUTPUT);
  pinMode(S5, OUTPUT);
  pinMode(S6, OUTPUT);
  pinMode(S7, OUTPUT);
  pinMode(S8, OUTPUT);
  pinMode(S9, OUTPUT);

   //Establecemos el pin de entrada de datos
  pinMode(sensorOut, INPUT);

  digitalWrite(S0, HIGH);
  digitalWrite(S1, LOW);
  Serial.begin(9600);
}

void loop() {
  //Reseteamos el cursor de la pantalla TFT
  tft.setCursor(10,60);

  //Leemos el color de entrada
  color = readColor();

  //Apagamos todos los motores
  analogWrite(S4, 0);
  analogWrite(S5, 0);
  analogWrite(S6, 0);
  analogWrite(S7, 0);
  analogWrite(S8, 0);
  analogWrite(S9, 0);
  
  //Dependiendo del color activamos su motor y la pantalla
  switch (color) {
    case 1:
    Serial.println("Rojo");
    Serial.print(" ");
    analogWrite(S6, 255);
    tft.fillScreen(ST7735_RED);
    tft.println("rojo");
    delay(500);
    break;
    
    case 2:
    Serial.println("Naranja");
    Serial.print(" ");
    analogWrite(S8, 255);
    tft.fillScreen(ST7735_ORANGE);
    tft.println("naranja");
    delay(500);
    break;
    
    case 3:
    Serial.println("Verde");
    Serial.print(" ");
    analogWrite(S4, 255);
    tft.fillScreen(ST7735_GREEN);
    tft.println("verde");
    delay(500);
    break;
    
    case 4:
    Serial.println("Amarillo");
    Serial.print(" ");
    analogWrite(S7, 255);
    tft.fillScreen(ST7735_YELLOW);
    tft.println("amarillo");
    delay(500);
    break;
    
    case 5:
    Serial.println("Morado");
    Serial.print(" ");
    analogWrite(S5, 255);
    tft.fillScreen(ST7735_RED);
    tft.println("morado");
    delay(500);
    break;
    case 6:
    Serial.println("Azul");
    Serial.print(" ");
    analogWrite(S9, 255);
    tft.fillScreen(ST7735_BLUE);
    tft.println("azul");
    delay(500);
    break;
    
    case 0:
    break;
  }

 //Reseteamos el color a 0 
 color=0;
}

//Llamamos a la función que lee los colores
int readColor() {
  //Ponemos el sensor para que detecte la frecuencia roja
  digitalWrite(S2, LOW);
  digitalWrite(S3, LOW);

  //Leemos la parte roja del color
  frequency = pulseIn(sensorOut, LOW);
  int R = frequency;
  
  //La imprimimos por pantalla
  Serial.print("R= ");
  Serial.print(frequency);
  Serial.print("  ");
  delay(50);
  
  //Ponemos el sensor para que detecte la frecuencia verde
  digitalWrite(S2, HIGH);
  digitalWrite(S3, HIGH);

  //Leemos la parte verde del color
  frequency = pulseIn(sensorOut, LOW);
  int G = frequency;
  
  //La imprimimos por pantalla
  Serial.print("G= ");
  Serial.print(frequency);
  Serial.print("  ");
  delay(50);
  
  //Ponemos el sensor para que detecte la frecuencia azul
  digitalWrite(S2, LOW);
  digitalWrite(S3, HIGH);
  
  //Leemos la parte azul del color
  frequency = pulseIn(sensorOut, LOW);
  int B = frequency;
  
  //La imprimimos por pantalla
  Serial.print("B= ");
  Serial.print(frequency);
  Serial.println("  ");
  delay(50);

//Dependiendo de cada frecuencia seleccionamos un color u otro
  if(R<30 & R>10 & B<50 & B>40){
    color = 1; // rojo
  }
  if(G<50 & G>30 & B<45 &B>35){
    color = 2; // naranja
  }
  if(R<50 & R>30 & G<35 & G>25){
    color = 3; // verde
  }
  if(R<20 & R>10 & G<25& G>15){
    color = 4; // amarillo
  }
  if(G<50 & G>40  & B<30 & B>20){
    color = 5; // morado
  }
  if (G<70 & G>50 & B<40 &B>20){
    color = 6; // azul
  }
  return color;  
}

RESULTADO FINAL

Colores del usuario

Arduino y protoboard

Pantalla y sensor de color

Vista delantera

Vista trasera

Vista lateral

VIDEO EXPLICATIVO

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 *