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