pATAq 发表于 2018-6-4 18:16:30

Micro:Bit手柄试用之一MagicPad (解决蓝牙与gamePad包共存)

本帖最后由 pATAq 于 2018-6-5 10:46 编辑

# 前言

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

**Micro:Bit真好玩!**

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

### 1、MagicPad设想

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

### 2、硬件解析

这里用到的硬件如下:

* (https://www.dfrobot.com.cn/goods-1395.html)
* (https://www.dfrobot.com.cn/goods-1674.html)
* MicroUSB数据线(烧录、临时供电)
* Android SmartPhone

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

#### 2.1 GamePad 4 MicroBit by DFRobot

![](http://ws.dfrobot.com.cn/FmeFt66nRP0WLYDvOcgXIoiRxPUk)

板载资源包括:

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

相关资料可以在[产品维库](https://wiki.dfrobot.com.cn/index.php?title=(SKU:DFR0536)_micro:bit%E6%B8%B8%E6%88%8F%E6%89%8B%E6%9F%84%E6%89%A9%E5%B1%95%E6%9D%BF)上找到,文档上提供了诸多示例,把玩了一下,非常有趣。然而由于产品并不是开源硬件,没有提供相关硬件引脚信息,只有封装好的MakeCode操作库,经过一番思索查找,在[官方产品github页面](https://github.com/DFRobot/pxt-gamePad)找到引脚定义。

#### 2.2 寻找 GamePad 引脚定义

![](https://camo.githubusercontent.c ... 539422542452e706e67)

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

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

   ![](https://i.loli.net/2018/06/01/5b10dcf02d418.png)

```c
   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引脚定义:

   ![](http://tech.microbit.org/docs/hardware/assets/edge_connector.svg)

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

#### 2.3 测试一下

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

https://makecode.microbit.org/_Cxpdt5MEVE8f

![](https://i.loli.net/2018/06/01/5b10ebc153b0f.png)

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

![](https://i.loli.net/2018/06/01/5b10ebc155424.png)

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

### 3、软件部分

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

#### 3.1 microbit Client —— MakeCode

MakeCode由微软开发,基于(https://github.com/Microsoft/pxt),这种Visual Blocks开发最早在Scratch上看到,后来用过(https://blockly.webduino.io/),彼时个人对它[评价颇低](http://www.cnblogs.com/sjqlwy/p/smart_all_in_1.html)。

![](https://i.loli.net/2018/06/01/5b10ee4fc65cd.png)

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

由于我们的设想是mb通过蓝牙控制手机,所以需要使用`Bluetooth`软件包,但是添加DFRobot官方的*(https://github.com/DFRobot/pxt-gamePad)*包时会提示冲突。

![](https://i.loli.net/2018/06/01/5b10f1a8963a0.png)

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

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

##### 3.1.1 加法

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

![](https://i.loli.net/2018/06/01/5b10f31339586.png)

看了相关的(https://makecode.microbit.org/reference/control/on-event)/(https://lancaster-university.git ... cs/ubit/messageBus/)/(https://lancaster-university.git ... s/data-types/event/)/(https://makecode.microbit.org/device/mes-events)/(https://www.microbit.co.uk/device/reactive),表示还没看懂,这里按下不表,后面搞懂再来。

##### 3.1.2 减法

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

参考如下:

* (https://github.com/Microsoft/pxt)
* (https://github.com/Microsoft/pxt-microbit)
* (https://github.com/Microsoft/pxt-sample)

阅读MakeCode关于`Creating Packages`相关的[手册内容](https://makecode.com/packages),我们了解到了`pxt.json`文件,打开github上`gamePad`包的主页,果不其然:

```json
{
    "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`包,但是`radio`与`bluetooth`冲突,因此解决方法显而易见,我们fork一份`gamePad`包到自己的github账户下,修改`pxt.json`文件,删除`radio`包依赖,其实`gamePad`并不需要无线电功能才能运行,希望Lee可以改动一下。这里我改好的包地址为:

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

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

![](https://i.loli.net/2018/06/01/5b10f6fccf667.png)

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

#### 3.2 Android Server —— micro:bit APP

手机上需要安装一个服务软件,用来连接mb,并响应mb的指令。一种方式是使用可视化的MIT APP Invetor自己写程序,我们这里使用现成的`micro:bit`APP即可,(https://play.google.com/store/ap ... om.samsung.microbit),无法访问的请下载附件。
![](https://i.loli.net/2018/06/01/5b10f835d5f9a.png)

### 4、开始动手!

目前实现的功能包括:

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

代码如下:

https://makecode.microbit.org/_5aY3heCgtLud

![](https://i.loli.net/2018/06/04/5b150e29e43e6.png)

这里我们借助`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连接接收控制,暂时还没看到有人做



digi_cow 发表于 2018-6-4 18:58:00

楼主的帖子行文学术范浓郁~

pATAq 发表于 2018-6-4 22:12:10

digi_cow 发表于 2018-6-4 18:58
楼主的帖子行文学术范浓郁~

谬赞,micro:bit新手,大家一起进步~

rzyzzxw 发表于 2018-6-5 09:47:11

楼主技术牛人,一上手就玩这么高大上,佩服。{:5_148:}

同时,也有看到很多东东,虽然还消化不动。您多发教程,带我们一起玩吧。{:5_145:}

rzyzzxw 发表于 2018-6-5 09:52:23

pATAq 发表于 2018-6-4 22:12
谬赞,micro:bit新手,大家一起进步~

强烈支持,楼主行文专业严谨。

pATAq 发表于 2018-6-5 22:20:47

rzyzzxw 发表于 2018-6-5 09:52
强烈支持,楼主行文专业严谨。

哈哈,跟着你的文章学了很多东西

rzyzzxw 发表于 2018-6-5 23:32:36

pATAq 发表于 2018-6-4 18:16
# 前言

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

大神,你顺手把DF的Micro:bit电机驱动板软件包也改个蓝牙版吧。或者再写个自己造软件包的教程带我们玩。

pATAq 发表于 2018-6-6 09:42:17

rzyzzxw 发表于 2018-6-5 23:32
大神,你顺手把DF的Micro:bit电机驱动板软件包也改个蓝牙版吧。或者再写个自己造软件包的教程带我们玩。
...

你仔细看我的链接和内容就会了啊,全都有~
修改这个文件
https://github.com/DFRobot/pxt-motor/blob/master/pxt.json
取消radio的依赖
自己做软件包的话,看我的链接,微软makecode提供了相关文档

rzyzzxw 发表于 2018-6-6 10:13:16

本帖最后由 rzyzzxw 于 2018-6-6 10:55 编辑

谢谢指导,我试试看。{:5_132:}英文不懂,学起来吃力,但还是改造了一个DF的电机驱动扩展。{:5_146:}

pATAq 发表于 2018-6-6 11:53:57

rzyzzxw 发表于 2018-6-6 10:13
谢谢指导,我试试看。英文不懂,学起来吃力,但还是改造了一个DF的电机驱动扩展。 ...

看你已经fork修改过了,应该可以用了,有问题继续pm
计算机英语学起来不很难,词汇多认认就好啦,毕竟英文资料多

rzyzzxw 发表于 2018-6-6 19:54:08

pATAq 发表于 2018-6-6 11:53
看你已经fork修改过了,应该可以用了,有问题继续pm
计算机英语学起来不很难,词汇多认认就好啦,毕竟英 ...

y谢谢鼓励哈。学习很快乐。{:5_132:}

rzyzzxw 发表于 2018-6-11 18:11:45

pATAq 发表于 2018-6-4 18:16
# 前言

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

大神,控件高级事件不明白,据说用它对接写出的APP运行很稳定。很想有突破,可是查了几天资料,亳无头绪。

pATAq 发表于 2018-6-12 16:10:47

rzyzzxw 发表于 2018-6-11 18:11
大神,控件高级事件不明白,据说用它对接写出的APP运行很稳定。很想有突破,可是查了几天资料,亳无头绪 ...

你说的是on event那种吗?我也没看甚懂,私以为类似于中断。其实你看df的gamepad包,可知用的就是on event。使用蓝牙会跑飞的原因怀疑是速率跟不上,具体在microbit faq里面有人提过。但是确认可能需要调试,最近在研究板载DAPLink仿真器配合pyOCD和gdb进行调试

rzyzzxw 发表于 2018-6-12 16:22:07

pATAq 发表于 2018-6-12 16:10
你说的是on event那种吗?我也没看甚懂,私以为类似于中断。其实你看df的gamepad包,可知用的就是on even ...

Iphone手机模拟gamepad蓝牙控制小车
https://mc.dfrobot.com.cn/forum.php?mod=viewthread&tid=38013&fromuid=727937
(出处: DF创客社区 - 分享创造的喜悦)
看这个帖子,和沈老师交流,运行很稳定,所以感觉这是一种更好的蓝牙方案。

pATAq 发表于 2018-6-12 22:24:48

rzyzzxw 发表于 2018-6-12 16:22
Iphone手机模拟gamepad蓝牙控制小车
https://mc.dfrobot.com.cn/forum.php?mod=viewthread&tid=38013&from ...

不错,谢谢分享~
页: [1]
查看完整版本: Micro:Bit手柄试用之一MagicPad (解决蓝牙与gamePad包共存)