在使用mblock编写arduino程序时,有些arduino功能mblock并没有提供,这就需要自行编写mblock扩展,为mblock添加新的语句块,丰富mblock对arduino硬件的控制功能。关于mblock扩展的编写,请参考mblock官网提供的教程:zh-home/docs/mblock-extension-center-cn/?noredirect=zh_CN
在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": "Seg_LED",
-
"description": "8 segment LED digital tube Extension for Arduino",
-
"version": "1.1",
-
"author": "yoyoba(stuyou@126.com)",
-
"homepage": "youhaidong.cn",
-
"sort":0,
-
"javascriptURL":"",
-
"firmware":"1.0",
-
"extensionPort":0,
-
"tags" : "makeblock,demo",
-
"blockSpecs": [
-
[
-
"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段数码管的引脚a~g接到arduino的数字2~8口,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]);
-
}
把该扩展导入到mblock中,然后在mblock的扩展菜单选中“Seg_LED”,在mblock的机器人模块中就会出现Sed_LED扩展模块,显示出“共阴数码管初始化”和“数码管显示”两个语句,
编写测试程序,如图1所示,数码管显示正常。
图1 8段共阴数码管扩展模块测试程序
扩展模块下载:
Demo.zip
为mblock编写扩展模块的更多内容请参考: