Mostrando entradas con la etiqueta Tutorial. Mostrar todas las entradas
Mostrando entradas con la etiqueta Tutorial. Mostrar todas las entradas

lunes, 26 de mayo de 2025

Gotek Flashfloppy en Amstrad CPC 6128

Muy buenas amigos y amigas de lo retro!!!

Amstrad CPC 6128 fue uno de los ordenadores más icónicos de Europa y por supuesto, en España. Este microordenador de 8bits ya lo hemos visto anteriormente cuando le dimos una buena limpieza y puesta a punto.

En competencia directa con el Commodore 64 y el ZX Spectrum, su hardware robusto, teclado de calidad y gráficos en color lo convirtieron en una plataforma ideal para juegos y aplicaciones. Sin embargo, como toda tecnología de la época, dependía de un soporte físico frágil y obsoleto hoy en día: los disquetes de 3 pulgadas.

Disquete Amstrad 3'

Con el paso de los años, las disqueteras originales han ido fallando debido al desgaste de los cabezales, la degradación de las bandas elásticas y la escasez de discos en buen estado.

Esto hace cada vez más difícil disfrutar de la amplia biblioteca de software del CPC... hasta que llegó la Gotek, un dispositivo que ha revolucionado la forma en que los usuarios de sistemas retro interactúan con su software.


¿Qué es exactamente una Gotek?

La Gotek es una unidad de disquete emuladora basada en un microcontrolador STM32, diseñada originalmente para entornos industriales como reemplazo económico de disqueteras.

Sin embargo, la comunidad retro rápidamente descubrió su potencial: al conectarla a un ordenador clásico como el Amstrad CPC y cargar un firmware alternativo como FlashFloppy, la Gotek se convierte en una "disquetera virtual" capaz de leer cientos de juegos desde una simple llave USB.


¿Qué es FlashFloppy?

Logo Flashfloppy
FlashFloppy es un firmware alternativo y mejorado para las unidades Gotek, desarrollado por keirf. Esta disponible en su repositorio de GitHub y con el podemos sacarle mucho más jugo a nuestros amados ordenadores de 8bits.

El firmware de Flashfloppy ofrece muchas más funciones que el original, mejoras funcionales ya que admite diferentes mods como pantalla OLED o encoder rotativo.

El mod de la pantalla OLED ofrece mejoras visuales como mostrar el archivo seleccionado o la navegación por carpetas:

  • Soporte para múltiples formatos de disco (.DSK, .EDSK, .IPF, .HFE, etc.).
  • Navegación por carpetas en el USB.
  • Pantallas OLED o LCD para visualizar el archivo seleccionado.
  • Soporte para rotary encoder (selector giratorio en lugar de botones).
  • Autoconfiguración para diferentes sistemas (Amstrad CPC, Spectrum, MSX, etc.).
  • Personalización de sonidos y temas visuales.

Es en este punto donde decidimos integrar este sistema en el CPC 6128 y estas son los puntos que tenemos que tener en cuenta antes de empezar:

Microcontrolador: Los dispositivos Gotek han presentado tres generaciones de MCU:

  • STM32F105
  • Artery AT32F415
  • Artery AT32F435

La Gotek que tenemos es la que tiene el chip Artery AT32F415.

Chip Artery AT32F415

Materiales:

  • Cable USB-A a USB-A Este cable lo podemos fabricar con un par de cables USB que tengamos sin usar. Solo hay que unir los cables que tengan el mismo color. En el caso de que no lo sean, hay que medir con el polímetro que los pines coincidan.
    Cable USB-A to USB-A
  • Pines y puentes Necesarios para que la operación sea más cómoda para la instalación y futuras actualizaciones.
    Pines para soldar

Ahora que tenemos todos los materiales, vamos a ver las modificaciones que tenemos que realizar sobre la placa:

La pantalla Oled en la Gotek es algo prácticamente imprescindible, puede ser de 128x32 o 128x64. Dispondremos de una información más detallada sobre las capetas y archivos.

Diagrama conexión pantalla 128x32

Listado de pines del zócalo de programación:

  • Boot Jumper: Puenteado con "3V" ponemos la Gotek en modo de programación.
  • 3V: Alimentación 3V
  • Tx: Puerto Tx para programador USB.
  • RX: Puerto Rx para programador USB.
  • RST: No se usa.
  • 5V: Alimentación 5V.
  • GND: GND o masa.

Listado de pines de control:

  • J5: Cambio de disco.
  • JA: Botón Seleccionar/Expulsar/Insertar con pulsador.
  • JC: Selección de máquina Abierto=Shugart Cerrado=IBMpc
  • JB: Conexión de un pequeño altavoz o buzzer (J- y B+).
  • S0: On=Gotek seleccionada como unidad A (S1=OFF).
  • S1: On=Gotek seleccionada como unidad B (S0=OFF).
  • M0

Listado de pines para pantalla Oled:

  • SDA: Conexión de datos I2C
  • SCL: Conexión de datos I2C
  • 3V: Alimentación + .
  • GND: Alimentación - .

Actualización del Firmware

En este paso necesitamos el cable USB-A a USB-A y en la placa puentear los pines marcados como Boot Jumper y 3V como se muestra en la parte inferior de la siguiente imagen:

Puentes de programación para Gotek

Gotek con los pines soldados

En este paso vamos a cargar el firmware en una maquina con Linux instalado, en este caso Ubuntu:

Vamos a utilizar la herramienta "dfu-util" para flashear el firmware de la Gotek que soporta el protocolo DFU (Device Firmware Upgrade).

Abrimos un terminal y escribimos:


sudo apt update && sudo apt-get install dfu-util

Con la herramienta instalada descargamos el software de Flashfloppy y descargamos la última versión.

Solo falta descomprimir el archivo, lo podemos hacer en el mismo directorio /Descargas. Encontraremos el archivo con extensión .dfu dentro del directorio dfu.

Recuerda usar el firmware correspondiente al microcontrolador que use la placa, en este caso el Artery AT32F435.

Gotek archivos dfu con el firmware

Ahora seguimos los siguiente pasos:


1-. Configuración de pines:

Establecemos el pin de programación en la Gotek tal y como hemos visto en la imagen anterior.


2-. Conexión:

Conectamos la Gotek con el cable USB-A a USB-A


3-. Desbloqueamos el firmware actual:

Abrimos un terminal y escribimos:


  dfu-util --list

dfu-utils nos devuelve la siguiente información:

Para romper la protección del firmware en el hilo original proponen el siguiente comando:


sudo dfu-util -D /path/to/flashfloppy-at415-st105-3.44.dfu -a 0 -s 0x08000000:unprotect:force

Pero por algún motivo nos daba un error como que había dos unidades y que le especificara la dirección de la disquetera correcta.

Este dato lo obtenemos del mismo comando "dfu-utils --list" y en este caso es: 2e3c:df11 al que llamaremos "MAC_GOTEK". Investigando un poco por internet tenemos esta variación del comando dfu-util en la que se incluye dicha dirección:


sudo dfu-util -v -d MAC-GOTEK -a 0 -s 0x08000000:unprotect:force -D /path/to/flashfloppy-at415-st105-3.44.dfu 

Esto termina con un error, pero desactiva la protección, por mi parte bien...


4-.Instalacion de Flashfloppy:

Ahora instalamos el firmware Flashfloppy donde tenemos que cambiar /path/to/ por el directorio donde tengamos el archico .fdu y X.XX por la versión de flashfloppy que hayamos descargado


sudo dfu-util -D /path/to/flashfloppy-at415-st105-X.XX.dfu -a 0


5-. Comprobación

Ya tenemos instalado Flashfloppy en nuestro dispositivo Gotek, Ahora desconectamos el cable USB y retiramos el puente entre el "Boot Jumper" y "3V"

Ahora volvemos a conectar el cable USB y en la pantalla aparecerá la siguiente imagen:

Gotek primer inicio con Flashfloppy

¡¡¡Enhorabuena ya tienes la Gotek con firmware Flashfloppy!!!

¿Y ahora?

Ahora nos toca configurar las opciones básicas que, por suerte, son pocas.

En el directorio "examples" tenemos el archivo FF.CFG con la configuración básica de la Gotek. Este archivo lo leera la unidad USB antes de empezar y modificará la configuración con los parámetros que hayamos definido en el archivo FF.CF.

Es decir, para que tenga efecto solo tenemos que copiar el archivo FF.CFG en la raíz de la memoria USB.

A continuación estos son algunos parametros a los que merece la pena echar un vistazo

Mantener pantalla encendida:


