前言

原创文章,转载引用务必注明链接。由于本人初次接触Micro:Bit,水平有限,如有疏漏,欢迎指正。

Micro:Bit真好玩!

DFRobot的论坛相关资料算是国内比较丰富的了,个人感觉MB比Arduino更有趣!感谢DFRobot,总会带来各种新奇、有趣价格相对不贵的模块,无论是Intel Edison还是micro:bit,都设计了大量模块,非常棒。文章原载于DFRobot论坛。

1、MagicPad设想

这次拿到micro:bit gamepad 遥控手柄 ,把玩了一下,发现很多神奇的功能,查阅了大量资料文档,算是管中窥豹,后续会分享给大家。这次做一个小项目,涉及到部分知识。目前想做的是:mb作为蓝牙遥控器,控制手机拍照(自拍)、查找手机、自动切歌、丢失报警(GamePad震动)等等。

2、硬件解析

这里用到的硬件如下:

micro:bit会在另一篇文章里进行介绍,其具有加速度与电子罗盘、温度及亮度传感器。这里主要说说DFRobot出品的GamePad拓展板。

2.1 GamePad 4 MicroBit by DFRobot

板载资源包括:

8个可编程按键,1个振动电机,一个蜂鸣器,一个LED 。

相关资料可以在产品维库上找到,文档上提供了诸多示例,把玩了一下,非常有趣。然而由于产品并不是开源硬件,没有提供相关硬件引脚信息,只有封装好的MakeCode操作库,经过一番思索查找,在官方产品github页面找到引脚定义。

2.2 寻找 GamePad 引脚定义

  1. 从面板上可以看到标记了部分引脚如P0、P12、P16等,另外A、B就是复用microbit板上的A、B按钮。

  2. 打开main.ts文件,第20行看到如下代码:

   enum GamerBitPin {
//% block="X button"
P1 = <number>DAL.MICROBIT_ID_IO_P1,
//% block="Y button"
P2 = <number>DAL.MICROBIT_ID_IO_P2,
//% block="D-PAD up"
P8 = <number>DAL.MICROBIT_ID_IO_P8,
//% block="D-PAD down"
P13 = <number>DAL.MICROBIT_ID_IO_P13,
//% block="D-PAD left"
P14 = <number>DAL.MICROBIT_ID_IO_P14,
//% block="D-PAD right"
P15 = <number>DAL.MICROBIT_ID_IO_P15,
}

至此,我们结合相关,可知对应引脚信息如下:

引脚 对应
P1 按钮X
P2 按钮Y
P8 按键UP
P13 按键Down
P14 按键Left
P15 按键Right
P5 按键A
P11 按键B
P0 Buzzer|蜂鸣器
P16 LED
P12 Vibrator|振动器

参考mb引脚定义:

P0/P1/P2又叫TouchPin,就是那三个大的引脚,其中音乐通常从P0输出。

2.3 测试一下

我们不借助DFRobot提供的MakeCode软件包,直接使用相关引脚看看:

https://makecode.microbit.org/_Cxpdt5MEVE8f

【直接操作引脚模式】注意初始化引脚方向,否则会乱跑。TouchPi和BtnA/B好像会初始化执行这一操作。但是程序会跑飞,需要进一步测试完善。

【DFRobot软件包操作模式】简洁很多,而且程序稳定。

3、软件部分

mb有诸多开发语言及开发环境可供选择,这里我们以MakeCode为例。

3.1 microbit Client —— MakeCode

MakeCode由微软开发,基于PXT (Programming eXperience Toolkit ),这种Visual Blocks开发最早在Scratch上看到,后来用过Webduino Blockly在线编辑器,彼时个人对它评价颇低

这次拿到mb本来是奔着microPython去的,其间测试的时候用了一下MakeCode,甚是喜欢,支持自定义函数,提供丰富的文档和拓展支持,下限上限都非常高,既适合小孩子入门,面对更复杂的需求也能完成。

由于我们的设想是mb通过蓝牙控制手机,所以需要使用Bluetooth软件包,但是添加DFRobot官方的gamePad包时会提示冲突。

这优点类似radiobluetooth包的冲突,那么如何解决呢?想到两个思路:

  • 加法:既然知道了引脚定义,我们不用gamePad包,直接操作相关引脚
  • 减法:使用官方提供的更为完善的gamePad包,进行移植修改及删减,由于软件包较小,这也未尝不可
3.1.1 加法

在直接操作Pin的示例中,D-Pad多按几次程序就跑飞了,如图所示显示乱码,mb无响应。回过头来,看到on pin Px pressed模块比较稳定,但是仅限于3个TouchPin,有没有类似的手写模块呢?我们找到了在控制组件里找到on event模块,拖拽右击选择help,可以看到相关帮助手册。

