弘毅 发表于 2011-11-12 13:17:31

NES手柄接Gameduino

英文原文地址:
http://www.artlum.com/gameduino/nes.html

NES手柄是比较常见的用来连接Gameduino的手柄。有方向键(四方向)、START键、SELECT键、A键、B键。



手柄原理
NES手柄通过串行方式和主板进行通信。Data线串行发送数据。另外的几根线提供电源和控制。(用的4201串转并移位芯片)

接口图



GND         地线
CLOCK       时钟线,一个上边沿发送一位数据
STROBE   使能(触发),由高变低的时候,按键数据读入4201
DATA         数据线
VCC         电源线,5V供电

第一步 确定线序




我拿到的线结论如下


+5VRed
GNDBrown
STROBEBlack
CLOCKYellow
DATAOrange


第二部 连线到Arduino







第三步 编写代码


[*]使能STROBE
[*]获取一个按键数据
[*]CLOCK由低变高
[*]获取下一个数据
[*]LOOP到最后一个
[*]通过STROBE 线Disable芯片
代码如下// Pin definitions - where the wires are connected
#define NES_DATA A0
#define NES_STROBE A1
#define NES_CLOCK A2

// Configure the Arduino pins for an NES controller
Joystick::Joystick()
{
pinMode(NES_DATA,INPUT);   digitalWrite(NES_DATA,HIGH);
pinMode(NES_STROBE,OUTPUT);digitalWrite(NES_STROBE,HIGH);
pinMode(NES_CLOCK,OUTPUT);   digitalWrite(NES_CLOCK,HIGH);
}

// Read the next button
static byte readNesBit(byte button)
{
const bool b = (digitalRead(NES_DATA)==LOW);
digitalWrite(NES_CLOCK,LOW);
digitalWrite(NES_CLOCK,HIGH);
return (b)? button: 0;
}

// Read complete controller state
void Joystick::read()
{
...
digitalWrite(NES_STROBE,LOW);
buttons= readNesBit(buttonA);
buttons |= readNesBit(buttonB);
buttons |= readNesBit(buttonSelect);
buttons |= readNesBit(buttonStart);
dpad= readNesBit(0x01);
dpad |= readNesBit(0x02);
dpad |= readNesBit(0x04);
dpad |= readNesBit(0x08);
digitalWrite(NES_STROBE,HIGH);
}
页: [1]
查看完整版本: NES手柄接Gameduino