Como parte de nuestro interés por colaborar con el desarrollo de la robótica en nuestro país, Panama Hitek pondrá este espacio a disposición de docentes y estudiantes entusiastas de la robótica y tratará de contribuir con este movimiento a través e la publicación de artículos y tutoriales sobre este tema. Sobre esta iniciativa ya hemos escrito un artículo dando a conocer los motivos por los cuales nos hemos propuesto participar de este movimiento. En esta ocasión escribiremos sobre las estructuras de control en los diagramas de flujo.
En programación las estructuras de control son las diferentes formas en las cuales se ejecutan las instrucciones de un programa. A través de las estructuras de control el usuario le da las instrucciones al programa para que éste se ejecute según la voluntad del usuario. Debemos tomar en cuenta que no siempre necesitaremos que nuestras instrucciones sean ejecutadas una detrás de la otra, sino que en ocasiones es necesario tomar decisiones o caer dentro de ciclos repetitivos. Este tipo de situaciones ya lo explicamos en el post sobre diagramas de flujo que publicamos hace poco.
En esta ocasión vamos a proceder con la descripción de los 4 tipos básicos de estructuras de control. Cabe destacar que a nivel de lenguajes de programación se habla de más de 4 estructuras, sin embargo, este artículo será basado en la enseñanza del uso del software RoboPro de fieschertechnik, el cual utiliza programación por medio de diagramas de flujo. Para efectos de este artículo en específico, consideraremos las siguientes estructuras de control:
- Estructura secuencial
- Estructura selectiva
- Estructura repetitiva
- Estructuras anidadas
A continuación procederemos a detallar todas y cada una de las estructuras mencionadas, con sus respectivas ilustraciones y ejemplos prácticos.
Consideraciones previas
Contenidos por revisar
Antes de proceder con la explicación de los conceptos que he mencionado considero importante que los lectores revisen algunos contenidos que ya hemos publicado para ustedes en Panama Hitek.
- Fischertechnik ROBO TX Controller: Conceptos básicos
- Fischertechnik RoboPro: Interfaz en Nivel Principiante
- Algoritmos, Diagramas de Flujo y el Arte de Programar
- Entradas y Salidas Analógicas y Digitales
A medida que vayamos avanzando en el artículo iremos haciendo referencia a través de enlaces a los artículos en los cuales se explica mejor los conceptos que queremos transmitir.
El uso del RoboPro
En este artículo utilizaremos el RoboPro para mostrar algunos ejemplos de cómo funcionan las estructuras de control. Para ello debemos tener instalado el software RoboPro 4.2.3, el cual lo podemos descargar gratuitamente desde la página oficial de fischertechnik. Una vez instalamos el software, lo abrimos y debemos asegurarnos de que la interfaz de usuario esté en Nivel Principiante, que es el nivel en el que trabajaremos por ahora.
Hacemos Clic en «Nuevo» (el icono de la página en blanco, o también en el menú Archivo/Nuevo) y nos aparecerá un lienzo en blanco en el cual podremos arrastrar los símbolos que tenemos disponibles en el panel de la izquierda.
Conexión del RTC a la computadora
La alimentación del RTC es en 9 voltios. El puerto USB de nuestra computadora entrega 5 voltios, por lo cual no podemos conectar el RTC y alimentarlo desde el puerto USB, tal como haríamos con un Arduino. Al RTC podemos alimentarlo, ya sea con la batería que viene con el Kit o con un adaptador AC/DC de 9 voltios.
Para los efectos de este artículo, la alimentación la haré con la batería que viene con el Kit.
Una vez conectamos la batería podemos comunicar la computadora con el RTC por medio de la conexión USB. Cuando lo conectemos, en el software RoboPro, hacemos clic en el icono COM/USB (entre los botones de «Entorno» y «Prueba») y veremos lo siguiente:
Seleccionamos ROBO TX Controller y la opción USB/WLAN/Bluetooth y hacemos clic en Aceptar. Con esto estamos listos para seguir los ejemplos que presentaremos en este artículo.
Estructuras de Control
Estructura Secuencial
La estructura secuencial es la estructura de control por excelencia en la gran mayoría de los lenguajes de programación. Esto se debe a que el principal paradigma que se utiliza hoy en día es aquel donde las instrucciones se ejecutan una después de la otra, en forma de secuencia. En el post sobre diagramas de flujo presentamos una imagen en la cual describimos muy bien una estructura secuencial.
El programa inicia, ejecuta un proceso (o procesos) y luego llega a su fin. Todo se produce de forma tal que cada instrucción se ejecuta una, después de la otra, de arriba hacia abajo, siguiendo una secuencia. De ahí el nombre de la estructura.
A continuación vamos a mostrar un ejemplo de una estructura secuencial. Para ello vamos a armar un pequeño circuito con nuestro RTC, utilizando los siguientes materiales:
- Resistencia con un valor entre 310Ω y 360Ω.
- Un LED de cualquier color
- Protoboard para hacer conexiones
Vamos a necesitar armar el siguiente diagrama.
Debemos recordar que para poder desarrollar estos ejemplos debemos alimentar el RTC con su batería y mantenerlo conectado a la PC. También debemos tomar en cuenta que un LED posee polaridad y que no podemos conectarlo de cualquier forma.
El cable negro es el cable que hemos utilizado para la conexión al negativo o ground (GND). El rojo es el que hemos conectado al positivo, el cual obtendremos a partir de una salida digital (en este caso, O1/M1). Ahora vamos a «dibujar» el siguiente diagrama en nuestro software RoboPro.
A continuación procedemos con la descripción, bloque por bloque del diagrama mostrado.
Este esquema es muy sencillo: cada una de las instrucciones se ejecuta una después de la otra en orden descendente, desde el inicio del flujo hasta llegar al final. Una vez llega al final, el programa se detiene y desactiva todas las cargas. Veamos el programa en acción:
Cada una de las instrucciones son ejecutadas al instante y en el orden que les corresponde. No se da ningún tipo de variación en la dirección del flujo, desde el inicio hasta el final.
Estructura Selectiva
Las estructuras selectivas son un tipo de estructura secuencial, en la que la dirección del flujo es decidida por una condición. Si la condición se cumple, se elige un camino. Si la condición no se cumple, entonces se sigue otro camino. En los lenguajes de programación a esto se le conoce como IF-THEN-ELSE (si-entonces-de lo contrario): IF se cumple una condición THEN se ejecuta una serie de acciones ELSE se ejecutan otras acciones.
Dentro de los diagramas de flujo, esto se representa como un rombo, de cuyas aristas se derivan los diferentes flujos. En el post sobre diagramas de flujo dimos una amplia explicación sobre esta estructura. Dentro del software RoboPro, en la interfaz para principiantes encontramos 2 tipos de estructuras selectivas (llamadas bifurcaciones, como ya vimos en este post):
La primera es una bifurcación analógica, la segunda es una bifurcación digital. Para explicar el funcionamiento de estos elementos mostraremos 2 ejemplos sobre su uso. Primero trabajaremos con una bifurcación analógica.
Lo que haremos será lo sigueinte:
- Utilizaremos un potenciometro para establecer un nivel analógico. Con el RTC podemos hacer lecturas de voltaje, donde 0 es igual a cero voltios y 10000 es igual a 10 voltios. Podemos obtener un valor a través de una lectura analógica entre 0 y 10000.
- Usando una bifuración analógica, el nivel de comparación será de 5000 (5 voltios), el cual es aproximadamente la mitad de las vueltas del potenciometro. Para los que no conocen como funciona un potenciómetro, les recomiendo el post titulado «¿Qué es y cómo funciona un potenciometro?«.
- Usaremos 2 LEDs, uno rojo y uno verde. Si el nivel analógico leído por el potenciometro supera los 5000, entonces encenderá el LED verde. De lo contrario, encenderá el LED rojo. El programa que haremos hará simplemente eso: leer un voltaje. Si supera los 5 voltios, habrá una luz verde; si no supera 5 voltios, habrá una luz roja. Luego de encender cualquiera de las luces se esperará 3 segundos y el programa llegará a su fin.
Necesitamos armar un circuito, el cual será un poco más complejo que el de la estructura secuencial. Para ello utilizaremos los siguientes materiales:
- 1 LED verde y 1 LED rojo
- 2 resistencias con valores entre 310Ω y 360Ω
- 1 potenciometro
- Protoboard para hacer conexiones
Debemos armar el siguiente circuito.
El funcionamiento que le otorgaremos a este circuito nos permitirá encender el LED rojo si la posición del potenciometro se encuentra en uno de los extremos. Si movemos la perilla al extremo opuesto, entonces se encenderá el LED verde. El encendido durará 3 segundos en cualquiera de los 2 casos y luego el programa llegará a su final. Para ello utilizaremos el siguiente diagrama de flujo:
La bifurcación digital es la encargada de tomar la decisión de qué camino seguirá el flujo. Es la que «selecciona» la dirección. De ahí que este tipo de estructura se conozca como selectiva. El siguiente video muestra el circuito en plena ejecución.
El funcionamiento mostrado en el video es justo lo que se propuso. La posición del potenciometro es la que decide el color de LED que se enciende. Podemos lograrlo también con una bifurcación digital. Para ello necesitaríamos, en vez de un potenciometro, un botón tipo «push».
Junto a este botón necesitamos una resistencia de un valor alto, preferiblemente 10K. El circuito que debemos armar es el siguiente:
Hemos reemplazado el potenciometro por un botón. Ahora, en vez de una señal de voltaje variable (analógica) tendremos una señal con 2 estados posibles: encendido o apagado. Si presionamos el botón leeremos un HIGH y si el botón no está presionado leeremos un LOW. El diagrama que usaremos será el siguiente:
Como vemos esta es una estructura similar a la anterior, con la diferencia en el tipo de bifurcación utilizada. El resultado será que cuando presionemos el botón y ejecutemos el código, encenderá el LED verde. Si no presionamos el botón y ejecutamos el código, encenderá el LED rojo. Veamos el comportamiento de este esquema en el siguiente video:
En resumen, las estructuras selectivas son capaces de modificar el flujo de un diagrama en función de una decisión. Nos permiten «escoger» entre una opción y otra para lograr lo que queremos.
Estructura Repetitiva
Las estructuras repetitivas (llamadas también iterativas) permiten repetir una serie de instrucciones determinada cantidad de veces. Es posible también que entremos una estructura repetitiva sin un final definido, lo cual es el equivalente a un loop o ciclo infinito. En el post sobre diagramas de flujo encontramos una referencia a este tipo de comportamientos:
Al dar las 10 vueltas a la piscina, el personaje del ejemplo entró en una estructura repetitiva. Esta estructura se conoce como for (o for next en algunos lenguajes). A nivel de lenguajes de programación podríamos mencionar múltiples estructuras repetitivas. Para los efectos de este post, mencionaré las 2 estructuras más importantes:
- For: estructura de control repetitiva que ejecuta una acción durante un número finito de veces
- While: estructura de control repetitiva que permite ejecutar una accion durante un número indefinido de veces, normalmente hasta que se cumpla una condición.
En programación avanzada podemos mencionar el Do-While, Do-Until, For-Next, así como el Select-Case o Switch dentro de las selectivas. Esto, sin embargo, no lo consideramos importante para los objetivos que perseguimos con este artículo.
Dentro del RoboPro, tenemos el siguiente bloque que nos permite utilizar un ciclo for:
Primero tenemos un terminal de entrada al flujo que es el que inicia las iteraciones. Mientras no se haya cumplido con el total de iteraciones el flujo saldrá por la N. Para aumentar el número de iteraciones es necesario que el flujo vuelva a entrar, esta vez por el terminal +1. Al llegar la cuenta a 10, el flujo saldrá por la salida S. Para demostrar el funcionamiento de este ciclo vamos a recrear el ejemplo que desarrollamos con la estructura secuencial.
En el diagrama de la estructura secuencial logramos que un LED se encendiera, se apagara y luego se encendiera. Esto lo logramos utilizando 9 bloques. Ahora haremos que el LED se encienda y se apague 10 veces, utilizando menos bloques de los que implementamos en la estructura secuencial. Nuevamente utilizaremos el circuito que aparece en el diagrama 1. En la programación aplicaremos la siguiente estructura:
Esta estructura repetirá durante 10 ciclos el encendido de un LED, seguido de un tiempo de espera de 1 segundo, para luego apagar el LED y esperar un segundo. De ahí el flujo regresará al principio, entrando al bloque del ciclo for por la entrada +1 aumentando en una unidad el número total de iteraciones. Cuando se cumplan las 10 iteraciones, el flujo saldrá por la «S» y llegará a su fin. Veamos el comportamiento del circuito en el siguiente video:
Como ya mencionamos, esta no es el único tipo de estructura repetitiva que podemos implementar. Es posible que logremos algo parecido a un ciclo while sin una condición de salida, lo cual es el equivalente a un loop, o ciclo infinito (también llamado bucle). Un ejemplo de ello sería un semáforo. ¿Que tal si lo construimos?
Necesitaremos los siguientes materiales:
- LEDs verde, rojo y amarillo.
- 3 resistencias con valores entre 310Ω y 360Ω
- Protoboard para hacer conexiones
Debemos armar el siguiente circuito.
Como vemos tenemos los 3 LEDs de las 3 luces asociados a 3 salidas (O1, O3 y O5) del RTC. Para darle funcionalidad utilizaremos el siguiente diagrama:
El semáforo en funcionamiento lo podemos apreciar en el siguiente video.
Como vemos, esta estructura nos permitirá repetir una serie de instrucciones por un número finito de veces (ciclo for) o por un número indeterminado de veces (ciclo while). Sin embargo, el ciclo while puede incluir una condición de escape si utilizamos una estructura condicional combinada con una estructura repetitiva.
Estructuras Anidadas
Las estructuras anidadas son estructuras dentro de estructuras. Por ejemplo, al tomar una decisión se hace necesario volver a tomar otra decisión. Entonces se dice que hay una estructura selectiva dentro de otra selectiva, lo cual se conoce como estructura anidada.
Podemos hacer una demostración de esta estructura si volvemos a considerar los ejemplos de los diagramas 2 y 3. En el diagrama 2 vimos como con el valor de un potenciometro un LED se encendía durante 3 segundos y luego el programa llegaba a su final. El color del LED dependía de la posición del potemciometro. Ahora haremos lo mismo, solo que el programa no llegará nunca a su final. El LED encendido, sea rojo o verde, dependerá nuevamente del potenciometro pero sin que tengamos que iniciar el programa y que éste solamente dure 3 segundos. Para el diagrama 3 usaremos el siguiente diagrama de flujo:
Si se cumple la condición de un valor A1 mayor a 5000 (equivalente a la posición central de la perilla del potenciómetro), entonces se encenderá el LED verde y se apagará el rojo. Si el valor de A0 es menor a 5000, entonces se apagará el LED verde y el rojo se encenderá. Estas órdenes se seguirán ejecutando de forma infinita, ya que luego del pequeño delay de 0,1 segundos en cada una de las 2 ramas, el flujo regresa al principio y así lo seguirá haciendo hasta que se apague el RoboTX Controller. En el siguiente video podemos observar este comportamiento:
Podemos lograr que el cambio en el color del LED encendido se produzca al presionar un botón en vez de la posición del potenciometro. Para ello cambiamos la bifurcación analógica por una digital y armamos el circuito del diagrama 4. La programación es la siguiente:
Esta vez será una señal digital, el presionar el botón, lo que cambiará la dirección del flujo. Una vez más, las instrucciones se repetirán infinitas veces. El siguiente video muestra este comportamiento:
La combinación de estructuras selectivas y repetitivas (y secuenciales) se utiliza por el programador según se su necesidad. Los 4 paradigmas que hemos presentado son los pilares fundamentales de casi cualquier lenguaje de programación y depende de la destreza del programador lograr sus propósitos con las herramientas que se le brinda.
Cualquier duda, comentario o sugerencia es bienvenida. Esperamos que la información suministrada sea de su comprensión. Saludos.
hola, estoy muy interesado en programar robots, actualmente voy a controlar un robot con un plc y driver mitsubishi , aun no tengo la claridad de las estructuras del programa, les agradesco su apoyo
Gracias por comentar