# Turn an LCD or OLED display off after N seconds of inactivity.
# N=0: always off; N=255: always on
# - Values: 0 <= N >= 255
# display-off-secs = 60
display-off-secs = 255

Cambio del tamaño del texto

Primero definimos la pantalla en display type y activamos la opción -narrow:


# Display Type.
# auto: Auto-detect (7-seg LED, LCD, OLED)
# lcd-CCxRR: CCxRR backlit LCD with I2C backpack (16<=CC<=40, 02<=RR<=04)
# oled-128xNN: 128xNN I2C OLED (NN = 32 | 64)
#  -rotate:     OLED view is rotated 180 degrees
#  -hflip:      OLED view is flipped horizontally
#  -narrow[er]: OLED view is restricted to Gotek display cutout
#               (-narrow: 18 chars; -narrower: 16 chars)
#  -inverse:    Inverse/reverse video (black text on white background)
#  -ztech:      ZHONGJY_TECH 2.23" 128x32 SSD1305 OLED display
#  -slow:       Run I2C bus slower (use this if OLED regularly blanks/corrupts)
# Values: auto | lcd-CCxRR | oled-128xNN[-rotate][-narrow[er]]...
# display-type = auto
display-type=oled-128x32-narrow

Y cambiamos el tamaño en la sección OLED Font:


# OLED Font. Narrow and wide options.
# Narrower 6x13 font permits:
#  - More characters per row
#  - Use of Gotek display cutout (eg. "display-type=oled-128x32-narrow")
# Values: 6x13 | 8x16
# oled-font = 6x13
oled-font = 8x16

Podemos volver a la configuración original si retiramos la memoria USB y después mantenemos pulsados los botones A(+) y B(+) durante 3 segundos y nos aparece el mensaje: Reset Flash Configuration

Con todo configurado ya podemos conectar la Gotek a nuestro Amstrad CPC6128 con un cable de disquetera estándar FDD que tenga la entrada para disqueteras de 5.25. No hace falta ninguna modificación en el cable FDD.


Ahora si, Cargar discos con Gotek

Con la memoria USB con los juegos y el archivo FF.CFG, lo introducimos en la Gotek y le damos alimentación.

El archivo FF.CFG se carga automáticamente (no hay que hacer nada) y ya podemos pasar a utilizar el archivo que seleccionemos.

Para movernos entre archivos y directorios la Gotek cuenta con 2 pulsadores para el controlar el disco que queremos cargar:

Pulsador A (+) :

  • Siguiente Archivo

Pulsador B (-) :

  • Archivo anterior

Ambos:

  • Reset memoria Flash

Resolución de problemas frecuentes

Como todo, siempre pueden surgir fallos o cosas que salen como deseamos, veamos los fallos mas comunes:

  • Cable de datos mal conectado:

En este caso nos aparece un mensaje en la pantalla OLED informando que el cable no esta mal conectado. Este mensaje no aparece si no hay cable.

Gotek con cable de datos mal conectado

  • Inserte Disco en la unidad B:

Si tenemos este error limpia los conectores del puerto de disco. Para una buena limpieza es recomendable usar alcohol isopropílico y un bastoncillo para los oídos. Si esto no funciona cambia el cable.

Este fallo nos puede volver un poco locos, si escribimos:

  • |b

y luego el comando:

  • "cat"

y leía el contenido del archivo pero al ejecutar run"program.bas" saltaba el mensaje de que no hay disco. Como ya hemos comentado arriba, una buena limpieza al conector y un repaso al cable con un pincel y problema solucionado.

Gotek con Flashfloppy instalado

Otro proyecto que me he escontrado es con Symbos, un sistema gráfico capaz de funcionar en un cpc 6128.


sábado, 8 de febrero de 2025

MPU6050 Acelerómetro y Giroscopio con Arduino

Muy buenas a todos!!!

Vamos a ver que funcionalidades tiene el sensor MPU6050 el cual integra un acelerómetro de 3 ejes un giroscopio de 3 ejes y un sensor de temperatura, aunque este último no es muy preciso.

Antes de empezar vamos a destacar algunos de los términos que se usan con este sensor:

¿Que mide el acelerómetro?

Como su nombre indica, un acelerómetro mide la aceleración que es una magnitud vectorial, es decir, mide el cambio de velocidad y la dirección hacia donde se realiza el cambio.

A grandes rasgos hay tres tipos de aceleración:

  • Aceleración positiva: La velocidad de un objeto aumenta en el tiempo.
  • Aceleración negativa: La velocidad de un objeto disminuye con el tiempo.
  • Aceleración centrípeta: La dirección cambia a una velocidad constante.

¿Que mide el giroscopio?

Un giroscopio es un dispositivo que mide la velocidad angular o tasa de rotación de un objeto en los ejes X, Y y Z. La velocidad angular se expresa en grados por segundo (°/s) o radianes por segundo (rad/s).

El MPU6050, está basado en tecnología Micro-Electro-Mechanical Systems más conocido como MEMS . Esta tecnología utilizan un pequeño elemento vibrante que, al girar, experimenta una fuerza llamada efecto Coriolis. Esta fuerza es detectada y convertida en una señal eléctrica, que luego se traduce en una medida de la velocidad angular. Esto nos permite detectar rotaciones en cualquier dirección.

También podemos configurar el rango de medición teniendo en cuenta que rotaciones más rápidas equivalen a una menor precisión.

El rango de medición es configurable con los siguientes valores:

  • ±250 °/s
  • ±500 °/s
  • ±1000 °/s
  • ±2000 °/s

Resumen de aceleración y giroscopio en el contexto del MPU6050

El acelerómetro del MPU6050 mide la aceleración en los ejes X, Y, Z. Esto incluye:

  • La aceleración debida al movimiento por ejemplo, si mueves el sensor.
  • La aceleración debida a la gravedad 9.8 m/s² hacia el centro de la Tierra.

El acelerómetro del MPU6050 mide la velocidad angular en los ejes: X, Y y Z.

  • La velocidad angular se expresa en grados por segundo (°/s) o radianes por segundo (rad/s).

Diferencia entre giroscopio y acelerómetro


  • Acelerómetro: Mide la aceleración lineal (cambios en la velocidad en línea recta) y la inclinación respecto a la gravedad.
  • Giroscopio: Mide la velocidad angular (cambios en la rotación o giro).

La combinación de ambos sensores trabajando juntos para proporcionan una imagen completa del movimiento de un objeto. Por ejemplo:

  • El acelerómetro puede decirte si un objeto está inclinado.
  • El giroscopio puede decirte si el objeto está girando y a qué velocidad.

Conexiones MPU6050:

  • VCC: Alimentación +.
  • GND: Alimentación - o masas.
  • SCL: Serial Clock pin para la interfaz I2C.
  • SDA: Serial Data pin para la interfaz I2C.
  • XDA: I2C externo Serial Data para conectar sensores externos como un magnetómetro.
  • XCL: I2C externo Serial clock.
  • AD0: Cambia de dirección para evitar conflictos: GND -> Dirección 0X68 o +3.3V -> Dirección 0x69.
  • INT: Pin de interrupción. El MPU6050 puede programarse para generar interrupciones al detectar ciertos gestos o vibraciones.

Librerías para MPU650:




#include <Wire.h>

// Dirección del sensor
const int MPU6050_addr=0x68;


int16_t AccX, AccY, AccZ; 
int16_t GyroX, GyroY, GyroZ;
int16_t Temp;

void setup(){
  
  Wire.begin();
  Wire.beginTransmission(MPU6050_addr);
  Wire.write(0x6B);
  Wire.write(0);
  Wire.endTransmission(true);
  
  Serial.begin(115200);
}

void loop(){
  Wire.beginTransmission(MPU6050_addr);
  Wire.write(0x3B);
  Wire.endTransmission(false);
  Wire.requestFrom(MPU6050_addr,14,true);
  
  AccX=Wire.read()<<8|Wire.read();
  AccY=Wire.read()<<8|Wire.read();
  AccZ=Wire.read()<<8|Wire.read();
  Temp=Wire.read()<<8|Wire.read();
  GyroX=Wire.read()<<8|Wire.read();
  GyroY=Wire.read()<<8|Wire.read();
  GyroZ=Wire.read()<<8|Wire.read();
  
  Serial.print("AccX = "); Serial.print(AccX);
  Serial.print(" || AccY = "); Serial.print(AccY);
  Serial.print(" || AccZ = "); Serial.print(AccZ);
  Serial.print(" || Temp = "); Serial.print(Temp/340.00+36.53);
  Serial.print(" || GyroX = "); Serial.print(GyroX);
  Serial.print(" || GyroY = "); Serial.print(GyroY);
  Serial.print(" || GyroZ = "); Serial.println(GyroZ);
  delay(100);
}


