用M61系列模块做一个手机蓝牙自拍杆
开始其实想做蓝牙键盘的,后来顺便把自拍杆功能也实现了。
虽然市面上有很多这样的产品,但是作为 DIY 爱好者的快乐不就是折腾吗。折腾使我快乐。
比如,刚到手的 AiPi-KVM 被我用 12V 点亮的故事
后来买了一堆零件,还想着用烙铁焊上结果焊盘都干掉了。
HID简介
The Human Interface Device (HID) ,即人机交互设备。定义了蓝牙在人机接口设备中的协议、特征和使用规程。典型的应用包括蓝牙鼠标、蓝牙键盘、蓝牙游戏手柄等。该协议改编自 USB HID Protocol。
手机蓝牙的 HID 是指人机接口设备。
HID 是蓝牙技术中的一种协议,用于描述设备与人之间的交互接口。下面是详细的解释:
HID 基本含义:HID 是英文“Human Interface Devices”的缩写,中文可以翻译为“人机接口设备”。在蓝牙技术中,HID 被广泛应用在各种设备之间,尤其是手机与外设之间。比如,我们常常用手机的蓝牙连接鼠标、键盘等外部设备,这时就会用到 HID 协议。
工作原理:当手机通过蓝牙与另一个设备建立连接时,如果另一设备支持 HID 协议,那么手机就可以识别并与之通信。这种通信允许用户通过这些外设设备进行更直观、便捷的操作。比如,使用蓝牙连接的键盘输入文字,或者使用鼠标移动屏幕上的光标。
手机中的应用场景:在日常生活中,手机蓝牙的 HID 功能经常被用于连接各种外部设备,如耳机、音箱、游戏手柄等。这使得手机的功能得到了扩展,提高了用户的使用体验。通过 HID 协议,这些设备可以与手机快速建立连接,并进行数据传输和控制。
总的来说,手机蓝牙的 HID 是指人机接口设备协议,它使得手机能够识别并与各种外部设备进行通信,提高了用户的使用体验和便捷性。
HID 自拍原理
其实想要实现蓝牙自拍功能其实比较简单,目前市面上的手机大多都可以通过按“音量-”按键进行拍照。知道了这个实现起来就比较简单了。只要我们能够模拟点击“音量-”按键就可以实现遥控拍照功能。
既然知道了拍照原理下一步我们就要开始想办法通过 HID 实现这个功能。
前置条件
自拍杆 HID 报告描述【使用的话把# 替换换成 //】
# Report ID 1: Advanced buttons 0x05, 0x0C, # Usage Page (Consumer) 0x09, 0x01, # Usage (Consumer Control) 0xA1, 0x01, # Collection (Application) 0x85, 0x01, # Report Id (1) 0x15, 0x00, # Logical minimum (0) 0x25, 0x01, # Logical maximum (1) 0x75, 0x01, # Report Size (1) 0x95, 0x01, # Report Count (1) 0x09, 0xCD, # Usage (Play/Pause) 0x81, 0x06, # Input (Data,Value,Relative,Bit Field) 0x0A, 0x83, 0x01, # Usage (AL Consumer Control Configuration) 0x81, 0x06, # Input (Data,Value,Relative,Bit Field) 0x09, 0xB5, # Usage (Scan Next Track) 0x81, 0x06, # Input (Data,Value,Relative,Bit Field) 0x09, 0xB6, # Usage (Scan Previous Track) 0x81, 0x06, # Input (Data,Value,Relative,Bit Field) 0x09, 0xEA, # Usage (Volume Down) 0x81, 0x06, # Input (Data,Value,Relative,Bit Field) 0x09, 0xE9, # Usage (Volume Up) 0x81, 0x06, # Input (Data,Value,Relative,Bit Field) 0x0A, 0x25, 0x02, # Usage (AC Forward) 0x81, 0x06, # Input (Data,Value,Relative,Bit Field) 0x0A, 0x24, 0x02, # Usage (AC Back) 0x81, 0x06, # Input (Data,Value,Relative,Bit Field) 0xC0 # End Collection 作者:我是鹏老师
有了它我们就可以模拟手机按键了。
具体实现
这里蓝牙部分主要参考官方的教程里面的蓝牙功能。
【完全开源】智能桌面助手——AiPi-DSL_Dashboard
资料获取
AiPi-DSL_Dashboard 资料包(Github)
项目目录结构
-BLE_HID 负责蓝牙
-main 程序主入口
-wifi MQTT 接入准备
程序
main
int main(void){ …… // 保留蓝牙相关任务 xTaskCreate(ble_hid_task, (char*)"ble_hid_task", 1024, NULL, 10, NULL); vTaskStartScheduler(); ……}
ble_hid_dev.c 蓝牙任务管理
/** * @brief HID 任务 * * @param arg*/void ble_hid_task(void* arg){ // 主要是通知【lvgl】UI更新蓝牙状态的由于没有屏幕暂时注释以下两行代码 // ble_queue = xQueueCreate(1, 512); // xTaskCreate(queue_receive_ble_task, "queue_ble_task", 1024, arg, 7, NULL); vTaskDelay(200/portTICK_RATE_MS); hid_key_num_t kb_num; btblecontroller_em_config(); ble_init(); bas_init(); dis_init(0x01, 0x07AF, 0x707, 0x2A50); hog_kb_init(); ble_kb_start(); ble_hid_queue = xQueueCreate(1, 4); while (1) { xQueueReceive(ble_hid_queue, &kb_num, portMAX_DELAY); ble_hid_dev_send(kb_num); }}
ble_hid_dev.h 文件中添加
typedef enum { HID_KEY_NUMBLE_NONE = 0, HID_KEY_NUMBLE_SELFIE_STICK,// 自拍杆 ……}
kb.h 文件中添加
typedef enum { KEY_NUMBLE_SELFIE_STICK = 0X10, // 拍照 ……} int send_selfie_stick_value(struct bt_conn* conn, uint8_t* keyboard_cmd); // 拍照指令
修改 kb.c
增加
static uint8_t report_selfie_stick_map[] =
{
// Report ID 1: Advanced buttons
0x05, 0x0C, // Usage Page (Consumer)
0x09, 0x01, // Usage (Consumer Control)
0xA1, 0x01, // Collection (Application)
0x85, 0x01, // Report Id (1)
0x15, 0x00, // Logical minimum (0)
0x25, 0x01, // Logical maximum (1)
0x75, 0x01, // Report Size (1)
0x95, 0x01, // Report Count (1)
0x09, 0xCD, // Usage (Play/Pause)
0x81, 0x06, // Input (Data,Value,Relative,Bit Field)
0x0A, 0x83, 0x01, // Usage (AL Consumer Control Configuration)
0x81, 0x06, // Input (Data,Value,Relative,Bit Field)
0x09, 0xB5, // Usage (Scan Next Track)
0x81, 0x06, // Input (Data,Value,Relative,Bit Field)
0x09, 0xB6, // Usage (Scan Previous Track)
0x81, 0x06, // Input (Data,Value,Relative,Bit Field)
0x09, 0xEA, // Usage (Volume Down)
0x81, 0x06, // Input (Data,Value,Relative,Bit Field)
0x09, 0xE9, // Usage (Volume Up)
0x81, 0x06, // Input (Data,Value,Relative,Bit Field)
0x0A, 0x25, 0x02, // Usage (AC Forward)
0x81, 0x06, // Input (Data,Value,Relative,Bit Field)
0x0A, 0x24, 0x02, // Usage (AC Back)
0x81, 0x06, // Input (Data,Value,Relative,Bit Field)
0xC0 // End Collection
//通用按键
// 0x05, 0x0C, // Usage Page (Consumer)
// 0x09, 0x01, // Usage (Consumer Control)
// 0xA1, 0x01, // Collection (Application)
// 0x85, 0x03, // Report ID (3)
// 0x15, 0x00, // Logical Minimum (0)
// 0x25, 0x01, // Logical Maximum (1)
// 0x75, 0x01, // Report Size (1)
// 0x95, 0x0B, // Report Count (11)
// 0x0A, 0x23, 0x02, // Usage (AC Home)
// 0x0A, 0x21, 0x02, // Usage (AC Search)
// 0x0A, 0xB1, 0x01, // Usage (AL Screen Saver)
// 0x09, 0xB8, // Usage (Eject)
// 0x09, 0xB6, // Usage (Scan Previous Track)
// 0x09, 0xCD, // Usage (Play/Pause)
// 0x09, 0xB5, // Usage (Scan Next Track)
// 0x09, 0xE2, // Usage (Mute)
// 0x09, 0xEA, // Usage (Volume Decrement)
// 0x09, 0xE9, // Usage (Volume Increment)
// 0x09, 0x30, // Usage (Power)
// 0x0A, 0xAE, 0x01, // Usage (AL Keyboard Layout)
// 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
// 0x95, 0x01, // Report Count (1)
// 0x75, 0x0D, // Report Size (13)
// 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
// 0xC0, // End Collection
};
经过测试以上两套报告描述都可以拍照,内容稍有不同。
修改
static ssize_t read_report_map(struct bt_conn* conn, const struct bt_gatt_attr* attr, void* buf, uint16_t len, uint16_t offset){ printf("read_report_map:%d \r\n", len); // report_selfie_stick_map 这个是自拍杆报告描述 return bt_gatt_attr_read(conn, attr, buf, len, offset, report_selfie_stick_map, sizeof(report_selfie_stick_map));}
增加
int send_selfie_stick_value(struct bt_conn* conn, uint8_t* keyboard_cmd){ struct bt_gatt_attr* attr; attr = &attrs[BT_CHAR_BLE_HID_REPORT_ATTR_VAL_INDEX]; return bt_gatt_notify(conn, attr, keyboard_cmd, 1);}
ble_hid_dev_send 方法中添加
switch (key_num) { case HID_KEY_NUMBLE_SELFIE_STICK: { key_vaule[0] = KEY_NUMBLE_SELFIE_STICK; // 0x10 // 按下音量键- send_selfie_stick_value(ble_conn_handle, key_vaule); vTaskDelay(100/portTICK_RATE_MS); key_vaule[0] = 0x00; // 释放音量键- send_selfie_stick_value(ble_conn_handle, key_vaule); LOG_I("HID SEND: 0x10"); } break; ……}
拍照发送的指令为什么是 0x10 呢,看下面消息体信息就会理解。
0x10 表示音量-
现在消息发送搞定了,那要怎么将消息发出去,如何触发呢?
按钮
目前最简单的就是增加按钮了那么如何增加按钮呢?
可以参考,以下两张图
图摘自:32 单片机基础:GPIO 输入
两种方式,我们一般用下接的方式。
第一个图:注意点。当按键按下,PA0 接地,被置为低电平, 但是一旦按键松手,PA0 悬空,引脚电压不确定。所以无论怎么读引脚也不知道知否被按下,所以为了解决这个问题,所以必须要求 PA0 是上拉输入的模式,这样引脚悬空的话,就会被置为高电平,这样我们我们就可以读取 PA0 的电压就知道按键是否被按下。
但是第二个图就不会出现问题,按下时,被置为低电平,松手,由于上拉电阻的作用,被置为高电平。这样引脚就不会出现浮空状态。所以此时 PA0 可以配置浮空输入和上拉输入。上拉输入,两个电阻共同作用,这样高电平就会更加稳定一些,
第三个图同样注意要使用下拉输入模式。
这里没有上下拉,直接使用的 Ai-M61-32SU 模块内部的上拉
struct bflb_device_s* btn_gpio; // 初始化gpio
int btn_clicked = 0;
// 按钮检测任务
static void btn_event(void* args){
while (1)
{
int status = bflb_gpio_read(btn_gpio, GPIO_PIN_14);
// 检测gpio14是否为低电平,默认上拉高电平
if(status == 0){
// 消除抖动
vTaskDelay(15/portTICK_RATE_MS);
再判断一次
if(status == 0){
// 防止多次触发
if(btn_clicked){
continue;;
}
LOG_I("点击");
btn_clicked = 1;
hid_key_num_t hid_key_num = HID_KEY_NUMBLE_SELFIE_STICK;
// 发送音量-按键进行拍照
xQueueSend(ble_hid_queue, &hid_key_num, portMAX_DELAY);
}
}else{
btn_clicked = 0;
}
}
}
int main(void)
{
board_init();
// gpio初始化
btn_gpio = bflb_device_get_by_name("gpio");
// 默认上拉
bflb_gpio_init(btn_gpio, GPIO_PIN_14, GPIO_INPUT| GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
……
// 创建按钮检测任务
xTaskCreate(btn_event, "btn_event", 1024, NULL, 1, NULL);
……
vTaskStartScheduler();
}
以上就完成了自拍杆的全部功能了。
这个就是发现的自拍杆设备蓝牙名称与外观。
其他
这里有个有意思的地方就是可以改变蓝牙的外观图标。HID 服务的 UUID 是 0x1812,鼠键的外观是 0x03C0,键盘的外观是 0x03C1,鼠标的外观是 0x03C2,游戏手柄的外观是 0x03C3。
想要改变蓝牙设备外观
修改 kb.h 第 10 行
#define BLE_APPEARANCE_HID_KEYBOARD 0x03C3
编译并烧录完成后,搜索蓝牙就可以看到效果了。
源码在文章评论区自取。目前只实现了功能,外观上还没设计比较丑陋暂时就不上图了。
- |
- +1 赞 0
- 收藏
- 评论 0
本文由samsara转载自安信可科技公众号,原文标题为:用M61系列模块做一个手机蓝牙自拍杆?,本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。
相关研发服务和供应服务
相关推荐
Ra-09系列开发板入门教程,标准LoRaWAN协议对接国外 TTN LoRaWAN 开源服务器
本文章将说明如何在TTN中创建应用与节点设备,配置安信可Ra-09模块连接至TTN服务,实现数据发送与接收。
设计经验 发布时间 : 2024-11-19
【经验】如何将安信可科技的PB-03F模块升级DTM固件进行认证测试?
使用安信可科技的蓝牙模组PB-03F进行产品设计后期,部分产品需要连同PB-03F模块一同送去认证机构进行认证测试,此时需要给蓝牙模组PB-03F烧录特殊的测试固件DTM。本文指导如何给PB-03F模块烧写DTM固件。
设计经验 发布时间 : 2023-06-22
BU04 UWB室内定位测距模块,配套测试说明
在现代物联网和智能设备的世界中,定位精度和数据传输速度是至关重要的指标。而Ai-Thinker BU04 UWB室内定位测距模块正是一款满足这些高要求的尖端产品。本文将带您详细了解BU04的独特之处及其在测试方法。
设计经验 发布时间 : 2024-08-22
【产品】工作频率高达160MHz的Wi-Fi模块ESP32-C3,支持低功耗蓝牙,适合物联网等多种应用
ESP32-C3系列模组是由深圳市安信可科技有限公司开发的Wi-Fi模块。该芯片ESP32-C3搭载RISC-V 32位单核处理器,工作频率高达160MHz,支持二次开发,无需使用其它微控制器或处理器。
产品 发布时间 : 2023-07-01
【产品】安信可科技WIFI蓝牙二合一模块Ai-WB2系列通过各项性能测试,实测400-500米传输距离
天线作为无线信号辐射和接收的重要器件,有着不可替代的作用。一款天线设计完成后需要经过测试才能确定其性能是否符合设计要求。那么天线性能需要进行哪些性能测试呢?本文以安信可的Ai-WB2-12F模块为例,看看如何测试PCB天线的性能。
产品 发布时间 : 2023-09-20
安信可Wi-Fi模块Ai-WB2-32S助力改造智能插座,10块钱低成本可体验智能生活
智能插座的原理其实很简单,就是一个开关,将插座的信息通过Wi-Fi模块联网对接云平台就能实现远程控制。选用安信可的Wi-Fi模块Ai-WB2-32S,仅仅用10块钱做一个智能插座,低成本来体验下智能生活。
应用方案 发布时间 : 2024-06-30
安信可Rd-03D雷达人体存在感应模块,助力空调智能化控制应用
空调作为房屋不可缺少的家电之一,用传感器采集数据进而空调执行相应的控制指令,是其智能化发展必不可少的手段。此前红外存在感应应用于空调时,只能简单的感应有人无人来联动控制空调,而毫米波雷达传感器在目标距离、速度和角度探测的特点更具优势。安信可科技Rd-03D雷达人体存在感应模块可应用在空调上。
应用方案 发布时间 : 2024-11-08
【产品】集成高性能32bit微处理器的海思Hi系列2.4GWiFi模块,提供最大72.2Mbit/s物理层速率
Hi系列模组(下称模块)是由深圳市安信可科技有限公司开发的Wi-Fi模块。可广泛应用于智能家居、智能安防、智慧城市等物联网相关智能终端产品。模块搭载Hi3861V100/Hi3861LV100核心处理器芯片。
产品 发布时间 : 2023-02-18
【IC】VC系列离线语音模块,简单易上手,综合识别率高达98%,打造属于你的语音智能产品
VC系列模组是安信可开发的一款AI离线语音识别的产品,主芯片是云知声推出的离线语音识别芯片锋鸟M(US516P6),具有高可靠性,通用性强的特点。在语音识别技术上实现了高可靠的唤醒识别率、更远距离的唤醒、更低误唤醒率、更强的抗噪音能力、更快的响应识别时间,免联网的纯离线识别。
产品 发布时间 : 2024-11-08
安信可TB系列蓝牙模块无需网关,支持天猫精灵直接控制,拥有蓝牙mesh组网功能
安信可科技针对物联网设计通用型的蓝牙模组,其功能强大、用途广泛。可以用于智能灯、智能插座、智能空调等其他智能家电。同时符合BLE 5.0及SIG Mesh规范,可直接通过智能手机组建Mesh网络,也可对接天猫精灵等智能音箱,适用于多种智能家居应用场景。安信可蓝牙模块主要分为PB系列、TB系列、TG系列,今天给大家带来高稳定性的TB系列。
产品 发布时间 : 2024-07-05
BU03 UWB室内定位模块,测距说明教程
概要本篇文章主要内容主要讲述BU03模组开发板的区别,测试方法,以及一些资源链接的分享,可以快速的帮助用户搭建测试环境,评估和测试模块功能和性能。
设计经验 发布时间 : 2024-10-12
Module Information IoT solutions
型号- RA-01SH,ESP32-S2 SERIES,N92-S,BU01,BS01,XW-01,RA-01,ESP32-G,BK2425,ESP8285 SERIES,ESP-15F,NODEMCU-32,BW18,ESP32-SL,BW16,NRF24L01,ESP8266 SERIES,BW15,NF-04-MI,BW14,BW12,ESP-01S,RTL8710BX,ESP8266,ESP-01M,RA-01S,N92-SG,RA-01H,RA07,ESP32,SX1276,PB-01,PB-02,N92-D,RG-01,TG-12F,RA07H,TG-01M,TB-03F,ESP-12S,NF-02-PA,NF-04,NF-03,NF-01-S,NODEMCU-32-S2,ESP-01F,ESP32 SERIES,RA-06H,NF-01-N,NF-02-PE,NODEMCU-BU01,ESP32-CAM,NB-IOT,ESP8285,ESP32-S,TLSR825X,XW01,CA-01,ESP-07S,XR808CT0,ESP-12H,RA-02,ESP-12K,ESP32-A1S,RA-06,SJ24R1,RA-07,ESP-12F,RA-07H,NODEMCU-8266,TB-04,TB-01,TB-02
ESP-01/07/12 Series Modules User's Manual
型号- ESP8266 SERIES,ESP-07,ESP-12 SERIES,ESP-07 SERIES,ESP-01S,ESP-12S,ESP-01 SERIES,ESP8266,ESP-01M,ESP-07S,ESP-12E,ESP-12F,ESP-01,ESP-12
BU03 UWB室内定位测距模块,配套测试说明
安信可推出了BU03定位模组,采用DW3000芯片,体积小巧,可集成至主板。BU03_Kit开发板使用STM32F103主控芯片,支持SPI连接和STM32 ST-LINK Utility烧录。测试时,需至少两个开发板,通过AT指令设置基站和标签,进行测距和定位测试。开发板提供USB和TTL接口,可配合上位机获取位置数据。
设计经验 发布时间 : 2024-10-31
电子商城
现货市场
服务
世强深圳实验室提供Robei EDA软件免费使用服务,与VCS、NC-Verilog、Modelsim等EDA工具无缝衔接,将IC设计高度抽象化,并精简到三个基本元素:模块、引脚、连接线,自动生成代码。点击预约,支持到场/视频直播使用,资深专家全程指导。
实验室地址: 深圳 提交需求>
根据用户的接口模块,使用是德示波器及夹具查看实时眼图演示,测试USB/MIPI/DDR/SATA/HDMI协议,支持最高到1.2GHz的实时眼图协议测试。支持到场/视频直播测试,资深专家全程指导。
实验室地址: 深圳 提交需求>
登录 | 立即注册
提交评论