用minifly遥控器打游戏


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

在这里插入图片描述

一.cubemx配置

参考资料:https://www.bilibili.com/read/cv9584555
https://blog.csdn.net/u014415522/article/details/107006787/
首先需要看一下minifly遥控手柄的原理图
在这里插入图片描述
在这里插入图片描述
主要用到的就是两个遥感,从原理图可以看出每一个遥感需要两个adc采集,x方向和y方向。
原理就是stm32通过hid协议与主机通信

1. 时钟配置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.ADC配置

多通道连续扫描
在这里插入图片描述
在这里插入图片描述

3.USB配置

在这里插入图片描述
在这里插入图片描述

4.生成代码

在这里插入图片描述
在这里插入图片描述

二.程序

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

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

hid descriptor tool参考资料: https://eleccelerator.com/tutorial-about-usb-hid-report-descriptors/
在这里插入图片描述
点击file->Save as为.h文件
在这里插入图片描述
生成的.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*/

在这里插入图片描述

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

#define HID_MOUSE_REPORT_DESC_SIZE    27U

在这里插入图片描述

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 */

三.测试

打开控制面板的查看设备和打印机
在这里插入图片描述
找到这个右键点击游戏控制器设置
在这里插入图片描述
点击属性
在这里插入图片描述
在这里插入图片描述
可以看到已经设置好了,可以通过设置进行校准(校准这一步很重要)
完成校准后需要下一个软件xpadder
在这里插入图片描述
这个软件的作用是连接遥感和键盘,使用方法参考这篇博客https://blog.csdn.net/u011552559/article/details/80841771
之后就可以开心的打游戏了

代码和软件下载

https://download.csdn.net/download/qq_44181970/16742832(0积分)

学习时间

2021.4.18


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值