Micro:Bit手柄试用之一MagicPad (解决蓝牙与gamePad包共存)
前言
原创文章,转载引用务必注明链接。由于本人初次接触Micro:Bit,水平有限,如有疏漏,欢迎指正。
Micro:Bit真好玩!
DFRobot的论坛相关资料算是国内比较丰富的了,个人感觉MB比Arduino更有趣!感谢DFRobot,总会带来各种新奇、有趣价格相对不贵的模块,无论是Intel Edison还是micro:bit,都设计了大量模块,非常棒。文章原载于DFRobot论坛。
1、MagicPad设想
这次拿到micro:bit gamepad 遥控手柄 ,把玩了一下,发现很多神奇的功能,查阅了大量资料文档,算是管中窥豹,后续会分享给大家。这次做一个小项目,涉及到部分知识。目前想做的是:mb作为蓝牙遥控器,控制手机拍照(自拍)、查找手机、自动切歌、丢失报警(GamePad震动)等等。
2、硬件解析
这里用到的硬件如下:
- micro:bit 编程入门开发板
- micro:bit gamepad 遥控手柄
- MicroUSB数据线(烧录、临时供电)
- Android SmartPhone
micro:bit会在另一篇文章里进行介绍,其具有加速度与电子罗盘、温度及亮度传感器。这里主要说说DFRobot出品的GamePad拓展板。
2.1 GamePad 4 MicroBit by DFRobot
板载资源包括:
8个可编程按键,1个振动电机,一个蜂鸣器,一个LED 。
相关资料可以在产品维库上找到,文档上提供了诸多示例,把玩了一下,非常有趣。然而由于产品并不是开源硬件,没有提供相关硬件引脚信息,只有封装好的MakeCode操作库,经过一番思索查找,在官方产品github页面找到引脚定义。
2.2 寻找 GamePad 引脚定义
从面板上可以看到标记了部分引脚如P0、P12、P16等,另外A、B就是复用microbit板上的A、B按钮。
打开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包时会提示冲突。
这优点类似radio
与bluetooth
包的冲突,那么如何解决呢?想到两个思路:
- 加法:既然知道了引脚定义,我们不用
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
包,但是radio
与bluetooth
冲突,因此解决方法显而易见,我们fork一份gamePad
包到自己的github账户下,修改pxt.json
文件,删除radio
包依赖,其实gamePad
并不需要无线电功能才能运行,希望Lee可以改动一下。这里我改好的包地址为:
添加我的软件包地址即可以同时使用GamePad与蓝牙功能了。
至此我们解决了开发环境的冲突问题。
3.2 Android Server —— micro:bit APP
手机上需要安装一个服务软件,用来连接mb,并响应mb的指令。一种方式是使用可视化的MIT APP Invetor自己写程序,我们这里使用现成的micro:bit
APP即可,google play下载地址,无法访问的请下载附件。
4、开始动手!
目前实现的功能包括:
- 蓝牙控制
- 照片视频拍摄控制(切换前后摄像头)
- 音乐播放控制(音量+/-,切换歌曲)
- Find My Phone
- 手机丢失告警
代码如下:
https://makecode.microbit.org/_5aY3heCgtLud
这里我们借助Devices
包中的相关block,如果你默认使用的是Radio
包,则需要手动添加并替换radio。
部分说明:
- D-Pad控制音量加减和歌曲前后切歌,需要事先打开音乐播放器,如网易云音乐。
- 按A键开启前置摄像头5s后自拍,摇晃mb切换前后摄像头
- 按Y键,只要手机在蓝牙范围内,则会相应,这样就不怕手机丢在角落找不到了
- 当手机-mb之间距离发生变化时(读取RSSI值Received signal strength indication),进行判断,返回0-4的数值,0=no signal,4=full signal
下载烧录此程式到mb后,在Android手机上你需要执行以下步骤:
- 把MakeCode生成的hex文件拷贝到microbit磁盘内
- 在安卓手机上,如果micro:bit已经在
已配对设备
里,则选择取消保存
。每次更新hex文件都要取消配对并重新配对,否则蓝牙通讯会失败。 - 在手机上运行Samsung micro:bit程序,选择Connect并与micro:bit进行配对。
- 按照图示操作让mb进入蓝牙配对模式:同时按住A和B键,短按Reset键,此时可以看到显示“PARING MODE”,松开A和B键。
- 回到手机端,输入密钥即可完成配对。
reset
键重置mb使其进入我们烧入的程序,初始化成功会显示一个笑脸。- 手机端选择mb进行连接,成功后mb会显示"C"(Connected),断开会显示"D"(Disconnect)。
- 使用相关按键就可以实现功能了,快去试一试
5、后记
- 官方也提供了iOS的程序,但是本人没条件测试
- 测试过程使用microUSB供电,会出现不稳定情况
- 目前我们实现了mb远程控制手机的功能,了解了基础的蓝牙操作,下一步尝试安卓蓝牙串口发送自定义程序;APP Inventor手写程序;mb与Linux 蓝牙串口通讯
- 看到论坛里遥控小车用的mb作为主控,两块mb进行通讯更方便些,后面会尝试手写BeagleBone Blue|RPi的Linux蓝牙服务端与mb连接接收控制,暂时还没看到有人做
Micro:Bit手柄试用之一MagicPad (解决蓝牙与gamePad包共存)的更多相关文章
- 【Maven】【IDEA】在idea中开发web项目,解决maven的jar包冲突的方法
在idea中开发web项目,解决maven的jar包冲突的方法 第一步: 先对项目进行 clean ,再进行install 第二步: 出现NoSuchMethodException,ClassNotF ...
- go mod 解决 Go 语言的包依赖问题
转:https://testerhome.com/topics/16980 https://testerhome.com/ -------------------------------------- ...
- CDH平台搭建解决离线安装依赖包的方法
背景介绍: 1CDH开发平台在搭建的过程中,会遇到各种各样的问题,其中的各种依赖就是一个很让人头痛的问题.如果安装脚本文件出现了这种问题,那么就可以把以下的这种方法加入shell中,但是不要用yum来 ...
- VS2008试用版到期解决办法----win7下VS2008升级补丁.zip
打开好久没用的Visual studio 2008,才知道试用版已经到期了.在网上找来了序列号,可是连一个输入序列号的地方都没有,困惑了好久,终于找到了解决办法. 首先献上自己收集的Visual st ...
- VS2008试用版到期解决办法
在Windows 7下,VS2008试用版无法正常升级到正式版.原因是维护页面的注册码输入框和升级按钮被隐藏.通过本补丁,可让注册码输入框和升级按钮恢复正常显示 点击此处下载补丁 1.安装完90天试用 ...
- VS2013 试用版到期 解决办法
摘自:http://jingyan.baidu.com/article/fec7a1e5100b481190b4e7d9.html 输入密钥:BWG7X-J98B3-W34RT-33B3R-JVYW9
- SQLyog试用到期的解决方法(仅供个人学习使用,禁止转载或用于商业盈利)
作者:EzrealYi 本章链接:https://www.cnblogs.com/ezrealyi/p/12434105.html win+r->输入regedit->进入注册表 在计算机 ...
- 用启动器py成功解决python2和python3同时共存且同时运行的问题
缘起:之前一直用PHP来开发微信公众号后台,最近正在学习python,而且看到微信官方也把公众号后台的示例代码换成了python的,但是示例中用的web.py需要用到python2,而我自己的电脑上装 ...
- 解决EBS中JAR包冲突的问题
同事解决的,摘抄上来备用. 问题描述:在OAF里调用ESB的服务报错如下: Error Page Exception Details. oracle.apps.fnd.framework.O ...
随机推荐
- 【bzoj1475】方格取数 网络流最小割
题目描述 在一个n*n的方格里,每个格子里都有一个正整数.从中取出若干数,使得任意两个取出的数所在格子没有公共边,且取出的数的总和尽量大. 输入 第一行一个数n:(n<=30) 接下来n行每行n ...
- 通过Xode上传代码到GIthub---步骤
---恢复内容开始--- 一:打开终端,git命令进行全局配置 由于本人已经配置完成,so,直接查看配置信息 然后在本地创建一个文件夹, 然后在gitHub上创建一个代码库 在终端clone到本地创建 ...
- python斐波那契数列复杂度
契数列 概述: 斐波那契数列,又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n ...
- Python学习杂记_4_分支和循环
分支 和 循环 分支和循环这俩结构在各语言中都有着很重要的地位,当然我之前都没有学好,这里总结一下在Python学习中对这俩结构的认识. 分支结构 # 单分支 if 条件判断: 执行语句… # 双分支 ...
- windows下安装oracle,sqlplus连接启动oracle(oracle 主机字符串输入是什么)
1.oracle安装 参考http://wenku.baidu.com/view/d01ffd43336c1eb91a375d68.html,这里不再赘述 2.命令行sqlplus连接oracle ...
- Codeforces Gym100735 I.Yet another A + B-Java大数 (KTU Programming Camp (Day 1) Lithuania, Birˇstonas, August 19, 2015)
I.Yet another A + B You are given three numbers. Is there a way to replace variables A, B and C with ...
- python调用phantomjs组件(windows和linux)
phantomjs在windows和linux系统,可以通selenium的webdriver直接调用,所以只要将phantomjs程序加载到python程序目录下. 示例代码如下所示: #建立Pha ...
- luogu P3092 [USACO13NOV]没有找零No Change
题目描述 Farmer John is at the market to purchase supplies for his farm. He has in his pocket K coins (1 ...
- NOIP2016模拟赛三 Problem B: 神奇的树
题面 Description 有一棵神奇的树.这棵树有N个节点,在每个节点上都有宝藏,每个宝藏价值V[i]金币:对于每条边,每经过一次都要花费C[i]金币. 值得注意的是,每个宝藏只能领取一次(也可以 ...
- SecureCRT导出服务器列表或配置文件
说明:SecureCRT没有Xshell那么简单有直接导出的功能,但是可以通过技巧的方式来操作. 1.打开SecureCRT,点击菜单栏的[Opitions]->[Global Opitions ...