arduino如何读取多个fc手柄的按键信号
本帖最后由 openmmoo 于 2013-3-18 11:07 编辑如图,fc的手柄两个,想用arduino读取它们的按键信号传到pc上去对打,应该如何做。
在网上查了很久,fc的手柄用的是cd4021的芯片,这个芯片用的什么方式通讯的,是i2c还是spi的,可以并联着用吗?
有现成的库可以用吗?
硬件上如何连接?
软件上如何操作?
在论坛里看到使用4017数字集成块扩展io口的,不知道这个手柄的原理及使用方法和它是不是一样的,那应用如何识别连发及同时按下多个键呢?
手柄不没回来,所以问题问的很乱,请见谅,{:soso_e100:} {:soso_e130:} !!
本帖最后由 小燕子神飞 于 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
希望对你有帮助.
1、哈哈,谢谢了,程序大概看懂了,程序虽不长,却是精华,等手柄回来再仔佃研究。
2、可以告诉我d和cp、RESET和下面那个线对应吗?我在网上看别人的拆机是这样的
1黄 2红 3白 4蓝 5棕
+5V GND LATCH CLK DATA
3、蜘蛛侠挺有意思的,等有机会也做一个试试。
自己来顶一下,哈哈!还没解决,线序总是找不到!试不出来呀! 终于找到了,还弄坏了一个手柄,发上来给需要的人参考。
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 连续同上
上位机用vs2010 c# 主要功能:
串口通讯,
接收数字数据
将数字数据转为字串数据
根据数据模拟按键。
这一块没有好的思路,写的很乱,请高手改改吧。
直接运行程序: 要vs2010的库。
玩森林冰火人:left左,right右,a跳,可以用组合按。
下面的是c#源代码:
好帖子。很有意思。:)
页:
[1]