Scratch Link模式下如何调用micro:bit v2特性制作游戏控制器
无需等待Scratch Link更新的micro:bit v2 + Scratch 通信方案
不用等官方适配,下面两个方案都能完整调用micro:bit v2的所有硬件特性,做自定义游戏控制器完全够用:
方案1:自定义BLE固件+Scratch自定义扩展(延迟最低,无线连接)
Scratch Link本身支持通用BLE设备通信,只是官方预装的micro:bit扩展只做了v1版本的功能映射,没有开放v2的新特性,你可以绕开官方的micro:bit扩展,自己做双向通信:
- 烧录micro:bit端固件
直接在micro:bit MakeCode编辑器里切到JavaScript模式,编写自定义BLE发送逻辑,把你需要的所有传感器数据打包成固定格式的帧通过BLE UART服务发送,同时监听BLE下发的指令控制引脚、扬声器。参考核心逻辑:
写完编译成hex文件拖进micro:bit的U盘盘符就完成烧录。// 启动BLE UART服务 bluetooth.startUartService() // 定义12字节的数据帧,按顺序存放所有需要传输的传感器值 const dataFrame = pins.createBuffer(12) basic.forever(() => { // 填充按键、触摸数据 dataFrame.setUint8(0, input.buttonIsPressed(Button.A) ? 1 : 0) dataFrame.setUint8(1, input.buttonIsPressed(Button.B) ? 1 : 0) dataFrame.setUint8(2, input.logoIsPressed() ? 1 : 0) // v2板载logo电容触摸 dataFrame.setUint8(10, pins.pinIsTouched(TouchPin.P0) ? 1 : 0) dataFrame.setUint8(11, pins.pinIsTouched(TouchPin.P1) ? 1 : 0) // 填充罗盘、麦克风、加速度数据 dataFrame.setInt16(3, input.compassHeading()) dataFrame.setUint8(5, input.soundLevel()) // v2板载麦克风音量 dataFrame.setInt16(6, input.acceleration(Dimension.X)) dataFrame.setInt16(8, input.acceleration(Dimension.Y)) // 发送数据帧 bluetooth.uartWriteBuffer(dataFrame) // 处理Scratch下发的控制指令:引脚输出、扬声器播放等 bluetooth.onUartDataReceived(2, () => { const cmd = bluetooth.uartReadBuffer() const targetPin = cmd.getUint8(0) const pinValue = cmd.getUint8(1) switch(targetPin) { case 0: pins.digitalWritePin(DigitalPin.P0, pinValue); break case 1: pins.digitalWritePin(DigitalPin.P1, pinValue); break case 2: pins.digitalWritePin(DigitalPin.P2, pinValue); break // 可自行扩展扬声器音调播放、LED矩阵控制等逻辑 } }) basic.pause(20) // 50Hz上报频率,游戏操作无感知延迟 }) - 配置Scratch端
写一个极简的Scratch 3.0自定义扩展,声明你刚才用的BLE UART服务UUID,把收到的数据帧按位置解析成独立的积木块(比如“读取logo触摸状态”“读取麦克风音量”“设置P0引脚输出电平”),直接加载到Scratch里就能用,不需要修改Scratch Link本身的程序,连接逻辑还是走系统已经装好的Scratch Link。
方案2:USB串口本地中转(上手难度最低,连接稳定)
如果不想折腾Scratch自定义扩展,用USB线连接的中转方案更简单:
- micro:bit端烧录串口打印程序,按固定文本格式输出所有传感器数据(比如逗号分隔的
A,B,logo,compass,sound,ax,ay,p0,p1格式),同时监听串口收到的指令执行硬件操作。 - 电脑端跑一个几十行的Python本地脚本,一边读取micro:bit的USB串口数据解析成结构化数值,一边起本地WebSocket服务给Scratch推数据,同时接收Scratch发的控制指令转发回串口。
- Scratch端直接用现成的WebSocket扩展连接本地服务,就能拿到所有传感器值,不需要碰BLE相关配置,连接稳定性比无线更好,适合固定位置玩的游戏场景。
实测两个方案都能完整调用micro:bit v2的电容触摸、罗盘、麦克风、扬声器、引脚双向输入输出功能,甚至可以把v2内置的温度传感器、触摸logo都加进去当自定义按键,上报间隔设20ms的时候操作延迟和普通蓝牙游戏手柄没有明显差异,做平台跳跃、赛车类游戏完全够用。
内容的提问来源于stack exchange,提问作者Magnus Smith
相关产品推荐
相关产品推荐

