Mostrando entradas con la etiqueta Programación. Mostrar todas las entradas
Mostrando entradas con la etiqueta Programación. Mostrar todas las entradas

domingo, 22 de junio de 2025

Script Bash para mantenimiento de Raspberry Pi

Muy buenas a todos y todas!!

Normalmente lo más tedioso y aburrido es poner en orden todos los programas básicos para nuestra Raspberry pi, sobre todo en modelos anteriores a la Raspberry pi 4.

El problema suele se la potencia limitada con las que cuentan las Raspberry Pi2 y Raspberry Pi 3, ambos modelos unicamente cuentan con 1 Gb de RAM.

Si bien esto no impide poner un sistema gráfico, el rendimiento no es el mejor. Este articulo va dedicado a los que prefieren el uso de la terminal para el manejo de estos versátiles ordenadores.

domingo, 8 de junio de 2025

Raspberry Pi 3B+ Alimentación con LM2590

Muy buenas a todos los amantes de la informática!!!

Hace poco hemos desempolvado unas Raspberry Pi (2x3B + 1x3B+) estaban montadas en un rack y les fui dando diferentes usos hasta que ya los deje un poco de lado por que casi siempre había problemas de alimentación.

Con ellas hemos visto algunos proyectos como la pantalla oled I2C o el uso del PWM para controlar el ventilador de la Raspberry Pi.

En mucho foros y paginas de internet hay referencia al temido mensaje "low-voltage". Este error es debido a que el chip que se encarga de entregar la energía a la Raspberry Pi detecta un voltaje por debajo de los 4.65V.

En este caso usaba una fuente de 3A que iba de maravilla cuando se estaba usando solo una de ellas y aún así al conectar un disco duro sata con conexión USB. En este punto la Raspberry Pi 3B+ arrancaba con el dichoso mensaje pero el disco duro no, y muchas veces ni si quiera arrancaba.

Este mensaje aparece al llegar a los 4.65V. Sabiendo esto medimos los pines +5V y GND del puerto GPIO y si, las sospechas se confirman, incluso sin el HDD el voltaje nunca llegaba a los 5V.

Entre las diferentes soluciones pasan por un buen cargador y un buen cable de alimentación. para este caso se decidió poner una fuente de alimentación de PC Usando la salida de 5V que puede entregar hasta 30A lo que es más que suficiente para alimentar las 3 Raspberry del proyecto.

Tampoco funciono...

Para este punto la frustración era máxima. Pero entro en juego una placa basada en el integrado LM2590.

¿Que es el LM2590?

El LM2590 es un circuito integrado regulador de voltaje. Y voltaje es lo que le falta a la Raspberry. Lo más interesante es el potenciómetro con el que podemos regular hasta el voltaje que queramos. Estas son los valores de entrada y salida así como la corriente capaz de entregar:

  • Tensión de entrada: 4V - 40V
  • Tensión de salida: 1.25V - 37V
  • Corriente máxima: 3A

Así que si medimos en los puertos USB 4.80V, con el potenciómetro podremos regular esos 0.20V que nos hacen falta.

Esto no es una regla de tres, para poder conseguir el voltaje adecuado hay que tener en cuenta que solo podemos subir a un máximo de 5.3V según las especificaciones

Para esta Raspberry Pi 3B+ lo he dejado en 5.15V aunque el display muestre 5.25V. También hay que tener en cuenta que este LM2590 alimenta al HDD mecánico y, sobre todo en el arranque, necesita un extra de potencia.

Por el momento he conectado la alimentación de la Raspberry y el HDD así:


Y en la siguiente fotografía se puede ver la medición con el voltímetro del voltaje que sale hacia los dispositivos:

Como se observa son diferentes dependiendo de si tienen carga o no, en fotografía superior se ve como marca los 5.30V pero realmente salen 5.20V.

Al aplicar la carga (RPI 3B+ + HDD + ventiladores) ese valor fluctuá un poco durante el arranque, pero una que ha cargado el sistema y esta en reposo, el voltaje se mantiene a 5.25V que marca el display y los 5.15V que tenemos realmente si medimos con el voltímetro.


Conclusión:

Y ya está! Después de tantos quebraderos de cabeza el modulo LM2590 es la solución que mejor ha funcionado después de varias pruebas entre cargadores y fuentes de PC.

Estamos pendientes de recibir un par de módulos más para las otras 2 Raspberry Pi 3B que están sin funcionar por el mismo problema.

Y bueno hasta aquí hemos llegado esta semana solucionando este pequeño pero insufrible problema "Low Voltage" que estaban sufriendo las Raspberry.

Esto es aplicable a casi todas las Raspberry Pi, tanto para 3 como 4, aunque para esta ultima no hemos realizado ninguna prueba ya que no tenemos ninguna disponible. Pero en casi todos los artículos y foros en los que se ha comentado, parecen tener el mismo problema.

Con esto no queremos decir que las Raspberry tengan ningún problema, pero imagino que intentamos usar cosas que tenemos por casa, como cargadores o en mi caso una fuente de PC un poco "destartalada" y si no hay un tanto un voltaje de 5.1V como la capacidad de entregar hasta 3A, no tendremos un funcionamiento optimo del sistema.

Aquí podemos descargar las hojas de datos (datasheet) de los diferentes chips y partes como cámaras o sensores para Raspberry Pi.

Muchas gracias a todos! Saludos!

viernes, 30 de mayo de 2025

Restauración ZX Spectrum +2 Gris - Limpieza y puesta a punto

Buenas amigos y amigas de los retro!!!

Con un presupuesto de 80€ me propuse encontrar en la web de venta de segunda mano, Wallapop, algún aparato retro que tanto nos gustan.

Le tenía echado el ojo al ZX Spectrum +2 pero en unas condiciones aceptables no encontraba gran cosa por menos de 100€. Y a muchos les faltaba el transformador o no estaba muy claro su funcionamiento.

En una de estas apareció este:

ZX Spectrum desde Wallapop

Tenía una pinta un poco rara... pero incluía el transformador, un joystick SJS-1 y el manual de usuario.

Cuantas más fotos veía.. la cosa no mejoraba....

Transformador original

Joystick SJS-1

Sin duda lo que mejor estaba era el manual de usuario.

No lo pensé mucho y lo compré... ¿había sido una buena idea? El vendedor se puso en contacto conmigo y hablamos sobre la máquina. Fue sincero desde el primer momento y me comento el mal estado en el que se encontraba este ZX Spectrum +2 y que había estado por mucho tiempo en un trastero. Incluso me envío vídeos del estado. La verdad, de 10.

Después de recibir el paquete empezamos con la limpieza, es preferible tenerlo limpio antes de trabajar con el. Esto ya se ha comentado más de una vez en el blog.

Empezamos desmontando todo y comprobando el estado de las piezas.

Con las "tripas" del Spectrum a la vista todo parece estar correcto. Mucha suciedad mucha.... pero todo lo demás como se puede ver esta completo.

Lo que no es tan correcto es poner componentes encima de la protección de burbujas, esto puede crear corriente electrostática y malograr algún componente. No lo hagáis en casa ;)

Una de las partes más perjudicadas en todos los elementos del ZX Spectrum eran las carcasas. Por suerte, solo era eso, restos de décadas de olvido en un trastero.

En este caso el corazón de la bestia sigue aparentemente en buenas condiciones. No hay restos de oxido o de liquidos derramados. Los condensadores también parecen en buen estado y si falla alguno son fáciles de reemplazar (siempre que no dañen otro componente).

ZXSpectrum +2 128K placa Z70500 ISS3

El teclado también tenía mucha suciedad pero las pulsaciones eran correctas.

La casetera más de lo mismo...

Ahora empieza lo interesante... Con todos los elementos fuera procedemos a la limpieza: NOTA: El agua y la electricidad no son muy amigos, recuerda secar completamente todos los elementos de cualquier resto de humedad.

Para esta parte, mis mejores aliados son el barreño (verde), jabón de cocina y un pincel suabe. En ultima instancia podemos usar desengrasante, pero puede ser muy agresivo con la pintura y las pegatinas.

Como ya hemos comentado un buen secado es imprescindible antes de empezar a montar el equipo.

Al final la placa, una Z70500 ISS3 en cuanto a suciedad, era lo más limpio, todo lo demás tuvo dos pasadas de barreño...

Después de muchas horas de investigación la mejor opción para probar la placa, ya que no tengo ningún cable para su conexión con la TV era usar la conexión AV de la que no dispone. El ZX Spectrum +2 cuenta con salida RF y una salida RGB. Pero con una pequeña modificación podemos obtener esta señal. Solo necesitamos una resistencia de 15 ohmios.

La conexión se realiza entre el vivo del conector de RF (la parte central) y primero tenemos que retirar la resistencia que ya tiene conectada. Solo hay que desoldarla y proteger la punta de la resistencia para que no haga contacto con otro componente.

Ahora soldamos la resistencia de 15ohm en la misma posición en la questaba la otra y aprovechando un agujero que hay en un lateral de la caja de RF, la pasamos por ahí y el otro extremo le soldamos un cable que llevamos a la salida del diodo D4.

Diagrama conexión para modificación AV

Este diodo se encuentra en la parte posterior del conector 8DIN y viene desde el integrado TEA2000 en su patilla 6 COVO (Composite Video Out). Es recomendable limpiar el conector del AV ya que si hace mucho que no se usa, puede tener una película de suciedad (oxido) que hace que la conexión no sea la correcta.

Es muy interesante tener a mano el manual de servicio, no confundir con el manual de usuario. Gracias a theoldrobot.com que lo tienen disponible online.

Una vez hecho esto toca presentar todo para hacer una primera prueba de encendido. Enchufamos todo y....

ZXSpectrum +2 128K vídeo AV

Y se hace la magia ochentera!!!

La calidad de imagen no es excelente, pero por lo menos puedo comprobar que el ZX Spectrum +2 gris funciona perfectamente. Es simplemente increíble que aparatos con más de 30 años funcionen perfectamente solo con un poco de limpieza y cariño. A ver si aprenden nuestros fabricantes contemporáneos...

Antes de cerrar decidí aventurarme con otra modificación, en concreto con el mod de audio.

¿En que consiste el mod de audio para el ZX Spectrum?

El sistema de carga de este microordenador es el antiguo sistema de cintas, si como las que, si ya tiene una edad, escuchabas en tu flamante walkman o en el coche. Si bien este sistema era muy de agradecer en los 80's debido a su bajo coste, hoy en día es una rareza, como los discos de 3.5.

Por suerte a día de hoy existen bastantes alternativas basadas en Arduino y otras tantas en Android, cada una con sus ventajas e inconvenientes. Y esta modificación es valida para los dos sistemas.

En ambos casos la modificación del sistema de audio nos permitirá cargar las cintas, en este caso audios, directamente a la placa del reproductor de casete. De esta manera nos saltamos el cabezal y prácticamente no necesitaremos más la parte mecánica del reproductor.

Para esta modificación he seguido una explicación de Manuel Cuenca Chips donde explica los puntos donde es mejore o peor dicha conexión. Esta variación dependerá de si el sistema que estamos usando esta amplificado o no.

¡¡¡ATENCIÓN!!! Existen diferentes tipos de placa para la casetera, comprueba cual es la tuya.

Vamos a intentar darle un poco de luz al tema...

Primera opción

La primera opción es el conector donde se enchufa el reproductor de cintas. El problema de estos pines es que necesitamos que la fuente de la que proviene el audio tiene que estar amplificada. En este caso solo servirían reproductores de cintas con un amplificador interno. Para usarlo con dispositivos tipo TZXduino o teléfonos móviles necesitamos la segunda opción.

Y consiste en soldar el cable del + del RCA en el punto que transmite la información directamente a la placa. Este punto ya viene amplificado desde integrado de amplificación LA6324A. Al conectarlo en la salida no hacemos uso de ese integrado y la señal tiene que llegar ya amplificada.

Segunda opción:

El reproductor del ZX Spectrum lleva integrado un amplificador y en este modelo en particular es el LA6324A y esta situado en la misma placa del reproductor de casete que podemos usar si queremos utilizar los dispositivos que acabamos de comentar.

Al fina me decidí a usar la segunda opción del amplificador internoLA6324A y aún así he necesitado amplificar la señal con un LM386 que, por suerte, tenía disponible.

Hay muchos circuitos para el LM386 disponibles en internet pero he usado un pequeño módulo de apenas 0.80€ que tenía por el taller.

Con esto logramos aumentar la señal de tal manera que el ZX Spectrum "escuche mejor". Para esta operación solo necesitamos 6 cables, 4 para la alimentación y 2 para la salida de audio.

El LM386 lo podemos alimentar con los 5 voltios desde la misma casetera, igual que la salida y entrada de audio. Estas son sus conexiones:

ZXSpectrum +2 128K - conexión amplificador LM386

  • Alimentación +5V: Tomaremos los 5V desde el casete.
  • Entrada de audio +: Toma + desde el RCA.
  • Entrada de audio -: Toma - desde el RCA.
  • Masa de alimentación (GND): Tomaremos GND desde el casete.
  • Salida de audio +: A la placa del casete.
  • Salida de audio -: A la placa del casete. Es común con GND de alimentación.

En la parte de las pistas de la placa del casete solo necesitamos estos 3 puntos de conexión:

ZXSpectrum +2 128K conexión casete
  • 1-. Toma de alimentación de 5V
  • 2-. Toma de masa o GND. Aquí conectamos las lineas marcadas como GND de la entrada de alimentación y el GND salida de audio
  • 3-. Entrada de audio.

El conjunto entero queda con la siguiente configuración:


Montaje final

Ya con todo montado tocaba probar el invento. Hay que decir que probamos primero sin amplificación, es decir con el programa PlayZX en el teléfono y el cable de audio directamente al mismo punto pero, aunque se escuchaba a través de spectrum en la tv, no se movían las lineas que indican que se esta cargando una cinta.

Solo tuve que regular el volumen hasta que empezaron a moverse las lineas... en un principio dio fallo de carga, pero poco a poco fuero apareciendo las famosas lineas de carga hasta que empezó a mostrar la imagen del juego que estaba cargando (1942). No solo estaba vivo, también funcionaba perfectamente.

ZXSpectrum +2 128K

Conclusión:

Ha sido un proyecto al que le tenia muchas ganas, bueno en general le tenia ganas a estas tres joyas retro, sobre todo después de ver vídeo sobre programación del Profesor Retroman. Un profesor de la Universidad de Valencia (creo) con explicaciones de sobre programación o el uso de la memoria.

Y aunque están basados mayoritariamente en ordenadores Amstrad, y ya me pico la curiosidad. Ahora con la Gotek y con esta modificación de audio (que también llevare al CPC464) se hace más fácil hacer todo tipo de pruebas.

También puede parecer que estos sistemas obviamente obsoletos en pleno 2025 no tienen ningún uso práctico pero son una gran plataforma para empezar a entender la programación desde el bajo nivel hará que mejore nuestra programación en alto nivel.


NOTA:
Todo lo mostrado en esta entrada esta realizado con el máximo cuidado y siguiendo varios tutoriales. Todo lo que realices a tú máquina queda bajo la responsabilidad del usuario.

Os dejamos algunos enlaces en los que hay gran cantidad de información sobre el ZX Spectrum.

Saludos retro!!!


miércoles, 18 de diciembre de 2024

La maqueta de Infotronikblog

Muy Buenas Arduineros y Arduineras!!!

Hace ya un tiempo, cuando empecé a programar, descubrí uno de los programas que más alegrías me ha dado desde que me dedico a esto. La central DCC++...

Hoy traigo al blog lamaquetade.infotronikblog.com una web dedicada al modelismo ferroviario y a la central DCC creada con Arduino.

Aunque no solo esta dedicada a la electrónica sino que también podemos encontrar trucos para la decoración de maquetas como un aplicador de césped electroestático o software dedicado al modelismo ferroviario como Rocrail o JMRI

Aunque el mayor premio se lo llevan la librería para el control de trenes DCC llamada DCCpp LMD y el software para Android con el que controlar esta y otras centrales DCC llamado DCCpp Android Cab.

Veamos algo más sobre este software:

La librería DCCpp LMD


DCCpp LMD es una librería que incluye todo lo necesario para montar una central DCC (Digital Command control) desde las funciones básicas hasta tener pantalla, comunicación Bluetooth y Wifi.

Características principales:

  • Flexibilidad: Una central DCCpp LMD es altamente configurable, lo que permite adaptarla a las necesidades específicas de cada maqueta. Puedes personalizar la configuración de las locomotoras, los accesorios, sensores y los diferentes aspectos de las operaciones de tu trenes.
  • Escalabilidad: DCCpp LMD cuenta con una amplia variedad de módulos y accesorios disponibles, como módulos S88 para detectar la ocupación de vías, módulos de radiofrecuencia para control remoto y mucho más. Esto te permite ampliar las funcionalidades de tu maqueta según tus necesidades.
  • Autonomía: Aunque la comunicación serial es su base, la central DCCpp LMD puede operar de manera autónoma gracias a la adición de una pantalla OLED, un teclado y un encoder rotatorio. Esto te permite controlar tus trenes directamente desde la central sin necesidad de una ordenador o teléfono inteligente.
  • Comunicación serial: Al comunicarse a través de serial facilita su integración con otros dispositivos y sistemas. Esto te permite conectar la central a un ordenador, un Arduino o cualquier otro dispositivo con capacidad serial.
  • Automatización: La DCCpp LMD se puede programar para realizar secuencias de comandos automáticas, como la simulación de horarios de trenes o la activación de señales.

Y estas son las opciones principales que nos ofrece la central DCCpp LMD con respecto a las locomotoras:

  • Direcciones de locomotoras de 2 y 4 bytes.
  • Velocidad de 128 pasos.
  • Programación en pista principal.
  • Control simultaneo de múltiples locomotoras.
  • Control de todas las funciones de cabina F0-F28.
  • Activación y apagado de todas las direcciones de accesorios 0-2048.
  • Programación en vía de programación.
  • Pantalla Oled 128*64 I2c.
  • Puertos seriales extras.

Ahora que ya hemos visto sus características y funciones principales...

¿Porqué existe DCCpp LMD y por que la uso?

La central DCC+ Base Station creada por Gregg E. Berman hace ya más de 9 años, revoluciono de una manera económica y sencilla el uso de las locomotoras que tienen incorporado un decodificador DCC

Estas centrales de tipo comercial, por lo general, tienen un coste elevado que añadido al coste de los decodificadores no hacía que fuera un entretenimiento asequible al bolsillo de cualquier aficionado.

Después de la central DCC++ Base Station todo eso cambio. Era relativamente sencillo conseguir una placa Arduino UNO y un MotorShield, podías encontrar los dos componentes en paginas webs por menos de 10€.

Visto esto y con mi consabida afición a los trenes en miniatura, ya sabes.. - ¿que hay mejor que un tren? - Dos trenes. decidí hacerme con todas las piezas y montar este cacharro y ver si daba lo que prometía... y vaya si lo hizo!!! Locomotoras y accesorios funcionaban al 100%, incluso se le podía añadir un sensor de consumo para prevenir cortocircuitos

