
CONTROL Y COMPONENTES
ROSTRO
Para mostrar el rostro del robot se utiliza código en JavaScript, que permite renderizar gráficos en un canvas a través de un cliente web. Se eligió este forma por su portabilidad a distintas plataformas, facilidad para programar y versatilidad en gráficos. Otras opciones eran en Python, usando bibliotecas como Turtle, pero estás eran bastante limitadas y algo difíciles de utilizar. El rostro se muestra en la pantalla, que irá en la cabeza del robot. Una función importante en este proceso es la siguiente:

Cabe recalcar que esté código corre un servidor que ejecuta React como framework para front-end. Este framework se basa en componentes principalmente para proveer arquitectura a los proyectos. En el código anterior, se ve que se utiliza un componente llamado Canvas, el cual recibe los siguientes parámetros:
​
Emotion: Establece la emoción que el rostro debe dibujar. Este parámetro es una cadena de caracteres.
Amplitude: Es un número que establece que tan abierta estará la boca en un momento dado.
Blink: Es un número que sirve como factor para la apertura de los ojos del rostro del robot.
Mode: Es una cadena de caracteres que establece si el robot está hablando o está callado, y por lo tanto si debe mover o no la boca.
​
El resultado que genera el componente canvas es el siguiente:

SISTEMA DE CONTROL Y PROCESAMIENTO DE DATOS
El sistema de control para el proyecto estará dado por la Raspberry PI 4, en la cual se tendrán 3 servidores que ayudarán a controlar los componentes del sistema y a procesar la información. Un servidor correrá una interfaz gráfica en el que se mostrará el rostro del robot a través de una pantalla y que permitirá enviar información a través de un dispositivo externo conectado a la misma red que la Raspberry. Otro servidor será usado para la coordinación entre los mensajes y el rostro del robot, de manera que cuando un nuevo mensaje sea enviado al sistema, se notifique al rostro para procesarlo y expresarlo en la interfaz; este implementará una arquitectura web socket. Finalmente, un servidor para procesar los mensajes y detectar emociones en estos, para saber que tipo de gesto se debe representar. Todo esto se puede resumir en la siguiente arquitectura:

Adicionalmente se puede ver el esquemático del proyecto, que se presenta más adelante. En este se detalla que los motores se controlaran a través de 6 pines GPIO de la Raspberry, con salidas PWM. Estás se generarán una vez allá sido procesado el gesto e identificado la emoción. En este punto se elige una subrutina para ejecutar en los motores una serie de pasos predefinidos y categorizados por emociones, ya que la biblioteca text2emotion reconoce 5 emociones diferentes, a saber, felicidad, tristeza, miedo, enojo, sorpresa y se agrega una emoción extra, que se denomina la neutral y se usa cuando no hay suficiente rating para elegir una emoción, ya que esta biblioteca da un valor para cada emoción de acuerdo a su presencia en el texto, se eligen solo las que tengan una calificación mayor a 0.5. Está calificación va hasta 1.
El mensaje del usuario se ingresa a través de un formulario desde un dispositivo conectado a la misma red que la Raspberry, y se envía mediante un método post al servidor, el cual notifica a un web socket que hay un nuevo mensaje, que a su vez notifica al servidor del rostro para mandar la petición al servidor de Flask que detecta la emoción y empezar a hacer el text to speech (conversión de texto a audio) con ayuda del Web Speech API nativo del sistema, mover la boca y cambiar los gestos en el rostro. Adicionalmente, el servidor de Flask ejecutará en paralelo el programa para los movimientos de los motores, que van conectados a las extremidades.
DETECCION DE EMOCION Y MOVIMIENTO
Para detectar la emoción en el mensaje que el usuario envíe al robot, se usa un servidor corriendo una aplicación en Flask, que es un framework para Python. Lo anterior, para poder usar la biblioteca text2emotion para Python, que permite detectar emociones en texto usando técnicas de Machine Learning. De esta manera, se envía al servidor el mensaje ingresado por el usuario a través de un input en una aplicación web. El servidor procesa el mensaje y devuelve la emoción que se debe representar en el gesto a realizar. Está emoción sirve de insumo al canvas previamente descrito y al código para el movimiento de los brazos y la cabeza del robot, que aún está pendiente por implementarse. Por ahora se tiene un código que usa un pin GPIO de la Raspberry, como test para el uso de estos pines para controlar los motores y demás salidas. Una parte del código se muestra a continuación:

