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

本设计以STM32单片机为核心,实现了一款功能完整的无线鼠标系统。通过光学传感器检测鼠标移动,结合STM32处理运动数据,实现光标的精确移动;按键电路实现左键和右键点击功能;滚轮模块实现垂直滚动功能。同时,利用无线模块将鼠标数据传输至计算机,实现真正的无线操作。整个系统结构紧凑、操作灵敏,适用于便携式无线鼠标开发和嵌入式外设设计。


2 系统功能介绍

  1. 光标移动功能:通过光学传感器检测鼠标在平面上的移动距离,并将运动数据转换为计算机可识别的光标移动信号,实现精确的指针控制。
  2. 按键功能:包括左键和右键,用户点击时触发对应的鼠标点击事件。系统通过按键消抖电路提高响应可靠性。
  3. 滚轮功能:通过滚轮模块采集滚动信号,实现垂直滚动操作,方便浏览文档和网页。
  4. 无线数据传输:鼠标采集的运动、按键和滚轮数据通过无线模块(如2.4GHz RF模块或BLE模块)传输到计算机端,实现无线操作。
  5. 低功耗设计:采用STM32的低功耗模式和按键唤醒机制,提高鼠标续航能力。

3 系统电路设计

系统电路设计主要包括STM32主控模块、光学传感器模块、按键模块、滚轮模块、电源模块以及无线传输模块。

3.1 STM32主控模块

STM32单片机作为核心控制单元,负责采集光学传感器数据、按键信号和滚轮信息,同时处理数据并通过无线模块发送至接收端。STM32具备高速ADC、丰富的GPIO和SPI/I2C接口,能够同时处理多个外设的数据,保证鼠标操作响应迅速。

3.2 光学传感器模块

光学传感器模块用于检测鼠标在平面上的移动。常用模块包括ADNS系列或自带光学传感器的模组。模块通过捕获鼠标底部光点的移动,实现X轴和Y轴方向的位移计算。STM32通过SPI或GPIO接口读取传感器数据,将位移转换为鼠标光标的移动指令。

3.3 按键模块

按键模块主要包括左键和右键,用户点击时通过STM32 GPIO口采集信号。为了避免按键抖动造成多次触发,电路中增加硬件去抖或软件去抖处理。按键模块设计要求触发灵敏、反馈可靠,以保证用户操作体验。

3.4 滚轮模块

滚轮模块通常采用机械编码器或光电编码器实现,检测滚轮旋转的方向和速度。STM32通过采集编码器输出信号,实现垂直滚动的数据计算,并发送至计算机,实现文档或网页滚动功能。

3.5 无线模块

无线模块用于将鼠标采集的运动数据、按键状态和滚轮信息传输至计算机端。可采用2.4GHz RF模块或BLE(蓝牙低功耗)模块。模块与STM32通过SPI或UART接口通信,STM32将鼠标事件数据打包并发送,无线模块负责信号发送及接收端数据解析。

3.6 电源模块

系统采用锂电池或干电池供电,并通过稳压电路为STM32及各模块提供稳定工作电压。电源模块设计需兼顾低功耗、续航长、供电稳定性和安全性,避免功率波动影响鼠标精度。


4 程序设计

程序设计分为主程序、光学传感器处理模块、按键扫描模块、滚轮数据处理模块以及无线传输模块,保证鼠标功能完整且响应迅速。

4.1 主程序设计

主程序负责系统初始化、循环调用各功能模块、处理数据并发送无线信号。

#include "stm32f10x.h"
#include "optical_sensor.h"
#include "key.h"
#include "wheel.h"
#include "wireless.h"

int main() {
    SystemInit();
    OpticalSensor_Init();
    Key_Init();
    Wheel_Init();
    Wireless_Init();

    while(1) {
        int dx, dy;
        OpticalSensor_GetMovement(&dx, &dy);
        Wireless_SendMovement(dx, dy);

        if(Key_Scan(KEY_LEFT)) {
            Wireless_SendClick(MOUSE_LEFT);
        }
        if(Key_Scan(KEY_RIGHT)) {
            Wireless_SendClick(MOUSE_RIGHT);
        }

        int wheel = Wheel_GetDelta();
        if(wheel != 0) {
            Wireless_SendWheel(wheel);
        }
    }
}

4.2 光学传感器处理模块

采集光学传感器X轴和Y轴数据,并转换为鼠标移动量。

void OpticalSensor_GetMovement(int *dx, int *dy) {
    uint8_t x_high, x_low, y_high, y_low;
    SPI_Read(OPTICAL_SENSOR_X_HIGH, &x_high);
    SPI_Read(OPTICAL_SENSOR_X_LOW, &x_low);
    SPI_Read(OPTICAL_SENSOR_Y_HIGH, &y_high);
    SPI_Read(OPTICAL_SENSOR_Y_LOW, &y_low);

    *dx = (x_high << 8) | x_low;
    *dy = (y_high << 8) | y_low;
}

4.3 按键扫描模块

实现左右键按下检测,并包含去抖动处理。

int Key_Scan(int key) {
    if(GPIO_ReadInputDataBit(KEY_GPIO_PORT, key) == RESET) {
        Delay_ms(10);
        if(GPIO_ReadInputDataBit(KEY_GPIO_PORT, key) == RESET) return 1;
    }
    return 0;
}

4.4 滚轮数据处理模块

获取滚轮旋转方向及增量,返回滚动值。

int Wheel_GetDelta() {
    static int last_state = 0;
    int state = GPIO_ReadInputData(WHEEL_GPIO_PORT) & 0x03;
    int delta = 0;

    if(state != last_state) {
        if((last_state == 0 && state == 1) || (last_state == 1 && state == 3) ||
           (last_state == 3 && state == 2) || (last_state == 2 && state == 0))
            delta = 1;
        else
            delta = -1;
        last_state = state;
    }
    return delta;
}

4.5 无线传输模块

将鼠标事件数据打包并通过无线模块发送。

void Wireless_SendMovement(int dx, int dy) {
    uint8_t buf[4];
    buf[0] = dx & 0xFF;
    buf[1] = (dx >> 8) & 0xFF;
    buf[2] = dy & 0xFF;
    buf[3] = (dy >> 8) & 0xFF;
    Wireless_Transmit(buf, 4);
}

void Wireless_SendClick(uint8_t button) {
    uint8_t buf[1];
    buf[0] = button;
    Wireless_Transmit(buf, 1);
}

void Wireless_SendWheel(int delta) {
    uint8_t buf[1];
    buf[0] = delta;
    Wireless_Transmit(buf, 1);
}

5 总结

本设计以STM32单片机为核心,结合光学传感器、按键、滚轮及无线传输模块,实现了一款功能完整的无线鼠标。系统不仅具备精确光标移动、左右键点击、滚轮滚动功能,还可通过无线模块实现数据远程传输。程序设计模块化、结构清晰,STM32高性能处理能力保证了鼠标操作的实时响应。通过低功耗电源设计和灵敏的按键检测,系统能够在保证使用体验的同时延长续航时间。整体设计具有稳定性高、可扩展性强、操作简便等特点,为嵌入式无线外设开发提供了完整的参考方案。

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