2. Características técnicas - alejandromz/AudioPlayer-ESP32 GitHub Wiki

A continuación, se va a hacer la justificación de cuales fueron los componentes que se decidieron utilizar para el proyecto. Estos componentes van desde el microcontrolador escogido, pasando por el lenguaje de programación en el que se va a desarrollar el software y el hardware con el que se va a desarrollar el sistema embebido. Se incluyen algunas anotaciones con estampillas de tiempo en donde se documentan los momentos en los que se hicieron adiciones o modificaciones a los componentes escogidos.

Microcontrolador - ESP32

El microcontrolador escogido fue la ESP32, específicamente el módulo ESP32-WROOM-32. Se seleccionó este módulo por varios factores. Primero que todo, es importante resaltar que tanto el módulo como la tarjeta de desarrollo son muy asequibles, con un precio que varia entre los $20,000 y $35,000 COP. Sin embargo, a pesar de tener este precio, la tarjeta es de muy buena calidad, con suficiente capacidad de memoria y velocidad de procesamiento para llevar a cabo las tareas necesarias para el proyecto. Además de esto, la ESP32 tiene la facilidad de que cuenta con capacidades WiFi y Bluetooth integradas, sin necesidad de adjuntar una antena. Todo esto, combinado con el hecho de que es una tarjeta muy popular de la que se encuentra mucha documentación en línea hizo que fuera una selección muy clara.

Lenguaje de desarrollo - Micropython

Ya habiendo decidido la tarjeta de desarrollo que se iba a utilizar para el proyecto, el siguiente paso fue determinar el lenguaje de programación en el cual lo íbamos a desarrollar. Para tomar esta decisión la primera consideración que se tomó fue que el lenguaje fuera compatible con la ESP32. Afortunadamente, otro de los puntos fuertes de esta tarjeta es que su arquitectura es compatible con muchos lenguajes de programación. La decisión final de que lenguaje utilizar fue entre C++, Micropython, eLua y Zephyr OS. Todos estos lenguajes presentan algunas ventajas clave, sin embargo, la decisión final fue hacer el desarrollo del proyecto en Micropython (Marzo 29). Esta decisión fue justificada por tres factores clave: primero, tomamos en consideración el hecho de que Python es un lenguaje de código abierto muy popular, del cual se pueden encontrar miles de librerías libres con una muy buena documentación, segundo, Python también es conocido por tener mucha facilidad para acceder a recursos web, punto clave para lo que queríamos lograr con el proyecto y tercero es el hecho de que múltiples integrantes del equipo ya tenían experiencia previa con este lenguaje.

Hardware

Después de definir las especificaciones funcionales del proyecto, el siguiente paso fue definir las especificaciones técnicas del mismo. En este proceso, fue fundamental definir los módulos físicos que iban a componer el hardware del sistema.

Interfaz Gráfica

Es necesaria la implementación de una interfaz gráfica para proporcionar un entorno visual sencillo que permita al usuario obtener la información y las acciones disponibles del sistema. Para esto se consideraron dos tipos de displays, un LCD y un Oled. En este caso se escogió el display LCD 16x2 ya que su costo es menor y además, junto con un módulo de comunicación serial I2C permite reducir los pines de conexión de 16 a solamente 4; en la siguiente imagen se muestra el módulo I2C utilizado:

Modulo-I2C-LCD-2-x16-La-Casa-de-la-Banda

La integración del display LCD y el módulo de comunicación serial para reducir el número de conexiones se muestra en la siguiente imagen:

modulo-adaptador-lcd-a-i2c displayI2C

La prueba del funcionamiento de este módulo se muestra en la sección PRUEBA DE MODULOS INDIVIDUALES.

Interfaz Física

Es necesaria la implementación de una interfaz física que permita al usuario navegar a través de las opciones proporcionadas por el sistema en conjunto con la interfaz gráfica. Para esto se tuvo en cuenta el uso de los componentes que se muestran a continuación:

  • Pad numérico matricial 4x5: Se consideró debido a la cantidad de opciones que ofrece, pues cuenta con un total de 20 botones que pueden ser muy útiles en la implementación de la navegación de usuario. Sin embargo su conexión es bastante compleja y su manejo puede llegar a ser poco intuitivo. Pad-númerico

  • Joystick: A pesar de que este módulo es más costoso que el pad matricial, se consideró debido a que su manejo es muy intuitivo y no requiere un esfuerzo visual para navegar a través del interfaz gráfico, sin embargo, ofrece un número de opciones de manejo menor.

