Programando Escornabot con mBlock

Introducción

mBlock es un entorno gráfico de programación basado en el editor Scratch 2.0 creado por la empresa Makeblock que permite programar no solo los propios robots de Makeblock con Scratch si no también robots basados en Arduino como es el caso del robot Escornabot.

Mediante la creación de extensiones podemos crear nuestros propios bloques y nos da la posibilidad de poder programar nuestro propio robot basado en Arduino mediante este entorno gráfico.

Este manual refleja los pasos necesarios para la instalación y uso de esta extensión creada específicamente para el robot Escornabot.

1- Descargar la extensión

El primer paso será Ir al repositorio y descargar la última versión de la extensión:

https://github.com/avilmaru/escornabot-extension-mblock

2- Parametrización del fichero de configuración de la extensión

Antes de hablar de la configuración (que será la única cosa necesaria que tengamos que hacer en este apartado) es conveniente tener la visión de la estructura de directorios y ficheros que componen la extensión.

Una vez descarga la extensión podemos ver que tiene la siguiente estructura:

Esta estructura está formada por:

    •  js: Carpeta que contendría el archivo javascript (*.js) utilizado para trabajar en “modo Scratch”. En nuestro caso este directorio estará vació ya que solo podemos trabajar en “modo Arduino” pero es necesario que este directorio se encuentre creado puesto que de no ser así se produciría un error a la hora de importar la extensión en mBlock.
    •   src: Carpeta que contiene las librerías y archivos adicionales que utilizamos en la extensión. En nuestro caso tendrá la librería EscornabotExtension (“EscornabotExtension.cpp” y “EscornabotExtension.h”) que contiene todas las funciones utilizadas en los bloques, el archivo “Pitches.h” utilizado para la definición de los valores de las notas musicales y por último el fichero de configuración “estándard” del Escornabot “Configuration.h”
    •  escornabot.s2e: Archivo principal de la extensión que contiene la información básica y los bloques que constituyen nuestra extensión.

Ahora sí, vamos a lo importante …

El fichero de Configuración “Configuration.h” que como hemos visto se encuentra dentro del directorio src es el mismo que se utilizada en el firmware oficial de Escornabot y por tanto bastará reemplazarlo por el que ya estemos utilizando con nuestro Escornabot (suponiendo que está correctamente configurado).

Esta acción es necesaria para el correcto funcionamiento del robot puesto que es donde definimos, entre otras cosas, el valor que tienen los botones al ser pulsados, la definición de pines, etc.

Otra opción es abrir el fichero “Configuration.h” que se incluye en la extensión y modificar las opciones directamente. Tanto una opción como otra será válida.

Hay que decir que solo el fichero de configuración es el único archivo en común con respecto a firmware original ya que para la creación de esta extensión se ha creado una librería específica para este propósito y no tiene ninguna dependencia con respecto a las librerías que componen el firmware original.

Y de todos los parámetros que tiene el fichero de configuración ¿qué parámetros son los utilizados por la extensión? … pues todos los que seguidamente os describo:

// engine to use
#define ENGINE_TYPE_STEPPERS  → Necesario para definir que estamos usando los motores paso a paso.

// button set to use (analog input, digital input)
#define BUTTONS_ANALOG → Necesario para definir que estamos usando los botones análógicos.

// buzzer
#define BUZZER_PIN 10 → Necesario para definir el pin al cual está conectado el buzzer.

// simple led
#define SIMPLE_LED_PIN 13  → Necesario para definir el pin al cual está conectado el LED integrado de la placa.

//////////////////////////////////////////////////////////////////////
///// Steppers engine setup
//////////////////////////////////////////////////////////////////////

#ifdef ENGINE_TYPE_STEPPERS

// stepper pin setup (digital outputs)
#define STEPPERS_MOTOR_RIGHT_IN1 9
#define STEPPERS_MOTOR_RIGHT_IN2 8
#define STEPPERS_MOTOR_RIGHT_IN3 7
#define STEPPERS_MOTOR_RIGHT_IN4 6
#define STEPPERS_MOTOR_LEFT_IN1 5
#define STEPPERS_MOTOR_LEFT_IN2 4
#define STEPPERS_MOTOR_LEFT_IN3 3
#define STEPPERS_MOTOR_LEFT_IN4 2
// step calibration
#define STEPPERS_STEPS_PER_SECOND 1000
#define STEPPERS_LINE_STEPS 1738
#define STEPPERS_TURN_STEPS 1019

#endif

→ Necesario para definir los pines a los cuales está conectado cada motor paso a paso así como la configuración de los pasos por línea, pasos por giro y velocidad de pasos por segundo.


//////////////////////////////////////////////////////////////////////
///// Button set analog
//////////////////////////////////////////////////////////////////////

#ifdef BUTTONS_ANALOG

#define BS_ANALOG_WIRES 2
//#define BS_ANALOG_WIRES 3

// Button set pin setup (analog input)
#define BS_ANALOG_PIN A4

// input values for each key pressed (0 if key doesn't exist)
#define BS_ANALOG_VALUE_UP 813
#define BS_ANALOG_VALUE_RIGHT 737
#define BS_ANALOG_VALUE_DOWN 576
#define BS_ANALOG_VALUE_LEFT 908
#define BS_ANALOG_VALUE_GO 856
#define BS_ANALOG_VALUE_RESET 0

#endif 

→ Necesario para definir el pin que va a leer el valor de los botones pulsados y el valor que posee cada uno de los botones cuando son pulsados.

Estos parámetros tienen que estar presentes y definidos en el fichero de configuración, si algún de ellos se obvia o se encuentra mal definido el robot no funcionará correctamente.

Ejemplo:

Imaginemos que no definimos el parámetro:

#define SIMPLE_LED_PIN 13  

Lo que ocurrirá es que si intentamos utilizar cualquier función relacionada con el LED (LED integrado en la placa) se producirá un error puesto que las funciones relacionadas con el LED no estará disponibles en la librería EscornabotExtension (librería específica creada para la extensión). Los bloques seguirán estando visibles en el programa mBlock pero al intentar subir el programa al robot se producirá un error puesto que dichos bloques están haciendo referencia a funciones que no se encuentran disponibles.

Una vez puesto los parámetros correctos en el fichero de configuración crearemos un archivo comprimido ZIP del directorio raíz de la extensión, es decir, del directorio que contiene los directorios js, src y el fichero escornabot.s2e.

Resumiendo después de todo este rollo:

    1. Mantener siempre la estructura de la extensión que hemos visto.
    2. Configurar el fichero Configuration.h” que se encuentra dentro del directorio src.
    3. Crear un archivo comprimido zip del directorio raíz de la extensión.

3- Importación de la extensión

Para importar la extensión (archivo zip que previamente hemos creado) al entorno visual de mBlock iremos a la opción del menú principal Extensiones y posteriormente a la opción Administrar Extensiones:

Nos aparecerá una pantalla donde aparecen todas las extensiones disponibles e instaladas:

Pulsaremos el botón Añadir Extensión (situado en la esquina inferior derecha) y seleccionaremos el archivo zip que contiene nuestra extensión.

Si todo está correcto se habrá cargado la extensión Escornabot en mBlock. Podemos verificar que se ha instalado correctamente pulsando el botón Instalado. Al pulsar el botón aparecerán todas las extensiones instaladas y entre ellas deberá aparecer la de Escornabot.

4- Preparación del entorno

Una vez importada correctamente la extensión y previamente a que empecemos a usar los bloques para programar nuestro Escornabot debemos realizar las siguientes acciones:

1.- Ir a la opción del menú principal Placas y seleccionar la opción Arduino Nano (mega328)

2.- Ir a la opción del menú principal Extensiones y seleccionar la opción Escornabot. Es recomendable dejar únicamente activa esta extensión para evitar que mBlock genere código innecesario a la hora de arrastrar los bloques.

3.- Conectar por USB nuestro Escornabot al ordenador (si no lo hemos hecho antes) y seleccionar el puerto serie. Para ello iremos a la opción del menú principal Conectar y seleccionaremos el puerto correspondiente dentro de la lista de puertos que se muestran dentro de la opción Puerto Serie.

4.- Ir a la opción del menú principal Editar y seleccionar la opción Modo Arduino.

Una vez ingresamos en Modo Arduino tendríamos que ver todos los bloques de la extensión de Escornabot:

En este punto ya tenemos todo lo necesario para poder empezar a programar nuestro Escornabot mediante bloques.

5- Bloques

1) Bloque cabecera: Bloque inicial obligatorio el cual es necesario para iniciar la programación del robot y del cual cuelgan el resto de bloques.

2)  Avanzar “n” unidades con velocidad “x”: Bloque que hacer avanzar el robot hacia adelante n unidades con una velocidad determinada.

Los valores a seleccionar en el desplegable de velocidad serán: 100%, 50% y 25% siendo el valor por defecto 100%.