Una vez que subamos el programa al microcontrolador, en el monitor serial, tendremos la siguiente salida:


AccX = 13432 || AccY = -792 || AccZ = 9780 || Temp = 44.06 || GyroX = 911 || GyroY = -10038 || GyroZ = -5514


Problemas con las librerías


Mientras he realizado las pruebas he tenido algunos problemas con las librerías, por lo que al final he usado la obtención de datos usando unicamente la librería "Wire.h". Con estos datos podemos hacer casí cualquier sistema que necesite conocer su posición, movimiento y posición angular tales como...

  • Drones: Para estabilizar el vuelo y detectar cambios de orientación.
  • Robótica: Para controlar la dirección y el movimiento de robots.
  • Realidad virtual: Para rastrear movimientos de la cabeza o manos.
  • Navegación: En sistemas de navegación inercial para vehículos.

Hoja de datos del MPU6050


Aquí tienes otros enlaces de este blog relacionados con sensores y Arduino:

Esp8266 y adxl345 acelerómetro de 3 ejes, lectura serial

Arduino: Grabación y lectura de Infrarrojos (IR) y control de 4 reles


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!!

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!!!

sábado, 21 de septiembre de 2024

ESP8266 y ADXL345 acelerómetro de 3 ejes. Lectura Serial

ADXL345

Buenas a todos!! El ADXL345 es un sensor súper versátil en campos como la robótica, drones o sistemas de seguridad.

Pues tengo varias ideas para el pero por el momento es mejor hablar sobre que es el sensor ADXL345 y cuales son sus características más destacadas.

¿Que es el sensor ADXL345?

El sensor ADXL345 es un acelerómetro digital de 3 ejes ampliamente utilizado en aplicaciones muy diversas, desde drones y robots hasta dispositivos portátiles y sistemas de control industrial. El sensor ADXL345 tiene una muy popular gracias a su alta precisión, bajo consumo de energía y facilidad de uso.

Las aplicaciones típicas para el sensor ADXL345:

  • Detección de movimiento: Detección de movimiento: En sistemas de seguridad, juegos, interfaces gestuales.
  • Control de orientación: Control de orientación: En drones, robots, estabilizadores de imagen.
  • Monitoreo de vibraciones: En maquinaria industrial, equipos de diagnóstico.
  • Interfaz hombre-máquina: En dispositivos portátiles, controles remotos.
  • Reconocimiento de patrones de movimiento: En aplicaciones de fitness, rehabilitación.

Principales Características técnicas funcionalidades:

  • Consumo de 23uA en modo de medición y 0.1uA en modo standby
  • Voltaje en un rango de 2.0V a 3.6V (ADXL345 funciona a 3,3V)
  • Conexión SPI de 3 o 4 lineas e interfaces I2C
  • Resolución fija de 10-bits y una máxima de 13-bits
  • Temperatura de uso -40º hasta +85º

Las principales funcionalidades del sensor ADXL345 pueden ser:

  • Medición de Aceleración: Mide la aceleración en los tres ejes del espacio (X, Y, Z), así permite determinar la orientación, inclinación o movimiento de un objeto.
  • Rango de medición configurable: Permite mediciones de ±2g, ±4g, ±8g y ±16g, adaptándose a diferentes aplicaciones.
  • Alta Resolución: Con una resolución de hasta 13 bits, lo que se traduce en una alta precisión en la medición de la aceleración.
  • Bajo Consumo de Energía: Consume muy poca energía, tanto en modo de medición como en modo de espera, con consumos tan reducidos es ideal para dispositivos alimentados por batería.
  • Comunicación: Puede comunicarse a través de interfaces I2C o SPI.
  • Regulador de Voltaje Integrado: Incorpora un regulador de voltaje interno, simplificando el diseño del circuito.
  • Tasa de muestreo configurable: Permite ajustar la frecuencia a la que se toman las medidas
  • Interrupciones configurables: Se puede configurar para generar interrupciones cuando se detectan ciertos eventos, como una aceleración determinada o un cambio de orientación.

¿Cómo Funciona?

