Piedra-papel-tijera por reconocimiento de voz
Integrantes del Grupo:
Isaac Montes Rodríguez
Ismael Martínez del Fresno
Luis Miguel Jimenez Aliaga
- Descripción del proyecto
Al comenzar este proyecto no teníamos ni idea de que podíamos hacer. En primer lugar no queríamos embarcarnos en un proyecto demasiado complejo que no fuéramos capaces de llevar a cabo, ya fuera por falta de recursos o por falta de tiempo. Entre nuestras ideas iniciales se encontraban opciones muy variadas, desde una maqueta a escala del sistema solar con movimientos de translación hasta un contador de vueltas para un circuito de scalextric. Finalmente una idea nos llamó más la atención y decidimos llevarla a cabo.
Nuestro proyecto se basa en hacer una máquina con la que poder enfrentarse a “Piedra, Papel, Tijera”. La máquina usa reconocimiento de voz para interactuar con los usuarios. El proyecto nos parecía sencillo de hacer si conseguíamos el micrófono y el software necesario para que reconociese la voz, pero tenía una complejidad suficiente para que nos sintiéramos satisfechos.
- Decisiones de implementación
Como ya se ha mencionado, hemos decidido que nuestra máquina interactúe mediante reconocimiento de voz. Para expresar el resultado se emplean cajas de papel (que representan la piedra, el papel y la tijera) que se iluminarán mediante el uso de diodos LED.
Hemos adquirido un módulo de reconocimiento de voz y un módulo USB serie para implementar la interacción por voz. Cuando nosotros digamos “piedra-papel-tijera”, el programa encenderá una de las tres cajas de forma aleatoria.
Además se han añadido a la máquina tres leds que nos indican el estado actual del sistema, de forma que el usuario puede saber en qué estado se encuentra la máquina en el caso de que no reconozca alguna palabra.
- Proceso de construcción
Lo primero que necesitábamos era que el reconocimiento de voz detectara algunas palabras. Afortunadamente, esto no resultó complicado (encontramos diversos tutoriales e información en la web) y pudimos lograrlo en una sesión. Hubo algunos problemas al principio con un error que nos llevó algo de tiempo resolver. Encontramos en internet varias personas con el mismo problema y descubrimos que el problema se encontraba en las conexiones de los cables entre el módulo de reconocimiento de voz y el USB serial. Nosotros teníamos conectado rx -> rx y tx -> tx, pero la conexión correcta es rx->tx y tx ->rx. Después, solo tuvimos que usar un programa para grabar los comandos.
El programa usado se llama “Docklight”. Nos permitía enviar y recibir señales entre el ordenador y el módulo de reconocimiento de voz, gracias a conectarlo al PC con el módulo USB. Es bastante sencillo de usar y conseguimos que reconociera los comandos necesarios para nuestro juego. Los comandos que puede reconocer nuestra máquina son: jugar, piedra, papel, tijera y apagar. De igual manera, se puede utilizar este programa para que el dispositivo de reconocimiento reconozca otro tipo de palabras. Adicionalmente, con este programa, podemos tratar de almacenar el reconocimiento de hasta 15 palabras. Desafortunadamente, solo reconoce las palabras del compañero que pudo programarlas, Ismael Martínez Del Fresno, por lo cual, si otra persona dice las mismas palabras, el reconocimiento no detecta las palabras correctamente y no podrá jugar. Nota: esto se puede arreglar programando dichas palabras con la voz de otras personas.
Una vez somos capaces de captar los comandos de voz, necesitamos conectarlo al Arduino para que nuestra máquina sea capaz de trabajar con ellos. En los tutoriales encontramos las instrucciones que se utilizan para usar el micrófono, y los comandos de voz se transforman en enteros, de forma que trabajar con ellos resulta sencillo mediante el uso de condicionales. Después escribimos el código para los diferentes casos de uso.
Finalmente añadimos estética al proyecto. Con el fin de hacerlo más vistoso, hemos implantado el circuito dentro de una caja de zapatos previamente tintada con spray de color negro. Después, se ha distribuido el circuito por el interior de la caja para que estuviese más organizado, y se han colocado los LEDs utilizados en sus posiciones verdaderamente reales, enganchados a unas cajas de papel diferenciadas tanto por el dibujo que tiene cada caja como con unas flechas y texto representativos por cada caja. Por último, se hicieron pequeños agujeros para las correspondientes conexiones que se verán en una imagen posterior. Al ser la caja un poco profunda y no tener una buena anchura en los cables, se hicieron dos cosas: se compró un trozo de corcho con el fin de subir el circuito y que los cables estén más “sueltos” con el fin de no romper las conexiones; por último, se han empalmado los cables de conexión con otros cables con el mismo fin (esto último no afectará ni al circuito realizado ni a la estética, ya que se encontrarán dentro de la caja). Este ha sido el resultado:
- Organización de tareas
Los materiales de esta práctica los tiene Ismael Martinez, por lo que él se encargó de hacer la parte hardware de la práctica. Luis Miguel Jiménez se encargó de configurar el micrófono para los comandos e Isaac Montes elaboró el código con Arduino. Sin embargo los tres colaboramos en todo el proceso de elaboración y resolvíamos los problemas en equipo.
- Costes de los materiales
Nombre del Componente | Uso | Precio |
USB serie + cables hembra-hembra | Grabación de palabras | 6,69€ |
Módulo de reconocimiento de voz + micrófono + cables hembra-hembra | Grabación y detección de palabras | 18,87€ |
Cables hembra-hembra, macho-hembra, macho-macho (40 de cada) | Conexiones entre protoboard, Arduino, diodos LED y resistencias | 4,99€ |
Gran parte de los componentes no nombrados en la tabla superior nos los proporcionaron los profesores en las cajas del Arduino. La otra pequeña parte ya se tenían y no se tuvieron que comprar.
- Problemas y soluciones encontradas
Anteriormente se han mencionado algunos de los problemas que encontramos durante la práctica. Ahora haremos una recopilación de los distintos problemas que nos encontramos, a pesar de que no han sido muchos:
- El módulo de reconocimiento de voz no nos enviaba las señales de vuelta. Lo solucionamos intercambiando los cables mencionados anteriormente.
- El comando “Serial.read();” no devuelve un número entero directamente y tuvimos que darnos cuenta de que debíamos hacer la conversión, lo que nos llevó un rato.
- Hardware utilizado
-Cables jumper (tanto de macho-macho como de hembra-macho).
– 6 Diodos LED (4 de color rojo, 1 amarillo y 1 verde).
– 6 resistencias de 1k Ω.
– Arduino UNO (vale cualquier Arduino).
-Módulo de reconocimiento por voz + micrófono + USB serie.
-Cable de alimentación para Arduino.
-Protoboard.
8. Código
int sensor; //Variable donde se almacena la señal recibida por el reconocimiento de voz. int estado; //Marca el estado actual de la máquina, se emplea para crear secuencialidad. //Para simplificar el código se han añadido las constantes de los distintos comandos con sus respectivos valores. int JUGAR=17; int PIEDRA=18; int PAPEL=19; int TIJERA=20; int APAGAR=21; //Array de enteros que contiene los pines que se emplean para activar los leds de la máquina. int led[] = {3, 5, 6, 9, 10, 11}; void setup() { //El serial begin necesario para usar la placa. Serial.begin(9600); //Importar el grupo 1 de comandos de voz, que es el grupo que hemos creado con nuestros comandos. Serial.write(0xAA); Serial.write(0x21); //Configuramos los pines del arduino como salidas. for (int i=0; i<6; i++) { pinMode(led[i], OUTPUT); } estado=0; //Inicializamos la máquina con el estado cero } void loop() { //Bucle para capturar las palabras recibidas por el receptor de voz. while (Serial.available()) { //Se almacena en la variable sensor el valor del comando de voz recibido. sensor =(int) Serial.read(); //Gracias a la variable estado el programa solo podrá ejecutar las palabras por orden (jugar-piedra-papel-tijera), salvo el comando apagar, que puede usarse siempre. if((sensor==JUGAR)&&(estado==0)){ //Apagamos todos los leds. for (int i=1; i<6; i++){ analogWrite(led[i],0); } //Encendemos el led del primer estado. analogWrite(led[0],255); //Cambiamos al siguiente estado. estado++; } if ((sensor==PIEDRA)&&(estado==1)){ //Encendemos el siguiente led de estado. analogWrite(led[1],255); //Aumentamos el estado. estado++; } if ((sensor==PAPEL)&&(estado==2)){ //Encendemos el último led de estado. analogWrite(led[2],255); //Cambiamos de estado. estado++; } if ((sensor==TIJERA)&&(estado==3)){ //Apagamos los leds de estado. analogWrite(led[0],0); analogWrite(led[1],0); analogWrite(led[2],0); //Elegimos una opción aleatoria entre piedra, papel o tijera. randomSeed(analogRead(0)); int respuesta= random(3,6); //Encendemos la opción escogida. analogWrite(led[respuesta],255); //Finaliza la ejecución por lo que regresamos al primer estado. estado=0; } if (sensor==APAGAR){ //Apagamos todos los leds. for (int i=0; i<6; i++){ analogWrite(led[i],0); } //Volvemos al estado inicial. estado=0; } } }
9. Explicación de casos de uso
Nombre de estado | Qué sucede | Transiciones |
Apagado | Espera a oír “Jugar” | Jugar Recibido |
Jugar Recibido | Enciende el LED rojo inferior. Espera a oír “Piedra” o “Apagar”. | Piedra Recibido, Apagado |
Piedra Recibido | Enciende el LED amarillo inferior. Espera a oír “Papel” o “Apagar”. | Papel Recibido, Apagado |
Papel Recibido | Enciende el LED verde inferior. Espera a oír “Tijera” o “Apagar”. | Tijera Recibido, Apagado |
Tijera Recibido | Enciende aleatoriamente uno de los tres LEDs superiores. Espera a oír “Jugar” o “Apagar”. | Jugar Recibido, Apagado |
10. Conclusiones
Es un proyecto sencillo de hacer. A lo mejor en términos económicos, a algunas personas les puede parecer un proyecto caro, pero no es tanto como aparenta. Los cables, los diodos LED y las resistencias son muy baratas. La placa (protoboard) dependiendo del tamaño será más barata o más cara. En cuanto al reconocimiento de voz, normalmente el conjunto con el micrófono y el USB serie se encuentra en Amazon a un precio cercano a los 40€, pero se puede encontrar algo más barato como fue en nuestro caso.
En términos de conocimiento, sólo es necesario saber lo básico en circuitos y saber cómo funcionan tanto el Arduino como el reconocimiento de voz, ya que, por ejemplo, equivocarnos de pin en el Arduino puede hacer que el circuito no funcione e incluso producir algún cortocircuito, lo cual podría estropear el Arduino.
11. Vídeo