No pude resistir el conocer a fondo como funcionaba, cuales eran sus entresijos, como recibía los datos con la comunicación serial y los distribuía entre las diferentes funciones así que termine empapándome de todo lo relacionado con esta central.

Finalmente llego a mi navegador de la mano de LocoDuino el mismo programa, pero en formato librería y paso a llamarse DCCpp. Nunca había tocado una librería... fue otro retro más que tenia que resolver. 

Después de un tiempo había añadido la pantalla Oled y el uso de los demás puertos seriales que tiene disponibles la placa Arduino MEGA. Por que si, para esta central, la placa que mejor se adapta tanto a el hardware como al software es la  placa Arduino MEGA. Sobre el 2020 la librería DCCpp dejo de actualizarse siendo su última versión la número 1.4.2. Una autentica pena la verdad.

Después de esto o incluso mientras otras centrales DCC surgieron de esta idea, la más destacada ahora mismo es la DCCEX. La rama americana de esta central. Ahí me perdí... Es un proyecto enorme en el que contribuyen muchas personas con mucho código que, si bien cubren las necesidades de muchos otros usuarios, para mi eran excesivas. Realmente no necesitaba tanto.

Volví a mi proyecto de la librería DCCpp modificada y pase a llamarla DCCpp LMD. La librería desde la que parte el proyecto, la V1.4.2, ya tiene todas las funciones que necesito, además de ser compatible con el software de gestión de trenes. Partiendo de esa base, fui añadiendo diferentes funciones y funcionalidades, mejorando el código en la medida de lo posible y adaptándola a mi maqueta.

Puedo programar secuencias de eventos, monitorear el consumo de corriente en tiempo real, detección con diferentes tipos de sensores, comunicación Bluetooth y wifi. Esto añadido al programa Rocrail, hace que me pueda pasar tardes enteras "jugando" con los trenes que tienen instalado un decodificador DCC,. Por desgracia no todas mis pequeñas cuentan con uno de estos decodificadores.

Si te gustan los trenes el modelismo y el sistema DCC y quieres descubrir como Arduino es capaz de adaptarse a cualquier entorno visita Lamaquetade.infotronikblog.com

Pantalla de llegada de trenes Adif - Lamaquetade.infotronikblog

Descargar librería DCCpp LMD para el control de locmotoras desde GitHub.

Decodificadores DCC realizados con Arduino en GitHub

Espero que te guste el contenido sobre Arduino y trenes y sobre todo que os guste la web, Saludos y felices fiestas!!!

miércoles, 20 de noviembre de 2024

ESP8266 Como usar LittleFS para guardar información

Antes de seguir con otro proyectos tenemos que detenernos en el apartado de los sistemas de ficheros (FS).

Si aunque no lo parezca, el ESP8266 tiene una memoria interna (Flash) con mucha más capacidad que sus primos Arduinos. Si bien dependiendo del ESP8266 tendremos diferentes capacidades de memoria.

Los ESP8266 más pequeños como el ESP8266-01 con 1MB y el ESP8266-01S que tiene 4MB. Y a partir de aquí casi todos los demás modelos ESP8266 tienen mínimo 4MB.

Esta cantidad de memoria suele ser más que suficiente para nuestros proyectos, pero si necesitas más memoria como por ejemplo para una estación meteorológica desatendida se puede utilizar un módulo al que podemos conectar una memoras SD o microSD.

De esta manera y siguiendo el ejemplo de la estación meteorológica, podríamos almacenar los datos de todo un mes y luego simplemente sacar la tarjeta y volcar los datos a nuestra computadora.

Hasta aquí la idea de tener alrededor de 3 (o más) MB disponibles suena muy bien, ahora, ¿como interactuamos con esta memoria?

Diferentes sistemas de archivos para ESP8266

  • SPIFFS:
    SPI Flash File System, es un sistema de archivos diseñado específicamente para dispositivos embebidos con poca memoria como el ESP8266.
  • LittleFS:
    La alternativa más reciente a SPIFFS, diseñada para ser más eficiente en cuanto al uso de la memoria y más robusta ante errores. Ofrece mejores prestaciones en términos de velocidad y capacidad de recuperación.
  • FAT:
    Un sistema de archivos ampliamente utilizado en dispositivos de almacenamiento masivo. Sin embargo, su implementación en microcontroladores como el ESP8266 puede ser más compleja y consumir más recursos.

Con todos los sistemas de archivos podremos manejar las funciones básicas con archivos:

  • Crear
  • Abrir
  • Leer
  • Escribir
  • Borrar
  • Formatear unidad

Para este ejemplo usaremos LittleFS, tiene algunas mejoras en eficiencia y control de errores que su hermana SPIFFS.

Instalación de la librería:

La Librería LittleFS viene incluida cuando instalamos y configuramos las placas esp8266 al IDE de Arduino, así que por esa parte no necesitamos hacer nada más, simplemente cargar la librería como cualquier otra:


#include "LittleFS.h"


Funciones básicas LittleFS

A partir de aquí veremos las diferentes funciones básicas de LittleFS, empezando por su configuración en el setup(). Al final del mismo tenemos las diferentes funciones que podemos utilizar:


#include "LittleFS.h"

String data = "FS ESP8266 Flash memory test";


void setup() {
  Serial.begin(115200);
  delay(100);
  
  // Monta el sistema de archivos
  if (!LittleFS.begin()){
    Serial.println("Error montando LittleFS");
    return;
  } 

  Serial.println("\n\nLittleFS se cargo correctamente");

  Create_file("/data.txt", data);
  Read_file("/data.txt");
  Delete_file("/data.txt");
  
  // Add_data_file("/data.txt", data);
  // Read_file("/data.txt");
  // Show_filetree("/");
  // Show_memory();
  // Format_all();
  Serial.println();
}


  • Create_file("/FILENAME", data);
    Crea el archivo FILENAME y almacena los datos del String "data".


// Create_file("/data.txt", data);

void Create_file(const char *path, String data)
{
  Serial.println(path);
  File file = LittleFS.open(path, "w");
  if (!file){
    Serial.println("Error open file");
    return;
  }

  if (file.print(data)){
    Serial.println("Writing file...");
  } else {
    Serial.println("Error Writing");
  }
  file.close();
}


  • Add_data_file("/FILENAME", data);
    Añade datos al final del archivo FILENAME. El archivo tiene que estar creado previamente.


