Pages: [1] 2 3   Go Down
Author Topic: Máquina de estados: Librería FSM  (Read 10060 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola,

He creado una librería para programar en forma de maquina de estados, buscando que sea de la forma más sencilla posible para Arduino.
Usar maquina de estados, es una forma de razonar un problema de computación, que se puede emplear en multitud de casos como control de un interfaz gráfico (lcd), protocolos, etc.
La gran ventaja, es que puedes modificar el flujo de tu programa o añadir más estados sin tener que reescribir código y de una manera bastante sencilla.

Me la he creado para mi uso personal, pero la pongo por aquí por si alguien lo encuentra útil. Es una versión "beta".
He escrito un pequeño documento descriptivo (adjunto con este mensaje=FSMv3.pdf).

Adjunto dos ejemplos, que muchas veces he visto preguntar en el foro:
  • FSM_v5: Es un programa que espera recibir por el puerto serie un número enviado desde el PC dentro de una "trama" sencilla. El número debe ser enviado entre SxxxxE, donde S es de start y E de end. xxxx es un número (unsigned long). Una vez recibido, vuelve a sacar por serie el número recibido.
  • FSM_v6: Es un programa que cronometra desde que se recibe una S(start) por puerto serie hasta que se recibe una E (end). Al recibir dicho comando para parar el cronómetro, saca por serie el resultado.

La librería (FSM.zip) se ha de guardar dentro de la carpeta de arduino (libraries).


Saludos y espero que le encontreis utilidad.


 smiley-twist
Igor R.

* FSMv3.pdf (103.26 KB - downloaded 494 times.)
* examples_FSM.zip (12.58 KB - downloaded 329 times.)
* FSM.zip (1.75 KB - downloaded 290 times.)
« Last Edit: October 18, 2011, 04:42:21 am by Igor R » Logged


Euskadi
Offline Offline
God Member
*****
Karma: 16
Posts: 729
Arduinotarrak
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Gracias, Igor

El programar analizando la situación según un número finito de estados  es una forma muy interesante de abordar los problemas. A mí que me he acostumbrado (viciado) a programar secuencialmente (if() else()) me cuesta bastante cambiar el chip y entrar en ese otro modo pensar, pero probaré algún ejemplo que has puesto.

Logged

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Si, pero ya verás que cuando pruebas resolver algún programa de esta manera, en muchas ocasiones que te facilita la vida muchísimo!! Resulta más fácil de hacerlo así....

Un ejemplo concreto, es si quieres controlar un menu en un lcd.... Si lo piensas de esta manera, es mucho más sencillo de abordar y si quieres hacer una modificación, no tienes que "parchear" todo tu código anterior....

Ya me direís si alguien prueba la librería....


smiley-wink
« Last Edit: October 18, 2011, 05:18:31 am by Igor R » Logged


0
Offline Offline
Edison Member
*
Karma: 8
Posts: 1040
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Esto es SUPERIOR. Gracias Igor

Quote
...acostumbrado (viciado) a programar secuencialmente (if() else()) me cuesta bastante cambiar el chip
Unete me uno al club @curro92
Logged

Trabajando en ...

    * Control Domotico (En montaje ...)
    http://casitadomotica.blogspot.com/
 

[url=https://bitbucket.org/fmalpartida

Ciudad Real
Offline Offline
God Member
*****
Karma: 1
Posts: 751
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

máquinas de estados se pueden abordar multitud de problemas, es lo que más se utiliza en automatización industrial.
otro de los ejemplos basicos que se se puede utilizar es para

no he podido mirarlo aun pero como todo lo que desarrolla Igor será un trabajo excepcional

3 HURRAS POR IGOR ¡¡¡ smiley
Logged

Málaga, Spain
Offline Offline
Edison Member
*
Karma: 41
Posts: 2182
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Igor eres un crack, este finde tenía pensado escribir una para el MMI de un controlador de una cámara climática y es muy posible que tu librería cumpla con lo que necesito. Ya os contare si me decanto por estos derroteros. Muchas gracias por tu contribución. Publica la en el playground que seguro que la usa la gente!
Logged

   

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Yo la he creado para una cosilla que estoy haciendo, ya que andaba hace tiempo con ganas de crearme algo genérico.
Resulta bastante sencillo, ya que sólo hay que crearse una tabla de estados (en forma de dos estructuras que se guardan en memoria de programa). Te deja bastante flexibilidad y si necesitas modificar el flujo de tu programa o añadir nuevas cosas, no necesitas reescribrir el código.

Ya me contaréis si la usáis...De momento está en versión "beta", por eso sólo la he publicado por aquí. En paralelo la estoy usando en un proyecto, pero he creído que a lo mejor podría ser de utilidad.


smiley-wink
« Last Edit: October 18, 2011, 08:18:01 am by Igor R » Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 30
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola Igor

  Como no sigo rigurosamente los temas de debate, y el lector de RSS no me habia avisado de este hilo no lo he visto hasta ahora.

  Interesante tu planteamiento y lamento no haber tenido conocimiento de el hace un par de semanas, me habria ahorrado algo de trabajo, ya que he tenido que hacer algo similar para gestionar una lavadora que tiene averiada la tarjeta de control y la tengo substituida con un Arduino.

  Tu planteamiento es similar al usado en PLCs para control de procesos.
Logged

Barcelona, Catalunya, España, la Tierra, Sistema Solar, Brazo de Orión, Vía láctea, Grupo local
Offline Offline
Jr. Member
**
Karma: 0
Posts: 71
"The best way to predict the future is to implement it." Alan Kay
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


Me he mirado el pdf porque no me da tiempo de echarle un ojo a todo, esta noche si puedo me lo miro. Por lo que he visto en el pdf, y para acabar de dar la vuelta a la rosca, te aconsejo que añadas funciones en las transiciones (no solo en los estados). Esto simplifica las máquinas y las hace más eficaces (no tienes que añadir tantos estados inutiles). A parte, he visto que guardas las cosas en la memoria de programa en vez de en la RAM. La mayoria de las veces, es la memoria del programa la que va justa, y la RAM suele ir más suelta (básicamente porque es más barata para los fabricantes de chips).

Como colofón, estaría bien aprovechar que puedes usar C++ para Arduino convirtiendo las máquinas en objetos. De este modo es mucho más simple instanciarlos, y así crear todas las máquinas de estados que necesites.
Logged

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Que micro usas tu que tiene mas Ram que Flash de programa?? La SRAM es la que es menor que la flash de programa (2kb versus 32 kb)

Acerca funciones en las transiciones, estoy de acuerdo con lo que dices. Tambien se podria anyadir funciones a la entrada, durante estado activo y a la salida del estado.... Pero claro, todo esto complica la programacion.
Para hacerlo en plan objetos existen ya cosas.... por ejemplo smc te crea las clases y tal... http://smc.sourceforge.net/
Tambien hay QP para Arduino....

Mi objetivo era tener algo mucho mas basico que todo eso. Una simple lookup table de transiciones de estados con las funciones a ejecutar.


Saludos y gracias por las sugerencias.

 smiley-wink


Nota.- estoy en ordenador ingles y no tengo ni acentos ni enyes.
« Last Edit: October 19, 2011, 10:09:30 am by Igor R » Logged


Madrid
Offline Offline
Sr. Member
****
Karma: 5
Posts: 481
Life isn't about finding yourself, life is about creating yourself!!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Buen trabajo Igor!!

Ahora que lo comentas hace tiempo que tengo ganas de incarle el diente a QP
http://www.state-machine.com/arduino/

Has hecho algo con QP¿
« Last Edit: October 19, 2011, 11:01:14 am by yOPERO » Logged

Engineering is the art of
making what you want from
things you can get.

     

[SOLUCIONADO]

Málaga, Spain
Offline Offline
Edison Member
*
Karma: 41
Posts: 2182
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Alternativa, implementar el patrón state machine. Pero tal y como esta articulado tiene buena pintan. Añadir callback en las transiciones seria lo ideal pero: una maquina de Mealy siempre se puede modelar con una de Moore y viceversa.

Una vez mas, me parece un librería muy flexible tal y como esta.
« Last Edit: October 19, 2011, 11:04:26 am by fm » Logged

   

Barcelona, Catalunya, España, la Tierra, Sistema Solar, Brazo de Orión, Vía láctea, Grupo local
Offline Offline
Jr. Member
**
Karma: 0
Posts: 71
"The best way to predict the future is to implement it." Alan Kay
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Que micro usas tu que tiene mas Ram que Flash de programa?? La SRAM es la que es menor que la flash de programa (2kb versus 32 kb)

Ouch, me lié, pensaba que era memoria EEPROM, vaya pajarada smiley-red
Logged

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

No pasa nada....  smiley-grin
Logged


Offline Offline
Newbie
*
Karma: 1
Posts: 44
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola a todos. Alguno podría indicarme si la máquina de estados es mas potente que el Grafcet.
Este último lo conozco, pero de la FSM no tengo ni idea. Ademas buscando por google para documentarme
tampoco he aclarado que es mejor si Mealy o Moore.

Bueno, gracias por adelantado.

Jaume
Barcelona
Logged

Pages: [1] 2 3   Go Up
Jump to: