Académique Documents
Professionnel Documents
Culture Documents
Inicio Cursos Electrónica y Programación Cursos Habilidades Blandas Tutoriales F.A.Q. Cont
Máquinas de estado
Máquinas de estado: blink.ino nos enseña la función de reposo (sleep)
Daremos una mirada al esquema blink.ino de Arduino como una máquina de estado explícita. Posteriormente
exploraremos las máquinas de estado donde se elaborará y pondrá en práctica un diagrama de reloj despertador.
Casi todos los esquemas de Arduino terminan usualmente con al menos una máquina de estado intencional y también
un montón de máquinas de estado no intencionales. Aquí, introduciremos el concepto de máquinas de estado y las
aplicaremos a una rutina blink “Hello World” en un microcontrolador. Luego de esto exploraremos algunas máquinas d
estado más complicadas, tales como un reloj despertador.
Un diagrama de una máquina de estado genérica. El elemento de memoria contiene el nuevo estado conocido como e
estado variable. Cuando la máquina de estado cuenta con los servicios, el estado variable es actualizado con el valor d
la próxima etapa. Acá la nueva etapa es una función de ambos; el estado actual y algunos inputs. La nube de la lógica e
un sistema que decide cual será el próximo estado, o la próxima lógica de estado.
cursos.mcielectronics.cl/maquinas-de-estado/ 1/17
8/5/2019 Máquinas de estado - MCI Capacitación - Cursos de Arduino, Raspberry, Domótica y diseño de PCB's
Puedes notar que no importa cuál será el estado de la entrada, la salida solo depende el estado actual contenido dentr
del elemento de la memoria.
Para diagramar la máquina Mealy, la salida está hecha para depender de ambos: el estado actual y la entrada. Aquí la
nube de la lógica de la próxima etapa contiene la lógica de salida también:
También puede ser dibujado separando la nube en la lógica del próximo estado o lógica de salida.
cursos.mcielectronics.cl/maquinas-de-estado/ 2/17
8/5/2019 Máquinas de estado - MCI Capacitación - Cursos de Arduino, Raspberry, Domótica y diseño de PCB's
Este es un ejemplo de cómo se pueden diagramar los estados de una máquina de estado, usando ideas de Moore y
Mealy.
El círculo es el estado
El nombre coloquial del estado esta dado en la mitad superior del circulo
La salida del estado está dada en la mitad inferior del círculo. A veces esto es explicito, como “X=1,” y el estado se
comporta como Moore, aunque a veces puede ser “SALIDA = ENTRADA” donde durante ese estado, hace la salida
igual a lo que haya sido la entrada. En este sentido, la máquina es muy Mealy. Normalmente se engloban los dos
para escribir máquinas de estado C porque realmente no importa la construcción C de la máquina.
La echa es el recorrido de la transición de estado.
Las Xs, arriba de la línea, son las condiciones para que esa transición de estado ocurra. Si se dan las condiciones,
ese será el recorrido de transición.
Las Ys, bajo la línea, son cosas que pasan durante la transición. Este concepto se desvía estrictamente del mundo
lógico digital de Moore y Mealy y se origina de la naturaleza de ejecución consecutiva de C. Mientras utilizamos un
programa, es fácil chequear las condiciones de transición y realizar algunas acciones de una sola vez mientras
cambian los estados, entonces se deben poner las acciones bajo las condiciones.
Siempre ten en mente que estas son representaciones abstractas de códigos y son una herramienta para crear niveles
más altos de operación. Agrega cuantos detalles necesites en el diagrama.
cursos.mcielectronics.cl/maquinas-de-estado/ 3/17
8/5/2019 Máquinas de estado - MCI Capacitación - Cursos de Arduino, Raspberry, Domótica y diseño de PCB's
¿Qué pasa si no se cumplen las condiciones de salida? El diagrama está incompleto y no se han de nido todas las
posibles acciones del estado. Usualmente no sabríamos la solución completa del programa hasta que estén hechos los
diagramas, y los vayamos completando. Con este diagrama, podemos asumir que si las condiciones no son concretada
el estado volverá a sí mismo.
Acá todos los estados posibles son representados con un círculo único. La acción del estado es agregar uno. Para
determinar el próximo estado, es fácil ver que sólo tenemos una opción, que es regresar al estado en que estábamos.
El Sketch de blink.ino
blink_fsm.ino
Salgamos del mundo teórico al re-escribir el familiar sketch de blink.ino con el comportamiento y sintaxis de una
máquina de estado, usando el caso de un interruptor. El ejemplo es iluminar el LED por 1 segundo, apagarlo 1 segundo
repetir el proceso. Acá hay dos estados, LED_ON y LED_OFF.
cursos.mcielectronics.cl/maquinas-de-estado/ 4/17
8/5/2019 Máquinas de estado - MCI Capacitación - Cursos de Arduino, Raspberry, Domótica y diseño de PCB's
En cada estado, el valor del LED se muestra bajo la línea. Las fechas están cada una etiquetadas como VERDADERO
porque no importa qué, nos moveremos al próximo estado de todas maneras. Esta máquina de estado no tiene ningun
entrada. Cada segundo, evaluaremos la máquina de estado. Si el estado es 1, la salida es 1 y se mueve al estado 0. Aqu
está la implementación C.
Para realizar la máquina de estado en C, debes crear una variable que sostiene el valor actual del estado, de ne las
palabras para cada valor numérico en que puede estar el estado y escribe un estado del interruptor para evaluar el
próximo estado.
Hasta ahora, el estado puede tener 1 o 2 opciones, entonces se selecciona el tipo de datos de tamaño más pequeño
switch (fsm_state) {
digitalWrite(13, LOW);
fsm_state = LED_ON;
cursos.mcielectronics.cl/maquinas-de-estado/ 5/17
8/5/2019 Máquinas de estado - MCI Capacitación - Cursos de Arduino, Raspberry, Domótica y diseño de PCB's
break;
digitalWrite(13, HIGH);
fsm_state = LED_OFF;
break;
default:
break;
Cada vez que la función loop es ejecutada, se evalúa la máquina de estado. El estado variable (fsm_state) es global,
entonces retiene el estado.
En este caso se puede notar que en cada segundo esperamos 1 segundo y evaluamos la máquina de estado. El código
extra asociado al proceso de la máquina de esta causará que el ciclo de tiempo sea mucho mayor a un segundo y
correrá un poco lento. Esto podría ser interrumpido con el n de obtener mayor precisión.
blink_fsm_ms.ino
No quiero tener que esperar un segundo completo. Durante ese tiempo podría estar realizando otras cosas! Preferiría
que el proceso de la máquina de estado fuera a un intervalo más rápido. Como 1 microsegundo y se quede en un
mismo estado 1000 veces con el n de crear retrasar.
cursos.mcielectronics.cl/maquinas-de-estado/ 6/17
8/5/2019 Máquinas de estado - MCI Capacitación - Cursos de Arduino, Raspberry, Domótica y diseño de PCB's
Un programa básico de cambio de estado que funciona más rápido de lo que fue programado
Con este diseño, no dejaré el estado a menos que el msCounts alcance 1000. El loop se retrasa por 1 microsegundo en
vez de 1000 microsegundos. Cuando la condición es verdadera para que una transición de estado ocurra, el estado del
LED es escrita y el contador se resetea.
Como antes, los mismos estados y la variable del estado es utilizada. La máquina de estado se expande para proveer
funcionalidad si y solo si la transición del estado va a ocurrir.
switch (fsm_state)
case LED_OFF:
fsm_state = LED_ON;
msCounts = 0;
cursos.mcielectronics.cl/maquinas-de-estado/ 7/17
8/5/2019 Máquinas de estado - MCI Capacitación - Cursos de Arduino, Raspberry, Domótica y diseño de PCB's
fsm_state = LED_OFF;
msCounts = 0; }
break; default:
break;
Ahora, cada estado solo se mueve si la transición lógica de estado es verdadero usando un enunciado “IF”. Aquí es
donde es obvio cuán fácil es agregar tareas de 1 tiempo a la acción de estados de transición. Ellos son solo agregados a
enunciado “IF”, y serán ejecutados solo cuando el estado se mueve.
La máquina de estado funciona pero no como quisiéramos. Noten que el estado LED está en LOW durante el estado
LED_ON y HIGH durante el estado LED_OFF. Es fácil ejecutar el código de una sola vez dejando un estado, pero no
durante la entrada del estado. Es contablemente intuitivo y puede ser realizado claramente al agregar dos estados má
cada uno sólo espera.
blink_fsm_ nal
cursos.mcielectronics.cl/maquinas-de-estado/ 8/17
8/5/2019 Máquinas de estado - MCI Capacitación - Cursos de Arduino, Raspberry, Domótica y diseño de PCB's
Acá los estados LED_ON y LED_OFF escriben al LED, limpian el contador y continúan adelante.
Nota lateral de sincronización y exactitud: El contador ha sido modi cado a una cuenta de 999 para tener en cuenta el
estado extra, pero no ayuda mucho. Llegamos más lejos mientas más rápido hacemos correr el reloj. Esto es debido a
que el tiempo que toma evaluar la máquina de estado está comenzando a alcanzar el total de tiempo para ejecutar el
loop() INCLUYENDO el retraso(1); enunciado.
Primero, los dos estados extra son agregados a la lista de #de nes.
blink_fsm_ nal
#define LED_OFF 0
#define LED_ON_WAIT 1
#define LED_ON 2
#define LED_OFF_WAIT 3
//state machine
switch (fsm_state){
cursos.mcielectronics.cl/maquinas-de-estado/ 9/17
8/5/2019 Máquinas de estado - MCI Capacitación - Cursos de Arduino, Raspberry, Domótica y diseño de PCB's
digitalWrite(13, LOW);
fsm_state = LED_ON_WAIT;
break;
fsm_state = LED_ON;
msCounts = 0;
break;
digitalWrite(13, HIGH);
fsm_state = LED_OFF_WAIT;
break;
cursos.mcielectronics.cl/maquinas-de-estado/ 10/17
8/5/2019 Máquinas de estado - MCI Capacitación - Cursos de Arduino, Raspberry, Domótica y diseño de PCB's
fsm_state = LED_OFF;
msCounts = 0;
break;
default:
break;
Vemos que los estados extra se han convertido en casos extras en la sentencia Switch. Los estados que siempre se
mueven hacia delante de forma simple asignan el próximo estado al estado variable. El estado de retraso chequea las
cuentas antes de asignar un nuevo estado, además retiene el estado en el que estaban.
Más notas sobre sincronización: Ejecutar el incrementador msCounts con una Rutina de Servicio de Interruptor de 1
microsegundo (ISR). Mientras tanto utilizar el loop en el FSM tan rápido como sea posible. Esto corregirá la
sincronización. Debemos tener en cuenta que si el tiempo de ejecución del código entre las llamadas ISER (el tiempo de
proceso de la máquina de estado) es más largo que el intervalo de la llamada ISER, el programa probablemente se
bloqueará
Estados:
Entradas
cursos.mcielectronics.cl/maquinas-de-estado/ 11/17
8/5/2019 Máquinas de estado - MCI Capacitación - Cursos de Arduino, Raspberry, Domótica y diseño de PCB's
Hay algunas más, como entradas para establecer hora y establecer alarma, pero este ejemplo está limitado a las
operaciones de alarma solamente.
Si intentamos caminar mentalmente a través de la operación de la máquina de estado veremos que podemos obtener
del ‘idle’ al sonar si el reloj despertador no está armado. También podemos volver a ‘idle’ al presionar el botón de repos
(sleep). Tenemos que desarmar la alarma, esto cumple nuestra de nición interna de cómo actúa un reloj despertador,
entonces proseguimos.
No existe una manera en que realmente demos seguimiento al tiempo, incluso si solo fuera para el experimento. En ve
de darle seguimiento a los días, horas, etc., solo queremos darle seguimiento a los segundos. Entonces necesitaremos
contar los segundos. La máquina de estado de parpadeo de LED ya hace eso! Solo lo cambiaremos para mantener el
seguimiento y agregar a toda la máquina de estado dentro.
Como un bene cio, se puede bloquear el parpadeo del LED a menos que la alarma se apague y usar eso como resultad
de depuración.
cursos.mcielectronics.cl/maquinas-de-estado/ 12/17
8/5/2019 Máquinas de estado - MCI Capacitación - Cursos de Arduino, Raspberry, Domótica y diseño de PCB's
Conexiones de Hardware:
Conecta un botón de apertura normal entre el pin 7 y el GND de un Arduino. Esto servirá como “REPOSO” (sleep).
Conecta el switch SPST entre el pin 9 y la tierra. Esto servirá como “ARM” (brazo).
El código es muy similar a los ejemplos previos, pero tiene dos máquinas de estado construidas sobre él.
uint16_t msCounts = 0;
uint16_t sCounts = 0;
#define LED_OFF 0
#define LED_ON_WAIT 1
#define LED_ON 2
#define LED_OFF_WAIT 3
Luego, los estados y las variables de la máquina de estado de alarma. La hora de la alarma se establece en 15 segundos
del reinicio (de hecho cerca de 20 con error), y el ciclo de reposo se establece por 5 segundos.
#define ALARM_SECONDS 15
#define SNOOZE_SECONDS 5
uint8_t alarmActive = 0;
cursos.mcielectronics.cl/maquinas-de-estado/ 13/17
8/5/2019 Máquinas de estado - MCI Capacitación - Cursos de Arduino, Raspberry, Domótica y diseño de PCB's
#define ALARM_IDLE 0
#define ALARM_RINGING 1
#define ALARM_SNOOZING 2
switch (timer_fsm_state)
digitalWrite(13, LOW);
timer_fsm_state = LED_ON_WAIT;
break;
timer_fsm_state = LED_ON;
msCounts = 0; }
break;
if(alarmActive == 1) {
digitalWrite(13, HIGH);
timer_fsm_state = LED_OFF_WAIT;
break;
cursos.mcielectronics.cl/maquinas-de-estado/ 14/17
8/5/2019 Máquinas de estado - MCI Capacitación - Cursos de Arduino, Raspberry, Domótica y diseño de PCB's
timer_fsm_state = LED_OFF;
msCounts = 0;
sCounts++;
break;
default:
break;
switch (alarm_fsm_state){
case ALARM_IDLE:
alarm_fsm_state = ALARM_RINGING;
alarmActive = 1; }
break;
case ALARM_RINGING:
if(buttonValue == 0) {
alarm_fsm_state = ALARM_SNOOZING;
alarmActive = 0; }
cursos.mcielectronics.cl/maquinas-de-estado/ 15/17
8/5/2019 Máquinas de estado - MCI Capacitación - Cursos de Arduino, Raspberry, Domótica y diseño de PCB's
alarmActive = 0; }
break;
case ALARM_SNOOZING:
alarm_fsm_state = ALARM_RINGING;
alarmActive = 1; }
alarm_fsm_state = ALARM_IDLE; }
break;
default:
break;
Conclusión
En nuestra experiencia, cualquier programador creador de códigos que puede diagramar un programa antes de
escribirlo tendrá éxito con el programa. Se han escrito muchos programas que han terminado como un montón de
“enunciados if” anidados porque no nos adelantamos a los hechos. Inevitablemente, se necesita agregar una cosa
pequeña que corrompe enormemente el programa y somos forzados a re-evaluar las decisiones. El usar herramientas
tales como diagramas de máquinas de estado, diagramas de ujo, diagramas de clase y tests de unidad que nos
permiten escribir códigos más complejos pero mantenibles (mientras permanece relativamente cuerdo). La máquina de
estado es solo otra idea para tener en la caja de herramientas y esperamos que les ayude en el futuro.
cursos.mcielectronics.cl/maquinas-de-estado/ 16/17
8/5/2019 Máquinas de estado - MCI Capacitación - Cursos de Arduino, Raspberry, Domótica y diseño de PCB's
Viana 405, Local 7, Viña del Mar Cursos arduino.cl
Tel:+ 56 32 2710559 Tutoriales ibutton.cl
Luis Thayer Ojeda 0115 of 1105, Santiago F.A.Q xbee.cl
Tel:+ 56 22 3339579 Contacto mcielectronics.cl
Tienda mcitelecom.com
cursos.mcielectronics.cl/maquinas-de-estado/ 17/17