STM32
直播中

周棠亨

7年用户 963经验值
擅长:可编程逻辑 电源/新能源
私信 关注
[问答]

如何使用HTC Tracker在UE4中传输模拟量呢

HTC Tracker的原理是什么?
HTC Tracker有哪些功能呢?如何使用HTC Tracker在UE4中传输模拟量呢?

回帖(1)

闫颖慧

2021-11-11 14:27:03
  Github
  功能简述
  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);
  }
举报

更多回帖

发帖
×
20
完善资料,
赚取积分