【问题标题】:Arduino Bluetooth HID NES controller coding keypresses in CC中的Arduino蓝牙HID NES控制器编码按键
【发布时间】:2013-04-02 23:24:06
【问题描述】:

我将一个连接到 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);
}

【问题讨论】:

  • 你在 Mac 上用什么编程?

标签: c controller bluetooth arduino hid


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    就像@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-21
      • 1970-01-01
      • 1970-01-01
      • 2020-07-25
      • 2016-08-28
      • 2012-12-19
      • 2016-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多