// Add_data_file("/data.txt", data);

void Add_data_file(const char *path, String data)
{
  Serial.println(path);
  File file = LittleFS.open(path, "a");
  if (!file){
    Serial.println("Error open file");
    return;
  }

  if (file.print(data)){
    Serial.println("Writing data...");
  } else {
    Serial.println("Error Writing");
  }
  file.close();
}


  • Read_file("/FILENAME");
    Lee los datos almacenados en el archivo FILENAME


// Read_file("/data.txt");

void Read_file(const char *path)
{
   File file = LittleFS.open(path, "r");
  if (!file){
    Serial.println("Error open file");
    return;
  }

  Serial.println("File content: ");
  while (file.available())
  {
    Serial.write(file.read());
  }
  Serial.println();
  file.close();
}


  • Delete_file("/FILENAME");
    Borra el archivo seleccionado


// Delete_file("/data.txt");

void Delete_file(const char *filename)
{
  if (LittleFS.remove(filename)){
    Serial.print("Removed ");
    Serial.println(filename);
  } else {
    Serial.println("Deleting error");
  }
}


  • Format_all();
    Elimina todos los datos de la memoria Flash (Esta acción no se puede deshacer).


// Format_all();

void Format_all()
{
  if (!LittleFS.format()){
    Serial.println("Error montando LittleFS");
    return;
  } else {
    Serial.println("All files deleted");
  }
  LittleFS.end();
}


  • Show_filetree("/");
    Muestra la árbol de archivos y directorios desde la raíz "/".


// Show_filetree("/");

void Show_filetree(const char *path)
{
  Dir folder = LittleFS.openDir(path);
  while (folder.next())
  {
    File file = folder.openFile("r");

  Serial.print (" Name: ");
  Serial.print (file.name());
  Serial.print (" Size: ");
  Serial.print (file.size());
  Serial.print (" Folder:");
  Serial.print (file.isDirectory() ? "Yes" : "No");
  Serial.println ();
  file.close();
  }
    Serial.println("End file off filetree");
}


  • Show_memory();
    Muestra el uso de memoria y cuanta memoria tenemos disponible


// Show_memory();

void Show_memory()
{
  FSInfo fs_info;
  LittleFS.info(fs_info);

  Serial.print("Used: ");
  int used = fs_info.usedBytes / 1024;
  Serial.print(used);
 
  Serial.print(" total Kbit: ");
  int total_kbits = (fs_info.totalBytes / 1024);
  Serial.print(total_kbits);
  Serial.print(" Used Kbits Used Memory: " );
  int used_memory = (fs_info.usedBytes / fs_info.totalBytes) * 100;
  Serial.print(used_memory);
  Serial.println();
}


Un punto importante del uso de archivos, es que una vez que terminemos de usar el archivo tenemos que cerrarlo con file.close().

Esto nos evitará perdida de información o que se pueda corromper el archivo.

Lo mejor es que en esta memoria podemos almacenar cualquier tipo de información, desde archivos de texto o archivos html o css.

Por el momento esto es todo, pero se vienen proyectos usando esta memoria. Si te ha gustado tienes el programa completo en mi repositorio.

Librería LittleFS desde GitHub

Descargar ejemplo con ESP8266 librería LittleFS desde GitHub

Saludos!!!

viernes, 25 de octubre de 2024

ESP32 oled 128x32 velocímetro RC Dashboard

Muy buenas a todos Arduineros y Arduineras!!!

Librería Adafruit
Ya os presente uno de los mejores proyectos para Radio Control el ESP32 Engine sound. En este proyecto una de las últimas opciones que implementaron fue la pantalla con velocímetro o dashboard

En ese apartado, se sincroniza una pequeña pantalla de 160x80 con conexión SPI. Simplemente genial.

¿Cual es mi problema con esto? Pues en principio ninguno, pero no disponía de una pantalla SPI, pero si una OLED de 128x32 y

conexión I2C

Librería U8g2Lib

El panel original viene un frok del ESP32 Engine Sound original al que como hemos comentado, se le añadió la pantalla con cuatro relojes, Velocidad, RPM, Gasolina y ADblue y los iconos de las funciones más comunes en todos los vehículos.

Como me pareció sencillo, decidí probar si ese código se podría portar a una pantalla I2C. Para la comunicación I2C con la pantalla he probado las 2 librerías más famosas para la pantalla SSD1306, la librería U8g2Lib y la librería Adafruit_SSD1306 siendo esta última la que me mejor a funcionado.

El proyecto lo he dividido en 2 partes, la primera es para usarlo de manera independiente y la segunda es con la pantalla ya integrada en el sistema ESP32 Engine Sound.

Los componentes que se han utilizado para el proyecto son los siguientes:

  • ESP32 WROOM Dev Kit V1
  • Oled SSD1306 128x32 I2C

Para no liar con lo que ya esta hecho, primero he renombrado los archivos dashboardc.cpp y dashboard.h a dashboardi2c.cpp dashboardi2c.h. y borrar todo lo que no esta relacionado con la pantalla "Garimaldi"

Para el manejo de la pantalla he usado la librería de Adafruit_SSD1306.h y Adafrit_GFX.h. Esto ha llevado cambios en la inicialización del programa y los tamaños de las esferas. Estos valores los cambiamos en el archivo dashboardi2c.h

En este archivo encontraremos los valores predefinidos como el radio de las esferas, iconos, colores o la posición de los iconos en la pantalla. Después de las definiciones, esta la clase "Dashboard" sustituida por "DashboardI2c" junto con sus funciones, menos la función "drawLogo()" que no afecta al funcionamiento normal del programa.

Puedes encontrar los archivos para su descarga al final de este articulo.

Una vez que ya he probado las funciones y parece que todo funciona bien, añado un puerto para el I2c en la placa con el programa RC Engine Sound ESP32 y copio los archivos a la carpeta "RC_Engine_Sound_ESP32/src/src/"

En el archivo 9_Dashboard.h añado la siguiente linea para poder activar o desactivar la pantalla:


#define I2C_DASHBOARD 

Con la definición creada ya podemos añadir los cambios en el archivo "src.ino". Primero declaramos el objeto dashboard:


// Other objects -----
// Dashboard

#ifdef I2C_DASHBOARD
  DashboardI2c dashboard;
#else
  Dashboard dashboard;
#endif

