基于 NXP QN9080 的 USB+2.4G+ BLE 三模电竞鼠标方案

当今社会,玩游戏不再是所谓的“不务正业”,恰恰成为了一种谋生手段,就是当下被人们追捧的竞技职业,还形成了一个生态圈——电竞圈。无论是先前热播剧《亲爱的,热爱的》中提到的 CTF 网络安全大赛,还是备受年轻人喜爱的 LOL,Dota 游戏,电竞大神们的神操作都离不开这个必备装备——电竞鼠标。针对电竞市场,世平集团推出基于 NXP QN9080的三模电竞鼠标方案。三模电竞的意思是指鼠标支持三种传输模式:USB,2.4G,BLE。

为什么会有三模电竞鼠标的市场需求呢?主要有这几个原因。第一,现如今年轻人比较爱玩游戏,就需要又能办公,又能玩游戏的鼠标。第二,罗技已经推广一个无线电竞的概念,这就要求鼠标的 report rate 需要达到 1K。第三,Dongle 需要接端口,电脑的 USB 端口没那么多,所以又加入蓝牙接入功能。

世平集团三模电竞鼠标方案,具有高回报率鼠标移动功能。方案采用 NXP QN9080 主控平台设计,它是一款低功耗蓝牙芯片,相比其他竞争对手的同类产品,能够节能40%。方案支持 USB+BLE+2.4G 模式,BLE 兼容目前主流 Windows 系统,支持 Windows、MAC、IOS、Android。

世平电竞鼠标方案最大的优势就是 2.4G 传输协议是世平私有的,并且准备申请专利。2.4G 在采集到 Sensor 按键等外设的数据之后,会先将数据已经自定义压缩,将原本 9 个 Byte 的数据压缩成 3 个 Byte,在发送之前将压缩好的数据存进 Buffer 里面,再判断 Buffer 缓存的数量如果超过 3 组,就将 Buffer 缓存的 3 组压缩好的数据合并成一组数据,并且发送出去,在 Dongle 端检测到特殊标志位时在将压缩的数据进行解压。

此电竞鼠标方案的  Optical Navigation Sensor 采用的是 PixArt 推出的 PAW3335DB‐TZDU,这个 Sensor 在无线鼠标中相对于其他型号的 Optical Navigation Sensor 拥有更高的性价比,PAW3335 工作电流只需要 1.7mA,Power Down 模式下只需要3uA,配合QN9080 完成的鼠标方案能够实现无线模式整机功耗在 4mA 以下,能够保证鼠标更长的续航能力。另外这个 Sensor 拥有最高 16000 的cpi。

在硬件方面,PAW3335 需要注意的是为了实现更低的功耗,在硬件设计的时候为了防止 MCU 的电流倒灌,需要添加电平匹配,将 MCU 提供的 3.3V 转换为 Sensor 所需的 1.8-2.1V。相关原理图如下:
      
      

在软件方面,PAW3335 Datasheet 对每一个寄存器有详细描述,对相关的初始化也有相应的描述,下面是 PAW3335 软件初始化的相应代码:

 void Sensor_PowerUp(void)

