雖然司徒之前已經自製一個N900手把,不過體積有點大,加上缺少Start、Select和L、R鍵,因此,司徒決定再製作一個更小、按鍵更多的手把,於是司徒找了一下可用的材料,發覺Dingoo Tech A380的按鍵還不錯

當然Dingoo Tech A330的手把也相當好看,只是它的A面並不是平面,製作難度比較高

Dingoo A320的按鍵是司徒最想拿來當材料,不過這一台是要拿來改IPS顯示屏,因此,這一台不能動刀

最後司徒決定使用Dingoo Tech A380,因為司徒覺得它的改造難度比較簡單,加上司徒短期應該沒時間研究它,但是A380的按鍵還是不夠多,因此,司徒決定使用如下材料當作其餘按鍵

抹掉外漆

剪裁

A380的D-Pad和按鍵

使用3秒膠固定

PCB板也使用3秒膠固定

PCB背面

使用CD-ROM的蓋子當支撐架

上D-Pad和按鍵

背面

拉線

使用更小的STM32F103板

焊接

固定STM32F103和手把主體

正面

需要一個USB Micro B接頭

USB Micro B連接到STM32F103主板

背面

連接支架

背面

完成

側面

背面

更薄的手把

另一面

底面

上邊

上手

相當棒的手把

跟前一代比較

另一面

電路圖

程式碼(修改自Keil MCBSTM32 Project):
volatile unsigned int cur_state = 0, pre_state = 0;
unsigned char index = 2;
unsigned char buffer[8] = {0};
void PushKey(unsigned char key)
{
if (index >= 5) {
buffer[0] = 0x00;
buffer[1] = 0x00;
buffer[2] = 0x01;
buffer[3] = 0x01;
buffer[4] = 0x01;
buffer[5] = 0x01;
buffer[6] = 0x01;
buffer[7] = 0x01;
}
else {
buffer[index] = key;
index += 1;
}
}
int main(void)
{
stm32_Init(); // STM32 Initialization
GPIOA->CRL = 0x88888888;
GPIOA->CRH = 0x88888888;
GPIOA->ODR = 0x00000000;
GPIOB->CRL = 0x88888888;
GPIOB->CRH = 0x88888888;
GPIOB->ODR = 0x00000000;
USB_Init(); // USB Initialization
USB_Connect(TRUE); // USB Connect
while (1) {
cur_state = 0;
if (GPIOB->IDR & 0x1000) { // PB12
cur_state |= 0x0001;
}
if (GPIOB->IDR & 0x2000) { // PB13
cur_state |= 0x0002;
}
if (GPIOB->IDR & 0x4000) { // PB14
cur_state |= 0x0004;
}
if (GPIOB->IDR & 0x8000) { // PB15
cur_state |= 0x0008;
}
if (GPIOA->IDR & 0x0100) { // PA8
cur_state |= 0x0010;
}
if (GPIOA->IDR & 0x0200) { // PA9
cur_state |= 0x0020;
}
if (GPIOA->IDR & 0x0400) { // PA10
cur_state |= 0x0040;
}
if (GPIOB->IDR & 0x0400) { // PB10
cur_state |= 0x0080;
}
if (GPIOB->IDR & 0x0200) { // PB9
cur_state |= 0x0100;
}
if (GPIOB->IDR & 0x0001) { // PB0
cur_state |= 0x0200;
}
if (GPIOA->IDR & 0x0040) { // PA6
cur_state |= 0x0400;
}
if (GPIOA->IDR & 0x0080) { // PA7
cur_state |= 0x0800;
}
if (GPIOB->IDR & 0x0020) { // PB5
cur_state |= 0x1000;
}
if (GPIOB->IDR & 0x0040) { // PB6
cur_state |= 0x2000;
}
if (cur_state == pre_state) {
continue;
}
pre_state = cur_state;
index = 2;
buffer[0] = 0x00;
buffer[1] = 0x00;
buffer[2] = 0x00;
buffer[3] = 0x00;
buffer[4] = 0x00;
buffer[5] = 0x00;
buffer[6] = 0x00;
buffer[7] = 0x00;
if (pre_state & 0x0001) PushKey(0x50);
if (pre_state & 0x0002) PushKey(0x12);
if (pre_state & 0x0004) PushKey(0x05);
if (pre_state & 0x0008) PushKey(0x11);
if (pre_state & 0x0010) PushKey(0x51);
if (pre_state & 0x0020) PushKey(0x4f);
if (pre_state & 0x0040) PushKey(0x07);
if (pre_state & 0x0080) PushKey(0x04);
if (pre_state & 0x0100) PushKey(0x1b);
if (pre_state & 0x0200) PushKey(0x06);
if (pre_state & 0x0400) PushKey(0x52);
if (pre_state & 0x0800) PushKey(0x10);
if (pre_state & 0x1000) PushKey(0x1c);
if (pre_state & 0x2000) PushKey(0x14);
if (USB_Configuration) {
USB_WriteEP(0x81, buffer, sizeof(buffer));
}
}
}