Máquina expendedora pokemon
INTRODUCCIÓN
Como sistema a diseñar y construir, escogimos una máquina expendedora. A lo largo del proyecto fuimos cambiando un poco el diseño para cubrir necesidades que iban surgiendo.
La máquina expendedora consta de 9 módulos individuales impresos con una impresora 3d, cada uno con un motor que hace girar una espiral de cable de hierro. Estos son accionados al escoger una posición con el mando y comprobar el pago correspondiente con una tarjeta NFC, a continuación se detalla el funcionamiento.
LAS PIEZAS
En cuanto a piezas necesarias y presupuesto manejaremos dos tablas, la primera muestra el precio que supuso para nosotros la adquisición de los componentes para la práctica, y la segunda, lo que supondría la realización de la misma desde 0, sin el kit de Arduino entregado por el profesor. El precio del grupo es bastante reducido porque, además de usar componentes del kit, utilizamos componentes que ya teníamos o prestados de otros compañeros.
CONCEPTO | GRUPO | DESDE 0 |
Placa arduino | – | 17€ |
Piezas de plástico | – | 20€ |
Cartón pluma | 5€ | 5€ |
Shift register | – | 1€ |
Motores | 13€ | 13€ |
Cable | 5€ | 5€ |
Lector NFC | 4€ | 4€ |
Pantalla lcd+I2C | – | 7€ |
Sensor IR+mando | – | 6€ |
Transistores | – | 5€ |
Diodos | – | 2€ |
TOTAL | 27€ | 85€ |
1.MÓDULOS (Piezas de plástico)
Para diseñar la máquina expendedora se partió de la idea de utilizar como referencia las máquinas expendedoras por muelle. Por tanto se decidió crear con impresión 3D un esqueleto donde quedarían los motores y productos en venta.
(Fig 1: Primer diseño a cartón)
Al realizar la primera prueba con un muelle ya nos dimos cuenta de la necesidad de tener el motor a cierta altura para evitar choques con la base.
En cuanto a la cantidad de motores y por tanto de módulos, decidimos crear una máquina con 9 posiciones, aprovechando así la cantidad de números y disposición que tenían los mandos del kit de Arduino.
(Fig 2: Mando)
Debido al tamaño que tendría que en un principio, que creíamos sería menor, pero debido a que meteremos cartas dentro, fue bastante voluminoso. Se tuvo que realizar de forma modular, para poder imprimir pieza a pieza.
En un principio se pensó en un diseño algo más pequeño, pero conforme avanzaba el proyecto se decidió ampliar los espacios. Debido a esto se creó un sistema modular en el que cada espacio de un motor sería impreso de forma individual, dejando unas pequeñas patas para poder encajar unos con otros. Cada espacio es llamado módulo.
Una vez aclaradas las ideas principales se modeló un módulo en Blender, que posteriormente fue impreso en 3D. Se imprimió tantas veces como espacios habíamos decidido usar, es decir 9. Todo el proceso de impresión fue bastante largo llegando casi a las 60 horas. Una vez impresos todos los módulos su colocación fue bastante simple.
(Fig 3: modelo en Blender) (Fig 4: módulo unitario impreso)
(Fig 5: 6 módulos en posición)
2.MOTORES
Con los motores surgiría el primer problema de la práctica, y ese sería la posibilidad de quedarnos sin pines de salida del Arduino, teniendo como total 13 pines digitales y usando 9 pines en motores, quedarían 4 pines para trabajar con los demás dispositivos de salida que teníamos pensados, como el LCD el lector IR y el lector de tarjetas.
Para solventar esa necesidad de pines adicionales utilizamos un shift register 74HC595, este usaría 3 pines del Arduino (5,6,7) pero a cambio nos daría 8 salidas paralelas, que podríamos utilizar para distintas combinaciones de salida, pero en este caso, solo pasaremos un byte, con un 1 en la posición del motor que queremos encender. El noveno motor, en cambio, va directamente a un pin del Arduino (8). Podríamos haber conectado dos de estos shift register en serie, pero ya teníamos suficientes salidas.
Cada motor está conectado al emisor de un transistor, mientras que cada salida del shift register está conectada a una resistencia de 330 para regular la velocidad de giro del motor y el colector a la salida de 5v del Arduino. A su vez el motor está protegido por un diodo.
(Fig 6: shift register) (Fig 7: Conjunto resistencia, transistor, diodo) (Fig 8: funcionamiento shift register)
3.PANTALLA LCD
La pantalla, muy utilizada en los proyectos arduino, la conectamos con un adaptador I2C, de esta forma ahorraremos muchos pines de la placa, aunque cambiando un poco el código para su manejo. Utilizamos una pantalla y adaptador que no venía con el kit proporcionado para poder soldar el adaptador a la pantalla y facilitar su colocación en la carcasa de la máquina expendedora.
El adaptador I2C tomará los pines A4 y A5 para los puertos serial data y serial clock respectivamente y otros dos cables, para positivo y negativo.
Emplea la librería LiquidCrystal
(Fig 9: adaptador I2C)
4.LECTOR DE TARJETAS
Para el lector de tarjetas no hemos utilizado ningún adaptador especial, este está conectado a los pines del arduino protegido por una serie de resistencias de 1k.
Emplea la librería MRFC522 , con el pin 4 para su RST y el pin 10 para su SDA.
Con este componente podemos leer y escribir información en unas tarjetas NFC para poder simular el pago con tarjetas.
(Fig 10: conexiones lector con resistencias)
DISPOSICIÓN DE LOS CABLES
Adjuntamos este esquema en tinkercad para facilitar la lectura del cableado, debido a la cantidad de cables y componentes en protoplaca. En el esquema se aparecen dos protoplacas, sin embargo esto es para facilitar la compresión, ya que en el proyecto real solo es necesario emplear una (más una pequeña), evitando malgastar espacio.
(Fig 11: esquema tinkercad de nuestro circuito)
(Fig 12: circuito real)
Como tenemos varios componentes colocados en la carcasa de la máquina expendedora, se han colocado cables juntos para los distintos componentes, como el lector de tarjetas, la pantalla y el sensor IR. No se pudo hacer lo mismo con los motores porque, aunque sus puntos de enganche están soldadas a los cables, siguen siendo muy frágiles y se ha querido evitar que se rompan al desplazarse. Todo componente que pueda ser soldado se ha soldado, y los únicos falsos contactos que puede dar la estructura son los puntos de contacto de la protoplaca.
ESTADOS DE LA MÁQUINA
Antes de pasar a explicar qué hace cada parte del código de la máquina veamos un pequeño esquema de su funcionamiento.
(Fig 13: estados de la máquina)
1.Parte del inicio del bucle, y espera que se accione un botón del mando de forma indefinida.
2.Tras pulsar un botón del mando escogiendo la opción deseada, tanto en el caso de que sea un producto o una recarga de saldo, esperará una tarjeta, si la tarjeta no se coloca volverá al estado de esperar mando, al estado 1, en caso contrario pasa al paso 3.
3a.Si se coloca la tarjeta, y es recarga de saldo, ingresa al menú de recarga de saldo y vuelve al estado 1.
3b.Si se coloca la tarjeta y se escogió un producto, procede a cobrar en la tarjeta el importe. Si no hay suficiente saldo, lo indica y vuelve al paso 1, en caso de suponer suficiente saldo pasa al 4.
4.Gira el motor y vuelve al paso 1 para repetir el bucle.
CÓDIGO
El código se explicará de forma secuencial según está en el Arduino.
(Fig 14: declaración y asignación de variables)
Las librerías utilizadas para este proyecto son IRremote, para el lector IR, Wire y LiquidCrystal para controlar el lcd con el I2C, y SPI y MFRC522 para el lector de tarjetas.
Los pines nombrados son los del ShiftRegister 7,6,5 para los motores del 1 al 8 y el pin 8 para el noveno motor. Los pines del LCD son el A4 y A5, predeterminados por la librería para el controlador I2C. El pin 9 para el sensor IR y los pines 4 y 10 para el lector de tarjetas MFRC522.
Además de el mapeado de pines también procedemos a generar variables para facilitar el manejo del proyecto como el delay de los motores, el bloque que se modificará en la tarjeta e inicializamos los objetos para el manejo del LCD y el MFRC522.
Por último generamos un array en el que se guardará la información que leamos de la tarjeta.
(Fig 15: clase casilla)
Creamos una clase casilla, con su constructor, para facilitar la creación de todas las casillas necesarias para manejar el mando, y posteriormente generamos el array de casillas.
(Fig 16: setup)
(Fig 17: loop)
El loop, tras imprimir por el lcd “Escoger producto” quedará inactivo hasta recibir una señal del mando. Una vez recibida e impreso por pantalla la opción pasará a la función seleccionar.
(Fig 18: función seleccionar)
(Fig 19: función seleccionar b)
La función Seleccionar(), que recibe la opción escogida imprime por pantalla la opción y llama a la función Tarjeta().
En caso de que la selección escogida fuese 0, creará un boolean en falso, esperará nuevamente una selección de mando y tras volver a leer la tarjeta, volverá el booleano true, para salir del bucle.
(Fig 20: función tarjeta a)
La función Tarjeta(), nombrada anteriormente, toma el precio del producto escogido y espera una tarjeta. Si pasa el tiempo de timer, saldrá de la función, cancelando la operación. En caso de recibir una tarjeta, lee el segundo bloque de la tarjeta, para comprobar su saldo, si no es suficiente para el producto lo hará saber por el LCD y saldrá de la función. Si el saldo es suficiente procederá a escribir en el mismo bloque el saldo tras sustraer el precio, marcará el booleano pagado como verdadero y llamará a la función motor si es verdadero.
(Fig 21: función tarjeta b)
(Fig 22: funciones del motor)
Las funciones Motor(), y MotorControl() manejan las salidas del shift register. Motor maneja el motor a accionar desde su llamada en la función anterior, y a su vez llama a MotorControl(), para que escriba en el desplazador de registros.
(Fig 23: funciones writeBlock para NFC)
(Fig 24: funciones readBlock para NFC)
Por último las funciones WriteBlock() y ReadBlock(), que nos permiten escribir y leer bloques en las tarjetas se recogieron del creador de contenido digital Zin Tech Ideas, que es el creador original de estas funciones.
PROBELMAS Y CONCLUSIÓN
Durante el desarrollo de la máquina expendedora surgieron diversos problemas.
Por parte de los físicos, el lector de tarjetas fue soldado 3 veces hasta que el Arduino fue capaz de reconocerlo, hasta el punto de que llegamos a creer que estaba defectuoso. Esto no volvió a ocurrir con ningún otro componente soldado.La fragilidad de los bornes de cobre de los motores se hizo notar cuando uno de ellos se rompió, teníamos 2 motores sobrantes así que no supuso un problema para el presupuesto. Además, la necesidad de ampliar la cantidad de pines para el Arduino hizo plantearse la compra de un Arduino Mega o reducir la cantidad de motores planteada inicialmente, pero al final decidimos emplear un Shift Register. Se compró un paquete de 20, de los cuales quemamos uno. Tras esto la necesidad de pines ya no fue un problema.
Por parte de los problemas lógicos del código, había muy poca documentación sobre el lector de tarjetas y varios de los tutoriales encontrados estaban incompletos o tenían algún error. Al final se encontró un video de Zin Tech Ideas del cual se sacaron las funciones necesarias para escribir y leer bloques de datos de la tarjeta programable.