Scratch et mBlocks

Utiliser Scratch et mBlock avec Gemini

Nous allons voir comment créer des extensions mBlock afin de pouvoir utiliser cet environnement de développement Scratch avec Gemini.

A lire également, l’excellent tutoriel « Creating mBlock Extensions » de Wang Yu, Product Manager chez MakeBlock.

En attendant, voici quelques informations complémentaires bien utiles pour mener la création d’extensions à terme facilement.

Les balises:

« inc »:

« inc »: » » permet de définir les include du croquis Arduino.

Exemple:

"inc":"#include \"myLib.h\"\n",

Cette ligne créera le source suivant dans le croquis Arduino:

#include "myLib.h"

La séquence \ » permet de placer un guillemet sur la ligne, sans qu’il ne soit pris pour le guillemet final.

Cet include peut être mis dans le marqueur « h »:

[

"h",

"Gemini program",

"runArduino",

{

"setup":"",

"inc":"#include \"myLib.h\"\n",

"def":"",

"work":"",

"loop":""

}

],

« def »:

Cette balise va nous permettre de placer des #define dans le code Arduino:

[

"w",

"Beep",

"Beep",

{

"setup":"",

"inc":"",

"def":" #define BUZZER 8\n",

"work":" tone(BUZZER, 4000);\n delay(125);\n noTone(BUZZER);\n", "loop":""

}

]


Ce qui donnera dans l’IDE Arduino:

#define BUZZER 8

« work »:

Cette balise permet de placer le code à exécuter.

[

"w",

"Beep",

"Beep",

{

"setup":"",

"inc":"",

"def":" #define BUZZER 8\n",

"work":"tone(BUZZER, 4000);\n delay(125);\n noTone(BUZZER);\n", "loop":""

}

]


Qui donnera en code Arduino:

tone(BUZZER, 4000);

delay(125);

noTone(BUZZER);

« loop »:

Cette balise va permettre de faire exécuter le code résultant du test à partir d’un appel de la boucle principale:

[

"B",

"Lumière( %m.ldr %n)",

"Lumière", "Gauche", "700",

{

"setup":"",

"inc":"",

"def":"",

"work":"(analogRead(A{0}) > {1})",

"loop":"analogRead(A{0});"

}

],


Le code Arduino correspondant va être le suivant, en considérant que la variable %n a reçu la valeur 700:

void loop(){

if((analogRead(A0) > 700)){

mcp.digitalWrite(13+0, HIGH);

}else{

mcp.digitalWrite(13+0, LOW);

}

if((analogRead(A1) > 700)){

mcp.digitalWrite(9+0, HIGH);

}else{

mcp.digitalWrite(9+0, LOW);

}

_loop();

}


void _loop(){

analogRead(A0);

}

« encode »:

Cette balise va également permettre de faire exécuter le code dans la boucle principale si la condition du test est remplie :

[

"B",

"Lumière( %m.ldr %n)",

"Lumière", "Gauche", "700",

{

"encode":"{d0}",

"setup":"",

"inc":"",

"def":"",

"work":"(analogRead(A{0}) > {1})", "loop":""

}

],


Le code Arduino correspondant va être le suivant, en considérant que la variable %n a reçu la valeur 700:

void loop(){

if((analogRead(A0) > 700)){

mcp.digitalWrite(13+0, HIGH);

}else{

mcp.digitalWrite(13+0, LOW);

}

//....

_loop();

}


void _loop(){

}


Le Répertoire src:

Pour être pris en compte, les fichiers de librairie doivent être copiés dans le répertoire src du projet mBlock.

Comment passer une valeur par variable ?

Pour passer une valeur comme une variable, on va utiliser le symbole %.

Par exemple, les Leds de Gemini soit bicolore, Vertes et Rouges.

On va donc créer un seul bloc pour tous les cas, en y insérant une liste de choix. Cette liste comprendra VERT et ROUGE.

Le code ressemblera à celui-ci:


[

"w",

"Configure Led( %d.couleur )",

"Configure Led",

"VERTE",

{

"setup":" digitalWrite({0}, OUTPUT);\n",

"inc":"",

"def":"",

"work":"",

"loop":""

}

],


Ici, le bloc de choix se définira par:

"Configure Led( %d.couleur )",


Cependant ATTENTION: La liste déroulante n’apparaitra que si les parenthèses sont encadrées d’espace comme dans notre exemple. Si les parenthèses sont collées au texte, les boites déroulantes ne se déroulent pas …

Ensuite, pour faire la liaison avec les valeurs de la liste déroulante, il faut deux autres étapes:

"menus": {

"couleur":["ROUGE","VERTE"]

},


et

"values":{ "ROUGE":10, "VERTE":9 },


« menu » va permettre de définir les choix disponibles dans le menu déroulant, tandis que « values » va faire la liaison entre ces items de la liste déroulante, et les valeurs numériques associées.

La valeur choisie par l’utilisateur se récupèrera ainsi:

"setup":" digitalWrite({0}, OUTPUT);\n",

Au final, on obtiendra un résultat de ce style, et comme on le voit ici, il est également possible de créer des Blocs Personnalisés (en bleu)

Et sur Gemini en action ...