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會在另一篇文章里進行介紹,其具有加速度與電子羅盤、溫度及亮度傳感器。這里主要說說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連接接收控制,暫時還沒看到有人做


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM