查看: 4145|回复: 1

[原创] 【DIY电竞产品】采用LPC54xx的游戏手柄

[复制链接]
  • TA的每日心情
    奋斗
    前天 20:19
  • 签到天数: 1849 天

    连续签到: 4 天

    [LV.Master]伴坛终老

    203

    主题

    3万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    112633
    最后登录
    2025-7-22
    发表于 2021-11-19 16:03:59 | 显示全部楼层 |阅读模式
    本帖最后由 stm1024 于 2021-11-20 13:47 编辑

    响应日天的号召,老早就立了这个flag,虽然还有很多工作没有做完,不过先做个笔记和大家分享一下,虽然还只是一个半成品,然后投入的时间也不够多,但是自己立的flag,硬着头皮也要搞下去。其实只做了一点微小的工作,有点诚惶诚恐,感觉hold不住“DIY”这么高大上的要求。

    闲话少说,讲正事儿。

    通过画原理图、PCB布线、打样,最后成品长这样:
    js.jpg

    哈哈,机智的小伙已经知道了这不就是某宝是几块钱的JoyStick Shield嘛。
    没错,翻箱倒柜找出来的这个玩意儿,还是以前玩arduino的时候买的,现在也算是吃灰资深板卡了,选用这个的一方面是有有现成的,另外就是NXP的很多评估板都是兼容Arduino的接口,所以我可以省不少杜邦线了,而且看起来也不会那么凌乱了。
    然后就是开发板了,刚开始盯上的是LPC51U68,有Arduino接口,不过对着电气原理图发现针脚有点儿对不上号,然后瞄了一下LPC54608的板子,针脚没问题。
    54608.png


    其实这个项目需要用到的硬件资源并不多,主要是GPIO,ADC,然后就是串口、USB等,用一颗LPC11U68等芯片也可以实现(话说我之前也有一块LPC11U68的板子的,只是没找到),但是画板子不是我的强项,只能捡现成的板子,而且还可以理直气壮的说自己没有重复造轮子(我也想啊,就是不会造)。

    2.jpg


    然后看看原理图,那个JoyStick shield的电路原理图,里面带的东西还不少,支持串口,nRF21L01接口等,实际我们要的也就是那么几个按键和摇杆的数据:

    4.jpg

    板子上就是这样设计的,然后我们可以看到,左下方的是模拟量,摇杆的X和Y接入了模拟量,按键A-F,以及K在右边。

    再看看LPC54608的排母:

    5.jpg

    6.jpg

    左边分别是P0_16对应ADC0的通道4,P0_31对应ADC0的通道5,之前看LPC51U68的原理图发现不行是因为有一个模拟量采集针脚直接悬空了……右边分别是对应A-F,K就不截图了,对应的是P4_7。

    这个搞完了就可以开始写代码了:

    首先是按键的配置,这个简单,就是基本的GPIO操作,而且默认也是Input的,所以只需要使能GPIO的时钟就OK了。

    1. void ButtonInit()
    2. {
    3.         SYSCON->AHBCLKCTRLSET[0]=1U<<15;//GPIO1
    4.         SYSCON->AHBCLKCTRLSET[0]=1U<<17;//GPIO3
    5.         SYSCON->AHBCLKCTRLSET[2]=1U<<9;//GPIO4
    6. }
    复制代码
    然后是ADC0的配置:

    1. //ADC0 config
    2. void XDADC0_Init()
    3. {
    4.         //Bit 6: Temp sensor
    5.         //Bit 9: PDEN_VD2_ANA
    6.         //Bit 10: ADC0
    7.         //Bit 19: VDDA to the ADC
    8.         //Bit 23: Vrefp to the ADC
    9.         SYSCON->PDRUNCFGCLR[0]|=(1U<<6)|(1U<<9)|(1U<<10)|(1U<<19)|(1U<<23);
    10.         //Enables the clock for the ADC0 register interface
    11.         SYSCON->AHBCLKCTRLSET[0]=1U<<27;
    12.         //PIN config
    13.         //Enable clock of the IOCON
    14.         SYSCON->AHBCLKCTRLSET[0]=(1U<<13);
    15.         //axis-X is P0.16--ADC4        P0_16 FUNC0 as ADC0_4 P0.31@J12_2
    16.         IOCON->PIO[0][16]=0x00|(1U<<9);
    17.         //axis-Y is P0.31--ADC5        P0_31 FUNC0 as ADC0_5 P0.31@J12_4
    18.         IOCON->PIO[0][31]=0x00|(1U<<9);
    19.         //disable clock of the IOCON when finish setting to save power
    20.         SYSCON->AHBCLKCTRLCLR[0]=(1U<<13);
    21.         ADC0->CTRL=0x0e00;//bypass CALIB
    22.         SysTick_DelayTicks(5);
    23.         ADC0->STARTUP=1U<<0;//ADC_ENA
    24.         SysTick_DelayTicks(5);
    25.         ADC0->STARTUP|=1U<<1;//ADC_INIT
    26.         ADC0->SEQ_CTRL[0]=0x40040000;
    27.         SysTick_DelayTicks(5);
    28.         //use ADC ch4 & ch5
    29.         ADC0->SEQ_CTRL[0]=0xc0040000|(1U<<4)|(1U<<5);//enable        
    30. }
    复制代码
    这里使用了序列A,使能通道4和通道5。


    然后是一些定义:

    1. //按键顺序及定义
    2. //A        P3.2
    3. //B        P4.5
    4. //C P3.10
    5. //D P3.14
    6. //E P3.1
    7. //F P1.22
    8. //KEY P4.7
    9. uint8_t PORTS[7]={3,4,3,3,3,1,4};
    10. uint8_t PINS[7]={2,5,10,14,1,22,7};
    复制代码
    因为我打算在后面的程序中采用循环方式,所以这里直接把GPIO的PORT和PIN给定义进去,一会直接用循环遍历,简单粗暴。 TS1 - 副本 (4).jpg TS1 - 副本 (3).jpg TS1 - 副本 (2).jpg TS1 - 副本 (5).jpg TS1 - 副本 (9).jpg TS1 - 副本 (8).jpg TS1 - 副本 (6).jpg TS1 - 副本 (7).jpg TS1 - 副本 (10).jpg TS1.jpg

    最后就是按键的采集,这个地方采用轮询方式,采集按键及模拟量输入值:

    1. while(1)
    2.         {        
    3.                 buttons=0x00;
    4.                 for(i=0;i<7;i++)
    5.                 {
    6.                         if(GPIO->B[PORTS[i]][PINS[i]]==0)
    7.                                 buttons|=1U<<i;
    8.                 }
    9.                 memset(pbuffer,0x00,256);
    10.                 sprintf(pbuffer,"JS:B=%02x,X=%02x,Y=%02x\n",buttons,XDADC0_Read(4)>>4,XDADC0_Read(5)>>4);
    11.                 Console_WriteString(pbuffer,strlen(pbuffer));
    12.                 SysTick_DelayTicks(100);
    13.         }
    复制代码
    先用串口输出采集到的数据,观察一波采集的效果:

    sss.gif

    目前看起来还算正常,不过测试发现按键E按下去以后没反应,然后用万用表测试了一下E端口和GND之间的通断,发现是正常的,这就让我有点费解了。另外一个问题是ADC采集的,ADC采集我并没有去计算具体的电压值,实际上就是把0-4095之间的值换算到了0-255之间,这样符合大多数摇杆的设置。不过有个问题是,不知道是板子做工的原因,还是供电,或者模拟量采集本身就有点不够精确,本来期望的中位值是两个0x80,但是实际测试发现一个是0x7a,一个是0x7f,后面一个还好,前面一个似乎有点儿不太准确,这种情况下只能通过手工校正来补偿了。
    //------------------------------------------------------
    目前已经完成的工作就这些,也没啥技术含量,就是基本外设的使用。不过后面需要做的工作才是最难搞的,第一个是打算将USB外设跑起来,这样可以把数据按USB协议发送给电脑,模拟发送按键键盘,例如ABCD按键分别对应键盘的四个方向键等,还了解到windows有一些支持JoyStick的API可以鼓捣一下。还有另外一种比较low的方法,就是自己写一个基于串口的游戏,自娱自乐吧,哈哈。

    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2025-7-11 08:53
  • 签到天数: 301 天

    连续签到: 2 天

    [LV.8]以坛为家I

    3884

    主题

    7490

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    39382
    最后登录
    2025-7-24
    发表于 2021-11-19 16:10:21 | 显示全部楼层
    再接再厉,期待力作!
    qiandao qiandao
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-24 11:13 , Processed in 0.095126 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表