Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1221182
  • 博文数量: 124
  • 博客积分: 5772
  • 博客等级: 大校
  • 技术积分: 1647
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-27 10:39
文章分类

全部博文(124)

文章存档

2020年(1)

2019年(1)

2018年(5)

2017年(2)

2016年(17)

2015年(3)

2014年(7)

2013年(11)

2012年(13)

2011年(30)

2010年(34)

分类: 嵌入式

2018-05-03 22:21:36

1.mblock简介

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

2.关于mblock扩展

 在使用mblock编写arduino程序时,有些arduino功能mblock并没有提供,这就需要自行编写mblock扩展,为mblock添加新的语句块,丰富mblock对arduino硬件的控制功能。关于mblock扩展的编写,请参考mblock官网提供的教程: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文件的内容:

  1. {    
  2.     "extensionName": "Seg_LED",
  3.     "description": "8 segment LED digital tube Extension for Arduino",
  4.     "version": "1.1",
  5.     "author": "yoyoba(stuyou@126.com)",
  6.     "homepage": "youhaidong.cn",
  7.     "sort":0,
  8.     "javascriptURL":"",
  9.       "firmware":"1.0",
  10.       "extensionPort":0,
  11.     "tags" : "makeblock,demo",
  12.     "blockSpecs": [
  13.         [
  14.             "w",
  15.             "led8_init( %n , %n , %n , %n , %n , %n , %n )",
  16.             "led8_init",
  17.             "2",
  18.             "3",
  19.             "4",
  20.             "5",
  21.             "6",
  22.             "7",
  23.             "8",
  24.             {
  25.                 "setup":"",
  26.                 "inc":"#include \"demo.h\"",
  27.                 "def":"DemoClass demo; \n",
  28.                 "work":"demo.led8_init({0},{1},{2},{3},{4},{5},{6}); \n",
  29.                 "loop":""
  30.             }
  31.         ],
  32.         [
  33.             "w",
  34.             "led8_display( %n )",
  35.             "led8_display",
  36.             "0",
  37.             {
  38.                 "setup":"",
  39.                 "inc":"#include \"demo.h\"",
  40.                 "def":"DemoClass demo; \n",
  41.                 "work":"demo.led8_display({0}); \n",
  42.                 "loop":""
  43.             }
  44.         ],
  45.     ],
  46.     "translators":{
  47.         "zh_CN":{
  48.             "Demo Program":"演示程序",
  49.       "led8_init( %n , %n , %n , %n , %n , %n , %n )":"共阴数码管初始化( %n , %n , %n , %n , %n , %n , %n )",
  50.       "led8_display( %n )":"数码管显示( %n )"
  51.         }
  52.     }
  53. }

 在编写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头文件内容


  1. #ifndef demo_h
  2. #define demo_h

  3. #include <Arduino.h>
  4. ///@brief Class for DemoClass
  5. class DemoClass
  6. {
  7.     public:
  8.         DemoClass();
  9.         void led8_init(int a,int b,int c,int d,int e,int f, int g);
  10.         //8段LED数码管初始化函数
  11.         void led8_display(int num);
  12.         //显示数值num,num取值0~9
  13.     private:
  14.         int SEG_a,SEG_b,SEG_c,SEG_d,SEG_e,SEG_f,SEG_g;
  15.         //共阴数码管的真值表
  16.         unsigned char table[10][8]=
  17.             {
  18.                  {0,0,1,1,1,1,1,1},//0
  19.                  {0,0,0,0,0,1,1,0},// 1
  20.                  {0,1,0,1,1,0,1,1},// 2
  21.                  {0,1,0,0,1,1,1,1},// 3
  22.                  {0,1,1,0,0,1,1,0},// 4
  23.                  {0,1,1,0,1,1,0,1},// 5
  24.                  {0,1,1,1,1,1,0,1},// 6
  25.                  {0,0,0,0,0,1,1,1},// 7
  26.                  {0,1,1,1,1,1,1,1},// 8
  27.                  {0,1,1,0,1,1,1,1},// 9
  28.             };
  29. };

  30. #endif
 demo.cpp文件内容

  1. #include "demo.h"
  2. DemoClass::DemoClass(){
  3.     pinMode(13,OUTPUT);
  4. }

  5. void DemoClass::led8_init(int a, int b, int c, int d, int e, int f, int g)
  6. {
  7.     SEG_a=a;
  8.     SEG_b=b;
  9.     SEG_c=c;
  10.     SEG_d=d;
  11.     SEG_e=e;
  12.     SEG_f=f;
  13.     SEG_g=g;
  14.     pinMode(SEG_a,OUTPUT);
  15.     pinMode(SEG_b,OUTPUT);
  16.     pinMode(SEG_c,OUTPUT);
  17.     pinMode(SEG_d,OUTPUT);
  18.     pinMode(SEG_e,OUTPUT);
  19.     pinMode(SEG_f,OUTPUT);
  20.     pinMode(SEG_g,OUTPUT);

  21. }

  22. void DemoClass::led8_display(int num)
  23. {
  24.      digitalWrite(SEG_a,table[num][7]);
  25.      digitalWrite(SEG_b,table[num][6]);
  26.      digitalWrite(SEG_c,table[num][5]);
  27.      digitalWrite(SEG_d,table[num][4]);
  28.      digitalWrite(SEG_e,table[num][3]);
  29.      digitalWrite(SEG_f,table[num][2]);
  30.      digitalWrite(SEG_g,table[num][1]);
  31. }
 把该扩展导入到mblock中,然后在mblock的扩展菜单选中“Seg_LED”,在mblock的机器人模块中就会出现Sed_LED扩展模块,显示出“共阴数码管初始化”和“数码管显示”两个语句,

编写测试程序,如图1所示,数码管显示正常。


                                        图1 8段共阴数码管扩展模块测试程序

扩展模块下载:Demo.zip
为mblock编写扩展模块的更多内容请参考:










阅读(2847) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~