Programando Escornabot con mBlock

Introducción

mBlock 3 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.

NOTA: Ya tenéis disponible la actualización de la extensión para la versión mBlock 5 (pulsa aquí).

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.

// keypad leds
#define KEYPAD_LED_PIN_UP A0
#define KEYPAD_LED_PIN_RIGHT A3
#define KEYPAD_LED_PIN_DOWN A2
#define KEYPAD_LED_PIN_LEFT A1
#define KEYPAD_LED_PIN_GO 13

→ Necesario para definir los pines de los LEDs asociados a los botones


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

#ifdef ENGINE_TYPE_STEPPERS

// stepper pin setup (digital outputs)
#define STEPPERS_MOTOR_RIGHT_IN1 5
#define STEPPERS_MOTOR_RIGHT_IN2 4
#define STEPPERS_MOTOR_RIGHT_IN3 3
#define STEPPERS_MOTOR_RIGHT_IN4 2
#define STEPPERS_MOTOR_LEFT_IN1 9
#define STEPPERS_MOTOR_LEFT_IN2 8
#define STEPPERS_MOTOR_LEFT_IN3 7
#define STEPPERS_MOTOR_LEFT_IN4 6

// step calibration
#define STEPPERS_STEPS_PER_SECOND 1000
#define STEPPERS_LINE_STEPS 1738
#define STEPPERS_TURN_STEPS 1024

#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.

NOTA: En la versión 1.2 se han añadido los bloques 12 y 13 que hacen las mismas funciones que los bloques 6, 7 y 8 pero se puede especificar, a parte del led presente en la placa de Arduino, los leds presentes en las botoneras.

12) Encender / Apagar el led “x”: Bloque que enciende o apaga el LED especificado.

Por defecto se encuentra seleccionado el valor ENCENDER.

Los posibles valores de los leds son: DE LA PLACA, ADELANTE, ATRÁS, IZQUIERDA, DERECHA y EJECUCIÓN. Valor por defecto: DE LA PLACA.

13) Hacer parpadear el led “x” “n” veces: Bloque que hace parpadear el LED especificado n veces. 

Los posibles valores de los leds son: DE LA PLACA, ADELANTE, ATRÁS, IZQUIERDA, DERECHA y EJECUCIÓN. Valor por defecto: DE LA PLACA.

Valor por defecto del número de veces es 1.

Observaciones respecto al parámetro “n” veces:

    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.

 

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.

14) obstáculo detectado a una distancia <= “n” cm: Bloque que permite detectar un objeto a una distancia especificada.

Observaciones respecto al parámetro distancia:

    1. Valor en centímetros.
    2. Valor por defecto 10.
    3. Solo se admiten números enteros positivos.
    4. Si se pone un número decimal solo se tendrá en cuenta la parte entera (Ej: 5.2 → 5, 5.5 → 5,  5.7 → 5).
    5. Si se pone un número negativo se considerará valor 0.

NOTA: Para poder utilizar este bloque es necesario instalar en el robot el módulo sensor de ultrasonidos HC-SR04 y añadir en el fichero “Configuration.h”  parámetros adicionales (ver sección 8 y 9 de este tutorial).

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 🙂

8 – Sentido de la marcha del robot

Como sabéis la parte de la “canica” (bola “loca”) del robot señala la parte trasera. Cuando programé la versión 1.0 de esta extensión consideré que la parte de la canica era la parte delantera  (estaba acostumbrado a otros robots que eran así, por ejemplo el propio robot mBot de Makeblock) por tanto cuando se añadía el bloque “Avanzar “n” unidades con velocidad “x” o Retroceder “n” unidades con velocidad “x”” para los usuarios que consideraban el sentido correcto del robot el sentido de la marcha estaba al revés pero para otros usuarios lo contrarío era su sentido lógico.

Para solventar este problema he añadido el parámetro siguiente en el fichero de configuración:

#define CHANGE_DIRECTION true

¿Qué hace este parámetro? … si este parámetro no se pone o si se pone con valor false el robot se comportará con el sentido con el que fue diseñado, es decir, la parte donde está la canica o bola loca es la parte trasera.

Si por el contrario se especifica y se pone el valor a true el sentido será el contrario, es decir, la parte de la canica será considerada la parte delantera.

Es importante a los que tengáis instalada la versión 1.0 de la extensión y actualices a la nueva versión que ahora el comportamiento se ha corregido para dejarlo con el sentido original con el que fue diseñado.

