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.
« 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":""
}
],
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
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);
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);
}
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(){
}
Pour être pris en compte, les fichiers de librairie doivent être copiés dans le répertoire src du projet mBlock.
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 ...