Funpack第二季第六期-项目文档
一、功能介绍
设计一个蓝牙鼠标+键盘的复合设备程序,通过蓝牙连接PC,其中nRF7002-DK开发板的按键1作为鼠标实现左键点击功能,nRF7002-DK开发板的按键2作为键盘在文本编辑器中输入“eetree”字符,而当电脑开启大写锁定时,控制nRF7002-DK开发板的LED2指示灯亮起。
二、开发环境介绍
本开发环境基于nRF7002-DK开发板进行设计开发,通过控制外设实现各种功能。开发板采用nRF5340多协议SoC作为主处理器,配合nRF7002 Wi-Fi协同芯片。可以同时支持低功耗蓝牙和Wi-Fi 应用的开发。板上的nRF5340是支持低功耗蓝牙、蓝牙Mesh、NFC、Thread和Zigbee的双核蓝牙5.3 SoC,并且蓝牙测向可实现所有到达角(AoA)和出发角(AoD)的测量功能。其中,nRF7002-DK开发板的nRF5340负责控制板上的按键、LED指示灯。这些外设在整个系统中起到了至关重要的作用,通过它们的协调工作,实现了鼠标点击、键盘输入以及LED指示等功能。
nRF7002-DK开发板上的nRF5340控制芯片连接接了按键1和按键2,它们分别对应鼠标的左键点击和键盘的字符输入功能。按键1被设计为模拟鼠标的左键点击,用户通过按下按键1来完成鼠标的左键点击的动作,该动作通过nRF7002DK开发板的蓝牙接口传递到计算机,从而实现了鼠标的左键点击;按键2则具有键盘输入的功能,特定设置下,按下按键2可以在文本编辑器中输入“eetree”字符。这种设计方式使得用户可以通过简单的按键操作,快速输入预定的字符;LED指示灯也是nRF5340控制芯片负责控制的外设之一,当电脑开启大写锁定时,LED指示灯亮起,当电脑关闭大写锁定时,LED指示灯熄灭,系统框图如下所示:
三、代码介绍
程序运行流程如上图所示,程序上电后执行初始化函数,包含BT初始化、HID初始化、GPIO初始化等,程序初始化完成后,开始运行主程序,当程序检测到触发开发板按键事件时,程序执行控制板按键处理程序,当程序检测到触发蓝牙事件时,程序执行相关处理函数,关键程序代码如下所示。
3.1 gpio初始化
void configure_gpio(void)
{
int err;
err = dk_buttons_init(button_changed);
if (err) {
printk("Cannot init buttons (err: %d)\n", err);
}
err = dk_leds_init();
if (err) {
printk("Cannot init LEDs (err: %d)\n", err);
}
}
3.2 按键处理函数
void button_changed(uint32_t button_state, uint32_t has_changed)
{
struct mouse_pos pos;
uint32_t buttons = button_state & has_changed;
memset(&pos, 0, sizeof(struct mouse_pos));
if (IS_ENABLED(CONFIG_BT_HIDS_SECURITY_ENABLED)) {
if (k_msgq_num_used_get(&mitm_queue)) {
if (buttons & KEY_PAIRING_ACCEPT) {
num_comp_reply(true);
return;
}
if (buttons & KEY_PAIRING_REJECT) {
num_comp_reply(false);
return;
}
}
}
if (has_changed & KEY_LEFT_MASK) {
// pos.x_val -= MOVEMENT_SPEED;
printk("%s(): left(%d)\n", __func__, (button_state & KEY_LEFT_MASK) != 0);
// data_to_send = true;
button_left_changed(button_state & KEY_LEFT_MASK);
}
if (has_changed & KEY_RIGHT_MASK) {
// pos.x_val += MOVEMENT_SPEED;
printk("%s(): right(%d)\n", __func__, (button_state & KEY_RIGHT_MASK) != 0);
// data_to_send = true;
// button_right_changed(button_state & KEY_RIGHT_MASK);
button_text_changed((button_state & KEY_RIGHT_MASK) != 0);
}
}
3.3 鼠标点击功能实现
static void button_left_changed(bool down)
{
for (size_t i = 0; i < CONFIG_BT_HIDS_MAX_CLIENT_COUNT; i++) {
if (!conn_mode[i].conn) {
continue;
}
uint8_t buffer[INPUT_REP_BUTTONS_LEN];
if (down) {
buffer[0] = 1;
buffer[1] = 0;
buffer[2] = 0;
} else {
buffer[0] = 0;
buffer[1] = 0;
buffer[2] = 0;
}
bt_hids_inp_rep_send(&hids_obj, conn_mode[i].conn,
INPUT_REP_BUTTONS_INDEX,
buffer, sizeof(buffer), NULL);
}
}
3.4 字符输入功能实现
static int hid_buttons_press(const uint8_t *keys, size_t cnt)
{
while (cnt--) {
int err;
err = hid_kbd_state_key_set(*keys++);
if (err) {
printk("Cannot set selected key.\n");
return err;
}
}
return key_report_send();
}
static int hid_buttons_release(const uint8_t *keys, size_t cnt)
{
while (cnt--) {
int err;
err = hid_kbd_state_key_clear(*keys++);
if (err) {
printk("Cannot clear selected key.\n");
return err;
}
}
return key_report_send();
}
static void button_text_changed(bool down)
{
static const uint8_t *chr = hello_world_str;
if (down) {
hid_buttons_press(chr, 1);
} else {
hid_buttons_release(chr, 1);
if (++chr == (hello_world_str + sizeof(hello_world_str))) {
chr = hello_world_str;
}
}
}
3.5 大写锁定功能实现
static void caps_lock_handler(const struct bt_hids_rep *rep)
{
uint8_t report_val = ((*rep->data) & OUTPUT_REPORT_BIT_MASK_CAPS_LOCK) ?
1 : 0;
dk_set_led(LED_CAPS_LOCK, report_val);
}
四、功能演示
4.1 添加蓝牙设备
首先我们打开windows的设置面板,点击设备项,此时我们可以看到设备的设置页面(如图4-1步骤1),选择该页面最左侧的蓝牙和其他设备项(如图4-1步骤2),点击添加蓝牙或其他设备(如图4-1步骤3),在弹出的设备搜索页面上,我们找到Nordic-Mouse&KeyBoard并连接(如图4-1步骤4),同时按下nRF7002 DK开发板上的Button1按钮(如图4-1步骤5),配对成功,此时nRF7002 DK开发板上的LED1指示灯常亮,便是蓝牙连接成功,同时在蓝牙和其他设备的页面上我们也可以看到刚刚连接上的Nordic-Mouse&KeyBoard设备,如图4-2所示。
图4-1 蓝牙配对指示图
图4-2 蓝牙设备图
4.2 鼠标点击功能说明
将鼠标光标移动到main.c的第386行,此时不点击鼠标左键,此时文本编辑器的指示光标停留在mian.c的第382行(如图4-3步骤1),此时点击nRF7002 DK开发板上的Button1按钮(如图4-3步骤2),我们可以看到文本编辑器的指示光标停留在了鼠标光标停留在的mian.c的第386行(如图4-3步骤3)。
图4-3 鼠标点击功能示意图
4.3 字符输入功能说明
我们在鼠标点击功能的基础上,按下nRF7002 DK开发板上的Button2按钮(如图4-4步骤1),此时开发板会将发送字符e
至电脑,文本编辑器在检测到输入的字符后会在当前光标指示位置显示当前输入的字符(如图4-4步骤2),多次按下nRF7002 DK开发板上的Button2按钮,直到eetree
字符全部显示在文本编辑器内(如图4-4步骤12)。
图4-4 字符输入功能示意图
电脑开启大写锁定时,板卡的LED亮起
4.4 大写锁定功能说明
电脑在未使能大写锁定,电脑键盘上的大写指示灯熄灭,nRF7002 DK开发板上的LED2指示灯熄灭(如图4-5步骤1),此时按下电脑键盘上的大写指示按键,电脑键盘上的大写指示灯点亮,nRF7002 DK开发板上的LED2指示灯点亮(如图4-5步骤2)。
图4-5 大写锁定功能示意图
五、心得体会
最近我有幸使用了Nordic Semiconductor的nRF7002 DK开发板进行项目开发,并在此分享一些我的心得体会。
首先,nRF7002 DK开发板是一款功能强大且易于使用的开发工具。它采用nRF5340多协议SoC作为主处理器,配合nRF7002 Wi-Fi协同芯片。可以同时支持低功耗蓝牙和Wi-Fi 应用的开发,并实现如 OFDMA、波束成形和目标唤醒时间等多项 Wi-Fi 6 功能。该开发板提供了一套完整的开发环境,包括软件开发工具链、示例代码和文档,使得开发者能够快速上手并进行项目开发。
尽管nRF7002 DK开发板具有许多优点,但也有一些改进的空间,比如说官方文档和示例代码虽然很详细,但在某些特定的应用场景或功能方面可能仍然缺乏一些深入的说明。因此,提供更全面的文档和教程,涵盖更多的细节和实践经验,将有助于开发者更好地理解和应用nRF7002 DK开发板。
总的来说,nRF7002 DK开发板是一款功能丰富且易于使用的开发工具,通过充分利用其强大的性能和丰富的资源,结合官方文档和示例代码的支持,开发者可以快速上手并进行项目开发。随着不断的改进和社区支持,nRF7002 DK开发板将成为无线物联网开发的重要工具之一。
十分期待硬禾学堂下期的活动!