上次用模块制作了一个SS手柄转USB的控制器,使用良好,但是模块大,不美观,成本还高,这次用STM32F103制作了一块小板,软硬件全开源。
首先上成品图
PCB上有1-9个焊盘 SS手柄有9根线,根据下面图的定义,按照对应的顺序焊接好就OK
再上个空PCB的图:
读SS土星手柄的代码
uint8_t key_Z,key_Y,key_X,key_R;
uint8_t key_B,key_C,key_A,key_St;
uint8_t key_Up,key_Dn,key_Lt,key_Rt;
uint8_t key_L;
#define SCAN_DELAY_TIME 30 //us
void scan_saturn(void)
{
//s0 s1 0 0
HAL_GPIO_WritePin(GPIOB,S0_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,S1_Pin,GPIO_PIN_RESET);
delay_us(SCAN_DELAY_TIME);
key_Z = HAL_GPIO_ReadPin(GPIOB,D0_Pin);
key_Y = HAL_GPIO_ReadPin(GPIOB,D1_Pin);
key_X = HAL_GPIO_ReadPin(GPIOB,D2_Pin);
key_R = HAL_GPIO_ReadPin(GPIOB,D3_Pin);
//s0 s1 1 0
HAL_GPIO_WritePin(GPIOB,S0_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,S1_Pin,GPIO_PIN_RESET);
delay_us(SCAN_DELAY_TIME);
key_B = HAL_GPIO_ReadPin(GPIOB,D0_Pin);
key_C = HAL_GPIO_ReadPin(GPIOB,D1_Pin);
key_A = HAL_GPIO_ReadPin(GPIOB,D2_Pin);
key_St = HAL_GPIO_ReadPin(GPIOB,D3_Pin);
//s0 s1 0 1
HAL_GPIO_WritePin(GPIOB,S0_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,S1_Pin,GPIO_PIN_SET);
delay_us(SCAN_DELAY_TIME);
key_Up = HAL_GPIO_ReadPin(GPIOB,D0_Pin);
key_Dn = HAL_GPIO_ReadPin(GPIOB,D1_Pin);
key_Lt = HAL_GPIO_ReadPin(GPIOB,D2_Pin);
key_Rt = HAL_GPIO_ReadPin(GPIOB,D3_Pin);
//s0 s1 1 1
HAL_GPIO_WritePin(GPIOB,S0_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,S1_Pin,GPIO_PIN_SET);
delay_us(SCAN_DELAY_TIME);
key_L = HAL_GPIO_ReadPin(GPIOB,D3_Pin);
// printf("____________________________________\n");
// printf("key_Z,key_Y,key_X,key_R :%d %d %d %d\n",key_Z,key_Y,key_X,key_R);
// printf("key_B,key_C,key_A,key_St :%d %d %d %d\n",key_B,key_C,key_A,key_St);
// printf("key_Up,key_Dn,key_Lt,key_Rt :%d %d %d %d\n",key_Up,key_Dn,key_Lt,key_Rt);
// printf("key_L:%d\n",key_L);
// printf("\n");
}
main函数代码
int main(void)
{
uint16_t report_data = 0;
HAL_Init();
SystemClock_Config();
//MX_USART1_UART_Init();
//printf("boot ok\n");
MX_GPIO_Init();
MX_USB_DEVICE_Init();
MX_TIM2_Init();
HAL_Delay(1000);
MX_IWDG_Init();
while(1)
{
scan_saturn();
report_data = 0;
report_data |= key_L << 0;
report_data |= key_Z << 1;
report_data |= key_Y << 2;
report_data |= key_X << 3;
report_data |= key_R << 4;
report_data |= key_B << 5;
report_data |= key_C << 6;
report_data |= key_A << 7;
report_data |= key_St << 8;
report_data |= key_Up << 9;
report_data |= key_Dn << 10;
report_data |= key_Lt << 11;
report_data |= key_Rt << 12;
report_data ^= 0x1FFF;
USBD_HID_SendReport(&hUsbDeviceFS, (uint8_t*) &report_data, sizeof(uint16_t));
HAL_Delay(1);
HAL_IWDG_Refresh(&hiwdg);
}
}
Windows游戏控制器显示:
SS手柄13个按钮均可用,速度OK,玩游戏没感觉出延时。
软件:
硬件:
BOM:
PCB源文件为.json格式,立创EDA画的,有需要的人可以用立创EDA导入,直接打板就可以用。
演示视频
SS手柄改USB/Sega Saturn 土星手柄改USB接口演示_哔哩哔哩_bilibili
软硬件完整下载: