Práctica Torreta: Control y Melodías
Práctica Torreta: Control y Melodías
Microprocesadores
Práctica Torreta
6CV3
OBJETIVO: Implementar Torreta con 2 melodias distintas con opción a controlar un motor
a pasos
DESARROLLO:
Primero, debemos conectar en la BluePill tal y como nos indica el programa:
/**
#####################################################################
########
** @file
** Archivo : main.cpp
** Proyecto : Bluepill_Torreta_Enhenced
** Procesador : STM32F103C8T6
** Plataforma : Bluepill
** Herramienta : Mbed Keil Studio Cloud
** Compilador : Mbed Online C Compiler
** Version : Keil Studio Cloud 1.6.16
** Fecha/Hora : 18-12-2019, 11:48, # CodeG
** @brief
** Descripción :
** Este proyecto es la versión mejorada de la Torreta y el
Medidor
** de Barras, compartiendo los mismos pines del puerto
definido para
** ambos.
** Muestra la utilización de un registro retentivo (Latch)
para retener
** datos mientras otro proceso utiliza el mismo bus de datos.
** El primero se actualiza por medio de la interrupción del
Ticker,
** el cual retiene su valor a través de un Latch
Transparente.
** La Barra de Led's se actualiza directamente después de
cada ciclo
** de Conversión del ADC asociado al Potenciómetro. La
Torreta junto
** con con el Latch Transparente SN74HC573 y la Barra de
Led's
** comparten el mismos bus de datos.
** Uno es una secuencia y el otro es un proceso cíclico que
actualiza
** cada vez que el ADC genera un nuevo valor obtenido de la
posición
** de un potenciometro.
** Componentes : GPIO, Timer, etc .
** Configuraciones : Includes, Stacks y Drivers externos
** Autores :
** ATEAM Development Group:
** - Antulio Morgado Valle
**
** Versión : Beta
** Revisión : A
** Release : 0
** Bugs & Fixes :
** Date : 20/10/2019
** Added support for Led_RGB
** 22/09/2018
** Added LCD Menu, Beta version (with bugs)
**
**
#####################################################################
######*/
/*
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::::::
: Includes
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::::::
*/
#include "stm32f103c8t6.h"
#include "mbed.h"
#include "Escalas.h"
#include <cstdint>
/*
:....................................................................
...........
: Definiciones
:....................................................................
...........
*/
#define LED_ON 1 // Estado para el Led Encendido
#define LED_OFF 0 // Estado para el Led Apagado
#define BUZZ_ON 1 // Estado para Buzzer Encendido
#define BUZZ_OFF 0 // Estado para Buzzer Apagado
#define BUZZ_TYPE 1 // Tipo de Buzzer: 0=Pasivo,
1=Activo
#define ON 0 // Estado para boton presionado
#define OFF 1 // Estado para boton sin
presionar
#define HOLD 2 // Estado para boton mantenido
#define RELEASE 3 // Estado para boton liberado
#define REPEAT 4 // Estado para boton repetido
#define FALSE 0 // Estado FALSO
#define TRUE 1 // Estado VERDADERO
#define DELAY 500 // Tiempo de retardo entre
secuencias (en ms)
#define TICKER_RATE 1000 // Periodo de Interrupción (us)
#define BAUD_RATE 115200 // Velocidad de Transmisión
(Bauds)
// Velocidades Permitidas:
// 300, 600, 1200, 2400, 4800,
9600,
// 14400, 19600, 28800, 38400,
57600
// 115200, 230400
/*
*====================================================================
===========
*
* C O N F I G U R A C I O N D E P U E R T O S
*
*====================================================================
===========
*/
Ticker Barrido; // Interrupción del Timer
AnalogIn Pot1(PA_1); // Potenciometro ADC12_IN1
DigitalOut Led_Monitor (LED1); // Led monitor de la Tarjeta
STM32F103C8
DigitalOut latch_enable(PB_5); // Latch Enable SN74HC573
//BusOut
Barra_Leds(PA_8,PA_9,PA_10,PA_11,PA_12,PA_15,PB_3,PB_4); // (lsb ->
msb)
BusOut
Barra_Leds(PB_4,PB_3,PA_15,PA_12,PA_11,PA_10,PA_9,PA_8); // (msb ->
lsb)
//BusOut Barra_Leds(D0,D1,D2,D3,D4,D5,D6,D7); // Utilizando las
definiciones Arduino
PwmOut Buzzer(PB_0); // PB1_TIM3_CH3
PwmOut Led_Rojo(PB_1); // PB1_TIM3_CH4
PwmOut Led_Verde(PA_7); // PA7_TIM3_CH2
PwmOut Led_Azul(PA_6); // PA6_TIM3_CH1
Serial PC_Terminal (PA_2, PA_3); // Tx, Rx - Terminal Serial
(TTL Level)
PwmOut Motor_1(PB_12); //Motor 1
PwmOut Motor_2(PB_13); //Motor 2
/*
#====================================================================
===========
|
| A R E A D E D A T O S
|
#====================================================================
===========
*/
/*
+--------------------------------------------------------------------
-----------
| Variables Globales de Usuario
+--------------------------------------------------------------------
-----------
*/
float badRomance[] = {SOL4, SOL4, SOL4, RE4, MI4, FA4, // RAH RAH
AH-AH-AH
MI4, MI4, MI4, FA4, SOL4, // ROMA,
ROMA-MA
SOL4, SOL4, MI4, MI4, FA4}; // GA-GA
OOH-LA-LA
float felizCumple[] = {
SOL4, SOL4, LA4, SOL4, DO5, SI4, // Feliz cumpleaños a ti
SOL4, SOL4, LA4, SOL4, RE5, DO5, // Feliz cumpleaños a ti
SOL4, SOL4, SOL5, MI5, DO5, SI4, LA4, // Feliz cumpleaños
querido/a [Nombre]
FA5, FA5, MI5, DO5, RE5, DO5 // Feliz cumpleaños a ti
};
}
PC_Terminal.printf ("\r\t\t\t\tNivel: %.2f %% \t\t\tPosicion:
%3d \r",(Lectura*100), Pos1);
// PC_Terminal.printf ("\r\t\t\tNivel: %.2f %% \r",
(Lectura*100));
// PC_Terminal.printf ("\r\t\t\t\t\t\tPosicion: %3d\x0d\
r",Pos1);
}
}
/* END main */
/*
+====================================================================
===========
|
| V E C T O R E S D E I N T E R R U P C I O N
|
+====================================================================
===========
*/
/* Rutina de Atención a la Interrupción */
/* Write your code here ... */
/*
###################################################################
** Evento : Barrido_OnInterrupt()
** Proyecto : STM32F103C8_Torreta
** Procesador : STM32F103C8T6
** Herramienta : Mbed
** Compilador : Mbed Online C Compiler
** Version : Mbed-OS 5.15.0
** Compiler : GNU C Compiler
** Date/Time : 18-12-2019, 11:48, # CodeGen: 0
** Abstract :
** This is user's event module.
** Put your event handler code here.
** Settings :
** Contents :
** Cpu_OnNMIINT - void Cpu_OnNMIINT(void);
**
**
###################################################################*/
void Barrido_OnInterrupt()
{
Retardo--; // Decremeta el contador
del Retardo (milisegundos)
if (!Retardo) // Contador es igual a
Cero?
{
buffer_temp=Barra_Leds; // Guarda el valor de la
Barra de Leds
latch_enable=TRUE; // Latch Enable SN74HC573
(Enciende)
Barra_Leds=badRomance[i]; // Escribe la
secuencia de la Torreta
latch_enable=FALSE; // Latch Enable SN74HC573
(Apaga)
Barra_Leds=buffer_temp; // Recupera el valor de
la Barra de Leds
Buzzer_SetPeriodMode(badRomance[j],1); // Suena la Sirena
i++; // Incrementa el índice
de las secuenciasa
j++; // Incrementa el índice
de los tonos
PC_Terminal.printf ("\rSecuencia Numero: %d ",i);
if (i >= No_Secuencias) i=0; // Es la última
secuencia?
if (j >= No_Tonos) j=0; // Es lel último tono?
Retardo = DELAY; // Reinicia retardo
programado
Led_Monitor = !Led_Monitor; // Parpadeo del Led
Monitor
}
}
/* END Events */
/*
____________________________________________________________________
__________
/
_____________________________________________________________________
_________\
|
|
| F U N C I O N E S P R O T O T I P O
|
|
_____________________________________________________________________
_________|
\
_____________________________________________________________________
________/
*/
// Las Funciones Prototipo van aquí !
/*!
*--------------------------------------------------------------------
---
* @code
* Función : Setup()
* @brief
* Descripción : Rutina para inicialización de los puertos y
funciones
* de la Bluepill
* @param
* Parámetros : Ninguno
* @return
* Retorna : Nada
* @endcode
*--------------------------------------------------------------------
---
*/
void Setup()
{
confSysClock(); // Inicialización del Sistema,
PC_Terminal.baud(BAUD_RATE); // Se configura la velocidad de
transmisión
Buzzer_Beep(); // Prueba el Buzzer
PC_Terminal.printf(" System is Wake Up!.\n\r"); // e inicia
la comunicación con la Terminal
Barrido.attach_us(&Barrido_OnInterrupt, TICKER_RATE); // Periodo de
la Interrupción por Timer = 1ms (TICKER_RATE=1000)
}
/*!
*--------------------------------------------------------------------
---
* @code
* Función : Caratula()
* @brief
* Descripción : Imprime la carátula de bienvenida en la
terminal Serial
* @param
* Parámetros : Ninguno
* @return
* Retorna : Nada
* @endcode
*--------------------------------------------------------------------
---
*/
void Caratula()
{
PC_Terminal.printf(" =)\e[2J"); // Clear Screen
PC_Terminal.printf ("\t\e[1;37;41mInstituto Politecnico Nacional\
e[0m\n\r");
PC_Terminal.printf ("\e[1;37;42mESCUELA SUPERIOR DE INGENIERIA
MECANICA Y ELECTRICA\e[0m\n\r\v");
PC_Terminal.printf ("\t\e[1;34mTo\e[1;33mrre\e[1;31mta y \
e[1;37;41mBar\e[1;37;45mras\e[1;37;43m de Le\e[1;37;42md's En\
e[1;37;46mhen\e[1;37;44mced\e[0m\n\r\v\v");
PC_Terminal.printf ("\e[1;37;42mNatan Gamaliel Tafoya Hernandez\
e[0m\n\r\v");
}
/**
*--------------------------------------------------------------------
-----------
* @brief
* Función : float log2lin(x, in_min, in_max, out_min, out_max)
*
* Descripción : Rutina para linealizar una función logaritmica
* @param
* Parámetros : x, in_min, in_max, out_min, out_max
* x = valor leído
* in_min = Valor de Entrada Mínimo
* in_max = Valor de Entrada Máximo
* out_min = Valor de Entrada Mínimo
* out_max = Valor de Entrada Máximo
* @return
* Retorna : float x_lin
* x_lin = Valor Linealizado
* @endcode
*--------------------------------------------------
*/
float log2lin(float x, float in_min, float in_max, float out_min,
float out_max )
{
float x_lin =(x-in_min)*(out_max-out_min)/(in_max-in_min)
+out_min;
return x_lin;
}
/**
*--------------------------------------------------------------------
-----------
* @brief
* Función : float Futaba(float duty)
*
* Descripción : Rutina para limpiar la pantalla de la
Terminal
* @param
* Parámetros : float duty
* duty = PWM Duty Cycle (0.0 - 1.0)
* @return
* Retorna : float posicion
* posicion = Duty Cycle para Posicionar el Servo (5% -
10%)
* @endcode
*--------------------------------------------------------------------
-----------
*/
float Futaba(float duty)
{
float posicion = (duty * 0.1)+0.024;
// float posicion = porcentaje * 0.1;
return posicion;
}
// Local functions
/**
*--------------------------------------------------------------------
-----------
* @brief
* Función : clear_screen()
*
* Descripción : Rutina para limpiar la pantalla de la
Terminal
* @param
* Parámetros : Ninguno
* @return
* Retorna : Nada
* @endcode
*--------------------------------------------------------------------
-----------
*/
void clear_screen()
{
PC_Terminal.printf("\e[2J\e[H");
}
/**
*--------------------------------------------------------------------
-----------
* @brief
* Función : Buzzer_Beep()
*
* Descripción : Rutina para prueba del Buzzer
* @param
* Parámetros : Ninguno
* @return
* Retorna : Nada
* @endcode
*--------------------------------------------------------------------
-----------
*/
void Buzzer_Beep() // Software routine for
Buzzer Beep
{
/
*--------------------------------------------------------------------
| Configuración del Buzzer para Tipo Pasivo
---------------------------------------------------------------------
- */
#if BUZZER_TYPE == 0
PC_Terminal.printf("Testing Pasive Buzzer... \n\r");
Buzzer_SetPeriodMode(0.001,1); //Buzzer = 1KHz
wait_ms(750);
Buzzer_SetPeriodMode(0.001,0); //Apaga el Buzzer
wait_ms(125);
Buzzer_SetPeriodMode(0.001,1); //Buzzer = 1KHz
wait_ms(250);
Buzzer_SetPeriodMode(0.001,0); //Apaga el Buzzer
wait_ms(125);
Buzzer_SetPeriodMode(0.001,1); //Buzzer = 1KHz
wait_ms(500);
Buzzer_SetPeriodMode(0.001,0); //Apaga el Buzzer
#endif
/
*--------------------------------------------------------------------
| Configuración del Buzzer para Tipo Activo
---------------------------------------------------------------------
- */
#if BUZZER_TYPE == 1
PC_Terminal.printf("Testing Active Buzzer... \n\r");
buzzer = BUZZ_ON;
wait_ms(750);
buzzer = BUZZ_OFF;
wait_ms(125);
buzzer = BUZZ_ON;
wait_ms(250);
buzzer = BUZZ_OFF;
wait_ms(125);
buzzer = BUZZ_ON;
wait_ms(500);
buzzer = BUZZ_OFF;
#endif
PC_Terminal.printf("Buzzer OK ! \n\r");
}
/**
|--------------------------------------------------------------------
-----------
*@brief
| Función Buzzer_SetPeriodMode(Periodo, Estado)
|
| Descripción : Rutina para establecer el periodo de PWM
activa/desactiva
| el buzzer piezo eléctrico
*@param
| Parámetros : float (Periodo del canal de PWM asignado)
| bool (Activa o desactiva el buzzer)
|
| Retorna : Nada
*@endcode
|--------------------------------------------------------------------
-----------
**/
void Buzzer_SetPeriodMode(float Periodo,bool Estado)
{
Buzzer.period(Periodo); // Establece la Frecuencia
if (Estado==1)Buzzer=0.5f; // Encience el Buzzer (Dutty =
50%)
if (Estado==0)Buzzer=BUZZ_OFF; // Apaga el Buzzer
}
/* END Functions */
/* END Routines */
/* END program */
/*
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++
*********************************************************************
***********
|
| D O C U M E N T A C I Ó N
|
*********************************************************************
***********
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++
|
| La documentación va aquí!:
|
|--------------------------------------------------------------------
-----------
| IDENTIFICADORES
|--------------------------------------------------------------------
-----------
|
| prefijo significado uso
| v_ variable (var) v_nombre_variable
| c_ constante (const) c_nombre_constante
| a_ arreglo (array) a_nombre_arreglo
| s_ estructura(struct) s_nombre_estructura
| i_ índice (index) i_nombre_indice
| p_ apuntador (pointer) p_nombre_apuntador
| l_ etiqueta (label) l_nombre_etiqueta
| f_ función (function) f_nombre_funcion
| e_ evento (event) e_nombre_evento
| I_ entrada (input) I_nombre_entrada
| O_ salida (output) O_nombre_salida
| R_ registro (register) R_nombre_registro
| W_ alambre (wire) W_nombre_alambre
|
|
| sufijo significado uso
| _v variable (var) nombre_variable_v
| _c constante (const) nombre_constante_c
| _a arreglo (array) nombre_arreglo_a
| _s estructura(struct) nombre_estructura_s
| _i índice (index) nombre_indice_i
| _p apuntador (pointer) nombre_apuntador_p
| _l etiqueta (label) nombre_etiqueta_l
| _f función (function) nombre_funcion_f
| _e evento (event) nombre_evento_e
| _I entrada (input) nombre_entrada_I
| _O salida (output) nombre_salida_O
| _R registro (register) nombre_registro_R
| _W alambre (wire) nombre_alambre_W
|
|--------------------------------------------------------------------
-----------
| CONEXIÓN A LA TERMINAL SERIAL
|--------------------------------------------------------------------
-----------
|
| Los Transeptores recomedados para se pueden conectar a los
siguientes pines
| de las UART's que posee la Bluepill por medio del siguiente
conexionado.
|
| UART1 UART2 UART3 CABLE CP2102 PL2303 CH340G
FT232RL
| PA_9 PA_2 PB_10 Tx ------> Rx 3 2 2
3
| PA_10 PA_3 PB_11 Rx <------ Tx 4 3 3
2
| 3V ------ 3V 5 5 4
1
| GND ------ GND 2 1 1
4
|
|--------------------------------------------------------------------
----------
| Conexionado de los LEDS´s
|--------------------------------------------------------------------
----------
| Los leds se pueden conectar a cualquier pin que se declare como
DigitalOut
| o PwmOut.
| El dispositivo puede drenar hasta 20ma por todas sus salidas a un
voltaje de
| 3.3V, pero se recomienda no exceder de 1mA por salida.
| Esto se logra poniendo una resistencia limitadora de mínimo 330
Ohms.
|
|
| PA_8 PA_9 PA_10 PA_11 PA_12 PA_15 PB_3
PB_4
| O O O O O O O
O
| | | | | | | |
|
| | | | | | | |
|
| / / / / / / /
/
| \ 1K \ 1K \ 1K \ 1K \ 1K \ 1K \
1K \ 1K
| / / / / / / /
/
| \ \ \ \ \ \ \
\
| | | | | | | |
|
| | | | | | | |
|
| ___|___ ___|___ ___|___ ___|___ ___|___ ___|___ ___|
___ ___|___
| \ / \ / \ / \ / \ / \ / \
/ \ /
| \ / \ / \ / \ / \ / \ / \
/ \ /
| \ / \ / \ / \ / \ / \ / \ /
\ /
| __\/__ __\/__ __\/__ __\/__ __\/__ __\/__
__\/__ __\/__
| | | | | | | |
|
| | | | | | | |
|
| | | | | | | |
|
| |_________|_________|_________|_________|_________|_________|
_________|
| |
| |
| ___|___
| _____
| ___
| _
|
| GND
|
|--------------------------------------------------------------------
-----------
| Descripción del Conexionado del Buzzer
|--------------------------------------------------------------------
-----------
|
| 10
| PWM Pin -----/\/\/\/-------|
| |
| | +
| ( )
| ( )
| ( )
| ( )
| ( O ) Buzzer Piezo Eléctrico Pasivo
| ( )
| ( )
| ( )
| ( )
| |
| |
| |
| -----
| ---
| -
|
| Buzzer Piezo Eléctrico Pasivo usando lógica negativa
|
| 3V3
| O
| |
| |
| | +
| ( )
| ( o ) Zumbador o Buzzer Activo
| ( )
| |
| |
| 10 |
| PWM Pin -----/\/\/\/-------|
|
|
|--------------------------------------------------------------------
---------
| Conexión al Led RGB:
|--------------------------------------------------------------------
----------
|
| Los leds se pueden conectar a cualquier pin que se declare como
DigitalOut.
| El dispositivo puede drenar hasta 20ma por todas sus salidas a un
voltaje de
| 3.3V, pero se recomienda no exceder de 1mA por salida.
| Esto se logra poniendo una resistencia limitadora de mínimo 330
Ohms.
|
|
| PIN (Digital Out)
|
| Led ROJO Led VERDE Led AZUL
|
| R GND G B
| O O O O
| | | | |
| | | | |
| / | / /
| \ 1K | \ 2K \ 2.2K
| / | / /
| \ | \ \ UTILIZANDO LED RGB DE
CÁTODO COMÚN
| | | | |
| | | | |
| ___|___ | ___|___ ___|___
| \ / | \ / \ /
| \ / | \ / \ /
| \ / | \ / \ /
| __\/__ | __\/__ __\/__
| | | | |
* | | | |
| |________|_______|________|
|
|
|
| PIN (Digital Out)
|
| Led ROJO Led VERDE Led AZUL
|
| R VCC G B
| O O O O
| | | | |
| | | | |
| / | / /
| \ 2K | \ 1K \ 1K
| / | / /
| \ | \ \ UTILIZANDO LED RGB DE
ÁNODO COMÚN
| | | | |
| | | | |
| ___|___ | ___|___ ___|___
| /\ | /\ /\
| / \ | / \ / \
| / \ | / \ / \
| /______\ | /______\ /______\
| | | | |
| | | | |
| |________|_______|________|
|
|
|
|--------------------------------------------------------------------
---------
| Conexión al Potenciometro:
|--------------------------------------------------------------------
----------
|
| Como recomendación hay que poner un filtro pasa bajas para evitar
que el
| ruido al convertidor analógico/digital.
|
| 3.3V
| O
| |
| |
| | Conexión al Potenciometro
| |
| /
| \ 10K
| / 100
| \ <----/\/\/\/\--------------> PIN (AnalogIn Pin)
| \ |
| / |
| \ ----- 0.1uF
| | -----
| | |
| | |
| | |
| ___|___ ___|___
| _____ _____
| ___ ___
| _ _
|
| GND GND
|
|
+--------------------------------------------------------------------
-----------
| EJERCICIO
|
| 1.- Modificar este programa para:
| a) Linealizar la respuesta del potenciómetro
| b) Realizar el barrido del arreglo de atrás hacia adelante y
repetir
| 2.- Modificar el programa para incluir un arreglo de secuencias de
sonidos
| utilizando el módulo PWM (Sirena).
| Buzzer_SetPeriodMode(Sirena[i],1); // Suena la Sirena linea
281
| corregir el error que genera y ampliar el número de sonidos
generados.
| 3.- Volver a realizar éste programa utilizando apuntadores a los
arreglos.
| 4.- Modificar el programa para que detecte automáticamente el
tamaño del
| arreglo de secuencias.
|
+--------------------------------------------------------------------
-----------
|
| EXAMEN
|
| 1.- Crear programa que emule al juego de "SIMON":
| a) Incluir 4 botones, 4 Led's (Rojo, Ambar, Verde, Azul) y 4
Tonos
| b) Utilizando el generador de números pseudo-aleatorios
generar numeros
| entre 1 y 4 y asociarlos a los Led´s, botones y tonos.
| c) Comparar el número generado con la respuesta del botón
asociado en un
| plazo de 5 segundos.
| d) Si se obtuvo la respuesta correcta, volver a generar un
nuevo número
| pseudo-aleatorio. De lo contario termina el juego y emite
una secuencia
| de sonidos indicando el fin de este y vuelve al inicio del
juego.
| e) Se repite la secuencia desde el principio hasta el nuevo
número generado
| f) Si se aciertan las secuencias los números (dentro de 5
segundos cada
| una), el programa continua hasta un máximo de 16
secuencias.
| g) Si se completan los 16 aciertos de la secuencia se emitirá
una seciencia
| de sonidos indicando que ya ganó, se volver a emitir toda
la secuencia
| y volverá al inicio del juego para volver a comenzar.
|
| Mucha Suerte!
|
|--------------------------------------------------------------------
---------*
|
| Powered by
|
| T H E A N T U L I U ' S T E A M R&D Unltd
|
| Research, Development, Systems, Equipment, Support & Spare Parts.
| (C) Copyright 1989-2019, All Rights Reserved
|
| Welcome to The Beaners Proyect Community!
|--------------------------------------------------------------------
--------*/
/* END documentation */
/* END Mbed */
RESULTADOS:
https://www.youtube.com/watch?v=ZX4wSvNoXnw
CONCLUSIONES:
1. Control de Motores DC con el L293D:
- El programa permite controlar dos motores DC de manera eficiente utilizando el
controlador L293D y la BluePill.
- La dirección de rotación de los motores se maneja mediante pines de control digital, lo
que facilita cambiar entre avance y retroceso para cada motor.
2. Implementación de PWM (Modulación por Ancho de Pulso):
- El uso de la señal PWM para los motores demuestra su efectividad en el control de la
velocidad, ya que permite variar la potencia entregada sin perder precisión.
- La configuración del PWM con la librería `PwmOut` de Mbed es sencilla, permitiendo
ajustar la frecuencia y el ciclo de trabajo para controlar tanto motores como otros
periféricos (como el buzzer).
7. Sincronización y Temporización:
- Se utiliza un temporizador `Ticker` para ejecutar ciertas tareas en intervalos regulares,
como el control de la barra de LEDs y la reproducción de tonos. Esto permite que el
sistema maneje múltiples tareas en paralelo sin sobrecargar el flujo principal del
programa.
- El uso de `wait_ms()` para temporizar el encendido y apagado de LEDs o el buzzer
demuestra cómo controlar eventos secuenciales sin necesidad de complejas estructuras
de interrupción o máquinas de estado.