Diseñar una interfaz de usuario para un reproductor de musica basado en un ESP32 con LVGL


En este post, vamos a ver una guia creada por @moononournation, que nos muestra cómo usar LVGL y SquareLine Studio para diseñar una interfaz de usuario de reproductor de música estilo Winamp. LVGL es una biblioteca de gráficos para crear fácilmente una interfaz gráfica de usuario elegante y SquareLine Studio ayuda a reducir la cantidad de codificación requerida para usar LVGL

En este post vamos a ver como implementar un reproductor casero al mas puro estilo winamp de forma completamente personalizable. Para ello cualquier dispositivo de desarrollo ESP32 con pantalla y salida de audio debería estar bien.

A continuación se muestran algunos dispositivos que podemos usar:

  • Por ultimo una opción con pantalla mas grande es el módulo ESP32-S3-pantalla inteligente HMI 8M PSRAM 16M Flash Arduino LVGL WIFI y Bluetooth 7 «800×480, módulo TFT LCD RGB de 7,0 pulgada ( mas información en https://www.aliexpress.com/item/1005004952726089.html).

Diseño de interfaz de usuario

Puede usar varias formas de pantalla, redonda, cuadrada, rectangular. Es mejor determinar usar qué forma primero. Luego, el siguiente paso es determinar cómo se ve la interfaz de usuario.

Reproductor de música clásica

Reproductor de música clásica
Reproductor de música clásica
Reproductor de música clásica
Reproductor de música clásica

Si aún no tiene ninguna idea de diseño de interfaz de usuario, imitar un reproductor de música clásico puede ser un buen comienzo.

Winamp es un reproductor de música de escritorio clásico de Windows que apareció en el siglo pasado, luego mas tarde hubo una variante de interfaz de usuario similar con soporte de caracteres chinos llamada TTPlayer . Estas 2 aplicaciones son el recuerdo de la infancia de muchos aficionados (y también el de muchas personas), así que usaremos esas UI como plantilla de diseño.

Winamp está diseñado para cambiar la «máscara» fácilmente, y los recursos de imagen de la máscara están en formato BMP empaquetados en un archivo zip. Puede encontrar una gran colección de máscaras de Winamp en skins.webamp.org , por lo que es fácil acceder a su máscara de Winamp favorita como plantilla de diseño.

Puede encontrar cómo iniciar el diseño de la interfaz de usuario desde la máscara de Winamp en bilibili:

https://www.bilibili.com/video/BV1ia4y137KM/

El reproductor de música tiene varias funciones, pero el autor del git esta interesado en las características que se encuentran en Winamp o TTPlayer. 

Aquí está la lista de deseos de funciones muchas ya implementadas en el actual firmware disponible en el git:

  • Reproducir MP3 desde la tarjeta SD
  • Lista de archivos MP3 de la tarjeta SD
  • Mostrar caracteres Unicode
  • Operación de reproducción básica (reproducir, pausar, detener, anterior y siguiente)
  • Control del volumen
  • Mostrar información MP3 ID3
  • Mostrar imagen de portada de MP3
  • Mostrar letras MP3
  • Sincroniza la visualización de letras mientras juegas
  • Mostrar analizador de espectro de audio

Reproducir MP3 desde la tarjeta SD

Al principio, necesitamos una biblioteca de audio que pueda leer archivos MP3 desde la tarjeta SD y reproducirlos. Esta vez usaremos ESP32-audioI2S. Es compatible con la familia ESP32, lee archivos de audio de varias fuentes y reproduce la salida al módulo I2S. 

Puede encontrar más detalles en Github:

https://github.com/schreibfaul1/ESP32-audioI2S.git

Operación de reproducción básica

Operación básica de reproducción

ESP32-audioI2S proporcionó toda la API de reproducción básica, solo necesitamos crear todos los widgets de botón correspondientes para cada operación. Sin embargo, el diseño del botón original de Winamp es demasiado pequeño para operar en la pantalla táctil con el dedo. Así que amplié un poco los botones y también extiendo un poco el área táctil con un fondo transparente.

Para cada botón, asigne el widget de botón a una función correspondiente.

Utilice el botón de reproducción como ejemplo:

lv_obj_add_event_cb(ui_ButtonPlay, playSong, LV_EVENT_CLICKED, NULL);

Y luego, en la función playSong, llame a la API ESP32-audioI2S:

void playSong(lv_event_t *e) 
{
if (isPlaying)
{
audio.pauseResume();
}
más
{
play_selected_song();
}
}

Enumeración de los archivos MP3 de la tarjeta SD

Antes de decirle a ESP32-audioI2S que reproduzca el archivo MP3, primero debemos buscar y enumerar los archivos MP3 de la tarjeta SD. Aquí está el extracto del código de read_song_list() que ilustra cómo concatenar la cadena de la lista de canciones separada por el carácter de salto de línea (\n):

Raíz del archivo = SD_MMC.open("/"); 
Archivo archivo = root.openNextFile();
while (archivo)
{
 if (archivo.isDirectory())
  {
   Serial.printf("DIR: %s\n", archivo.nombre());
  }
  else
  {
   const char *nombre de archivo = archivo.nombre();

   int8_t len ​​= strlen(nombre de archivo);
   const char *MP3_EXT = ".mp3";
   if ((nombre de archivo[0] != '.') && (strcmp(MP3_EXT, &nombre de archivo[len - 4]) == 0)) { // Serial.printf("
   Archivo
    de canción: %s, tamaño: %d\ n", nombre de archivo, archivo.tamaño());
    if (cuenta_canciones > 0)
    {
     stringSongList += '\n';
    }
    stringSongList += nombre de archivo;
    cuenta_canciones++;
   }
  }
  archivo = root.openNextFile();
}

Luego asigne la cadena de lista de canciones concatenada al componente de rodillo LVGL:

lv_roller_set_options(ui_RollerPlayList, stringSongList.c_str(), LV_ROLLER_MODE_INFINITE);

Mostrar caracteres Unicode

Mostrar caracteres Unicode

La compatibilidad con LVGL muestra caracteres Unicode, pero requiere un archivo de fuente Unicode. 

Control de volumen

Control del volumen

Asigne el control deslizante de volumen a una función de evento de cambio de valor:

lv_obj_add_event_cb(ui_ScaleVolume, volumenCambiado, LV_EVENT_VALUE_CHANGED, NULL);

Y luego, en la función de evento, llame a la API ESP32-audioI2S:

void volumenCambiado(lv_event_t *e) 
{
int16_t volumen = lv_slider_get_value(ui_ScaleVolume);
audio.setVolume(volumen);
}

La interfaz de usuario de progreso de tiempo también es un widget deslizante. Pero está demasiado cerca de los botones y la interfaz de usuario de control de volumen, por lo que deshabilité la entrada táctil para evitar una operación inesperada.Agregar sugerenciaPreguntaComentarioDescargar

Mostrar la información MP3 ID3

ESP32-audioI2S expuso una función de devolución de llamada audio_id3data(). La función es llamada para cada etiqueta ID3 que se encuentra en el archivo MP3.

En la función de devolución de llamada, simplemente concatene todos los datos en una cadena:

if (playingStr.length() > 0) 
{
playingStr += " ";
}
jugandoStr += info;

Luego asigne a una etiqueta para mostrar:

lv_label_set_text(ui_LabelPlaying, playingStr.c_str());

Mostrar una imagen de portada de MP3

ESP32-audioI2S expuso una función de devolución de llamada audio_id3image(). Se llama a la función si se encuentra una imagen de portada en la etiqueta MP3 ID3. La imagen puede ser cualquier formato de imagen, actualmente en soporte para decodificar y mostrar un archivo de imagen JPEG no progresivo.

En la función de devolución de llamada, copie los datos binarios:

archivo.buscar(pos); 
archivo.leer(coverImgFile, len);

Busque el encabezado JPEG:

tamaño_t idx = 11; 
while ((idx < len) && ((coverImgFile[idx++] != 0xFF) || (coverImgFile[idx] != 0xD8)))
;
--idx;

Luego decodifica con JPEGDEC:

jpegdec.openRAM(coverImgFile + idx, len - idx, jpegDrawCallback);

Agregar sugerenciaPreguntaComentarioDescargar

Mostrar las letras de las canciones en MP3

ESP32-audioI2S expuso una función de devolución de llamada audio_id3lyrics(). Se llama a la función si se encuentran letras sincronizadas, letras no sincronizadas o etiquetas de datos de texto en un archivo MP3.

En la función de devolución de llamada, copie los datos binarios:

archivo.buscar(pos); 
file.read((uint8_t *)lyricsText, len);

Decodificar texto binario a UTF8:

audio.unicode2utf8(letraTexto, largo);

Si el texto tiene una etiqueta de tiempo de sincronización, almacene el índice de tiempo en la matriz syncTimeLyricsSec[] y syncTimeLyricsLineIdx[].

Luego configure el texto de la letra en el widget de rodillo:

lv_roller_set_options(ui_RollerLyrics, lyricsText, LV_ROLLER_MODE_NORMAL);

Agregar sugerenciaPreguntaComentarioDescargar

Sincronizar las letras de la pantalla mientras se reproduce

Si se encuentra la etiqueta de letras sincronizadas, haga rodar el widget de letras mientras juega:

for (int i = 0; i < syncTimeLyricsCount; ++i) 
{
if (syncTimeLyricsSec[i] == currentTime)
{
lv_roller_set_selected(ui_RollerLyrics, syncTimeLyricsLineIdx[i], LV_ANIM_ON);
romper;
}
}

Mostrar analizador de espectro de audio

ESP32-audioI2S también expuso una función de devolución de llamada audio_process_i2s() para procesar la salida de audio. Podemos utilizar esta función para recopilar los datos de audio para visualizar el espectro de audio.

En la función de devolución de llamada, recopile los datos de audio:

raw_data[raw_data_idx++] = *muestra;

Si los datos están llenos, procese con la clase FFT:

if (raw_data_idx >= WAVE_SIZE) 
{
fft.exec((int16_t *)raw_data);
dibujar_fft_nivel_metro(canvasFFT_gfx);
lv_obj_invalidate(ui_CanvasFFT);
raw_data_idx = 0;
}

Nota: La visualización se dibuja en un lienzo, canvasFFT_gfx, por separado. Y el lienzo está asociado con el widget ui_CanvasFFT de LVGL.

Opcional: Carcasa

Un hermoso estuche para el dispositivo de desarrollo puede hacer que se parezca más a un reproductor de música.

Puede encontrar el estuche de escritorio WT32-SC01 PLUS en Thingiverse y luego imprimirlo en el color que le guste ( https://www.thingiverse.com/thing:6030590 )

Por cierto , todas las fuentes de imágenes, los proyectos de SquareLine Studio y el código fuente se pueden encontrar en Github:

https://github.com/moononournation/LVGL_Music_Player.git

Fuente: https://www.instructables.com/Design-Music-Player-UI-With-LVGL/?utm_source=newsletter&utm_medium=email

PZEM004 cambia de RS485 a ModBus RTU


El PZEM-004 es un monitor de energía de CA versátil y fácil de usar que es una buena opción para proyectos de domótica e IoT. Es relativamente barato y tiene una amplia gama de características, por lo que es un buen valor por su precio.

Aquí hay algunos detalles adicionales sobre el PZEM-004:

  • Dimensiones: 118mm x 60mm x 27mm
  • Peso: 100g
  • Temperatura de funcionamiento: de -10 a 60 grados Celsius
  • Precisión: 1,0 grado
  • Tipo de pantalla: Sólo digital
  • Puerto de comunicación: TTL
  • Rango de tensión: 80 a 260VAC
  • Rango de corriente: 0 a 100A
  • Rango de potencia: 0 a 22kW
  • Rango de energía: 0 a 9999kWh

El PZEM-004 es una opción popular para proyectos de domótica e IoT porque es relativamente barato y fácil de usar. Se puede utilizar para medir la tensión, la corriente, la potencia y el consumo de energía, lo que lo convierte en una herramienta versátil para monitorizar sistemas eléctricos. Asimismo El PZEM-004 también tiene una amplia gama de características, incluida la medición no invasiva, un amplio rango de voltaje, un alto rango de corriente y envio de datos. Estas características hacen del PZEM-004 una buena elección para una gran variedad de aplicaciones:

  • Medición no invasiva: El PZEM-004 no requiere ningún contacto físico con el circuito eléctrico, lo que hace que sea seguro de usar y fácil de instalar.
  • Amplio rango de tensión: El PZEM-004 puede medir voltaje de 80 a 260VAC, lo que lo hace compatible con una amplia gama de sistemas eléctricos.
  • Alto rango de corriente: El PZEM-004 puede medir corriente de 0 a 100A, lo que lo hace adecuado para medir el consumo eléctrico de grandes electrodomésticos.
  • Comunicación Modbus RTU: El PZEM-004 versión T puede comunicarse con otros dispositivos mediante el protocolo Modbus RTU, lo que facilita su integración con sistemas de domótica e IoT.


¿Amigo lector ha visto alguna diferencias con las características que siempre ha tenido este modulo? Pues en efecto las hay básicamente porque el fabricante PeaceFair además de añadir mas precisión ,ha cambiado el protocolo de comunicaciones que pasa de ser RS485 a ModBus RTU.

Para este producto , PZEM-004T es la versión de actualización para reemplazar la versión antigua. La versión antigua se ha agotado y ya no se produce ( pero no se alarme amigo lector porque hay un largo stock).

La información de actualización como sigue:

  1. La nueva versión tiene el mismo tamaño y el puerto TTL como antes
  2. El software es nuevo, tienen software Inglés como el mismo que el PZEM-014,016, el cambio de protocolo de comunicación para ser Modbus-RTU, la interfaz de visualización se cambia. Ahora se puede probar la tensión, corriente, potencia, factor de potencia, frecuencia y energía 6 parámetros.
  3. La nueva versión tiene mayor precisión, velocidad de actualización más rápida y la comunicación más estabilidad que la versión anterior.
  4. La nueva versión aumenta un conjunto de 0-10A

RS485 y MODBUS a menudo escriben juntos, pero ¿Cuál es su diferencia y relación?. RS485 es una interfaz física, simplemente hardware. MODBUS es un protocolo de comunicación estándar internacional para el intercambio de datos entre dispositivos de diferentes proveedores (generalmente para uso industrial).

El protocolo MODBUS se divide en MODBUS RTU, MODBUS ASCII y luego desarrolló MODBUS TCP tres modos:

Las interfaces de hardware físico utilizadas en los dos primeros (MODBUS RTU, MODBUS ASCII) son puertos de comunicación en serie (RS232, RS422, RS485) y MODBUS TCP es para cumplir con la tendencia de desarrollo actual del mundo, y cualquier cosa se puede conectar con la red Ethernet o Internet para transmitir datos. Entonces, el modo MODBUS TCP, la interfaz de hardware de este modo es el puerto Ethernet, que es el puerto de red común en nuestra computadora.

Atribuimos la red industrial a tres tipos: red RS485, red HART y red fieldbus.

  • Red HART: HART es un estándar de bus de transición propuesto por Emerson. Sobrepone principalmente señales digitales en señales de corriente de 4-20 mA. La capa física usa la tecnología de modulación por desplazamiento de frecuencia BELL202 para lograr las funciones de algunos medidores inteligentes. Sin embargo, este acuerdo no es un estándar verdaderamente abierto. Para unirse a su fundación, uno debe obtener un acuerdo y unirse a una tarifa por una parte de la fundación. La tecnología está monopolizada principalmente por varias grandes compañías extranjeras. En los últimos dos años, las empresas en el país lo han hecho, pero aún no han alcanzado el nivel de las empresas extranjeras. Una gran cantidad de medidores inteligentes ahora tienen tarjetas redondas HART y todos tienen capacidades de comunicación HART. Sin embargo, desde el punto de vista interno, no ha utilizado realmente esta parte de sus funciones. A lo sumo, solo ha utilizado el comunicador para establecer parámetros, no ha reproducido la función adecuada del medidor inteligente HART y no se ha conectado en red para monitorear el equipo. A largo plazo, debido a la baja velocidad de comunicación HART y las dificultades de red, el volumen de adquisición de los instrumentos HART disminuirá. Sin embargo, debido a que los instrumentos HART tienen un historial de más de 10 años, la cantidad de instrumentos HART es ahora muy grande. Para algunos integradores de sistemas, todavía hay mucho espacio disponible.
  • Red Fieldbus: la tecnología Fieldbus es uno de los puntos clave en el campo de la automatización en la industria de la automatización actual. Se conoce como una red de área local de computadora en el campo de la automatización. Su aparición marca el comienzo de una nueva era de tecnología de control de automatización. Fieldbus es una red de comunicación digital, en serie y de varias estaciones que conecta los instrumentos que están configurados en el sitio de control para controlar los dispositivos que están configurados en la sala de control. El signo clave es que puede admitir comunicaciones totalmente digitales bidireccionales, multinodo y tipo bus. En los últimos años, la tecnología de bus de campo se ha convertido en un punto caliente en el desarrollo de la automatización e instrumentación en el mundo. Su apariencia es un cambio revolucionario en la estructura de los sistemas de control tradicionales. Es un sistema inteligente, digital, de información, de red y de automatización descentralizada. La dirección del movimiento, la formación de un nuevo tipo de red integrada sistema de control distribuido completo — sistema de control de bus de campo FCS (sistema de control de bus de campo). Sin embargo, varios estándares para fieldbus ahora existen en paralelo y tienen sus propias áreas de supervivencia. No hay un estándar verdaderamente unificado. La clave es no ver cuándo pueden formar un estándar unificado y la tecnología no es lo suficientemente madura. Además, los tipos de instrumentación en el bus de campo son todavía relativamente pequeños y hay poco espacio para la selección, y el precio también es alto. Desde la perspectiva de los usuarios finales, la mayoría de ellos todavía están en modo de espera y espera. Todos quieren esperar hasta que la tecnología esté madura y considerar su implementación.
  • Red RS485: RS485 / MODBUS es un popular modo de red de tela, que se caracteriza por una implementación simple y conveniente, y ahora admite cada vez más instrumentos RS485, especialmente en la industria petrolera RS485 / MODBUS simplemente domina el mundo, el instrumento actual Las empresas tienen también se convirtió en compatible con RS485 / MODBUS. La razón es muy sencilla. Al igual que el instrumento HART original, es muy difícil y costoso comprar un puerto de conmutación. La interfaz del conmutador RS485 es mucho más económica y variada. Al menos en el mercado de gama baja, RS485 / MODBUS también será el método de red más importante y no cambiará en los próximos dos o tres años.

¿DIFERENCIAS ENTRE MODBUS RTU Y RS485?

Modbus RTU y RS485 son dos tecnologías diferentes que a menudo se utilizan juntas en aplicaciones de automatización industrial. Como ya se ha comentado Modbus RTU es un protocolo de comunicación serie que se utiliza para transmitir datos entre dispositivos de una red. Es un protocolo maestro-esclavo, lo que significa que hay un dispositivo maestro que inicia la comunicación y uno o más dispositivos esclavos que responden a las peticiones del maestro. Modbus RTU utiliza una conexión monofilar o multifilar para transmitir datos y puede admitir hasta 32 dispositivos esclavos en una misma red.

RS485 es un estándar de capa física que define las características eléctricas y mecánicas de una interfaz de comunicación serie. Es una norma de señalización diferencial, lo que significa que utiliza dos conductores para transmitir datos. Esto hace que RS485 sea más resistente al ruido y a las interferencias que otros estándares de comunicación serie, como RS232. RS485 puede soportar hasta 127 dispositivos en una sola red.

En la práctica, Modbus RTU suele implementarse sobre RS485. Esto se debe a que RS485 proporciona las características eléctricas y mecánicas necesarias para que Modbus RTU funcione de forma fiable en entornos industriales.

A continuación se muestra una tabla que resume las principales diferencias entre Modbus RTU y RS485:

FeatureModbus RTURS485
ProtocolSerial communication protocolPhysical layer standard
Data transfer rateUp to 19.2 kbpsUp to 100 kbps
Number of devices supportedUp to 32Up to 127
Electrical characteristicsSingle-wire or multi-wireDifferential signaling
Mechanical characteristics5-volt TTL or 12-volt EIA-2325-volt TTL
Noise immunityLowHigh
CostLowModerate


A continuación se ofrecen algunos detalles adicionales sobre las dos tecnologías:

Modbus RTU

  • Modbus RTU es un protocolo de comunicación serie que se desarrolló a principios de la década de 1980. Se trata de un protocolo sencillo y eficaz, muy adecuado para aplicaciones de automatización industrial.
  • Modbus RTU utiliza una conexión monofilar o multifilar para transmitir datos. Los datos se codifican como una serie de bytes de 8 bits.
  • Modbus RTU admite diversos tipos de datos, como entradas discretas, entradas analógicas, salidas discretas y salidas analógicas.
  • Modbus RTU es un protocolo maestro-esclavo. Esto significa que hay un dispositivo maestro que inicia la comunicación y uno o más dispositivos esclavos que responden a las peticiones del maestro.
  • Modbus RTU es un protocolo ampliamente utilizado en la automatización industrial. Es compatible con una amplia gama de dispositivos, incluidos PLC, HMI y sensores.


RS485

  • RS485 es un estándar de capa física que se desarrolló a principios de la década de 1980. Se trata de un estándar de señalización diferencial muy adecuado para aplicaciones de automatización industrial.
  • RS485 utiliza dos conductores para transmitir datos. Esto hace que RS485 sea más resistente al ruido y a las interferencias que otros estándares de comunicación serie, como RS232.
  • RS485 puede soportar hasta 127 dispositivos en una sola red.
  • RS485 es un estándar de capa física muy utilizado en la automatización industrial. Es compatible con una amplia gama de dispositivos, incluidos PLC, HMI y sensores.

Diferencias en la implementación con Arduino

En efecto hay algunas diferencias entre implementar una solución para el PZEM-004 con un ESP32 utilizando RS485 o Modbus RTU.

RS485 es un protocolo de capa física que define cómo se transmiten los datos a través de una línea serie. Modbus RTU es un protocolo de comunicación que define cómo se intercambian los datos entre dispositivos.

Cuando se utiliza RS485, el ESP32 tendrá que configurarse para utilizar la capa física RS485. Esto puede hacerse configurando la velocidad en baudios, la paridad y los bits de parada adecuados. Si se utiliza Modbus RTU, el ESP32 deberá configurarse para utilizar el protocolo de comunicación Modbus RTU. Para ello, necesitamos configure la dirección del esclavo, los códigos de función y los registros adecuados.

Además, cuando se utiliza Modbus RTU, el ESP32 tendrá que ser capaz de interpretar el formato de datos Modbus RTU. Este formato de datos es un formato binario diferente del formato ASCII que utiliza RS485.

A continuación se muestra una tabla que resume las diferencias entre RS485 y Modbus RTU:

FeatureRS485Modbus RTU
Physical layerElectricalSerial
Communication protocolNoneYes
Data formatASCIIBinary
ConfiguationBaud rate, parity, stop bitsSlave address, function codes, registers
InterpretationASCIIBinary

En general, la principal diferencia entre RS485 y Modbus RTU es que Modbus RTU es un protocolo de comunicación completo, mientras que RS485 es sólo un protocolo de capa física. Esto significa que cuando se utiliza Modbus RTU, el ESP32 tendrá que ser configurado para utilizar tanto el protocolo de comunicación Modbus RTU como la capa física RS485.

Aqui amigo lector dejamos algunos detalles del protocolo usado en las nuevas versiones: