孤单片机器人 发表于 2014-4-4 20:35:34

PS2手柄的STM32驱动源代码(亲测可用)

最经做国创买了一对32的舵机控制板正好顺便买了一个PS2的手柄当然是中国山寨的sony的   你懂得    早就想玩玩这个东西 用它来控制四轴省买遥控了   可是PS2的通信协议传输数据的时序是啥   自己对这个原来还真没有研究过   这下我可犯难了
之后当然是去谷歌百度搜了   结果是搜到一些资料也哟一些是讲PS2鼠标键盘的   和手柄完全不一样   将PS2手柄的有一个帖子不错
http://hellorobot.blog.163.com/blog/static/185444129201362084945855/
淡然还有别的   你上谷歌一搜就有了    不过讲的都只是泛泛的一讲看完差不多就能明白   可是要写程序时还是有困难通信时的时序咋整?难道让我买个逻辑分析仪来弄?
我一看没有源代码也就没往下看   总想找到一个有源代码的帖子自己改革IO口i就行的那种帖子   可是我基本上没哟找到   回过头来就直接看协议吧   有些不懂的地方
后来又去谷歌   结果谷歌没有找到要不上一下百度   我有这儿几次经历谷歌找不到的资料百度竟然找到了 呵呵   你别说好真哟一个大发现   一个论坛上有人说2003年的某一期的电子世界杂志上有过一篇关于该方面的文章
我就马上找来看了一下他说有源代码   没找到   自己凭着理解写了一份驱动   结果不行   后来又是在百度上找到了那份代码是51上的和自己的比对了一下就是时序没弄好不知道该延迟多长时间的高低电平自己有修改了一番结果好了成功了
最后还是有一个bug协议上说传输数据时是先传低位再传高位可是我先接收低位后    最终得出来的那个字节刚好和协议上相反也就是说我应该先接受高位   但是我把程序改成先接受高位的了收到的数据却不对了
也不知道咋回事   估计是国产山寨的原因吧还有按键不是特别灵敏 遥感很坑划几下就满量程了离边界还有一般距离呢也是山寨的原因吧但是山寨的便宜啊还能用吧
总结出了几点教训   不要想着天上掉馅饼的事对不起一般是没有的 No painNo gain!!
                            我写驱动到最后弄好一共也就一天左右的时间   之前算是找过资料但是没有咋看基本上没有实际进展所以要学会坚持   才有可能有成绩搞硬件软件都是这样不坚持啥都做不成
                            我昨天下午写好第一份后晚上调试到1点竟然有一个不可思议的错就是初始化IO口的时候没有起作用后来把led的IO初始化复制过来竟然可以了   两段代码都是一样的啊奇怪啊

之前在坛子里以及其他网站 论坛呢都没有找到PS2的驱动代码   在此我特地上传发扬开源精神据说这个协议值几十万美金呢   希望的挂昂达朋友都发扬开源精神共同促进共同提高


有几点要说明我只是用到了6跟线   ACK没哟用到没什么用也
工程的板子是 STM32F103VET6 开发环境是开源的COIDE 谷歌一下就有了 自己安装一个吧很好使的   还能单步调试呢   keil可不行所以说开源很强大啊   
没有做过多的数据处理只是采集数据进行了简单的处理大家可以根据自己的需要来移植修改
没有遥控的孩子们可以用游戏的手柄来玩了   最后祝大家用的愉快不懂得可以来问我

孤单片机器人 发表于 2014-4-4 20:48:32

传错了那个不是51的例程是杂志内容再传一遍

majianjia1991 发表于 2014-4-4 21:02:09

支持 有木有PS3的,我对那个比例的油门感兴趣。。

jjj206 发表于 2014-4-5 12:50:03

谢谢楼主的共享

yue621 发表于 2014-4-5 12:51:40

很犀利啊~!!!支持~!!

孤单片机器人 发表于 2014-4-8 21:54:44

majianjia1991 发表于 2014-4-4 21:02
支持 有木有PS3的,我对那个比例的油门感兴趣。。

只有2的   没买3以后买了的话会开源出来的

工程师030 发表于 2014-4-8 23:13:00

顶楼主!楼主的精神值得学习

jetli 发表于 2014-4-8 23:27:23

sony PS2 手柄
还是
PC的ps2接口手柄

{:titter:}?

sunnyqd 发表于 2014-4-8 23:40:40

是不是可以随意放大招了

yht0312 发表于 2014-4-9 08:24:00

呵呵这个不错,收藏了,感谢楼主

Excellence 发表于 2014-4-9 08:26:08

{:victory:}{:victory:}{:victory:}{:victory:}

1638574407 发表于 2014-4-16 00:35:35

谢谢了,明天看看好不好用吧!!!!!!!

hemeizhi 发表于 2014-4-16 08:23:31

看看这个东西http://www.hezimm.com/?p=912

1638574407 发表于 2014-4-16 09:49:29

楼主,单片机移植后有问题啊!!

1638574407 发表于 2014-4-16 17:03:10

楼主看看有什么问题吧:
#include<reg52.h>
#defineuchar unsigned char
#defineuintunsigned int
#definetime100

ucharHAND;                     
ucharkeybuf0;//手柄按键编码存储单元
ucharkeybuf1;
ucharRES;               
uchar   t=0;

sbitDAT=P3^0;
sbitCMND=P3^1;
sbitATT=P3^2;   //手柄控制信号   
sbitCLK=P3^3;                  
               
                  


void delay_1ms(uchar k);
void key_scan();
void psout();
void psinout();
void delay(uchar k) ;
void key_function();


void main()
{
    while(1)
    {
   
                delay_1ms(1);
    key_scan();
                delay_1ms(1);
                              
               
    key_function();    //各个按键对应的功能
    }
}

void key_function()

{
               
                        
P0=keybuf0;                                                //RES%256;
P1=keybuf1;                                                //RES%256;

delay(5);
}


    void key_scan()//键扫描
{
    t=0;
    ATT=0;         //主机读手柄先拉低ATT
    HAND=0x01;   //主机发送开始命令
    psinout();   //0xff
    delay(5);
               
    HAND=0x42;   //主机发送请求数据命令
    psinout();   //0x41:手柄返回请求应答信号
    delay(25);
               
    /*psout();       //0x5A
    delay(25);
               
    psout(); //keybuf0(空0xff)//手柄返回按键编码第一字节
    delay(25);
               
    psout(); //keybuf1(空0xff)//手柄返回按键编码第二字节*/
               
                HAND=0x00;   //主机发送请求数据命令
    psinout();   //0x41:手柄返回请求应答信号
    delay(25);
               
                HAND=0x00;   //主机发送请求数据命令
    psinout();   //0x41:手柄返回请求应答信号
    delay(25);
               
                HAND=0x00;   //主机发送请求数据命令
    psinout();   //0x41:手柄返回请求应答信号
    //delay(25);
               
    keybuf0=RES;            
    keybuf1=RES;
    delay(10);
               
    ATT=1;
}


    void psout()//主机接收子程序            
{
    int j,k;
    unsigned char duf=0;
    j=1;
    for(k=0;k<=7;k++)       //逐位发送
    {
       CLK=1;
       delay(5);
       CLK=0;
       delay(5);
       if(DAT==1)
          duf=duf+j;
       j=j*2;
       CLK=1;
       delay(5);
   }
    RES=duf;
                //if(t==6)t=0;
}

void psinout()//手柄发送子程序
{
    uchar buf,duf=0;
    uchar i,j=1;
    buf=HAND;
    for(i=0;i<=7;i++)   //逐位接收   
    {
   CLK=1;
   delay(5);
   if(buf&0x01)
      CMND=1;
   else
      CMND=0;
   buf=buf>>1;
   CLK=0;
   delay(5);
   if(DAT==1)
      duf=duf+j;
   j=j*2;
   CLK=1;
   delay(5);
    }
    RES=duf;
}


    void delay(uchar k)         
{
   uchar i;
   for(i=0;i<k;i++);
}




void delay_1ms(uchar k)
{
   do
   {
    TMOD=0x01;
    TH0=-(300/256);
    TL0=-(300%256);
    TR0=1;
    while(!TF0);
    TF0=0;
   }while (k--);
         TR0=0;
         TMOD=0x00;
}


1638574407 发表于 2014-4-16 17:04:26

数据偶尔能够成功,大部分是不成功的,而且必须复位,很奇怪。

1638574407 发表于 2014-4-16 17:04:59

用的单片机是AT89S52
麻烦帮忙看看,谢谢了

1638574407 发表于 2014-4-16 17:05:41

hemeizhi 发表于 2014-4-16 08:23
看看这个东西http://www.hezimm.com/?p=912

这个东西看了就很贵。。。。。买不起啊!!!

1638574407 发表于 2014-4-16 17:06:57

楼主,要是有资料的话麻烦发一份行么?      1638574407@qq.com    谢谢了!!!!

孤单片机器人 发表于 2014-4-17 15:44:02

1638574407 发表于 2014-4-16 17:03
楼主看看有什么问题吧:
#include
#defineuchar unsigned char


读取数据的时序按照我的那个   读取的周期不要太快我的事隔50ms左右太快太慢都不好这个你可以自己试试

1638574407 发表于 2014-4-17 18:45:32

本帖最后由 1638574407 于 2014-4-17 19:05 编辑

孤单片机器人 发表于 2014-4-17 15:44
读取数据的时序按照我的那个   读取的周期不要太快我的事隔50ms左右太快太慢都不好这个你可以自己 ...

好的,能加个好友吗??我的qq是1638574407,,这个东东我一直都没有弄好,我的是无线的,不知道有没有问题,还有通信这个东西好抽象啊!!有时候能够成功,有时候不行,需要不断地复位才能实现,好麻烦的!!而且发现大家用这个的很少的,不知道为什么,这个东西要是用好了的话其实挺方便的!!谢谢了!!!1638574407

1638574407 发表于 2014-4-17 19:57:23

孤单片机器人 发表于 2014-4-17 15:44
读取数据的时序按照我的那个   读取的周期不要太快我的事隔50ms左右太快太慢都不好这个你可以自己 ...

你的pdf下载不了啊!!!

孤单片机器人 发表于 2014-4-19 16:33:53

1638574407 发表于 2014-4-16 09:49
楼主,单片机移植后有问题啊!!

有什么问题??

1638574407 发表于 2014-4-19 17:25:51

孤单片机器人 发表于 2014-4-19 16:33
有什么问题??

按键后收不到数据,更新很慢啊!!!!

孤单片机器人 发表于 2014-4-19 17:28:12

1638574407 发表于 2014-4-19 17:25
按键后收不到数据,更新很慢啊!!!!

不会吧你隔50ms读一次   你是买的山寨的手柄吗我的是山寨的按键也有点小问题

1638574407 发表于 2014-4-19 17:32:50

是山寨的啊!!!才30

1638574407 发表于 2014-4-19 17:34:08

会不会是驱动电路的问题,我就加了几个上拉电阻!!!

孤单片机器人 发表于 2014-4-21 16:49:34

1638574407 发表于 2014-4-19 17:34
会不会是驱动电路的问题,我就加了几个上拉电阻!!!

我没加不过可以试试我遇到的最大的问题就是读取的频率问题按一次键会读出好几次都显示同一个按键按下

1638574407 发表于 2014-4-21 18:19:06

孤单片机器人 发表于 2014-4-21 16:49
我没加不过可以试试我遇到的最大的问题就是读取的频率问题按一次键会读出好几次都显示同一个按 ...

我已经弄得差不多了,但是还是有问题,主要是反应不灵敏,好像原来的问题是没有读出所有的数据造成的额,我只是读了5个数据,读了9个后就没事了!!!

jiwx2011 发表于 2014-4-21 18:35:18

谢谢楼主的共享

孤单片机器人 发表于 2014-4-24 13:17:37

1638574407 发表于 2014-4-21 18:19
我已经弄得差不多了,但是还是有问题,主要是反应不灵敏,好像原来的问题是没有读出所有的数据造成的额, ...

是不是也有反映慢的现象   我这个一直有 估计是山寨的原因吧读取的间隔我控制在了10ms左右也可以了

1638574407 发表于 2014-4-24 14:12:18

孤单片机器人 发表于 2014-4-24 13:17
是不是也有反映慢的现象   我这个一直有 估计是山寨的原因吧读取的间隔我控制在了10ms左右也可以了 ...

这个东西大家玩的很少啊!!!有点坑了!!!!

PLM 发表于 2014-4-24 15:11:35

支持一下

bajie_zhl19 发表于 2014-4-25 08:43:06

顶楼主!楼主的精神值得学习

霸气侧漏 发表于 2014-4-25 09:30:47

好东西   支持一个

liyang53719 发表于 2015-1-15 21:10:40

现在正在研究用FPGA读手柄,过来学习学习
页: [1]
查看完整版本: PS2手柄的STM32驱动源代码(亲测可用)