什么是mblock扩展呢
mBlock扩展能为mBlock添加新的语句块。您可以用扩展来支持您喜欢的Arduino传感器,或者Lego, LittleBits等机器人和电子模块产品。
基于近几年创客平台的火热,mblock作为青少编程平台,也大受青睐。其中已经有不少扩展已经编写,但是我们如何为添加自己的模块来完成图形化编程的任务呢?
安装教程和软件这个博主写的很详细,可以参考。FB安装
另外,还有一篇详细的安装文档共给分享。
注意最后一步1.13如果不把 Arduino的软件安装路径下的全部文件打包放在portable中,mblock在arduino下将不能运行。
这个文档还详细介绍了mblock底层代码的功能,以及如何修改,在这片文章中只介绍如何添加扩展,其他框架的修改如果大家感兴趣,自行下载了解。
给出文档的目录(感兴趣自行下载)
下面是网盘文档分享
链接:https://pan.baidu.com/s/1R97Xpw6-dCZU41DgAyEJVg
提取码:ia96
js文件夹
里面包含js文件,是scratch在线模式下调用的,在调用外部arduino文件的.c和.h文件时可以什么都不写,但是注意不能没有,而且js文件的文件名字要和你扩展模块的文件名字一致。
src
里面包含了你的arduino源文件,事先编辑调试好
s2e文件
图形化界面的设计文件,也可以在里面添加适量代码
官网的解释:.s2e文件是扩展的主要文件。除基本信息外,.s2e文件还定义语句块,告诉mBlock下拉菜单是什么样子,以及完成多语言翻译工作( 如果有的话)
以下是官网给的文件编写的教程
可能官方给的很笼统,给出一个我写的完整.s2e文件
{
"extensionName": "GPSA",
"sort":0,
"javascriptURL":"js/GPSA.js",
"firmware":"1.0",
"extensionPort":0,
"blockSpecs": [
[
"w",
"GPSABegin( %n )",
"GPSABegin",
"9600",
{
"setup":"GPSA.gpsa_init(9600);\n",
"inc":"#include \"GPSA.h\"",
"def":"GPSAClass GPSA; \n",
"work":"",
"loop":""
}
],
[
"w",
"GetGPS",
"GetGPS",
{
"setup":"",
"inc":"#include \"GPSA.h\"",
"def":"GPSAClass GPSA; \n",
"work":"GPSA.gpsa_getdata(); \n",
"loop":""
}
],
],
"translators":{
"zh_CN":{
"GPSABegin( %n )":"GPSA初始化( %n )",
"GetGPS":"GPSArduino测量",
}
}
}
arduino的.c文件
#include "GPSA.h"
GPSAClass::GPSAClass(){
pinMode(13,OUTPUT);
}
void GPSAClass::gpsa_init( int a ){
GPSSerial.begin(9600);
DEBUGSerial.begin(9600);
DEBUGSerial.println("NUIST");
DEBUGSerial.println("Wating...");
}
void GPSAClass::gpsa_getdata()
{
while (GPSSerial.available()) {
DEBUGSerial.write(GPSSerial.read());
}
}
.h文件的
#ifndef GPSA_h
#define GPSA_h
#include
#define GPSSerial Serial
#define DEBUGSerial Serial
///@brief Class for GPSAClass
class GPSAClass
{
public:
GPSAClass();
void gpsa_init( int a );
void gpsa_getdata();
};
#endif
数码管的显示扩展
.s2e文件
{
"extensionName": "LED_DEMO", //扩展名称
"sort":0, //扩展在mBlock中展示次序
"javascriptURL":"js/demo.js", //指定javascript文件的路径
"extensionPort":0, //扩展使用的网络端口,0表示使用串口
"firmware":"1.0", //在线控制的固件版本号
"blockSpecs": [
["h","Demo Program","runArduino"],
[
"w",
"led8_init( %n , %n , %n , %n , %n , %n , %n )",
"led8_init",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
{
"setup":"",
"inc":"#include \"demo.h\"",
"def":"DemoClass demo; \n",
"work":"demo.led8_init({0},{1},{2},{3},{4},{5},{6}); \n",
"loop":""
}
],
[
"w",
"led8_display( %n )",
"led8_display",
"0",
{
"setup":"",
"inc":"#include \"demo.h\"",
"def":"DemoClass demo; \n",
"work":"demo.led8_display({0}); \n",
"loop":""
}
],
],
"translators":{
"zh_CN":{
"Demo Program":"演示程序",
"led8_init( %n , %n , %n , %n , %n , %n , %n )":"共阴数码管初始化( %n , %n , %n , %n , %n , %n , %n )",
"led8_display( %n )":"数码管显示( %n )"
}
}
}
#include "demo.h"
DemoClass::DemoClass(){
pinMode(13,OUTPUT);
}
void DemoClass::led8_init(int a, int b, int c, int d, int e, int f, int g)
{
SEG_a=a;
SEG_b=b;
SEG_c=c;
SEG_d=d;
SEG_e=e;
SEG_f=f;
SEG_g=g;
pinMode(SEG_a,OUTPUT);
pinMode(SEG_b,OUTPUT);
pinMode(SEG_c,OUTPUT);
pinMode(SEG_d,OUTPUT);
pinMode(SEG_e,OUTPUT);
pinMode(SEG_f,OUTPUT);
pinMode(SEG_g,OUTPUT);
}
void DemoClass::led8_display(int num)
{
digitalWrite(SEG_a,table[num][7]);
digitalWrite(SEG_b,table[num][6]);
digitalWrite(SEG_c,table[num][5]);
digitalWrite(SEG_d,table[num][4]);
digitalWrite(SEG_e,table[num][3]);
digitalWrite(SEG_f,table[num][2]);
digitalWrite(SEG_g,table[num][1]);
}
.h文件
#ifndef demo_h
#define demo_h
#include
///@brief Class for DemoClass
class DemoClass
{
public:
DemoClass();
void led8_init(int a,int b,int c,int d,int e,int f, int g);
//8段LED数码管初始化函数
void led8_display(int num);
//显示数值num,num取值0~9
private:
int SEG_a,SEG_b,SEG_c,SEG_d,SEG_e,SEG_f,SEG_g;
//共阴数码管的真值表
unsigned char table[10][8]=
{
{0,0,1,1,1,1,1,1},//0
{0,0,0,0,0,1,1,0},// 1
{0,1,0,1,1,0,1,1},// 2
{0,1,0,0,1,1,1,1},// 3
{0,1,1,0,0,1,1,0},// 4
{0,1,1,0,1,1,0,1},// 5
{0,1,1,1,1,1,0,1},// 6
{0,0,0,0,0,1,1,1},// 7
{0,1,1,1,1,1,1,1},// 8
{0,1,1,0,1,1,1,1},// 9
};
};
#endif