El ADXL345 utiliza micro-condensadores que se desplazan físicamente cuando se aplica una fuerza (aceleración). Este desplazamiento cambia la capacitancia de los condensadores, lo que se traduce en una señal eléctrica que es convertida a un valor digital por un convertidor analógico-digital (ADC) interno.

En esta señal digital es donde se encuentran los datos que utilizaremos para representar las coordenadas X Y Z

Como usar el sensor ADXL345

Para utilizar el sensor ADXL345 de una manera más amigable tenemos disponibles varias librerías que simplifican su uso y que como comentamos mas arriba, nos permitirá tanto lectura de datos como programar eventos. Estas son las librerías más populares:

  • Adafruit ADXL345 library: Es una de las librerías más conocidas y documentadas, desarrollada por Adafruit Industries.

    Esta librería ofrece una amplia gama de funciones para configurar y leer datos del sensor, como establecer el rango de medición, ajustar la tasa de muestreo y leer los valores de aceleración en los tres ejes. Es muy fácil de usar gracias a su interfaz es intuitiva y bien estructurada, lo que facilita su integración en tus proyectos.

  • SparkFun ADXnodemcu adxl 345L345 library: Muy similar a la librería de Adafruit pero desarrollada por SparkFun Electronics.

    Esta librería comparte muchas similitudes con la de Adafruit y puede incluir algunas funciones adicionales o variaciones en la implementación, pero en general, su funcionalidad es prácticamente la misma.

  • Jarzebski Arduino ADXL345: Esta librería ofrece algunas funciones más avanzadas, como la detección de caídas libres y la detección de golpes y una mayor personalización de la configuración del sensor. Incluye gravedades como Marte, la Luna o el sol. No es la más conocida pero merece la pena darle un vistazo.

Opciones avanzadas:


Para el ejemplo del sensor ADXL345 vamos a utilizar la librería Adafruit ADXL345 library conectado a un microcontrolador ESP8266 NodeMCU por protocolo I2C. El sensor es alimentado por los 3.3V que ofrece el microcontrolador y el NodeMCU se alimenta por el mismo cable USB por donde recibiremos los datos.

El ejemplo es el mismo que aparece en su web así que no pondré parte del ejemplo que esta en la misma librería. Una vez cargado el programa pasará por los siguientes procesos:

  • Creamos el sensor:
    
        /* Crea el sensor. 12345 asigna una ID unica para el sensor*/
        Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345);
        
        
  • En el apartado void setup() inicializamos el sensor y seleccionamos el rango:
    
          /* Inicializa el sensor */
          if(!accel.begin()) {
          	/* Hay un problema al conectar ADXL345 ... compruebe las conexiones... */
          	Serial.println("Ooops, no ADXL345 detected ... Check your wiring!");
          	while(1);
          }
          
          /* Selecciona el rango apropiado para tu proyecto */
          accel.setRange(ADXL345_RANGE_16_G);
        
        
  • Una vez en el loop tomamos los eventos para luego mostrarlos en el monitor serial. Los datos se acualizan cada 500ms.
    
        void loop(void) {
        /* Get a new sensor event */ 
        sensors_event_t event;
        accel.getEvent(&event);
        
        /* Display the results (acceleration is measured in m/s^2) */
        Serial.print("X: "); Serial.print(event.acceleration.x); Serial.print("  ");
        Serial.print("Y: "); Serial.print(event.acceleration.y); Serial.print("  ");
        Serial.print("Z: "); Serial.print(event.acceleration.z); Serial.print("  ");Serial.println("m/s^2 ");
        delay(500);
        }
        
        

Con todo funcionando tenemos que tener una salida en el monitor similar a esta:


Accelerometer Test

------------------------------------
Sensor:       ADXL345
Driver Ver:   1
Unique ID:    12345
Max Value:    -156.91 m/s^2
Min Value:    156.91 m/s^2
Resolution:   0.04 m/s^2
------------------------------------

Data Rate:    100  Hz
Range:         +/- 16  g

X: 0.47  Y: -1.18  Z: 12.20  m/s^2 
X: 0.59  Y: -1.06  Z: 12.32  m/s^2 
X: 0.51  Y: -1.10  Z: 12.28  m/s^2 
X: 0.59  Y: -1.14  Z: 12.24  m/s^2 
X: 0.08  Y: -0.71  Z: 12.24  m/s^2 
X: 10.16  Y: -1.22  Z: 2.51  m/s^2 
X: 10.40  Y: -0.90  Z: 2.51  m/s^2

Salida serial ESP8266 NodeMCU y ADXL3345

Es realmente sencillo conectar el sensor a cualquier microcontrolador que admita protocolo I2C además de tener la opción SPI. Espero que este ejemplo os sirva de ayuda para futuros proyectos

Hoja de datos: ADXL345 DataSheet

Saludos!!!

sábado, 2 de marzo de 2024

WLED el mejor control para tus tiras LED

WLED es un firmware de código abierto que te permite controlar tiras de LED digitales RGB con un microcontrolador ESP8266 o ESP32.

Es una de las mejores alternativas a los controladores LED tradicionales, ya que ofrece una gran flexibilidad y personalización a través de una interfaz web intuitiva.

Empecemos!

¿Que son los LEDS WS2812B?

Una tira de LED direccionables es un tipo de tira de LED que te permite controlar el color y el brillo de cada LED individual. La más popular es la denominada WS2812B y es la tira de led que he usado en varios proyectos con unos resultados totalmente satisfactorios. Uno de ellos es la iluminación para la caja del PC.


sábado, 28 de octubre de 2017

Arduino ejemplos: Lectura analógica y led PWM

Muy buenas a todos!!!

Muchos de los sensores que utilizamos para Arduino son sensores analógicos como potenciómetros, fotoresistencias, etc.


Para esto Arduino utiliza unos pines específicos, que van desde el A0 al A5 en Arduino UNO y del A0 al A7 en el Arduino Nano.


El ADC (Convertidor Analógico-Digital):


Arduino pines analógicos

Para poder leer correctamente los valores se utilizan 3 pines por sensor, pin de lectura, +5V y GND.

Por si mismo Arduino es incapaz de realizar lecturas analógicas y para esta función utiliza un conversor analógico digital ADC (Analog Digital Converter) que convierte la entrada analógica en una digital soportada por la lógica TTL (0 - 5V) de Arduino.

Para la lectura de las entradas analógicas Arduino UNO tiene una resolución de 10 bits, o lo que es lo mismo puede leer valores desde 0 hasta 1023. En cada paso aumentamos la lectura en 5 / 1024 = 0.00488V.

jueves, 26 de octubre de 2017

Arduino ejemplos: LCD con I2c

Buenas a todos Arduineros y Arduineras!!!

Si ya vimos antes como utilizar un LCD 16x02, Arduino: El LCD 16x2 y
Arduino: Diferentes efectos en un LCD 16x2
directamente conectando a Arduino usando en total un mínimo de 6 líneas, esto puede que no sea un problema si tú proyecto no utiliza muchos sensores, pero si es necesario usar el máximo de pines disponibles existe una solución que puedes usar, el módulo I2c para LCD.
Con este dispositivo conseguiremos un ahorro en los pines de nuestro Arduino pudiendo, además, conectar más dispositivos I2c a las mismas líneas de control.

El bus TWI/i2c:


El bus serie i2c fue creado por Philips en 1982 para la comunicación entre microcontroladores y periféricos.

El TWI (Two Wired Interface) es idéntico a nivel técnico pero Atmel tuvo que cambiar las siglas por motivos de licencias, pero a efectos prácticos es lo mismo.

I2c está diseñado como un bus de comunicación Maestro-Esclavo, con esto uno de los dispositivos (maestro) regula la comunicación y los demás dispositivos (esclavos) que atienden sus peticiones.

Este bus está formado por dos líneas, SLK y SDA.

  • SLK (Serial Clock) marca la velocidad de comunicación y marca los tiempos para la lectura/escritura en el bus.
  • SDA (Serial Data) es la línea por donde se transmite la información.

Cada dispositivo conectado al bus tiene una dirección, así que para conectarnos con el debemos saber dicha dirección, con este programa podréis saber cual es la dirección de vuestro dispositivo:

leer dirección de un dispositivo i2C

Conexión Arduino modulo i2C:
Conexión Arduino UNO con LCD i2C
Conexión Arduino UNO con LCD i2C

domingo, 8 de octubre de 2017

Arduino: Grabación y lectura de Infrarrojos (IR) y control de 4 relés

Buenas a todos los Arduineros y Arduineras!!!

Esta semana he estado trasteando con la comunicación infrarroja o IR (Infra Red). Este tipo de comunicación es unidireccional, es decir, la comunicación se efectúa en un solo sentido.

