天冷不想动手?一款自制的蓝牙手机遥控器能让你把手藏在被窝里,轻松刷抖音、快手等短视频。
这款遥控器的核心功能是通过蓝牙连接,远程模拟触控手势,实现上下翻页、暂停播放、点赞等操作,彻底解放双手。
对于嵌入式开发者来说,直接购买成品非首选。这次我们利用手边已有的沁恒CH585开发板,它功能强大,曾用于NFC模拟门禁卡等项目。本次任务相对简单,主要利用其BLE-HID功能。我们基于官方提供的HID_Mouse参考例程(路径:CH585EVT\EVT\EXAM\BLE\HID_Mouse)进行修改,即可实现目标。
实现原理:模拟手指滑动
要实现短视频的上下翻页,本质是模拟出手指在屏幕上“按下-滑动-松开”的完整触控手势。这里我们通过蓝牙HID鼠标协议来间接实现。
手机操作系统会将连接的HID鼠标报告解析为相应的指针移动和点击事件。我们的策略是:
- 按下:发送鼠标左键按下的报告,相当于手指触碰屏幕。
- 滑动:在保持按下状态的同时,连续发送带有Y轴位移(正值或负值)的报告,模拟手指持续滑动。
- 松开:发送鼠标左键释放的报告,完成手势。
代码实现步骤
原HID_Mouse例程连接后,会控制鼠标指针每隔0.5秒向右下角移动。我们需要修改为通过按键触发一次完整的上滑动作。
1. 增加按键检测功能
首先初始化按键并设置扫描事件。可以参考按键检测实现文章中的方法。
void Key_Init(){
GPIOB_ModeCfg( GPIO_Pin_22, GPIO_ModeIN_PU );
tmos_set_event( hidEmuTaskId, START_KEYSCAN_EVT );
}
2. 实现按键触发的翻页逻辑
当检测到按键(如S3)被按下时,执行一个预设的鼠标动作序列。我们可以编写一个简单的状态机或顺序逻辑来控制以下步骤:
- 移动到屏幕预设位置(或利用当前指针位置)
- 执行“按下 → 上移 → 松开”的操作
关键API调用示例:
- 鼠标左键按下:
hidEmuSendMouseReport(0x01, 0x00, 0x00); (第一个参数0x01表示按下)
- 按下并向上移动:
hidEmuSendMouseReport(0x01, 0x00, -50); (第三个参数为Y轴位移,负值表示向上)
- 释放左键:
hidEmuSendMouseReport(0x00, 0x00, 0x00);
通过组合和循环发送这些报告,即可实现一次长距离的上滑翻页操作,然后让鼠标指针归位。
方案优化:从HID Mouse到HID Touch
上述方案存在一个视觉瑕疵:手机屏幕上会一直显示一个鼠标指针。
更优的方案是使用HID触控(HID Touch)协议。沁恒CH585EVT中也提供了HID_Touch示例。该协议直接模拟触摸屏的绝对坐标输入,没有光标,体验上更接近真实的触控操作,符合移动应用对直接触控交互的需求。
核心区别:
- HID Mouse:报告相对坐标位移,系统显示指针。
- HID Touch:报告绝对坐标位置,系统视为直接触摸事件。
目前,该HID Touch方案在安卓手机上已验证成功。在苹果iOS设备上的支持情况,取决于沁恒蓝牙协议栈的后续更新。
总结
本文介绍了基于沁恒CH585蓝牙SoC开发手机蓝牙遥控器的两种实现思路:利用成熟的HID鼠标协议快速实现基本功能,或采用更专业的HID触控协议获得原生触控体验。这为嵌入式开发爱好者提供了一个结合具体应用场景(如懒人刷视频)的实战项目,同时也涉及了操作系统中外设协议的基本工作原理。对于希望在移动应用交互硬件层面进行创新的开发者来说,这是一个很好的入门实践。
|