极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 23874|回复: 7

arduino如何读取多个fc手柄的按键信号

[复制链接]
发表于 2013-3-12 10:09:30 | 显示全部楼层 |阅读模式
本帖最后由 openmmoo 于 2013-3-18 11:07 编辑


如图,fc的手柄两个,想用arduino读取它们的按键信号传到pc上去对打,应该如何做。
在网上查了很久,fc的手柄用的是cd4021的芯片,这个芯片用的什么方式通讯的,是i2c还是spi的,可以并联着用吗?
有现成的库可以用吗?
硬件上如何连接?
软件上如何操作?
在论坛里看到使用4017数字集成块扩展io口的,不知道这个手柄的原理及使用方法和它是不是一样的,那应用如何识别连发及同时按下多个键呢?
手柄不没回来,所以问题问的很乱,请见谅,{:soso_e100:} {:soso_e130:} !!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2013-3-12 14:52:05 | 显示全部楼层
本帖最后由 小燕子神飞 于 2013-3-12 15:02 编辑

FC手柄线中只有5根线,分别是 VCC  GND  D CP  RESET
我给你一段程序吧,不是C语言,但是你好好看下应该好理解



//游戏手柄元件
unit game_pad
{
        //初始化
        public void init()
        {
                d = high;
                cp = low;
                reset = high;
        }
        //读取键盘按键
        public uint8 read()
        {
                uint8 key_data;
                reset = high;
                loop( 8 ) {
                        key_data <<= 1;
                        key_data.0 = d;
                        reset = low;
                        cp = high;
                        cp = low;
                }
                return key_data;
        }
        //键盘枚举值, 相与后为零表示对应键按下
        public const uint8 null =        0b1111_1111;
        public const uint8 right =        0b0000_0001;
        public const uint8 left =        0b0000_0010;
        public const uint8 down =        0b0000_0100;
        public const uint8 up =                0b0000_1000;
        public const uint8 start =                0b0001_0000;
        public const uint8 select =        0b0010_0000;
        public const uint8 a =                0b0100_0000;
        public const uint8 b =                0b1000_0000;
        //手柄信号线定义
        bit cp = @game_pad_config.cp;
        bit d = @game_pad_config.d;
        bit reset = @game_pad_config.reset;
}

我做过FC手柄控制电脑上的模拟器,玩 魂斗罗:
http://blog.sina.com.cn/s/blog_694e0ad70100r593.html
希望对你有帮助.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-3-13 15:13:16 | 显示全部楼层
1、哈哈,谢谢了,程序大概看懂了,程序虽不长,却是精华,等手柄回来再仔佃研究。
2、可以告诉我d和cp、RESET和下面那个线对应吗?我在网上看别人的拆机是这样的
    1黄        2红        3白        4蓝        5棕
    +5V        GND        LATCH        CLK        DATA
3、蜘蛛侠挺有意思的,等有机会也做一个试试。


回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-3-15 21:19:35 | 显示全部楼层
自己来顶一下,哈哈!还没解决,线序总是找不到!试不出来呀!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-3-16 15:00:07 | 显示全部楼层
终于找到了,还弄坏了一个手柄,发上来给需要的人参考。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-3-23 10:43:58 | 显示全部楼层
fc手柄差不多了,现在可以用来控制森林冰火人玩了。虽然程序还很乱,不过先发上来,请大家给个意见。
根据上一楼的图将单片机和手柄相连:
    fc        arduino
    gnd        gnd
    vcc        vcc
    Clock      d6
    latch(rst) d7
    data       d8
单片机程序如下:
const int rst = 7; //板子的RST脚接Arduino的D7口(自定义)
const int clk = 6; //板子的CLK脚接Arduino的D6口(自定义)
const int data1 = 8; //板子的DATA脚接Arduino的D8口(自定义)

unsigned int keybak = 0;
void setup()
{
Serial.begin(9600);
pinMode(rst, OUTPUT);
pinMode(clk, OUTPUT);
pinMode(data1, INPUT);

}
void loop()
{
unsigned int key = 0;
digitalWrite(rst, HIGH); //初始化
delayMicroseconds(10);
digitalWrite(rst, LOW);
delayMicroseconds(10);
for(int i = 0; i < 10; i++) //读取10个端口电平到key中
{
key<<=1;
bitWrite(key,0,digitalRead(data1));//读取中
digitalWrite(clk, HIGH);
delayMicroseconds(10);
digitalWrite(clk, LOW); //移下一个端口
delayMicroseconds(10);
}

if (key!=keybak) 如果两次读取的数据一样,就不发送到串口
{
  Serial.println(key);
  keybak=key;
}
delay(100);
}

发送到串口的数字代码,下面是对应的按键
left 1015
right 1019
up 1007
down 991
select 895
start 959
a 767
b 511
c 511 1023
d 767 1023

left a      759
     b      503
     c 1015 1015 503 503 连续
     d 1015 1015 759 759 连续

right a      763
      b      507
      c 1019 507 连续同上
      d 1019 763 连续同上

up    a      751
      b      495
      c 1007 495 连续同上
      d 1007 751 连续同上

down  a      735
      b      479
      c 991  479 连续同上
      d 991  735 连续同上


回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-3-23 11:17:38 | 显示全部楼层

上位机用vs2010 c# 主要功能:
    串口通讯,
    接收数字数据
    将数字数据转为字串数据
    根据数据模拟按键。
这一块没有好的思路,写的很乱,请高手改改吧。
直接运行程序: 要vs2010的库。
玩森林冰火人:left左,right右,a跳,可以用组合按。
下面的是c#源代码:



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2017-1-10 18:34:52 | 显示全部楼层
好帖子。很有意思。
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-16 15:06 , Processed in 0.044461 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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