Observaciones respecto al parámetro unidades:

    1. Valor por defecto 1.
    2. Solo se admiten números enteros positivos.
    3. Si se pone un número decimal solo se tendrá en cuenta la parte entera (Ej: 1.3 → 1, 1.5 → 1,  1.7 → 1).
    4. Si se pone un número negativo se considerará valor 0.
    5. Vale pero … ¿que es una unidad? … la unidad vendrá definida por el parámetro STEPPERS_LINE_STEPS del fichero de configuración “Configuration.h” de nuestra extensión presente en el directorio src.:

#define STEPPERS_LINE_STEPS 1738  (esto equivale a 10 cm)

Donde por defecto 1 unidad = 10 cm. Si por ejemplo se quiere que por cada unidad se  avance 1 cm bastará cambiar el valor de este parámetro por el número de pasos que hacen avanzar al robot 1 cm.

3)  Retroceder “n” unidades con velocidad “x”: Bloque que hacer retroceder el robot n unidades con una velocidad determinada.

Los valores a seleccionar en el desplegable de velocidad serán: 100%, 50% y 25% siendo el valor por defecto 100%.

Observaciones respecto al parámetro unidades:

    1. Valor por defecto 1.
    2. Solo se admiten números enteros positivos.
    3. Si se pone un número decimal solo se tendrá en cuenta la parte entera (Ej: 1.3 → 1, 1.5 → 1,  1.7 → 1).
    4. Si se pone un número negativo se considerará valor 0.
    5. Vale pero … ¿que es una unidad? … la unidad vendrá definida por el parámetro STEPPERS_LINE_STEPS del fichero de configuración “Configuration.h” de nuestra extensión presente en el directorio src.: 

#define STEPPERS_LINE_STEPS 1738  (esto equivale a 10 cm)

Donde por defecto 1 unidad = 10 cm. Si por ejemplo se quiere que por cada unidad se  retroceda 1 cm bastará cambiar el valor de este parámetro por el número de pasos que hacen retroceder al robot 1 cm.

4) Girar a la izquierda “n” grados con velocidad “x”: Bloque que hacer girar el robot n grados hacia la izquierda con una velocidad determinada.

Los valores a seleccionar en el desplegable de grados serán: 90, 180, 270 y 360 siendo el valor por defecto 90.

Los valores a seleccionar en el desplegable de velocidad serán: 100%, 50% y 25% siendo el valor por defecto 100%.

5) Girar a la derecha “n” grados con velocidad “x”: Bloque que hacer girar el robot n grados hacia la derecha con una velocidad determinada.

Los valores a seleccionar en el desplegable de grados serán: 90, 180, 270 y 360 siendo el valor por defecto 90.

Los valores a seleccionar en el desplegable de velocidad serán: 100%, 50% y 25% siendo el valor por defecto 100%.

6) Encender el led de la placa: Bloque que enciende el LED integrado en la placa del Arduino.

7) Apagar el led de la placa: Bloque que apaga el LED integrado en la placa del Arduino.

8) Hacer parpadear el led de la placa “n” veces: Bloque que hace parpadear el LED integrado en la placa del Arduino n veces. Valor por defecto 1.

Observaciones:

    1. Solo se admiten números enteros positivos.
    2. Si se pone un número decimal solo se tendrá en cuenta la parte entera (Ej: 1.3 → 1, 1.5 → 1,  1.7 → 1).
    3. Si se pone un número negativo se considerará valor 0.

9) Hacer sonar la nota “n” con duración “x”:  Bloque que hace sonar la nota seleccionada con una duración concreta.

Las notas disponibles son:

A3,AS3,B3,C4,CS4,D4,DS4,E4,F4,FS4,G4,GS4,A4,AS4,B4,C5,CS5,D5,DS5,E5,F5,FS5,G5,GS5,A5,AS5,B5,C6,CS6,D6,DS6,E6,F6,FS6,G6,GS6,A6,AS6,B6,C7,CS7,D7,DS7,E7,F7,FS7,G7,GS7,A7,AS7,B7,C8,CS8,D8,DS8. El valor por defecto es A3.

La duración de la nota puede ser: REDONDA, BLANCA, NEGRA, CORCHEA, SEMICORCHEA, FUSA y SEMIFUSA. El valor por defecto es NEGRA.

10) Hacer sonar la melodía “n”: Bloque que hace sonar una melodía establecida. Los posibles valores son: 1, 2, 3 y 4.

11) Botón “n” pulsado: Bloque que detecta la pulsación del botón seleccionado. Si el botón seleccionado es pulsado la función devuelve “VERDADERO (true)” en caso contrario devolverá “FALSO (false)”.

Los posibles valores de los botones son: ADELANTE, ATRÁS, IZQUIERDA, DERECHA y EJECUCIÓN.

Consideraciones sobre el uso del bloque

Si nos fijamos en la siguiente imagen:

Vemos que el primer bloque sólo se ejecutará una vez mientras que el segundo bloque se ejecutará siempre al estar los bloques de botón “n” pulsado dentro del bucle “ejecutar por siempre”, es decir, el segundo bloque está evaluando constantemente si se ha pulsado algunos de los botones que se han especificado. Si miramos a la derecha de la imagen vemos el código Arduino generado. El primer bloque se ha generado dentro de la función setup() mientras que el segundo se ha generado dentro de la función loop().

Como sabemos en Arduino la función setup()  sólo se ejecutará una sola vez (justo cuando se haya subido el programa) mientras que la función loop() se ejecutará siempre.

Bueno … y esto.. ¿ para qué me lo cuentas? … pues porque sería un error realizar la evaluación de la pulsación como el primer bloque ya que solo se evalúa si se ha pulsado algunos de los botones especificados una sola vez y a no ser que se tenga el botón pulsado en el preciso momento que el programa ejecuta la función ya no lo volverá a evaluar nunca más y podríamos pensar que no funciona.

Por tanto la evaluación de la pulsación de los botones se tiene que poner en bucles para que el sistema repetidamente detecte si se ha pulsado o no un botón.

En la siguiente imagen se puede ver el uso del bloque botón “n” pulsado dentro de la función setup() pero a diferencia del caso anterior se ha insertado dentro del bucle “esperar hasta que …”, por tanto, el sistema está evaluando constantemente la pulsación de los botones hasta que se pulse el botón “ADELANTE”, eso sí, una vez que se haya pulsado ya no se volverá a evaluar nunca más y el sistema seguirá ejecutando las instrucciones siguientes al bucle.

6- Subir el programa al robot

Una vez tengamos finalizada la programación del robot haciendo uso de los distintos bloques (ya sean los propios de la extensión como los disponibles en las otras secciones) solo tendremos que pulsar el botón Subir Arduino. Esta acción subirá el programa a nuestro robot y solo habrá que esperar a que haya terminado de subir verificando que no haya existido ningún error.

Una vez subido el programa no será necesario que nuestro robot siga conectado con el cable USB al ordenador ya que funcionará de forma autónoma.

NOTA: Si se quiere volver a tener la funcionalidad “original” del Escornabot habrá que volver a cargar mediante el IDE de Arduino el firmware correspondiente.

7- Consideraciones entorno Linux

Parece ser que la versión de mBlock para Linux 4.0.4 posee un bug con el tema de las extensiones.

La importación de la librería se hace correctamente pero cuando se pulsa el botón “Subir a Arduino” para cargar el programa al robot da el error que falta la librería EscornabotExtension.h (librería de la extensión).

A la hora de subir el programa lo que hace internamente el software es crear una carpeta temporal con todos los archivos necesarios para el proceso de compilación, pues bien, parece ser que la librería de la extensión no la copia en esta carpeta temporal y por tanto la compilación de un error debido a la falta de dicho fichero.

La forma fácil y rápida que he probado para solucionar este problema es hacer la siguiente operativa:

1.- Abrir el Administrador de extensiones y pulsar la opción “ver código” para que se abra la carpeta donde se encuentra la extensión.

La ruta completa donde se encuentra la extensión es:

opt/makeblock/mBlock/resources/ext/libraries/escornabot-extension-mblock-master

NOTA: En mi caso el nombre del directorio que contiene la extensión es: “escornabot-extension-mblock-master” pero teneis que mirar en vuestro caso con qué nombre se ha subido.

2.- Mover (no copiar) todo el directorio src a la siguiente ruta:

/opt/makeblock/mBlock/resources/tools/arduino-server/tools/arduino/libraries

3.- Renombrar este directorio src con el nombre Escornabot.

4.- Asegurarse que ya no exista el directorio src (lo acabamos de mover) en la ruta:

opt/makeblock/mBlock/resources/ext/libraries/escornabot-extension-mblock-master

NOTA: En mi caso el nombre del directorio que contiene la extensión es: “escornabot-extension-mblock-master” pero teneis que mirar en vuestro caso con qué nombre se ha subido.

Con esta operativa ya debería ir todo bien 🙂

Una respuesta a “Programando Escornabot con mBlock”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *