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);
}
实物效果