给mBlock添加扩展模块

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27251141/article/details/89716661

1.mblock简介

mblock是基于开源软件Scratch开发的图形化编程软件,支持Makeblock机器人和Arduino编程,从而让用户可以轻易创造出可交互的智能应用。关于mblock请查看官网:http://www.mblock.cc/

2.关于mblock扩展

在使用mblock编写arduino程序时,有些arduino功能mblock并没有提供,这就需要自行编写mblock扩展,为mblock添加新的语句块,丰富mblock对arduino硬件的控制功能。关于mblock扩展的编写,请参考mblock官网提供的教程:http://www.mblock.cc/zh-home/docs/mblock-extension-center-cn/?noredirect=zh_CN

3.编写一个mblock扩展

在mblcok提供的官方扩展教程中提到,mblock语句都有两个模式Scratch模式和Arduino模式。Scratch模式是在线模式,Arduino控制板必修一直连接电脑才可以。Arduino模式下,程序被烧写到Arduino控制板中,arduino脱离电脑自行运行。因此Scratch称为在线模式,Arduino称为离线模式。
在mblock提供的扩展demo示例中,一个mblock扩展一般包括三个部分,xxx.s2e,js文件夹,src文件夹;其中xxx.s2e文件是每个扩展必须实现的文件,js文件夹中是Scratch模式下的Javascript文件xxx.js,src文件夹中是额外的C程序文件。如果要实现Scratch模式,则xxx.js文件必须实现,如果不需要Scratch模式,则xxx.js文件不必实现。

共阴8段数码管只实现Arduino模式,因此xxx.js不用实现,只编写xxx.s2e即可,同时实现控制LED显示数字的C程序。该实现是在mblock提供的扩展demo的基础上修改而来。整个扩展包好demo.s2e文件和src文件夹,其中src文件夹中是demo.cpp文件和demo.h文件。

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 )"
        }
    }
}

在编写demo.s2e文件时需要注意:
1.由于本功能没有实现Scratch模式,因此"javascriptURL":""字段要设置为空,否则会报错。
2.led8_init函数指定8段数码管引脚使用的Arduino数字引脚,这里8段数码管的引脚ag接到arduino的数字28口,led8_init( %n , %n , %n , %n , %n , %n , %n )写的时候,%n前后都有一个空格,否则在mblock中该函数会参数会显示不完整。
3.led8_init函数和led_display函数都是在src文件夹中的demo.cpp中实现的函数
4.“work”:“demo.led8_init({0},{1},{2},{3},{4},{5},{6}); \n”,意思是调用demo对象中的led8_init函数。
5."translators"字段中是把函数名称转换成中文显示在mblock中。

demo.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

demo.cpp文件内容

#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]); 
}

demo.js 文件为空文件

如果不加这个文件将导入不进去。


把该扩展导入到mblock中,然后在mblock的扩展菜单选中“Seg_LED”,在mblock的机器人模块中就会出现Sed_LED扩展模块,显示出“共阴数码管初始化”和“数码管显示”两个语句,

编写测试程序,如图1所示,数码管显示正常。
在这里插入图片描述
本博客程序下载地址:https://download.csdn.net/download/qq_27251141/11154279

猜你喜欢

转载自blog.csdn.net/qq_27251141/article/details/89716661
今日推荐