Casi todos los controles remoto de TV, reproductores de DVD, incluso el mando del aire acondicionado funcionan con este sistema.


¿Que es la luz infrarroja?

La luz infrarroja o radiación infrarroja es un tipo de radiación electromagnética y térmica de mayor longitud de onda que la luz visible pero menor que las microondas.

Tabla del espectro infrarrojo
Tabla del espectro infrarrojo

Esta "luz" no se puede ver a simple vista ya que el ojo humano no es capaz de captar esa longitud de onda, aun así siempre podemos comprobar si el infrarrojo de nuestro control remoto funciona mediante cualquier cámara de teléfono móvil.

Solo tenemos que apuntar el emisor del control remoto al objetivo de la cámara y pulsar cualquier botón, el led IR debe encenderse en un color violáceo como en la imagen:

Vista de un Led infrarrojo con la cámara de un móvil


miércoles, 4 de octubre de 2017

Ejemplos Arduino: Semáforo (Street Light)

Buenas a todos Arduineros y Arduineras!!!

Hoy traemos un ejemplo de los más básicos que se pueden realizar con Arduino: El semáforo.

Si bien es un practica sencilla, nos ayudará a entender como realizar secuencias con LED y el bucle FOR que ya hemos tratamos en la entrada de este mismo blog Arduino: Efecto Coche fantástico

Podríamos realizar la practica con un solo semáforo, pero añadir un segundo semáforo le da un poco más de complejidad ya que tenemos que sincronizar para que no tengamos ningún accidente en la intersección.

Otro punto interesante seria añadirle un pequeño altavoz para simular el dispositivo para invidentes que hay situados en casi todos los pasos de peatones de una gran ciudad.


Materiales necesarios:

  • Arduino UNO
  • 6 Resistencias 330ohm
  • 2 LED de color rojo
  • 2 LED de color naranja
  • 2 LED de color verde

Conexiones:

Vamos a usar los pines digitales 7, 8, 9, 10, 11, 12 configurados como OUTPUT y sera donde irán conectados los LED con su resistencia limitadora de 330ohm


El código del programa es bastante sencillo, puedes copiar y pegar o descargar el sketch al final de esta misma entrada:



// Definimos los pines de los LED
// Semaforo 1:
const int rojo = 7;
const int amarillo = 8;
const int verde = 9;

// Semaforo 2:
const int rojo2 = 10;
const int amarillo2 = 11;
const int verde2 = 12;


void setup() {
  // Configuramos los pines como salida
  pinMode (rojo, OUTPUT);
  pinMode (amarillo, OUTPUT);
  pinMode (verde, OUTPUT);
  pinMode (rojo2, OUTPUT);
  pinMode (amarillo2, OUTPUT);
  pinMode (verde2, OUTPUT);
  
  // Comprobamos que todos los LEDs encienden
  for (int z = 7; z < 13; z++) {
    digitalWrite ( z, HIGH);
    delay (100);
    digitalWrite (z, LOW);
    delay(100);
  }
}

void loop() 
{
  // SECUENCIA 1 //
  digitalWrite (rojo2, HIGH);
  digitalWrite (verde, HIGH);
  delay (5000);
  digitalWrite (verde, LOW);
  
  // SECUENCIA 2 //
  for (int x = 0; x < 5; x++) 
  {
    digitalWrite (amarillo, HIGH);
    delay(500);
    digitalWrite (amarillo, LOW);
    delay (500);
  }
  
  // SECUENCIA 3 //
  digitalWrite (rojo2, LOW);
  digitalWrite (verde2, HIGH);
  digitalWrite (rojo, HIGH);
  delay (5000);
  digitalWrite (verde2, LOW);
  
  // SECUENCIA 4 //
  for (int y = 0; y < 5; y++) 
  {
    digitalWrite (amarillo2, HIGH);
    delay(500);
    digitalWrite (amarillo2, LOW);
    delay (500);
  }
  digitalWrite (rojo, LOW);

}


En la siguiente animación podemos ver una simulación del resultado final del programa:


Este proyecto puede ser ampliado con varios módulos más como un zumbador que simule el sonido para los invidentes o una barrera mecanizada con un servo.

Espero que les guste y les sea de utilidad, hasta la próxima!!!!

También te puede interesar: