笔记目录

  • 一.cubemx配置
  • 1. 时钟配置
  • 2.ADC配置
  • 3.USB配置
  • 4.生成代码
  • 二.程序
  • 三.测试
  • 代码和软件下载
  • 学习时间


最近在研究minifly,昨天突发奇想想用正点原子minifly的遥控器当一个游戏手柄打游戏放松一下然后就有了这篇博客。

android仿王者荣耀遥控杆 用遥控器玩王者荣耀_软件下载

一.cubemx配置

参考资料:https://www.bilibili.com/read/cv9584555

首先需要看一下minifly遥控手柄的原理图

android仿王者荣耀遥控杆 用遥控器玩王者荣耀_Desktop_02


android仿王者荣耀遥控杆 用遥控器玩王者荣耀_Desktop_03


主要用到的就是两个遥感,从原理图可以看出每一个遥感需要两个adc采集,x方向和y方向。

原理就是stm32通过hid协议与主机通信

1. 时钟配置

android仿王者荣耀遥控杆 用遥控器玩王者荣耀_描述符_04


android仿王者荣耀遥控杆 用遥控器玩王者荣耀_Desktop_05


android仿王者荣耀遥控杆 用遥控器玩王者荣耀_软件下载_06

2.ADC配置

多通道连续扫描

android仿王者荣耀遥控杆 用遥控器玩王者荣耀_描述符_07


android仿王者荣耀遥控杆 用遥控器玩王者荣耀_描述符_08

3.USB配置

android仿王者荣耀遥控杆 用遥控器玩王者荣耀_android仿王者荣耀遥控杆_09


android仿王者荣耀遥控杆 用遥控器玩王者荣耀_软件下载_10

4.生成代码

android仿王者荣耀遥控杆 用遥控器玩王者荣耀_描述符_11


android仿王者荣耀遥控杆 用遥控器玩王者荣耀_描述符_12

二.程序

因为cubemx默认生成的设备是鼠标,这里需要改一下
以下代码通过下图软件hid descriptor tool自动生成,除了做游戏手柄外还可以做键盘。。。
(USB 协会提供了一个HID 描述符编辑工具称作HID Descriptor Tool,其执行程序为DT.exe。)

这里介绍一下HID
HID是Human Interface Device的缩写,HID设备是直接与人交互的设备,例如键盘、鼠标与游戏杆等。只要符合HID类别规范的设备都是HID设备。使用STM32的USB功能可以实现HID设备的功能。协议的具体内容可以参考这篇博客

hid descriptor tool参考资料: https://eleccelerator.com/tutorial-about-usb-hid-report-descriptors/

android仿王者荣耀遥控杆 用遥控器玩王者荣耀_描述符_13


点击file->Save as为.h文件

android仿王者荣耀遥控杆 用遥控器玩王者荣耀_描述符_14


生成的.h文件如下

// C:\Users\WYD\Desktop\Desc4.h


char ReportDescriptor[27] = {
    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
    0x09, 0x04,                    // USAGE (Joystick)
    0xa1, 0x00,                    // COLLECTION (Physical)
    0x05, 0x01,                    //   USAGE_PAGE (Generic Desktop)
    0x09, 0x30,                    //   USAGE (X)
    0x09, 0x31,                    //   USAGE (Y)
    0x09, 0x32,                    //   USAGE (Z)
    0x09, 0x33,                    //   USAGE (Rx)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x25, 0x7f,                    //   LOGICAL_MAXIMUM (127)
    0x75, 0x08,                    //   REPORT_SIZE (8)
    0x95, 0x04,                    //   REPORT_COUNT (4)
    0x81, 0x00,                    //   INPUT (Data,Ary,Abs)
    0xc0                           // END_COLLECTION
};

1.更改usbd_hid.c
更改318行左右,就是上面生成的内容(报告描述符)

__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE]  __ALIGN_END =
{
 0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
    0x09, 0x04,                    // USAGE (Joystick)
    0xa1, 0x00,                    // COLLECTION (Physical)
    0x05, 0x01,                    //   USAGE_PAGE (Generic Desktop)
    0x09, 0x30,                    //   USAGE (X)
    0x09, 0x31,                    //   USAGE (Y)
    0x09, 0x32,                    //   USAGE (Z)
    0x09, 0x33,                    //   USAGE (Rx)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x25, 0x7f,                    //   LOGICAL_MAXIMUM (127)
    0x75, 0x08,                    //   REPORT_SIZE (8)
    0x95, 0x04,                    //   REPORT_COUNT (4)
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)
    0xc0                           // END_COLLECTION
};

211行左右的,默认是鼠标需要改成none

0x00,         /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/

android仿王者荣耀遥控杆 用遥控器玩王者荣耀_android仿王者荣耀遥控杆_15

2.更改usbd_hid.h
就是生成的.h文件中的数组的大小。(报告描述符的长度)

#define HID_MOUSE_REPORT_DESC_SIZE    27U

android仿王者荣耀遥控杆 用遥控器玩王者荣耀_软件下载_16

3.更改main.c
这里使用的是adc扫描,没有用到dma和中断
添加头文件

#include "usbd_hid.h"

添加以下代码

/* USER CODE BEGIN PFP */

void set_data(void);
extern USBD_HandleTypeDef hUsbDeviceFS;
uint16_t adc_value[4];
uint8_t MouseDate[4];
/* USER CODE END PFP */
/* USER CODE BEGIN 2 */
	int i=0;
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		 for(i=0;i<4;i++)
		{
		HAL_ADC_Start(&hadc1);
		HAL_ADC_PollForConversion(&hadc1,0xffff);
	    adc_value[i]=HAL_ADC_GetValue(&hadc1);
		}
		HAL_ADC_Stop(&hadc1);
		set_data();
		USBD_HID_SendReport(&hUsbDeviceFS,( uint8_t*)MouseDate,sizeof(MouseDate));
		HAL_Delay(10);
  }
/* USER CODE BEGIN 4 */
void set_data()
{
 MouseDate[0]=127-(float)adc_value[0]/4095*127;
 MouseDate[1]=127-(float)adc_value[1]/4095*127;
	MouseDate[2]=127-(float)adc_value[2]/4095*127;
 MouseDate[3]=127-(float)adc_value[3]/4095*127;
if(abs((int)MouseDate[0])<5)
   MouseDate[0]=0;
if(abs((int)MouseDate[1])<5)
   MouseDate[1]=0;
if(abs((int)MouseDate[2])<5)
   MouseDate[2]=0;
if(abs((int)MouseDate[3])<5)
   MouseDate[3]=0;
}
/* USER CODE END 4 */

三.测试

打开控制面板的查看设备和打印机

android仿王者荣耀遥控杆 用遥控器玩王者荣耀_软件下载_17


找到这个右键点击游戏控制器设置

android仿王者荣耀遥控杆 用遥控器玩王者荣耀_描述符_18


点击属性

android仿王者荣耀遥控杆 用遥控器玩王者荣耀_Desktop_19


android仿王者荣耀遥控杆 用遥控器玩王者荣耀_描述符_20


可以看到已经设置好了,可以通过设置进行校准(校准这一步很重要)

完成校准后需要下一个软件xpadder

android仿王者荣耀遥控杆 用遥控器玩王者荣耀_Desktop_21


这个软件的作用是连接遥感和键盘,使用方法参考这篇博客

之后就可以开心的打游戏了

代码和软件下载

(0积分)

学习时间

2021.4.18