Mblock的扩展模块的编写

本文详细介绍mBlock扩展模块的编写方法,包括图形化界面设计、Arduino源代码编写及扩展文件夹配置。通过实例展示了北斗模块和数码管显示扩展的具体实现,适合mBlock爱好者和编程教育者参考。

Mblock的扩展模块的编写

什么是mblock扩展呢
mBlock扩展能为mBlock添加新的语句块。您可以用扩展来支持您喜欢的Arduino传感器,或者Lego, LittleBits等机器人和电子模块产品。
基于近几年创客平台的火热,mblock作为青少编程平台,也大受青睐。其中已经有不少扩展已经编写,但是我们如何为添加自己的模块来完成图形化编程的任务呢?

编程环境的安装(Flash Builder4.7的安装)

安装教程和软件这个博主写的很详细,可以参考。FB安装
另外,还有一篇详细的安装文档共给分享。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意最后一步1.13如果不把 Arduino的软件安装路径下的全部文件打包放在portable中,mblock在arduino下将不能运行。

这个文档还详细介绍了mblock底层代码的功能,以及如何修改,在这片文章中只介绍如何添加扩展,其他框架的修改如果大家感兴趣,自行下载了解。
给出文档的目录(感兴趣自行下载)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
下面是网盘文档分享
链接:https://pan.baidu.com/s/1R97Xpw6-dCZU41DgAyEJVg
提取码:ia96

Flash builder完成界面

在这里插入图片描述

mblock的界面展示

在这里插入图片描述
在这里插入图片描述

mblock的扩展添加

在这里插入图片描述
在这里插入图片描述
扩展文件夹包含三个文件

  1. js文件夹
    里面包含js文件,是scratch在线模式下调用的,在调用外部arduino文件的.c和.h文件时可以什么都不写,但是注意不能没有,而且js文件的文件名字要和你扩展模块的文件名字一致

  2. src
    里面包含了你的arduino源文件,事先编辑调试好

  3. s2e文件
    图形化界面的设计文件,也可以在里面添加适量代码

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测量",
		
		}
	}
}

这是一个关于北斗模块的扩展
来看看实现的模块化图形
在这里插入图片描述

这里调用的src里的源代码是

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 <Arduino.h>
#define GPSSerial  Serial
#define DEBUGSerial Serial
///@brief Class for GPSAClass
class GPSAClass
{
	public:
		GPSAClass();
		void gpsa_init( int a );
                                void gpsa_getdata();

};

#endif

另一个Demo供参考

数码管的显示扩展
.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 )"
        }
    }
}

.js文件
在这里插入图片描述
空文件
src文件夹里的
.c文件

#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 <Arduino.h>
///@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

图形化展示
在这里插入图片描述

那么写好文件后如何添加进去呢

  1. 在fb里点运行
  2. 在mblock里选择Arduino模式
  3. 点击扩展

在这里插入图片描述

  1. 点击扩展管理器
    在这里插入图片描述
  2. 点击查看代码
    在这里插入图片描述

最后就大功告成了,完成扩展,也可以发到mblock的官方github中共享代码哦

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值