-1

我将一个连接到 Arduino mini pro (3.3v) 的 NES 控制器和一个蓝牙 HID 模块(类似于 rn-42 BlueSmirf)放在一起。我可以将它连接到我的 Macbook 并发送击键。

但是,它的作用就像是重复按下键而不是按住键。我需要它像键盘一样工作,但现在它每次通过循环(50ms)时都会按下一个键。我在这里先向您的帮助表示感谢!

Arduino代码:

const int buttonA = 2;//Button: A
const int buttonB = 3;//Button: B
const int buttonC = 4;//Button: Start
const int buttonD = 5;//Button: Select
const int buttonE = 6;//Button: Up
const int buttonF = 7;//Button: Down
const int buttonG = 8;//Button: Left
const int buttonH = 9;//Button: Right

...

void loop()
{
  if (digitalRead(buttonA) == LOW)      //pin is HIGH until a button is pressed
  {Serial.write('A');}
  if (digitalRead(buttonB) == LOW) 
  {Serial.write('B');}
  if (digitalRead(buttonC) == LOW) 
  {Serial.write('1');}
  if (digitalRead(buttonD) == LOW) 
  {Serial.write('2');}
  if (digitalRead(buttonE) == LOW) 
  {Serial.write('U');}
  if (digitalRead(buttonF) == LOW) 
  {Serial.write('D');}
  if (digitalRead(buttonG) == LOW) 
  {Serial.write('L');}
  if (digitalRead(buttonH) == LOW) 
  {Serial.write('R');}
  delay(50);
}
4

2 回答 2

0

就像@angelatlarge 所说,您的代码完全按照您的要求执行(请参阅他的回复了解原因)。

您的第一步可能应该是实现@angelatlarge 的建议:存储按钮的状态,并且仅在之前未按下且现在按下的情况下发送字符。对于一个按钮,它看起来像这样*:

const int buttonA = 2;
boolean wasAPressed = false;
boolean isAPressed  = false;

// ...

loop() {

    isAPressed = (digitalRead(buttonA) == LOW);
    if(!wasAPressed && isAPressed) {
        wasAPressed = true;
        Serial.write('A');
    } else if(wasPressed && !isAPressed){
        wasAPressed = false;
    }

    // ...
}

逻辑基本上很简单。我们有两个布尔变量,为您提供四种可能的选择。如果按钮没有被按下,现在是,保存状态 ( wasAPressed = true) 并发送字符。如果之前按下,但现在没有按下,则保存状态 ( wasAPressed = false)。在其余两种情况下,不要更改任何内容。

但是请注意,每次按下按钮 A 时,这只会发送一个“A”。如果要模拟长按,则必须在两侧添加额外的逻辑。例如,我已经确定“Ad”表示按下了A按钮( d**own),而“Au”表示释放了* A按钮( *u**p)。

// ...

isAPressed = (digitalRead(buttonA) == LOW);
if(!wasAPressed && isAPressed) {
    wasAPressed = true;
    Serial.write('Ad');
} else if(wasAPressed && !isAPressed){
    wasAPressed = false;
    Serial.write('Au');
}

// ...

然后,您计算机上的接收代码将读取第一个字符以了解我们在说的是谁,然后读取第二个字符以了解它是按下还是释放动作。最后,您必须找到分别模拟按键和按键释放所需的代码。

于 2013-04-03T10:05:32.957 回答
0

让您开始:您的程序正在按照您的指示进行操作。这是发生了什么:每次通过循环程序都会询问:按钮是否被按下?如果是,那么它会发送一个击键。

您需要做的是存储每个按钮的状态(即按钮是否被按下),可能存储在一个数组中。然后读取每个按钮,检查该按钮的状态是否与您存储的状态不同,如果发生了变化,则向蓝牙发送一些内容。在这种情况下,您需要将状态更新为按钮的新状态。

如果按钮状态未更改,则不发送任何内容(针对该按钮)。那将有你想要的行为。

于 2013-04-02T23:39:18.433 回答