DUAL_AXIS_XY_JOYSTICK_MODULE_ARDUINO

En este caso se eligió el Joystick KY-023 ya que es el más común comercialmente. Debido a que el número de opciones es limitado en comparación al pad matricial, se añadieron 2 botones al interfaz físico para agregar opciones en la navegación de usuario y otros dos botones para facilitar el encendido y apagado del sistema. La prueba del módulo del Joystick se muestra en la sección PRUEBA DE MODULOS INDIVIDUALES.

Amplificador de audio

El proyecto está basado en la reproducción de audio, por lo tanto es necesario implementar un módulo capaz de amplificar las señales de audio y de entregar la potencia necesaria para los altavoces o parlantes. Por proyectos anteriores se contaba con un parlante de 3W, por lo cual se consideraron los amplificadores TDA7266, LM386 y HXJ8002 los cuales cuentan con características similares, así que los tres podrían ser implementados en el proyecto. Sin embargo, en la búsqueda del amplificador se encontró el módulo MAX98357A basado en la comunicación I2S, lo cual facilita la codificación en Micropython y también es capaz de proporcionar la potencia necesaria, además, gracias a la cantidad de documentación que hay disponible su implementación es bastante sencilla. Por lo anterior se escoge el módulo MAX98357A, el cual se muestra a continuación:

Amplificador-de-Audio-MAX98357-I2S-3W-clase-D-1

El código realizado para la prueba del módulo se muestra en la sección PRUEBA DE MODULOS INDIVIDUALES.

Almacenamiento externo

En un principio se considera el uso de un almacenamiento externo para el almacenamiento de los audio libros que serán reproducidos posteriormente por el AudioPlayer, por lo tanto se utiliza un módulo lector de memoria Micro SD card, el cual permite el acceso a una memoria mucro SD por medio de comunicación SPI (en el módulo las señales de control están claramente etiquetadas). El módulo incluye un chip MC74VHCT125A como circuito de conversión de voltaje lógico para comunicarse a 3.3V o 5V.

modulo-lector-de-memoria-micro-sd-card

El código realizado para la prueba del módulo se muestra en la sección PRUEBA DE MODULOS INDIVIDUALES.

Alimentación

Se considera el módulo de alimentación Tp4056 USB que se muestra en la siguiente imagen.

Modulo-Cargador-Batería-de-LiPo-1A-Micro-Usb-5V-1

Como se observa cuenta una entrada USB micro A, con las salidas B- y B+ correspondientes a las conexiones de la batería y las salidas out- y out+ que se dirigen al sistema embebido para su respectiva alimentación. También, se hace uso de módulos reguladores de voltaje, estos son necesarios debido a que la batería usada tiene un voltaje de salida de 3.7V aproximadamente y los componentes mencionados anteriormente trabajan a 3.3V o a 5V, por lo que es necesario elevar o reducir el voltaje de salida de la batería según corresponda.

El módulo reductor de voltaje es el LM2596 que es presentado a continuación:

LM2596-Reductor-de-voltaje-DC-DC

Finalmente el módulo elevador de voltaje usado es el XL6009E1:

elevador_voltaje_dagoppi

Los anteriores módulos fueron elegidos porque sus características son apropiadas para el proyecto y tienen gran disponibilidad en el mercado. Se agregó, además, un led a cada diferencia de potencial para evidenciar la correcta alimentación de los módulos

##Módulo RS232

Este módulo es seleccionado e incorporado al diseño ya que el módulo ESP32 que se va a implementar en el sistema embebido es el siguiente:

modulo-esp-wroom-32-esp32-wifi

Como se observa, no es el módulo convencional que tiene ya dispuestos los pines correspondientes para su respectiva programación, dado este inconveniente surge la necesidad de encontrar el módulo capaz de realizar la conexión con la ESP32 para incorporar el respectivo código y así poder programar el módulo ESP32, para esto se selecciona el módulo conversor USB a serial RS232 mostrado a continuación:

rs232