看了相关的1/2/3/4/5,表示还没看懂,这里按下不表,后面搞懂再来。

3.1.2 减法

思路就是剥离gamePad包里面与蓝牙功能冲突的部分,只保留需要的功能,这就需要阅读gamePad源码进行修改移植,本以为很难,不想十分简单。

参考如下:

阅读MakeCode关于Creating Packages相关的手册内容,我们了解到了pxt.json文件,打开github上gamePad包的主页,果不其然:

{
"name": "gamePad",
"version": "0.0.0",
"description": "This library is DFRobot gamer:bit provides the game handle control function.",
"license": "GNU",
"dependencies": {
"core": "*",
"radio": "*"
},
"files": [
"README.md",
"gamerpad.cpp",
"main.ts",
"_locales/zh/gamePad-strings.json"
],
"testFiles": [
"test.ts"
],
"public": false
}

第8行"radio": "*"提示该软件包依赖radio包,但是radiobluetooth冲突,因此解决方法显而易见,我们fork一份gamePad包到自己的github账户下,修改pxt.json文件,删除radio包依赖,其实gamePad并不需要无线电功能才能运行,希望Lee可以改动一下。这里我改好的包地址为:

https://github.com/sjqlwy/pxt-gamePad

添加我的软件包地址即可以同时使用GamePad与蓝牙功能了。

至此我们解决了开发环境的冲突问题。

3.2 Android Server —— micro:bit APP

手机上需要安装一个服务软件,用来连接mb,并响应mb的指令。一种方式是使用可视化的MIT APP Invetor自己写程序,我们这里使用现成的micro:bitAPP即可,google play下载地址,无法访问的请下载附件。

4、开始动手!

目前实现的功能包括:

  • 蓝牙控制
  • 照片视频拍摄控制(切换前后摄像头)
  • 音乐播放控制(音量+/-,切换歌曲)
  • Find My Phone
  • 手机丢失告警

代码如下:

https://makecode.microbit.org/_5aY3heCgtLud

这里我们借助Devices包中的相关block,如果你默认使用的是Radio包,则需要手动添加并替换radio。

部分说明:

  1. D-Pad控制音量加减和歌曲前后切歌,需要事先打开音乐播放器,如网易云音乐。
  2. 按A键开启前置摄像头5s后自拍,摇晃mb切换前后摄像头
  3. 按Y键,只要手机在蓝牙范围内,则会相应,这样就不怕手机丢在角落找不到了
  4. 当手机-mb之间距离发生变化时(读取RSSI值Received signal strength indication),进行判断,返回0-4的数值,0=no signal,4=full signal

下载烧录此程式到mb后,在Android手机上你需要执行以下步骤:

  1. 把MakeCode生成的hex文件拷贝到microbit磁盘内
  2. 在安卓手机上,如果micro:bit已经在已配对设备里,则选择取消保存。每次更新hex文件都要取消配对并重新配对,否则蓝牙通讯会失败。
  3. 在手机上运行Samsung micro:bit程序,选择Connect并与micro:bit进行配对。
  4. 按照图示操作让mb进入蓝牙配对模式:同时按住A和B键,短按Reset键,此时可以看到显示“PARING MODE”,松开A和B键。
  5. 回到手机端,输入密钥即可完成配对。
  6. reset键重置mb使其进入我们烧入的程序,初始化成功会显示一个笑脸。
  7. 手机端选择mb进行连接,成功后mb会显示"C"(Connected),断开会显示"D"(Disconnect)。
  8. 使用相关按键就可以实现功能了,快去试一试

5、后记

  • 官方也提供了iOS的程序,但是本人没条件测试
  • 测试过程使用microUSB供电,会出现不稳定情况
  • 目前我们实现了mb远程控制手机的功能,了解了基础的蓝牙操作,下一步尝试安卓蓝牙串口发送自定义程序;APP Inventor手写程序;mb与Linux 蓝牙串口通讯
  • 看到论坛里遥控小车用的mb作为主控,两块mb进行通讯更方便些,后面会尝试手写BeagleBone Blue|RPi的Linux蓝牙服务端与mb连接接收控制,暂时还没看到有人做