{      

    uint8_t  VarA = 0;

        uint8_t  VarB = 0;

       

        delay(t50ms);                  // 50ms

       

        DRIVER_NCS_OFF;

        delay(t1us);

        DRIVER_NCS_ON;  

    Write_Sensor(0x3A, 0x5A);

       

    delay(t1ms);                                      //wait for at least 5ms

    delay(t1ms);

    delay(t1ms);

    delay(t1ms);

    delay(t1ms);

Write_Sensor(0x40,0x80);

    Write_Sensor(0x55,0x01);

    delay(t1ms);

    Write_Sensor(0x7F,0x0E);

    Write_Sensor(0x43,0x1D);

       

    VarA = (Read_Sensor(0x46));                  //check bit3 - bit0

       

    Write_Sensor(0x43,0x1E);

       

    VarB = (Read_Sensor(0x46));                  //check bit3 - bit0

       

    Write_Sensor(0x7F,0x14);

    Write_Sensor(0x6A,VarA);

    Write_Sensor(0x6C,VarB);

    Write_Sensor(0x7F,0x00);

    Write_Sensor(0x55,0x00);

    Write_Sensor(0x4E,0x23);

    Write_Sensor(0x77,0x18);

    Write_Sensor(0x7F,0x05);

    Write_Sensor(0x53,0x0C);

    Write_Sensor(0x5B,0xEA);

    Write_Sensor(0x61,0x13);

    Write_Sensor(0x62,0x0B);

    Write_Sensor(0x64,0xD8);

    Write_Sensor(0x6D,0x86);

    Write_Sensor(0x7D,0x84);

     Write_Sensor(0x7E,0x00);

     Write_Sensor(0x7F,0x06);

     Write_Sensor(0x60,0xB0);

     Write_Sensor(0x61,0x00);

     Write_Sensor(0x7E,0x40);

     Write_Sensor(0x7F,0x0A);

     Write_Sensor(0x4A,0x23);

     Write_Sensor(0x4C,0x28);

     Write_Sensor(0x49,0x00);

     Write_Sensor(0x4F,0x02);

     Write_Sensor(0x7F,0x07);

     Write_Sensor(0x42,0x16);

     Write_Sensor(0x7F,0x09);

     Write_Sensor(0x40,0x03);

     Write_Sensor(0x7F,0x0C);

     Write_Sensor(0x54,0x00);

     Write_Sensor(0x44,0x44);

     Write_Sensor(0x56,0x40);

     Write_Sensor(0x42,0x0C);

     Write_Sensor(0x43,0xA8);

     Write_Sensor(0x4E,0x8B);

     Write_Sensor(0x59,0x63);

     Write_Sensor(0x7F,0x0D);

     Write_Sensor(0x5E,0xC3);

     Write_Sensor(0x4F,0x02);

     Write_Sensor(0x7F,0x14);

     Write_Sensor(0x4A,0x67);

     Write_Sensor(0x6D,0x82);

     Write_Sensor(0x73,0x83);

     Write_Sensor(0x74,0x00);

     Write_Sensor(0x7A,0x16);

     Write_Sensor(0x63,0x14);

     Write_Sensor(0x62,0x14);

     Write_Sensor(0x7F,0x10);

     Write_Sensor(0x48,0x0F);

     Write_Sensor(0x49,0x88);

     Write_Sensor(0x4C,0x1D);

     Write_Sensor(0x4F,0x08);

     Write_Sensor(0x51,0x6F);

     Write_Sensor(0x52,0x90);

     Write_Sensor(0x54,0x64);

     Write_Sensor(0x55,0xF0);

     Write_Sensor(0x5C,0x40);

     Write_Sensor(0x61,0xEE);

     Write_Sensor(0x62,0xE5);

     Write_Sensor(0x7F,0x00);

     Write_Sensor(0x5B,0x40);

     Write_Sensor(0x61,0xAD);

     Write_Sensor(0x51,0xEA);

     Write_Sensor(0x19,0x9F);

     Write_Sensor(0x5B,0x20);

         for(uint8_t ctr = 0; ctr< 55; ctr++)

         {

         if (Read_Sensor(0x20) == 0x0F)

 {

            Read_Sensor(0x20);

            break;

           }

     

delay(t1ms);

        }

        delay(t1ms);

       

        Write_Sensor(0x19,0x10);

        Write_Sensor(0x61,0xD5);

        Write_Sensor(0x40,0x00);                      

        Write_Sensor(0x7F,0x00);

    Write_Sensor(0x77,0x24);

    Write_Sensor(0x7F,0x0D);

    Write_Sensor(0x4E,0x6B);

    Write_Sensor(0x7F,0x05);

    Write_Sensor(0x44,0xA8);

    Write_Sensor(0x4A,0x14);

    Write_Sensor(0x7F,0x00);

    Write_Sensor(0x4F,0x46);

    Write_Sensor(0x4D,0xD0);        

        Read_Sensor(0x02);                

        Read_Sensor(0x03);

        Read_Sensor(0x04);

        Read_Sensor(0x05);

        Read_Sensor(0x06);

}

 

鼠标方案使用的灯是 Brightek 的 ISC3535VGBC1MBA1,ISC3535VGBC1MBA1 是一颗自带 IC 的RGB 灯,工作电流为 5mA,静态电流为 0.3mA,相对于其他 RGB 灯,ISC3535VGBC1MBA1 只需要通过 IO 口模拟时序就能完成对三种颜色的控制,这个 RGB 是通过对 32 bit 数据进行赋值,R、G、B 各占用 8 bit。只需要一路普通 IO,不需要通过 I2C 去控制,不仅能节省 MCU 的IO 口,更简化了控制 RGB 的流程。

主要时序如下图:

  

只需要在相应的时间给予 IO 口高低电平就能控制每一个 RGB 的颜色,具体的使用如下:

     

     

PCB Layout:

  
    
   
   

►场景应用图

►产品实体图

►展示板照片

►方案方块图

►核心技术优势

1. 2.4G回报率达1K,2.4G 私有协议,回报率已经可以稳定在1K,并保持3米内 980 以上 2. 无需多颗芯片,只需1颗Soc 就可支持三种模式 3. 超低功耗,800mA电池可正常使用 20H 4. 支持三种模式进行FW升级:USB、2.4G、OTA 5. 按键宏–通过 Marco Key 宏定义实现特殊功能按键,实现一键完成按键组合动作 6. WPI 人力资源丰富,提供技术支持,协助客户项目开发 7. 免费提供所有的硬件设计资料

►方案规格

1. QN9080:32-bit Arm® Cortex®-M4F,512 kB embedded flash,128 kB RAM 2. 电竞滑鼠功能–高回报率鼠标移动、文件点击 3. 高性能 MCU (32 位 ARM Cortex-M4F) Bluetooth Low Energy SoC 4. 方案支持 USB、BLE、2.4G 鼠标连接方式 5. 在无线干扰下,自动跳频