基于STM32单片机的无线鼠标设计

发布于:2025-09-04 ⋅ 阅读:(23) ⋅ 点赞:(0)

基于STM32单片机的无线鼠标设计

1. 系统功能介绍

随着计算机技术的发展,鼠标作为最重要的人机交互设备之一,其功能和设计越来越受到关注。传统鼠标多以有线方式连接计算机,但有线鼠标受到线材长度限制和缠绕困扰,因此无线鼠标逐渐成为主流。本设计基于 STM32单片机,利用其强大的处理能力和丰富的外设资源,实现了一款无线鼠标的设计。

本系统功能完整,能够实现无线鼠标的常规功能,包括:

  1. 光标移动功能:通过光学传感器采集鼠标在平面上的移动信息,经过STM32处理后,将位移数据无线传输至计算机,实现光标的移动。
  2. 左、右键功能:通过独立按键模拟鼠标的左键和右键点击,完成日常操作中的选择、确认等动作。
  3. 滚轮功能:通过编码器或滚轮传感器检测滚轮滚动信息,实现页面上下滚动的操作。
  4. 无线传输:通过无线通信模块(如nRF24L01、蓝牙或2.4G模块)将数据传输至接收端,实现真正意义上的无线鼠标功能。
  5. 低功耗设计:由于无线鼠标依靠电池供电,本设计特别优化了电源管理,进入待机状态时自动降低功耗,延长使用时间。

本系统不仅满足了日常办公和娱乐中的基本需求,同时具备良好的扩展性,可在未来实现如多功能按键、触摸板扩展、人体工学优化等功能。


2. 系统电路设计

无线鼠标的硬件系统主要包括以下几个部分: STM32最小系统、光学传感器电路、按键电路、滚轮检测电路、无线通信电路、电源电路

2.1 STM32最小系统

  • 功能:作为整个无线鼠标的核心控制单元,STM32负责采集传感器信息、处理数据、生成通信协议并通过无线模块发送。
  • 配置:选用STM32F103系列单片机,具备高速运算能力和丰富的GPIO接口,适合实时采集和传输数据的应用。
  • 组成:晶振电路、复位电路、电源电路以及必要的调试接口(SWD)。

2.2 光学传感器电路

  • 工作原理:光学鼠标利用光学传感器检测鼠标在表面上的位移,通过图像采集和处理获得X、Y轴的移动信息。
  • 典型元件:ADNS系列光学传感器,输出SPI或I²C接口数据,便于与STM32连接。
  • 作用:实现光标在计算机屏幕上的移动,是无线鼠标的核心感知模块。

2.3 按键电路(左键与右键)

  • 设计方式:使用独立按键,通过下拉电阻接入STM32的GPIO口。
  • 逻辑实现:当按键按下时,检测到电平变化,STM32识别并将对应的点击事件通过无线模块发送给计算机。
  • 功能扩展:可支持双击、长按等不同操作模式。

2.4 滚轮检测电路

  • 实现方式:通过增量式编码器或霍尔传感器检测滚轮的旋转方向与步进。
  • 信号接口:编码器输出A、B相位信号,经STM32捕获后计算滚动方向与步数。
  • 功能:实现网页、文档等内容的上下滚动。

2.5 无线通信电路

  • 通信方式:本设计采用nRF24L01 2.4GHz无线通信模块,具有低功耗、低成本、传输稳定等优点。
  • 接口协议:通过SPI与STM32通信,发送打包后的鼠标数据。
  • 接收端:PC端配备USB转接模块,负责接收无线信号并模拟USB HID协议,将鼠标数据传递给操作系统。

2.6 电源电路

  • 设计要求:系统由干电池或锂电池供电,需具备稳压与低功耗设计。
  • 电源管理:采用LDO稳压芯片提供3.3V电压,光学传感器与无线模块均可稳定工作。
  • 低功耗优化:通过STM32进入睡眠模式以及无线模块休眠控制,有效降低功耗,延长续航时间。

3. 程序设计

系统软件部分以STM32单片机为核心,程序分为以下几个模块: 主程序、光学传感器采集模块、按键检测模块、滚轮检测模块、无线通信模块、USB接收模块

3.1 主程序框架

#include "stm32f10x.h"
#include "nrf24l01.h"
#include "sensor.h"
#include "keys.h"
#include "encoder.h"
#include "delay.h"

typedef struct {
    int16_t dx;
    int16_t dy;
    uint8_t button;
    int8_t wheel;
} MouseReport;

MouseReport report;

int main(void)
{
    SystemInit();
    NRF24L01_Init();
    Sensor_Init();
    Keys_Init();
    Encoder_Init();

    while(1)
    {
        // 获取光学传感器位移
        report.dx = Sensor_ReadX();
        report.dy = Sensor_ReadY();

        // 获取按键状态
        report.button = Keys_Scan();

        // 获取滚轮状态
        report.wheel = Encoder_Read();

        // 发送鼠标数据
        NRF24L01_Send((uint8_t*)&report, sizeof(report));

        delay_ms(10);
    }
}

3.2 光学传感器采集模块

int16_t Sensor_ReadX(void)
{
    // 读取光学传感器X轴位移
    return SPI_ReadSensor(ADDR_X);
}

int16_t Sensor_ReadY(void)
{
    // 读取光学传感器Y轴位移
    return SPI_ReadSensor(ADDR_Y);
}

说明:光学传感器通过SPI接口与STM32通信,返回X、Y位移值。


3.3 按键检测模块

uint8_t Keys_Scan(void)
{
    uint8_t key = 0;
    if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0) key |= 0x01; // 左键
    if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == 0) key |= 0x02; // 右键
    return key;
}

说明:通过GPIO口检测按键状态,左键与右键分别对应不同的二进制位。


3.4 滚轮检测模块

int8_t Encoder_Read(void)
{
    int8_t wheel = 0;
    if(ENC_A == 0 && ENC_B == 1) wheel = +1; // 向上滚动
    else if(ENC_A == 1 && ENC_B == 0) wheel = -1; // 向下滚动
    return wheel;
}

说明:通过检测编码器的相位变化,判断滚轮的方向与步进。


3.5 无线通信模块

void NRF24L01_Send(uint8_t *data, uint8_t length)
{
    NRF24L01_SetTXMode();
    NRF24L01_WriteTxPayload(data, length);
    while(!NRF24L01_Tx_Done()); // 等待发送完成
}

说明:通过nRF24L01模块将数据无线传输至接收端。


3.6 USB接收模块(PC端)

接收端可使用STM32作为USB HID设备,通过USB接口与电脑通信:

void USB_MouseSend(MouseReport *report)
{
    USB_HID_Send((uint8_t*)report, sizeof(MouseReport));
}

说明:接收端将无线接收到的鼠标数据通过USB HID协议上报给计算机,系统无需额外驱动即可识别为标准鼠标。


4. 总结

本设计实现了一款 基于STM32单片机的无线鼠标,其主要特点如下:

  1. 功能完整:支持光标移动、左右键和滚轮功能,满足日常使用需求。
  2. 无线传输:通过nRF24L01实现2.4GHz无线传输,稳定可靠。
  3. 低功耗设计:系统采用优化的电源管理方案,延长了电池使用时间。
  4. 模块化设计:软硬件均采用模块化设计,方便扩展与升级。
  5. 应用广泛:不仅可用于普通计算机,还可拓展至嵌入式系统的人机交互控制。

通过本系统的设计与实现,可以深入理解无线通信、传感器信号采集、USB HID协议等知识,为进一步开发更高性能的无线交互设备打下坚实的基础。


网站公告

今日签到

点亮在社区的每一天
去签到