Micro:Bit手柄试用之一MagicPad (解决蓝牙与gamePad包共存)的更多相关文章

  1. 【Maven】【IDEA】在idea中开发web项目,解决maven的jar包冲突的方法

    在idea中开发web项目,解决maven的jar包冲突的方法 第一步: 先对项目进行 clean ,再进行install 第二步: 出现NoSuchMethodException,ClassNotF ...

  2. go mod 解决 Go 语言的包依赖问题

    转:https://testerhome.com/topics/16980 https://testerhome.com/ -------------------------------------- ...

  3. CDH平台搭建解决离线安装依赖包的方法

    背景介绍: 1CDH开发平台在搭建的过程中,会遇到各种各样的问题,其中的各种依赖就是一个很让人头痛的问题.如果安装脚本文件出现了这种问题,那么就可以把以下的这种方法加入shell中,但是不要用yum来 ...

  4. VS2008试用版到期解决办法----win7下VS2008升级补丁.zip

    打开好久没用的Visual studio 2008,才知道试用版已经到期了.在网上找来了序列号,可是连一个输入序列号的地方都没有,困惑了好久,终于找到了解决办法. 首先献上自己收集的Visual st ...

  5. VS2008试用版到期解决办法

    在Windows 7下,VS2008试用版无法正常升级到正式版.原因是维护页面的注册码输入框和升级按钮被隐藏.通过本补丁,可让注册码输入框和升级按钮恢复正常显示 点击此处下载补丁 1.安装完90天试用 ...

  6. VS2013 试用版到期 解决办法

    摘自:http://jingyan.baidu.com/article/fec7a1e5100b481190b4e7d9.html 输入密钥:BWG7X-J98B3-W34RT-33B3R-JVYW9

  7. SQLyog试用到期的解决方法(仅供个人学习使用,禁止转载或用于商业盈利)

    作者:EzrealYi 本章链接:https://www.cnblogs.com/ezrealyi/p/12434105.html win+r->输入regedit->进入注册表 在计算机 ...

  8. 用启动器py成功解决python2和python3同时共存且同时运行的问题

    缘起:之前一直用PHP来开发微信公众号后台,最近正在学习python,而且看到微信官方也把公众号后台的示例代码换成了python的,但是示例中用的web.py需要用到python2,而我自己的电脑上装 ...

  9. 解决EBS中JAR包冲突的问题

    同事解决的,摘抄上来备用. 问题描述:在OAF里调用ESB的服务报错如下: Error Page   Exception Details.    oracle.apps.fnd.framework.O ...

随机推荐

  1. maven学习(十四)——Eclipse中使用Maven插件

    1.导入Maven项目 File→import

  2. unity中的main方法

    由于方法命名的原因,无意之间把一个方法命名为了Main,然后把这个方放到了Start方法中去执行,结果运行后发现这个方法竟然执行了两次 情况如下图: -------------- 检查代码,发现脚本并 ...

  3. How to modify a compiled Android application (.apk file)

    Today I’d like to share with you my findings about how an existing .apk file can be modified. An .ap ...

  4. 个人环境搭建——搭建tomcat

    搭建tomcat 和前几个软件一样,Tomcat 同样是由JAVA开发的,所以,在安装前一定要装好JDK,具体JDK搭建过程参见 个人环境搭建——搭建JDK环境 篇.   系统环境:ubuntu12. ...

  5. 排列计数(permutation)

    排列计数(permutation) 题目描述 求有多少种长度为n的序列A,满足以下条件: 1) 1~n这n个数在序列中各出现了一次 2) 若第i个数A[i]的值为i,则称i是稳定的.序列恰好有m个数是 ...

  6. element el-cascader设置默认值

    原文:https://www.jianshu.com/p/b690d7fe6ec0 注意两点就行了 <el-form-item label="AP名称"> <el ...

  7. jquery 实践操作:div 动态嵌套页面

    此篇记录如何在指定 div 中嵌套一个页面 load() 方法: 1. 使用 $.load() 直接导入一个页面 $('#addPage_div').load("temp/handle.ht ...

  8. JavaScript 的新特性:类的 #private 字段

    这是什么,如何使用,为什么需要? 一边听“Noise Pollution” —— Portugal. The Man,一边阅读本文简直就是享受 JavaScript 标准的第二阶段(Stage 2)加 ...

  9. (二) Spring项目的搭建

    传统的项目搭建,是将所依赖的第三方jar包复制到项目的类路径下.但是,这样带来的问题是,无法更好的对这些jar包进行动态管理. 目前主流的构建工具有:Ant.Maven.Gradle.以Maven为例 ...

  10. Union和Concat的区别,以及它们的速度 (C# Linq)

    原文发布时间为:2011-06-29 -- 来源于本人的百度文章 [由搬家工具导入] Union 会去重复后合并。而Contact不去重直接合并。 所以Contact当然比较快了。所以如果你不用去重的 ...