笔记目录
- 一.cubemx配置
- 1. 时钟配置
- 2.ADC配置
- 3.USB配置
- 4.生成代码
- 二.程序
- 三.测试
- 代码和软件下载
- 学习时间
最近在研究minifly,昨天突发奇想想用正点原子minifly的遥控器当一个游戏手柄打游戏放松一下然后就有了这篇博客。
一.cubemx配置
参考资料:https://www.bilibili.com/read/cv9584555
首先需要看一下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设备的功能。协议的具体内容可以参考这篇博客
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
这个软件的作用是连接遥感和键盘,使用方法参考这篇博客
之后就可以开心的打游戏了
代码和软件下载
(0积分)
学习时间
2021.4.18