使用HTC Tracker在UE4中传输模拟量的方法

Github

https://github.com/HaHaHaHaHaGe/custom_htcTracker

功能简述

HTC Tracker背面的POGOpin 有6个引脚 如图:
在这里插入图片描述
可用的输入只有4个,也就是第3、4、5、6引脚,而且是数字输入,正常情况下一个Tracker只能接入4个按键,进行检测,而下面的方法,以牺牲低延迟为代价,换来更多的输入,甚至是模拟输入
(下面的设计为两个开关输入、一个模拟输入(2bit)、一个编码器输入(4bit))
当然也可以只要一路12bit模拟输入,具体控制由代码实现

原理简述

HTC Tracker的硬件设计决定了他不可能采集模拟信号,但是我们可以用一个转接板,将Tracker的4路开关量信号当做通信接口,使用转接板采集模拟/数字信号,在经过POGO PIN传输到Tracker,这样一来,就是实现了模拟量的传输。

原理图

在这里插入图片描述

电路功能模块

供电

首先要解决的是供电问题,Tracker的第一引脚是控制马达的,本以为可以用于转接板的供电,但是使用示波器测量后发现,他是一个个的短脉冲,而且电压不高,也就没办法使用其当做供电了。
没办法,只能使用额外的锂电池供电了,正巧Tracker的第3引脚是充电与数据传输共用了,所以可以将转接板设计成Tracker的充电板,这样一来就不需要分别为Tracker与转接板充电了。

开关

不想使用一个硬开关来管理转接板的启动与关闭,因为会很不方便,所以将LDO的使能端接到MCU与一个开关上,这样一来当开关被触发时,LDO开始供电,MCU启动后立即拉住LDO的使能,使其不会因松开按键导致失效。关机的话,设计为长时间没有按键操作自动关机即可

采集

因为工作需要所以设计了两路开关(图中一路写的是led,但是可以复用成开关)、一个机械编码器输入、一个霍尔开关输入(也就是adc采集模拟量)

PCB图

在这里插入图片描述

代码

使用STM32CUBEMX制作
贴了其中一部分,详细的在github中

	while (1)
  {
		if(HAL_GPIO_ReadPin(POW_CHECK_GPIO_Port,POW_CHECK_Pin) == 1)
		{
			GPIO_InitTypeDef GPIO_InitStruct = {0};
			GPIO_InitStruct.Pin = CLK_Pin;
			GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
			GPIO_InitStruct.Pull = GPIO_NOPULL;
			GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
			HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
			HAL_Delay(1000);
			HAL_GPIO_WritePin(POW_TRACKER_GPIO_Port,POW_TRACKER_Pin,0);
			while(HAL_GPIO_ReadPin(POW_CHECK_GPIO_Port,POW_CHECK_Pin))
			{
				HAL_Delay(100);
			}
			HAL_GPIO_WritePin(POW_TRACKER_GPIO_Port,POW_TRACKER_Pin,1);
			HAL_Delay(100);
			GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
			HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
		}
		
		
		
		HAL_GPIO_WritePin(PAK_GPIO_Port,PAK_Pin,1);
		HAL_GPIO_WritePin(CLK_GPIO_Port,CLK_Pin,0);
		HAL_GPIO_WritePin(DATA0_GPIO_Port,DATA0_Pin,HAL_GPIO_ReadPin(BUTTON_GPIO_Port,BUTTON_Pin));
		HAL_GPIO_WritePin(DATA1_GPIO_Port,DATA1_Pin,HAL_GPIO_ReadPin(BUTTON_SW_GPIO_Port,BUTTON_SW_Pin));
		HAL_Delay(50);
		HAL_GPIO_WritePin(PAK_GPIO_Port,PAK_Pin,0);
		HAL_GPIO_WritePin(CLK_GPIO_Port,CLK_Pin,1);
		HAL_Delay(50);
		HAL_GPIO_WritePin(CLK_GPIO_Port,CLK_Pin,0);
		HAL_GPIO_WritePin(DATA0_GPIO_Port,DATA0_Pin,adc_sw & 0x01);
		HAL_GPIO_WritePin(DATA1_GPIO_Port,DATA1_Pin,(adc_sw >> 1) & 0x01);
		HAL_Delay(50);
		HAL_GPIO_WritePin(CLK_GPIO_Port,CLK_Pin,1);
		HAL_Delay(50);
		HAL_GPIO_WritePin(CLK_GPIO_Port,CLK_Pin,0);
		HAL_GPIO_WritePin(DATA0_GPIO_Port,DATA0_Pin,sw_sw & 0x01);
		HAL_GPIO_WritePin(DATA1_GPIO_Port,DATA1_Pin,(sw_sw >> 1) & 0x01);
		HAL_Delay(50);
		HAL_GPIO_WritePin(CLK_GPIO_Port,CLK_Pin,1);
		HAL_Delay(50);
		HAL_GPIO_WritePin(CLK_GPIO_Port,CLK_Pin,0);
		HAL_GPIO_WritePin(DATA0_GPIO_Port,DATA0_Pin,(sw_sw >> 2) & 0x01);
		HAL_GPIO_WritePin(DATA1_GPIO_Port,DATA1_Pin,(sw_sw >> 3) & 0x01);
		HAL_Delay(50);
		HAL_GPIO_WritePin(CLK_GPIO_Port,CLK_Pin,1);
		HAL_Delay(50);
		HAL_GPIO_WritePin(CLK_GPIO_Port,CLK_Pin,0);
  }

实物效果

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值