En la función void setup() tenemos que desactivar los pines que correspondes al puerto I2C que en la placa DOIT ESP32 DEVKIT V1 corresponden a los pines GPIO21 (SCL) y GPIO22(SDA) y en el programa a las funciones "Beacon1" y "Cab light":


// Added for I2c dashboard
#if not defined I2C_DASHBOARD
  beaconLight1.begin(BEACON_LIGHT1_PIN, 9, 20000);  // Timer 9, 20kHz
  cabLight.begin(CABLIGHT_PIN, 12, 20000); // Timer 12, 20kHz
#endif

Un poco más abajo en la misma función setup() ponemos un mensaje para mostrar en el monitor serial que la pantalla esta activada:


#if defined I2C_DASHBOARD
  // Dashboard setup
  Serial.printf("I2C_DASHBOARD enabled. Pins 21 (beacon1), 22 (cablights) not usable!\n");
  Serial.printf("-------------------------------------\n");
  dashboard.init(dashRotation);
#endif

Como la tasa de refresco de la pantalla es bastante baja, el tiempo en el que se muestra tiene que ser mayor, si no gastará mucho tiempo "dibujando" y el programa ira excesivamente lento, para esto añadimos en la función "updateDashboard()" lo siguiente:


#ifdef I2C_DASHBOARD
  if (millis() - lastFrameTime > 300) // We need to save processing time!
#else
  if (millis() - lastFrameTime > 40) // 40) // We need to save processing time!
#endif
  

Y por último actualizamos la pantalla en la función loop():


#ifdef I2C_DASHBOARD
    updateDashboard();
#endif

Por supuesto todo esto ha sido para poder implementar la pantalla junto con su código en el programa original RC Engine Sound, pero no solo de código vive el hombre, así que este es el diagrama de conexiones que utilizo actualmente:


Al conservar los nombres que le dieron a las funciones en la clase Dashboard original, solo con unos pocos cambios podemos hacer compatibles esta pantalla I2C con el sistema RC Engine Sound ESP32. Si bien no dispone de todo el colorido y la rapidez de la pantalla SPI. Quedará muy bien en cualquier vehículo RC.

Como comente al principio, la librería U8G2Lib que, aunque si que dibuja la pantalla, la tasa de refresco es muy inferior a la tasa de refresco de la librería Adafruit. Esto hace que la pantalla no muestre los datos de una manera fluida e incluso produzca cuelgues en el ESP32.


Tenéis más información sobre el sistema en el artículo:Man Kat con Rc Engine Sound esp32.

Los archivos, tanto para la librería Adafruit como para U8g2Lib, para el velocímetro los puedes descargar en:

Descargar ESP32 oled i2c 128x32_dashboard desde GitHub

El programa original, en ingles, lo podéis encontrar en el siguiente enlace:

Repositorio oficial de RC Engine Sound ESP32 en GitHub

Puedes hacer las placas para RC Engine Sound ESP32 de una manera profesional desde el repositorio PCBway.com de "Thediyguy

Espero que os guste esta pequeña modificación para este excelente programa y para los que os gusta trastear, esta es una manera más clara de aprender a como dibujar en una pantalla de estas características.

Saludos!!

lunes, 14 de octubre de 2024

ESP8266 AP con GPS-6MV2 socket interface


GPS-6MV2 Tkinter interface

Buenas a todos!!!

Aprovechando que ya sabemos como mostrar, de manera serial, los datos que nos proporciona el módulo GPS-6MV2

No es muy practico tener que abrir el monitor Serial del IDE Arduino, o putty, para tener que ver una serie de números que, a priori, no nos dicen nada.

Pero para eso tenemos a Python, la navaja suiza de los lenguajes de programación. Igual que hicimos con el módulo ADXL345 con la interfaz y la clase socket. Solo necesitamos unos cuantos labels para mostrar los datos GPS de una manera que tengan sentido para cualquier usuario.

GPS-6MV2 pyTermTk interface

Pero volver a mostrar el mismo programa en otra entrada diferente, ya que los cambios son mínimos, no me convencía mucho. He probado a crear un programa pero usando esta vez pyTermTk.

Para cambiar un poco la programación esta vez no he usado ttkDesigner, simplemente he ido creando la interfaz como si estuviera usando Tkinter.

El resultado han sido dos programas prácticamente iguales, pero uno diseñado para mostrar datos en un entorno con ventanas y el otro se puede usar directamente desde cualquier terminal.

Arduino ESP8266 en modo AP:

Otra de las cosas que he cambiado es la manera de conectar el módulo ESP8266 con el portátil. Generalmente programo en un entorno cerrado y la conexión del ESP8266 se realiza con una conexión al router.

¿Pero que pasa si quiero salir de casa? Pues que el sistema deja de funcionar y tendría que programar la IP de cada red a la que se conecte.

Poniendo el microcontrolador en modo AP (Access Point) convertimos el ESP8266 en el punto central de una pequeña red local. De esta manera son los dispositivos como portátiles o smartphones los que se conectan al microcontrolador

Puede ser una red abierta (no recomendado) o una red con contraseña WPA2-PSK y la programación cambia muy poco con respecto al modo cliente, que es que uso habitualmente.

El programa esta dividido en dos archivos:

  • ESP8266_GPS6MV2_AP_server.ino Establece el modo AP y la comunicación con el módulo GPS-6MV2.
  • neo6mv2.ino donde se construye el String con los datos recibidos por el GPS-6MV2.

Asignamos un nombre y contraseña para la red:


#include "ESP8266WiFi.h"

const char* ssid = "gpsServer";
const char* password =  "!2345678";
WiFiServer wifiServer(1314);
void setup(){

  WiFi.softAP(ssid, password);

  IPAddress IP = WiFi.softAPIP();
  Serial.print("Starting GPS-6MV2 in AP mode on IP: ");
  Serial.println(IP);
}


Con este código el microcontrolador ya está en modo AP

Es el loop() donde se crearán los nuevos clientes y donde se sitúa la función principal, en este caso las funciones relacionadas con el módulo GPS:


void loop() {
  
 WiFiClient client = wifiServer.available();
 
  if (client) {
    Serial.println("Client connected");
    while (client.connected()) {
    
    // Lo que haga el programa
    
    }
  client.stop();
  Serial.println("Client disconnected");
  } 
}

En este punto ya solo tenemos que añadir la parte de código que ya hemos visto en el artículo Modulo GPS 6MV2 Serial ESP8266 NodeMCU.

Si ya has descargado el código y conectado el ESP8266 a una fuente de alimentación tiene que aparecer en el gestor de conexiones de la distribución que estemos usando.

Gestor de conexiones

Cuando le damos a conectar, nos pedirá la contraseña, !2345678, la introducimos y tenemos la conexión establecida. Empecemos con el programa realizado con Tkinter:


python3 -m main_gps6mv2

Si ya estas conectado a la red "gpsServer", los datos aparecerán al pulsar el botón "Start Conn":


Para el ejemplo desarrollado con la librería pyTermTk tenemos que ejecutar:


python3 -m main_gps_termtk


Igual que con la otra interfaz, si estamos conectados a la red "gpsServer" y pulsamos "Connect":

Puedes descargar los programas estas interfaces para el módulo GPS-6MV2 desde GitHub desde los siguientes enlaces:

Programa para microcontrolador ES8266 comunicación en GitHub

Interfaz de ejemplo con Tkinter de este articulo en GitHub

Interfaz de ejemplo con pyTermTk de este articulo en GitHub

Aquí tienes otros enlaces de este blog relacionados con programas hechos en Python:

Interfaz para el módulo ADXL345

Muestra el estado del sistema Raspberry Pi

Raspberry pi PWM

Espero que os guste el contenido, Saludos!!

miércoles, 2 de octubre de 2024

Modulo GPS 6MV2 Serial ESP8266 NodeMCU

¿Qué es el Módulo GPS-6MV2?

GPS-6MV2

El módulo GPS-6MV2 es un dispositivo electrónico pequeño y, sobre todo, económico. Este dispositivo que permite determinar la posición geográfica de un objeto, como un dron, a través de las señales emitidas por los satélites GPS. Es ampliamente utilizado en proyectos de electrónica, robótica y aplicaciones de seguimiento. Fácil de programar y con multitud de librerías disponibles para leer los datos que proporciona de manera serial. Datos que posteriormente se pueden buscar en paginas como Google maps.

Antes de empezar a programar vamos a ver primero sus características, los usos más comunes y, sobre todo, su funcionamiento.

Principales características módulo NEO-6MV2

  • Chipset: U-blox NEO-6M
  • Alimentación: 3.3V a 5V
  • Consumo: Aproximadamente 45mA en funcionamiento
  • Comunicación: Serial UART (TTL)
  • Velocidad de comunicación: Hasta 9600 bps (Configurable)
  • Precisión: Hasta 2.5 metros
  • Antena: Integrada (cerámica)
  • Temperatura de funcionamiento: -40°C a 85°C
  • Dimensiones: Pequeño y compacto
  • Memoria: EEPROM interna para configuración

 

¿Cómo Funciona el módulo GPS 6MV2?

El módulo recibe las señales de los satélites GPS, calcula su posición en base a la demora de las señales y proporciona esta información a través de la interfaz serial. Los datos que se pueden obtener incluyen:

  • Latitud y longitud: Coordenadas geográficas exactas.
  • Altitud: Altura sobre el nivel del mar.
  • Velocidad: Velocidad del dispositivo.
  • Curso: Dirección en la que se mueve el dispositivo.
  • Número de satélites: Cantidad de satélites detectados.
  • Hora: Hora UTC (Tiempo Universal Coordinado)

¿En que aplicaciones es un gran aliado?

La versatilidad del módulo GPS-6MV2 lo hace ideal para una amplia gama de proyectos y aplicaciones, entre las que destacan:
      Seguimiento:
    • Seguimiento de vehículos, personas o mascotas.
    • Sistemas de flotas.
    • Geolocalización de activos.
      Robótica:
    • Navegación autónoma de robots móviles.
    • Drones con GPS.
    • Vehículos aéreos no tripulados (UAV).
      Proyectos con microcontroladores:
    • Creación de sistemas de posicionamiento para Arduino.
    • Desarrollo de aplicaciones de geolocalización.
      IoT (Internet de las Cosas):
    • Dispositivos IoT con seguimiento GPS.
    • Sensores remotos con geolocalización.
      Meteorología:
    • Balones sonda con GPS.
    • Estaciones meteorológicas móviles.
      Deportes:
    • Seguimiento de actividades al aire libre (running, ciclismo, etc.).
    • Análisis de rutas.

Su capacidad para determinar la posición geográfica de un dispositivo hace que sea una opción popular y accesible para los aficionados a la electrónica y los ingenieros.

Sin embargo, como cualquier tecnología, el GPS-6MV2 presenta tanto ventajas como desventajas. A continuación, veremos los puntos positivos y negativos de este módulo, esto nos permitirá tomar la decisión adecuada sobre si aplicarlo o no en nuestro proyecto.

Ventajas del módulo GPS-6MV2:

  • Bajo costo: Es una opción económica para proyectos de GPS.
  • Fácil de usar: Su interfaz serial simplifica la integración con microcontroladores como Arduino.
  • Pequeño y ligero: Ideal para aplicaciones móviles.
  • Alta precisión: Proporciona datos de posición precisos para la mayoría de las aplicaciones.
  • Amplia disponibilidad: Se encuentra fácilmente en tiendas de electrónica y en línea.

Desventajas del módulo GPS-6MV2:

  • Precisión: La precisión, pese a ser muy buena en condiciones optimas, puede verse afectada por factores como la obstrucción de la señal GPS por edificios, vegetación o factores meteorológicos como la lluvia o tormenta. El número de satélites visibles se vera afectado por estos factores y se reducirá la precisión
  • Consumo de energía: Durante la búsqueda inicial el consumo es más elevado si lo comparamos a cuando el sistema ya ha establecido conexión.
  • Configuración: Es posible configurar el módulo para ajustar parámetros como la velocidad de baudios, el formato de datos y otros.

Como vemos no todo es bonito con el módulo GPS 6MV2, pero queda claro que sus ventajas lo hacen ideal para casi cualquier proyecto que requiera la posición de un objeto.

Librerías Arduino para el Módulo GPS-6MV2

Para comunicarnos con este módulo existen diversas librerías que puedes utilizar con Arduino para interactuar con el módulo GPS-6MV2. Cada una ofrece diferentes funcionalidades y niveles de complejidad. A continuación, te presentaré algunas de las librerías más comunes y algunas otras menos conocidas pero no por ello menos importantes:

 

