openmmoo 发表于 2013-3-12 10:09:30

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

本帖最后由 openmmoo 于 2013-3-18 11:07 编辑


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

小燕子神飞 发表于 2013-3-12 14:52:05

本帖最后由 小燕子神飞 于 2013-3-12 15:02 编辑

FC手柄线中只有5根线,分别是 VCCGNDD CPRESET
我给你一段程序吧,不是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
希望对你有帮助.

openmmoo 发表于 2013-3-13 15:13:16

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


openmmoo 发表于 2013-3-15 21:19:35

自己来顶一下,哈哈!还没解决,线序总是找不到!试不出来呀!

openmmoo 发表于 2013-3-16 15:00:07

终于找到了,还弄坏了一个手柄,发上来给需要的人参考。

openmmoo 发表于 2013-3-23 10:43:58

fc手柄差不多了,现在可以用来控制森林冰火人玩了。虽然程序还很乱,不过先发上来,请大家给个意见。:loveliness::loveliness::loveliness:
根据上一楼的图将单片机和手柄相连:
    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 连续同上

downa      735
      b      479
      c 991479 连续同上
      d 991735 连续同上


openmmoo 发表于 2013-3-23 11:17:38


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



a461624201 发表于 2017-1-10 18:34:52

好帖子。很有意思。:)
页: [1]
查看完整版本: arduino如何读取多个fc手柄的按键信号