Este parámetro es interesante no solo porque la gente lo programará con el sentido que más le guste, si no que por ejemplo para el caso de la versión DIY es más fácil y cómodo añadir el sensor de ultrasonidos en la parte donde se encuentra la canica (trasera) y por tanto tener un parámetro que considere que esta es la parte delantera ayudará mucho.

En la siguiente imagen se muestra cual es el sentido de marcha original del robot con el que ha sido diseñado:

9 – Módulo adicional: Sensor de ultrasonidos HC-SR04

Como ya comentamos en el apartado 5 para poder utilizar el bloque “obstáculo detectado a una distancia <= “n” cm” es necesario instalar en el robot el módulo sensor de ultrasonidos HC-SR04 y añadir en el fichero “Configuration.h”  parámetros adicionales.

Respecto al fichero de configuración los parámetros adicionales que tenemos que añadir ya vienen incorporados en la última versión (versión 1.1) del repositorio de la extensión:

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

¿Y cuales son esos parámetros adicionales que se han incorporado en el fichero “Configuration.h” ?. Son los siguientes:

// ultrasonic sensor

#define ULTRASONIC_SENSOR true
#define TRIGGER_PIN 11
#define ECHO_PIN 12

El primer parámetro indicará que vamos a utilizar esta funcionalidad en nuestra extensión y habilitará todas las funciones necesarias para el correcto funcionamiento del bloque.

Los otros dos parámetros son las definición de los pines donde se va a conectar el pin TRIGGER y el pin ECHO de nuestro sensor de ultrasonidos a la placa Arduino UNO.

NOTA: Tendréis que añadir estos 3 parámetros en caso de que estéis utilizando un fichero propio de configuración diferente al que se descarga con la extensión.

Instalación del módulo en el robot

Lo ideal es tener una pieza 3D específica para este propósito (si ese es tu caso puedes saltarte este apartado) pero en mi caso, que no la tenía, he utilizado elementos de Makeblock que había utilizado en otro proyecto. Aquí tenéis la forma en que yo lo he realizado (por si os puede servir de ayuda):

Listado de componentes:

    • 1 ángulo 3×3.
    • 1 viga recortable de  80mm.
    • 2  tornillos Allen Planos de M4 (métrica 4) de 14 mm de longitud.
    • 2 tuercas de M4

Para poder acoplar el sensor de ultrasonidos HC-SR04 a la estructura de ángulo 3 x 3 necesitaremos cortar una viga recortable de 80 mm para dejar una pieza de solo 3 agujeros tal y como se muestra en la siguiente imagen:

Por otro lado uniremos 4 conectores de cable dupont hembra – hembra mediante cinta aislante negra con el fin de facilitar el montaje:

Mediante 2 tornillos Allen Planos de M4 de 14 mm de longitud junto con sus respectivas tuercas aprisionaremos (lo justo para que quede bien sujeto) los 4 conectores dupont entre la estructura de ángulo 3 x 3 y la pieza recortada de la viga de 80 mm para finalmente conectar el sensor de ultrasonidos:

En las siguientes imágenes tenéis el resultado final una vez acoplado el sensor al chasis del robot.

En mi caso he instalado el sensor en la parte trasera ya que para la versión DIY es más fácil y por tanto tendré que utilizar el parámetro “#define CHANGE_DIRECTION true” que se especifica en la sección 8 de este tutorial para cambiar el sentido de la marcha.

Aunque me gusta más el montaje en la parte trasera del robot también os detallo cómo he realizado el montaje del sensor en la parte delantera.

Empezaremos pasando los cables del sensor a través de los agujeros tal y como se muestra en la siguiente imagen:

Uniremos el ángulo 3 x 3 a una viga recortable de 80 mm mediante 2 tornillos Allen Planos de M4 de 8 mm de longitud junto con sus respectivas tuercas:

Ahora acoplaremos todo lo anterior en el agujero que se muestra en la siguiente imágen sustituyendo el tornillo existente (que en mi caso es de 10 mm por uno de 15 mm) y añadiendo una tuerca de M3 para que ésta haga presión sobre la viga de 80 mm:

El resultado final es el que se muestra a continuación (aunque lo suyo sería poner una pieza 3D hecha a medida para este propósito):

Conexionado a la protoboard para la versión DIY de escornabot.

El sensor de ultrasonidos HC-SR04 tiene 4 pines: TRIGGER, ECHO, VCC y GND.

Antes de liarnos con el conexionado hay que decir que tendremos que añadir dos cables a nuestra protoboard (versión DIY) con el fin de añadir dos líneas más de alimentación +5V y GND ¿y porqué? … pues porque tenemos que alimentar al sensor de ultrasonidos y nos faltaría una toma de GND (ya que no quedan libres, al menos en mi caso)