Librerías Principales para el módulo GPS-6MV2

  • TinyGPS: Una de las librerías más populares y sencillas de usar. Proporciona una interfaz intuitiva para leer los datos NMEA (National Marine Electronics Association) del módulo GPS y extraer información como latitud, longitud, altitud, velocidad y tiempo. Es una excelente opción para comenzar.
  • TinyGPSPlus: Una versión mejorada de TinyGPS que ofrece funciones adicionales y un mayor rendimiento. Es ideal para proyectos que requieren un procesamiento más avanzado de los datos GPS.
  • Adafruit_GPS: Desarrollada, como su nombre indica, por Adafruit, esta librería proporciona una interfaz fácil de usar y es compatible con una amplia variedad de módulos GPS. Ofrece funciones para configurar el módulo, leer datos y calcular distancias.
  • NewSoftSerial: Esta librería no es específica para GPS, pero es útil si necesitas utilizar pines diferentes a los seriales estándar de Arduino para la comunicación con el módulo GPS.

Otras librerías menos conocidas

  • SparkFun_Ublox_GPS: Diseñada específicamente para los módulos GPS U-blox, como el NEO-6MV2. Ofrece un control más granular sobre las configuraciones del módulo y acceso a características avanzadas.
  • GPSLib: Una librería más completa que ofrece funciones para calcular distancias, rumbos y realizar otras operaciones geográficas.

Librería TinyGPSPlus y el ESP8266 NodeMCU

Es una de las librería de Arduino más populares y fáciles de usar. Procesa los datos específicos para del módulo GPS que transmite información en formato NMEA. Esta librería es una evolución de la librería TinyGPS.

Además de su facilidad de uso, cuenta con una amplia comunidad y documentación que nos proveen de toda la información necesaria para usos más específicos.

Para las conexiones entre microcontrolador y módulo unicamente usaremos 2 pines, más concretamente el pin, Rx GPIO0 (D3) y Tx GPIO2 (D4). Para la alimentación usaremos los 3.3V y GND.

Conexión entre NodeMCU y GPS6MV2

Es importante recordar que para muchos microcontroladores con un solo puerto serial, es imprescindible el uso de la librería "SoftwareSerial". Esta herramienta nos permite simular una comunicación serial en cualquier par de pines digitales de tu placa.


#include <tinyGPSPlus.h>
#include <SoftwareSerial.h>
/*
    Este ejemplo demuestra el uso de TinyGPSPlus, requiere el uso 
    de SoftwareSerial, para el dispositivo GPS-6MV2 usaremos 9600-baud 
    y conectado al pin GPIO 0 (Rx) y el GPIO 2(Tx) del microcontrolador
    ESP8266 NodeMCU.
*/

static const int RXPin = 0, TXPin = 2;
static const uint32_t GPSBaud = 9600;
String gpsdate = "";
String gpstime = "";

// Objeto TinyGPSPlus
TinyGPSPlus gps;

// Conexión serial con el dispositivo GPS
SoftwareSerial ss(RXPin, TXPin);

// Inicia el Serial y la comunicación GPS-6MV2 
void setup() 
	{
	Serial.begin(115200);
	delay(1000);
    Serial.println("Iniciando GPS-6MV2...");
	ss.begin(GPSBaud);
	}

void loop() 
	{
	Serial.println(neo6mv2data());
    smartDelay(1000);

	if (millis() > 5000 && gps.charsProcessed() < 10) 
    	{
    	Serial.println(F("No se reciben datos GPS, revise las conexiones"));
    	}
    }

static void smartDelay(unsigned long ms) {
	unsigned long start = millis();
	do 
    	{
		while (ss.available()) 
        	{
			gps.encode(ss.read());
            }
		} while (millis() - start < ms);
}

La función principal del loop() se hace una llamada a la función neo6mv2data() Esta es la función encargada de devolvernos un String con los datos que se mandan en la comunicación serial.


String neo6mv2data() {

  int satellites = -1;
  float hdop = 0.0;
  float location_lat = 0.0;
  float location_lng = 0.0;
  int age = 0;
  char dateBuffer[10]; // 00/00/0000
  char timeBuffer[8]; // 00:00:00
  float altitude = 0;
  float course = 0;
  float speed = 0;

  if (gps.satellites.isValid()) satellites = gps.satellites.value();
  else satellites = -1;
  if (gps.hdop.isValid()) hdop = gps.hdop.hdop();
  else hdop = -1;
  if (gps.location.isValid()) location_lat = gps.location.lat();
  else location_lat = 0.0;    
  if (gps.location.isValid()) location_lng = gps.location.lng();
  else location_lng = -1;
  if (gps.location.isValid()) age = gps.location.age();
  else age = -1;
  if (gps.altitude.isValid()) altitude = gps.altitude.meters();
  else altitude = -1;
  if (gps.course.isValid()) course = gps.course.deg();
  else course = -1;      
  if (gps.speed.isValid()) speed = gps.speed.kmph();
  else speed = -1;
  
   if (gps.date.isUpdated())
  {
    sprintf(dateBuffer, "%d/%d/%d", gps.date.day(), gps.date.month(), gps.date.year());
    gpsdate = String(dateBuffer);
  }
  
  if (gps.time.isUpdated())
  {
    sprintf(timeBuffer, "%d:%d:%d", gps.time.hour(), gps.time.minute(), gps.time.second());
    gpstime = String(timeBuffer);
  }

 return "<gps" 
            + String(satellites)
            + " " 
            + String(hdop)
            + " " 
            + String(location_lat,6)
            + " "
            + String(location_lng,6)
            + " "
            + String(age)
            + " "
            + String(gpsdate)
            + " "
            + String(gpstime)
            + " "
            + String(altitude, 2)
            + " "
            + String(course, 2)
            + " "
            + String(speed, 2)
            + ">";
}

Si nos fijamos en las lineas de location_lat o location_lng, al formar el Srting, conservamos los decimales, en este caso 6:


String(location_lat, 6) // x.000000

String(location_lng, 6)	// y.000000

Salida serial GPS-6MV2

Y esta es la captura de los datos seriales que recibe el microcontrolador ESP8266.

Cada uno de los valores esta delimitados por "< ">, con una cabecera con los caracteres "gps" y separados por un espacios " " y esto hace que a la hora de usar otro programa sea más sencilla su decodificación.

Versátil y barato, este módulo puede hacer las delicias de cualquier aficionado a la electrónica o la radio frecuencia. Esperamos que con esta información se pueden tener más claros ciertos conceptos y ventajas y desventajas del módulo GPS-6MV2.

Descargar ESP8266 Basic GPS6MV2 Serial desde GitHub

Saludos!!!