Inicio » Programacion » Facilino » Facilino Guía » Introducción a Facilino MyBlocks

Introducción a Facilino MyBlocks

En estra entrada se presenta la herramienta de creación de bloques de Facilino: Facilino MyBlocks.

Facilino MyBlocks es una herramienta que te permitirá crear tus propios bloques de Facilino. El objetivo de esta herramienta es que pueda ser utilizada por usuarios avanzados que consideren que una funcionalidad no contemplada por Facilino pueda ser interesante compactarla en una instrucción. Principalmente está enfocada a profesores y docentes, para que creen sus propios bloques y los compartan con otros usuarios, pero también para usuarios y programadores que quieran crear instrucciones de sus propios componentes.

En este sentido, se pueden crear bloques que puedan ser incorporados en Facilino de forma sencilla, tanto para el uso individual como para el uso colectivo. En el caso del uso individual, los bloques creados serán automáticamente guardados en la librería MyBlocks que internamente utiliza Facilino, mientras que si se quiere compartir una instrucción para su uso colectivo, lo que se debe de hacer es exportar el proyecto de Facilino MyBlocks, así como todos los ficheros (imágenes y documentos html para la ayuda que sean necesarios).

Para poder utilizar Facilino MyBlocks se requiere entender el proceso de generación de código tanto en Arduino como en Blockly (se recomienda leer información al respecto de la API de Arduino y la API de Blockly), aunque de forma intuitiva se puede aprender a utilizar la herramienta de forma sencilla.

Interfaz de Facilino MyBlocks

A continuación se muestra la interfaz de usuario de Facilino MyBlocks, en la que por un lado se dispone de una barra de menú con las típicas opciones para abrir/guardar ficheros «xml» con los bloques definidos, así como utilidades para actualizar la librería de bloques de Facilino MyBlocks. También dispone de un icono que mostrará un menú desplegable con los bloques existentes en la librería, así como un icono para salir de Facilino MyBlocks y volver a Facilino.

 

Facilino MyBlocks permite generar el aspecto del bloque (conocido también como la definición del bloque), definir el código generado para Arduino, así como la documentación del bloque. Tanto la definición del bloque como la generación de código Arduino son necesarias completar para que el bloque funcione adecuadamente. La documentación es opcional y, en principio lo deseable sería que todo estuviera perfectamente documentado, particularmente si su uso será colectivo.

Concretamente, en el menú de bloques disponemos de tres categorías en concreto, que son «Block», «Code» y «Doc», cada una con las instrucciones correspondientes para completar los tres aspectos anteriormente mencionados.

Definición de bloques

Así, pues, las instrucciones de la categoría permitirán definir el aspecto del bloque, definiendo tanto las entradas, salidas, conexiones, campos, color, etc. que el bloque debe de tener. Este es el primer paso a completar ya que la generación de código dependerá de las variables de entradas aquí definidas. Conforme se añaden o modifican los diferentes elementos, el aspecto del bloque cambiará interactivamente, así como el código Blockly generado para la definición del bloque en la parte derecha.

El tooltip permite mostrar un texto de ayuda al pasar el ratón por encima de la instrucción.

A continuación se muestran las opciones disponibles y se comenta la funcionalidad de cada una de ellas:

Entradas

Las entradas de bloque permiten definir el tipo de entrada del bloque tal y como Blockly lo hace. Una entrada del tipo «Value Input» es una entrada que espera un valor determinado para que sea introducido por el usuario, mientras que una entrada del tipo «Statement Input» espera que se apilen un conjunto de instrucciones dentro de ella. Las entradas «Dummy Input» son entradas que tienen la finalidad de agrupar un conjunto de campos con diferente información.

Las entradas del tipo «Value Input» generarán en el Código Blockly para la generación de código Arduino el siguiente tipo de código:

var input_name = Blockly.Arduino.valueToCode(block, 'NAME', Blockly.Arduino.ORDER_ATOMIC);

De forma similar, las entradas del tipo "Statement Input" generarán el siguiente código:
var statements_name = Blockly.Arduino.statementToCode(block, 'NAME');

Las entradas del tipo «Dummy Input» no generan código en esta sección (sólo afectan a la definición del bloque).

Campos

Los campos permiten mostrar texto o introducir determinadas opciones para que el usuario escoja o determine un valor, pero no se pueden conectar a ninguna otra instrucción a diferencia de las entradas del tipo «Value Input». Según el tipo de información que queramos mostrar, el campo puede ser desde un simple campo de texto que nos permitirá mostrar un texto en el bloque hasta un campo que indique la ruta de la imagen a mostrar dentro del bloque. Otros campos de interés como el «Text Input field» permiten al usuario introducir un texto, el «Dropdown Field» un menú desplegable con opciones, el «Checkbox field» una casilla marcable o el «Colour field» un color seleccionable por el usuario.

Los campos que incluyan un nombre propio, por defecto «NAME», también generarán código en la sección de generación de código de Arduino de Blockly. Concretamente:

var field_name = block.getFieldValue('NAME');
Tipos

Los tipos de variables permiten discriminar la compatibilidad de conexión de una entrada con otra. De esta forma si queremos asegurarnos que nuestra entrada acepte sólo un tipo determinado de entradas, debemos especificar el tipo de variable. Esto ayudará a corregir errores de programación de los usuarios de la instrucción, ya que Facilino, a través de una utilidad de Blockly permite expulsar los bloques que son incompatibles.

Etiquetas y Ejemplos

Estas opciones están, por el momento incluidas pensando en futuras funcionalidades, pero que por el momento no tienen ningún efecto sobre el bloque.

Código de Arduino

Para poder generar adecuadamente el código de Arduino que el bloque debe generar, debéis primero entender la forma en la que tanto Arduino como Facilino trabajan en este aspecto.

Arduino requiere por un lado la inclusión de librerías de cabecera (o «headers») que le permiten ampliar sus diferentes funcionalidades a través de librerías desarrolladas, en la mayoría de los casos, por terceros y que no están incluidas por defecto en el núcleo (o «core») de Arduino. Por otro lado, podemos, al igual que en C, definir funciones y variables globales que podremos utilizar en otras partes de código. Algunos bloques requieren de un conjunto de instrucciones, típicamente de inicialización de un dispositivo, que debe ser programado en la función «Setup» de Arduino. Muchos bloques requieren de estas instrucciones para poder utilizar otros métodos o instrucciones posteriormente, como por ejemplo «Serial.begin()», que es necesario para posteriormente hacer uso de las instrucciones «Serial.read» o «Serial.write», entre otras. Para evitar generar múltiples instancias del mismo código, es decir, que se generen múltiples instancias de «Serial.begin» cada vez que hagamos uso de «Serial.read» o «Serial.write», lo que se hace es estructurar el código de setup en secciones. Si el nombre de la sección es el mismo para varios de los bloques que creemos, todos estos bloques deberían compartir el mismo código, ya que de lo contrario, se quedará siempre por defecto el código de la última instrucción. Por ejemplo, lo lógico sería definir la sección «Serial» para que todas aquellos bloques que hagan uso del puerto serie de Arduino, siempre implementen las mismas instrucciones de Arduino. Finalmente, el código introducido en «Inline» es un código que la instrucción generará allá donde se ubique en le programa del usuario, típicamente puede ser en «Setup» o «Loop».

Cabeceras

Por cada cabecera que queramos incluir, debemos especificar el nombre de la cabecera, por ejemplo «Servo.h» incluirá en el código generado por el bloque el código de Arduino «#include <Servo.h>»

Variables

Se pueden definir variables globales con tipos predefinidos en Arduino o variables con cualquier otro tipo (por ejemplo de una clase definida en una cabecera que acabmos de incorporar). Los nombre de las variables deben ser únicos para que el compilador no genere errores y una vez establecido el nombre de la variable, éste aparecerá en la lista de variables seleccionables para generar el código correspondiente en las funciones globales, setup o código «inline».

Funciones

La funciones permiten generar código que puede ser reutilizado posteriormente en otras lladamas. Para definir una función debemos primero especificar el tipo de función que queremos crear, si ésta tiene argumentos de entrada y de qué tipo, argumento de salida (y de qué tipo), etc. Una vez definida la función, podemos arrastrar dentro de ella, código que será incluido dentro de la función, seleccionar variables, estructuras básicas de control (if, switch, for, while), etc.

Setup

Tal y como se ha mencionado, el código generado en el Setup de Arduino se estructura por secciones, a las cuales debemos de asignar un nombre (si tenéis dudas al respecto de los nombre que genera Facilino para algunas de sus secciones podéis consultárselo a soporte@roboticafacil.es.

Dentro de cada sección podéis incluir bloques para la generación de código de Arduino que se describen a continuación en el apartado «Inline».

Inline

Tanto las funciones globales, como las secciones de «Setup» e «Inline» permiten la generación de código de Arduino. A continuación se muestra el conjunto de instrucciones que se pueden utilizar:

Las instrucciones se deben enganchar de forma que el código se lea como si se fuera código de Arduino. Se puede aprender mucho mediante prueba y error, pero lógicamente en el futuro documentaremos mejor este aspecto.

Documentación

En el apartado de documentación se puede incluir un título para la instrucción, así como una descripción. Por otro lado, para cada entrada del tipo «Value Input» y «Statement Input», así como de aquellos campos que tengan un nombre específico, se pueden documentar incluyéndolos en los apartados correspondientes.

Los emplos pueden también documentarse y se incluirán en la documentación. Se debe seleccionar el nombre del ejemplo e incluir una descripción del mismo así como una imagen del circuito necesario para reproducir el ejemplo.

El documento finalmente generado se completará con toda la información proporcionada y será el que se mostrará cuando el usuario pulse sobre el botón derecho para acceder a la ayuda.