基於 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. 在無線干擾下,自動跳頻