Haciendo la siguiente operativa añadiremos a nuestra protoboard líneas adicionales de +5V y GND que no solo nos servirá para alimentar nuestro módulo de ultrasonidos sino que al haber añadido más pines +5V y GND a la protoboard podremos alimentar futuros módulos (verificar que tenéis la disposición de vuestro Arduino Nano montando en la protoboard tal cual se muestra en la siguiente imagen, si no es así hacer las modificaciones necesarias para dejar al menos una tira libre en la protoboard).


Como veis hemos unido mediante cable de protoboard el pin +5V y GND de nuestro Arduino con la línea más a la derecha de la protoboard (+5V parte superior , GND parte inferior).

La longitud de los cables de protoboard tendría que ser de unos 2 cm de longitud:


Ahora solo faltará unir los pines del sensor de ultrasonidos a la protoboard tal y como se muestra en la siguiente imagen:

En la versión DIY del escornabot (la que yo tengo) conectaremos el pin TRIGGER al pin 11 y el pin ECHO al pin 12. Respecto a los pines de alimentación Vcc (+5V) y GND los uniremos a las líneas de la protoboard que acabamos de añadir tal y como se muestra en la imagen.

Consideraciones a la hora de utilizar el bloque

Es importante tener en cuenta cuando utilicemos el bloque de detección saber cuándo el programa está evaluando la detección de obstáculos.

En la siguiente imagen se muestra un ejemplo de bloques que hará que el robot vaya avanzando y cuando detecta un obstáculo a una distancia <= de 10 cm emitirá un sonido y girará a la izquierda 90º con el fin de evitarlo.

Este es sería un ejemplo típico donde el robot va en modo automático avanzando y detectando obstáculos (se puede cambiar las instrucciones a la hora detectar un obstáculo para que por ejemplo retroceda y gire, en fin, cada uno puede poner el comportamiento que quiera).

Vale y ¿qué me quieres decir con esto? … bueno pues que al añadir este bloque tenemos que tener presente el comportamiento del resto de bloques ya existentes (recordad que estamos en un entorno gráfico donde cada bloque tiene definido un comportamiento ya establecido y que no podemos modificar).

Vale, lógico , pero todavía no te entiendo….. bueno lo que quiero decir es lo siguiente:

El robot por defecto tiene definido que 1 unidad es igual a 10 cm (recordad que la unidad vendrá definida por el parámetro STEPPERS_LINE_STEPS del fichero de configuración “Configuration.h” : #define STEPPERS_LINE_STEPS 1738  → esto equivale a 10 cm) y el comportamiento del robot en el ejemplo anterior sería algo así:

¿Existe un obstáculo a la distancia especificada? → No → Avanzo 1 unidad (que son 10 cm) al 100% → ¿Existe un obstáculo a la distancia especificada? → Sí → Hago sonar la nota y giro a la izquierda 90º al 100% →   ¿Existe un obstáculo a la distancia especificada? → No → Avanzo 1 unidad (que son 10 cm) al 100% → etc, etc, etc …

¿Qué sucedería si le específico avanzar 3 unidades en vez de una? … pues lo mismo pero en vez de avanzar 10 cm avanzará 30 cm ¿y qué pasa si mientras avanzo 30 cm o los centímetros que sean hay una pared o un obstáculo?… pues que el robot solo va a evaluar si hay un obstáculo cuando termine de avanzar los centímetros que se han especificado o dicho de otro modo el bloque Avanzar “n” unidades con velocidad “x” ejecutará íntegramente el avance especificado y sólo cuando termine esta ejecución el programa pasará a procesar el siguiente bloque que hayamos especificado en la programación que en nuestro caso es la detección de si hay un objeto a la distancia especificada.

Por tanto cuando se utilice la detección de obstáculos no pongais que se avancen muchos centímetros ya que lo lógico es poner la unidad mínima posible o una razonable en la instrucción de avance para que seguidamente se ejecute nuevamente la instrucción que evalúa si hay o no un obstáculo.

Si para el ejemplo anterior quereis que en vez de cada 10 cm el robot evalúe la  detección de obstáculos cada 1 cm porque 10 cm os parece demasiado bastará que cambies el parámetro STEPPERS_LINE_STEPS al valor correspondiente.

Por tanto cuando utilicéis este bloque con el resto tener presente lo que os acabo de comentar y si veis que no detecta o tarda en detectar preguntaros qué instrucciones estoy poniendo por medio antes de que el sistema vuelva a evaluar si hay o no un obstáculo.