El código anterior se llama cuando se hace una petición a la ruta /process, mediante el método POST, que recibe como parámetro el mensaje a procesar se procesa y se detecta la emoción haciendo uso de la biblioteca text2emotion, que a su vez usar un servidor externo para el procesamiento, y luego se devuelve la emoción. Imagen de la prueba:

Como se ve, se retorna las emociones presentes en el mensaje enviado. Adicionalmente se probó el uso de los pines de la Raspberry a través del servidor, con la siguiente función:

Se hace una petición a la ruta /led del servidor, el cual cambia el estado del led, de encendido a apagado:

Se muestra el cambio del estado del led:

DIAGRAMA P&ID

MEF


ACTUADORES SELECCIONADOS
Para este proyecto se requieren 6 servo motores, una pantalla y un parlante. La información que se recolecta es un mensaje ingresado por el usuario, que lo digita desde un dispositivo externo, que puede ser un computador o su celular personal, conectado a la misma red que la Raspberry, enviándolo a un servidor que corre en esta. Las referencias se ponen en la tabla de Bill of materials.




Los motores que se tienen son servo motores marca Pololu con las siguientes características:
​
-
Dimensiones: 40,7 x 20,5 x 39,5 mm
-
Peso: 60g
-
Velocidad @6V: 0,14sec/60°
-
Torque (Stall) @6V: 17kg·cm
-
Voltaje de alimentación: 4.8V-6V
Se usará para mostrar el rostro del robot una pantalla de 7 pulgadas, LCD, con una interfaz que soporta conexión VGA y HDMI. Tiene las siguientes características:
-
Tamaño: 7"
-
Resolución: 480x800
-
Dimensiones: 164.9x100x5.7 mm
-
Voltaje de alimentación: 12V
Se usará una Raspberry Pi 4 model B con 8 GB de RAM para el procesamiento y control en el sistema. Tiene las siguientes características:
-
Procesador: Broadcom BCM2711, quad-core Cortex-A72 (ARM v8) 64-bit SoC @ 1.5GHz
-
Memoria:8GB
-
Conectividad: 2.4GHz y 5.0 GHz IEEE 802.11b/g/n/ac wireless LAN, Bluetooth 5.0, BLE Gigabit Ethernet
-
2 puertos USB 2.0
-
2 puertos micro HDMI (soporta hasta 4Kp60)
-
1 puerto para audio estéreo
-
GPIO: header GPIO estándar 40-pin (compatible con versiones anteriores)
-
Voltaje de entrada: 5V DC vía conector USB-C (mínimo 3A1), vía header GPIO 5V DC (mínimo 3A1), Power over Ethernet (PoE)-enable (requiere PoE HAT)
-
Dimensiones: 88x58x19.5mm
Parlante con conexión USB, se conecta directamente al puerto USB de la Raspberry. Tiene las siguientes características:
-
Voltaje: 5V
-
Potencia total: 2 x 2W
-
SNR: 60dB
-
Impedancia: 4 ohm
-
Dimensiones: 84x43x32mm
Los dispositivos que estarán conectados a la Raspberry serán la pantalla, a través de HDMI o VGA, gracias a la interfaz que esta tiene; el parlante se puede conectar por el JACK o por USB. La alimentación que estará dada por una fuente de 5V. Y los motores, que se conectaran a la Raspberry por los puertos GPIO. Esto se detalla en el esquemático del sistema.
DISTRIBUCION DE COMPONENTES

TABLA DE PRECIOS
A continuación, se presente el Bill of materials para el proyecto. Algunos de estos componentes ya se han adquirido y se están realizando pruebas con estos. Cabe recalcar que estos materiales serán comprados por el laboratorio de control digital, gestión que se realiza a través del profesor Hugo Murillo Hoyos, quien es coordinador del laboratorio.
​
Se presentan también las cotizaciones de algunos componentes.
