programación basada en autómatas
TRANSCRIPT
Sistemas Electrónicos Programables Facultad de Ingeniería, Universidad de Deusto
Programación Basada en Autómatas
Sistemas Electrónicos Programables
Patrones de Diseño Software
Para programa correctamente un sistema embebido, un desarrollador software debe conocer y dominar gradualmente los patrones o métodos de programación más usados porque
proporcionan catálogos de elementos reusables en el diseño de sistemas software,
evitan la reiteración en la búsqueda de soluciones a problemas ya conocidos,
estandarizan el modo en el que se realiza el diseño, entre otras cosas
Un Patrón de Diseño Software es una solución
efectiva y reutilizable a un problema de diseño
software
No pretenden imponer ciertas alternativas de diseño
ni eliminar la creatividad del proceso de diseño
Sistemas Electrónicos Programables
Patrón Singleton
Por medio de este patrón se pretende garantizar la existencia de una única instancia para una clase; y la creación de un mecanismo de acceso global a dicha instancia. Se basa en el uso de un constructor privado y un atributo
estático con la única instancia posible de la clase.
class Singleton {
private static Singleton instance;
private Singleton(){
}
public static Singleton GetInstance() {
{
if (instance == null)
instance = new Singleton();
return instance;
}
}
Sistemas Electrónicos Programables
Patrón Código Espagueti
En realidad, es un anti-patrón, y es un término utilizado para los programas computacionales que tienen una estructura de control de flujo compleja e incomprensible. Suele asociarse a lenguajes de programación antiguos o
básicos y a programadores nóveles.
Se identifica fácilmente cuando: se realiza un uso recurrente de sentencias condicionales
anidadas (if-then-else, while…),
se crean situaciones de bloqueo del sistema (while(1), delay()…) y
se realizan las mismas comprobaciones una y otra vez a lo largo del programa.
No hay nada malo en escribir código espagueti inicialmente
si facilita la compresión de un problema; lo incorrecto es
considerar el código como definitivo
Sistemas Electrónicos Programables
Código Espagueti (continuación…)
Ejemplo 2:
Programar una luz frontal de atletismo con la siguiente
funcionalidad:
Por medio de un botón se puede pasar entre 4 modos
diferentes: apagado, encendido, parpadeo y regulación de luz.
Con cada pulsación, se pasa de un modo al siguiente, y del último al
primero.
En el estado de parpadeo; la luz se encenderá y apagará cada
500mS.
En el estado de regulación de luz; la intensidad de luz será ajustada
por medio de un potenciómetro.
Sistemas Electrónicos Programables
Código Espagueti (continuación…)
void setup() {
pinMode(2, INPUT);
pinMode(6, OUTPUT);
}
void loop() {
digitalWrite(6, LOW);
while (digitalRead(2) == LOW);
delay(200);
digitalWrite(6, HIGH);
while (digitalRead(2) == LOW);
delay(200);
while (digitalRead(2) == LOW)
{
digitalWrite(6, LOW);
delay(500);
digitalWrite(6, HIGH);
delay(500);
}
delay(200);
while (digitalRead(2) == LOW)
{
int val = analogRead(A1);
analogWrite(6, (val * 255.0) / 1023.0);
}
delay(200);
}
Anidamiento de
Condicionales
Comprobación Repetitiva
Situación de Bloqueo
Sistemas Electrónicos Programables
Máquina de Estados
Se llamará máquina de estados finitos si el conjunto de estados de la máquina es finito; siendo éste el único tipo de máquina de estados que es
posible modelar con un computador.
La representación gráfica se realiza por medio de Grafos o Diagramas de Estados;
aunque es posible utilizar diagramas de secuencia.
Se denomina Máquina de Estados al
comportamiento de un sistema con entradas y
salidas; donde las salidas dependen tanto de las
entradaS actuales como de las anteriores
Sistemas Electrónicos Programables
Autómatas Finitos
Formalmente, un autómata finito es una 5-tupla (Q,
Σ, q0, δ, F) donde:
Q es un conjunto finito de estados
Σ es un alfabeto finito
q0 ∈ Q es el estado inicial
δ: Q x Σ Q es una función de transición
F ⊆ Q es un conjunto de estados finales
Un Autómata Finito es un modelo matemático
para la representación de una máquina de
estados finitos.
Sistemas Electrónicos Programables
Autómatas Finitos (continuación…)
Representación formal de un autómata:
Como Diagrama de Estados
Como tabla de transiciones
S2 S1
1 1
1
0
Salida
Q ∈ Q
Símbolo
δ ∈ Σ
Llegada
δ(q,σ) ∈ Q
S1 0 S2
S1 1 S1
S2 0 S1
S2 1 S2
0 1
S1 S2 S1
S2 S1 S2 ó
Sistemas Electrónicos Programables
Diagramas de Estados
Se componen de 3 elementos principales:
Estado: es una condición o situación estable en el tiempo, donde se puede realizar alguna actividad, o no, a la espera de algún tipo de evento.
Evento: es un acontecimiento significativo que puede, o no, activar una transición entre estados.
Transición: es una relación entre dos estados por medio del cual se indica qué evento debe producirse para pasar de un estado a otro.
Los Diagramas de Estados modelan el
comportamiento de un sistema a lo largo de su
ciclo de vida; mostrando el flujo de control entre
los diferentes estados
Sistemas Electrónicos Programables
Diagramas de Estados (continuación…)
Ejemplo 3:
Definición del funcionamiento de una puerta:
Secuencia de Eventos:
1. Abrir con Llave
2. Abrir Puerta
3. Cerrar Puerta
4. Abrir Puerta
5. Cerrar Puerta
6. Cerrar con Llave
Estado
Transición
Evento
Abrir con Llave
Cerrar con Llave
Abrir Puerta
Cerrar Puerta Cerrada
Cerrada
con llave
Abierta
Sistemas Electrónicos Programables
Diagramas de Estados (continuación…)
Ventajas:
Los diagramas de estado son intuitivos y fáciles de entender.
Su uso está muy extendido (por ejemplo, en protocolos de
comunicación).
El sistema se divide en subsistemas más pequeños y
manejables.
Es posible ampliar la funcionalidad del sistema con sólo añadir
nuevos estados y transiciones (sin cambiar lo implementado).
Desventajas:
No es aplicable al 100% de los casos.
Es fácil caer en el error de definir demasiados estados lo que
complicará el sistema se puede solucionar con jerarquías.
Sistemas Electrónicos Programables
Programación de un Autómata
Ejemplo 4:
Especificar el diagrama de estados de la luz frontal del
ejemplo 2. Pulsar Botón
Encendido Apagado
Parpadeo Regulación
Pulsar Botón
Pulsar
Botón
Pulsar
Botón
Sistemas Electrónicos Programables
Programación de un Autómata (continuación…)
Ejemplo 4 (continuación…):
Analizar los eventos que generan las transiciones y las
acciones a realizar en cada estado.
Evento Significado
Pulsar Botón Cuando la señal pasa de nivel bajo a nivel alto
Estado Acciones Se realiza…
Apagado* Apagar la luz 1 vez
Encendido Encender la luz 1 vez
Parpadeo Apagar la luz cuando hayan transcurrido 500 mS todo el tiempo
Encender la luz cuando hayan transcurrido500 mS todo el tiempo
Regulación Regular la luz en base al valor del potenciómetro todo el tiempo
* Estado inicial
Sistemas Electrónicos Programables
Programación de un Autómata (continuación…)
Ejemplo 4 (continuación…):
Identificar los requisitos de cada evento y cada estado.
Evento Requisitos
Pulsar Botón R1. Problema de rebotes con el sistema mecánico del pulsador
R2. Es posible utiliza la interrupción externa
Estado Requisitos
Apagado R3. La luz debe estar apagada al arrancar el sistema
R4. La luz se apaga en la transición hacia este estado
Encendido R5. La luz se enciende en la transición hacia este estado
Parpadeo
R6. Se debe guardar el tiempo del último cambio que se ha realizado
R7. Se cogerá el primer valor en la transición hacía este estado
R8. Se pueden crear dos sub-estados: Apagado y Encendido
Regulación Ninguno
Sistemas Electrónicos Programables
Programación de un Autómata (continuación…)
Ejemplo 4 (continuación…):
Codificar el programa en base a toda la información
obtenida previamente: #define LUZ 6
#define PULSADOR 2
#define POTENCIOMETRO A1
#define APAGADO 0
#define ENCENDIDO 1
#define PARPADEO 2
#define REGULACION 3
byte estado = APAGADO;
byte subestado;
unsigned long tiempoAnterior;
void setup() {
pinMode(PULSADOR, INPUT);
pinMode(LUZ, OUTPUT);
attachInterrupt(0, intPulsador, RISING);
digitalWrite(LUZ, LOW);
}
Definición de los Estados
Requisito R3
Requisito R1
Variables para el Autómata
Sistemas Electrónicos Programables
Programación de un Autómata (continuación…)
void loop() {
switch(estado)
{
case APAGADO:
break;
case ENCENDIDO:
break;
case PARPADEO:
if ((millis() - tiempoAnterior) > 500) {
tiempoAnterior = millis();
if (subestado == ENCENDIDO) {
digitalWrite(LUZ, LOW);
subestado = APAGADO;
}
else {
digitalWrite(LUZ, HIGH);
subestado = ENCENDIDO;
}
}
break;
case REGULACION:
int val = analogRead(POTENCIOMETRO);
analogWrite(LUZ, (val * 255.0) / 1023.0);
break;
}
}
Requisito R6
Clasificación de Estados
Requisito R8
Sistemas Electrónicos Programables
Programación de un Autómata (continuación…)
void intPulsador() {
delay(20);
switch(estado)
{
case APAGADO:
digitalWrite(LUZ, HIGH);
estado = ENCENDIDO;
break;
case ENCENDIDO:
tiempoAnterior = millis();
subestado = ENCENDIDO;
estado = PARPADEO;
break;
case PARPADEO:
estado = REGULACION;
break;
case REGULACION:
digitalWrite(LUZ, LOW);
estado = APAGADO;
break;
}
}
Requisito R4
Clasificación de Estados
Requisito R5
Requisito R7
Sistemas Electrónicos Programables
Programación de un Autómata (continuación…)
Ejemplo 4 (continuación…):
Añadir un nuevo modo de funcionamiento donde la luz se
encienda a un 50% de la potencia:
¿Cómo de complicado y
costoso sería este cambio?
Esta presentación está sujeta a la licencia de Reconocimiento
de Creative Commons mediante la cual se permite la copia, la
distribución, la comunicación pública y la generación de obras
derivadas sin ninguna limitación siempre que se cite al autor y
se mantenga el aviso de la licencia.
© 2014, Jonathan Ruiz de Garibay
Algunos derechos reservados