Cómo desarrollar extensiones para mBlock

Bueno lo primero de todo decir que esto es algo bastante avanzado y poco documentado. Por una parte el mBlock es un fork (es decir un proyecto derivado) del Scratch. Y en Scratch para modificar y crear nuevas extensiones, tienes que utilizar la variante ScratchX no compatible con Scratch. Buen, un lio.

El caso es que mBlock tiene una documentación muy justita de como crear una extensión que es la siguiente:

http://www.mblock.cc/docs/create-extensions-for-mblock/

pero cuando entras en detalle te faltan cosas, o por lo menos a mi. Entonces, indagando encontré que la relación de mBlock con ScratchX y la pobre documentación de como crear una extensión con ScratchX:

https://github.com/LLK/scratchx/wiki

Bueno, así que a día de hoy lo que nos queda es I+D e ir viendo el código de las demás extensiones que ya trae mBlock. Si quieres continuar tendrás que haberte leido al menos el enlace anterior de mblock, sino vas a andar perdido.

Donde se guardan las extensiones

Si vas al menú de mblock de extensiones, y ves cualquier extensión, tiene un enlace, “ver código”, que te lleva al sitio

Estructura de la Extensión

Tendremos una carpeta con nuestro nombre de extensión en el directorio de extensiones del mBlock. Lo primero es el fichero con estructura JSON con la extensión “.s2e”, que es donde le dice donde está todo. Imagino que solo puede haber un “.s2e” en dicha carpeta, porque el nombre del fichero le da igual. El contenido tiene una estructura tal que así:

{

{

“extensionName”: “Pequeños Innovadores”,

“javascriptURL”:”js/pi.js”,

“blockSpecs”: [

[

“w”,

“Haz %d en el pin %n”,

“runHazLoQueSea”,

“ON”,

“13”,

{

“encode”:”{d0}{d1}”,

“setup”:”pinMode({1},OUTPUT); \n”,

“inc”:””,

“def”:””,

“work”:”digitalWrite({1},{0});\n”,

“loop”:””

}

],

],

“menus”: { …},

“values”:{…},

“translators”:{…}

}

}

si vas al menu de mblock de extensiones, y ves cualquier extensión, tiene un enlace, “ver código”, que te lleva al sitio

(function(ext) {

/*

Puedes añadir tus funciones al objeto “ext”  con el nombre que hayas creado en el apartado “blockSpecs”

*/

ext.runHazLoQueSea(orden, pin){

}

device.set_receive_handler(‘arduino’,processData);
};

ext._deviceRemoved = function(dev) {
if(device != dev) return;
device = null;
};

ext._shutdown = function() {
if(device) device.close();
device = null;
};

ext._getStatus = function() {
if(!device) return {status: 1, msg: ‘Arduino disconnected’};
if(watchdog) return {status: 1, msg: ‘Probing for Arduino’};
return {status: 2, msg: ‘Arduino connected’};
}

var descriptor = {};
ScratchExtensions.register(‘Arduino’, descriptor, ext, {type: ‘serial’});

})({});

Arquitectura

Lo que he podido averiguar es que el mBlock ejecuta el JavaScript en un interprete de Flash (Si en consecuencia mBlock está hecho en Flash).

Cómo desarrollar

En principio, cuando ya has creado los ficheros adecuados, tienes que comprimirlos y añadirlos como una extensión nueva. Pero claro si estamos probando y desarrollando eso parece un poco lio. La solución que he encontrado es cambiar los ficheros directamente en la carpeta de extensiones y cada vez que hago un cambio, reiniciar el mBlock. Si así de duro está el tema.

Cómo Tracear o Loggear lo que haces

Es decir, cómo saber que demonios se está ejecutando cuando estas haciendo pruebas. Pues hasta donde he llegado, no se puede. En la versión de ScratchX, se ejecuta en un navegador y admite el comando console.log, pero aquí si lo poneis, fallará, pero no tira nada, como no te dice nada si falla en cualquier otro lado. No da error utiliza un comando que se llama trace(), pero no he conseguido localizar si lo que mandas al trace lo pone en algún lado, y a estas alturas ya estoy convencido de que no lo hace.

Entonces como comprobamos el código si no hace lo que quieres, pues hasta donde he llegado lo único que funciona es utilizar el comando alert() e ir poniendo mensajitos por donde crees que se está ejecutando, ah! pero cada vez que creas un mensajito nuevo, tienes que reiniciar scratch.

 

2 opiniones en “Cómo desarrollar extensiones para mBlock”

  1. Buenas noches, estoy intentando trastear con las extensiones para mblock y me he encontrado con este post. ¿Has podido avanzar algo más?
    En mi caso estoy tratando de crear una extensión para programar de forma más sencilla el coche V2 de ELEGOO.
    Mi primera duda (y en la que ya me he bloqueado) es que los pines de echo y trig son los A4 y A5 respectivamente. Logro hacer que funcione editando el código antes de enviarlo, pero quisiera cambiarlo en el propio menú de arduino y no consigo hacerlo (me pide valor numérico)….

    Bueno, ya ves que estoy algo pez… ya me dirás si has avanzado algo más.

    1. Hola, creo que tienes un error de concepto. No se de donde sacas que el echo y el trigo tienen que ir a A4 y A5. Pero de primeras el echo y trig, es algo de un sensor de ultrasonidos y en el mblock tienes un bloque para ultrasonidos en la extension de Arduino, que te pide directamente el pin de echo y trig, y tienes que enchufar el ultrasonidos a un Digital de 0 a 13. puede que le llamen D1, D2, … pero realmente es el pin digital 1, 2,… y en el bloque tienes que pones ese numero.
      Si fueran pines Analógicos, le llamarían A0, A1, A2… pero el pin es el 0, 1, 2… pero en este caso estas viendo algo mal, por que el sensor de ultrasonidos, solo utiliza pines digitales.

Deja un comentario

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