Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matrix Arduino键盘矩阵示例?(蒂恩西杜诺)_Matrix_Arduino_Custom Keyboard_Teensy - Fatal编程技术网

Matrix Arduino键盘矩阵示例?(蒂恩西杜诺)

Matrix Arduino键盘矩阵示例?(蒂恩西杜诺),matrix,arduino,custom-keyboard,teensy,Matrix,Arduino,Custom Keyboard,Teensy,我是一个初学者,使用Arduino和Teensy 3.2板,并将其编程为usb键盘。 我有两个4按钮薄膜开关。他们的按钮触点在引脚1-8上,第9个引脚将两个薄膜开关的地线焊接在一起,或者不管它的真实名称是什么;完成电路的线路 基本上,当你按下按钮,他们应该只是简单地键入a,b,c。。。分别地有人告诉我要用矩阵来做这个 我正在寻找一个如何编写一个键盘矩阵的示例,该矩阵有效地支持一行/9列,反之亦然?我一直无法在网上找到解决方案 到目前为止,我所拥有的只是这个代码,当按下第二个引脚上的按钮时,它会发

我是一个初学者,使用Arduino和Teensy 3.2板,并将其编程为usb键盘。 我有两个4按钮薄膜开关。他们的按钮触点在引脚1-8上,第9个引脚将两个薄膜开关的地线焊接在一起,或者不管它的真实名称是什么;完成电路的线路

基本上,当你按下按钮,他们应该只是简单地键入a,b,c。。。分别地有人告诉我要用矩阵来做这个

我正在寻找一个如何编写一个键盘矩阵的示例,该矩阵有效地支持一行/9列,反之亦然?我一直无法在网上找到解决方案

到目前为止,我所拥有的只是这个代码,当按下第二个引脚上的按钮时,它会发出大量的aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa按键

void setup() {
  // make pin 2 an input and turn on the 
  // pullup resistor so it goes high unless
  // connected to ground:
  pinMode(2, INPUT_PULLUP);
  Keyboard.begin();
}

void loop() {
  //if the button is pressed
  if(digitalRead(2)==LOW){
    //Send an ASCII 'A', 
    Keyboard.write(65);
  }
}

有人能帮忙吗?

首先,一排键盘不是矩阵。或者更好,从技术上来说,它可以被视为一个矩阵,但。。。矩阵键盘是这样的:

看到了吗?为了扫描这个,你必须

将行1拉至地面,同时使行2-4浮动 读取Col1-4的值。这些是开关1-4的值 将第2行拉至地面,同时使第1行和第3-4行保持浮动 读取Col1-4的值。这些是开关5-8的值 以此类推,适用于所有行

至于另一个问题,当按钮保持低位时,您正在打印A。你想要达到的是只在针的下降沿上打印A,理想情况下每压一次,所以

char currValue = digitalRead(2);
if((currValue==LOW) && (oldValue==HIGH))
{
    //Send an ASCII 'A', 
    Keyboard.write(65);
}
oldValue = currValue;
当然,您需要在循环函数之外声明oldValue,并在main中将其初始化为HIGH

使用此代码,您不会收到大量的“A”,但每次按下按钮时,您都会看到类似5-10个“A”。为什么?因为按钮的弹跳。这就是去抖技术的用途

我建议你看一下Bounce2类,为你的按钮创建一个易于使用的类。如果您喜欢一些代码,我为另一个问题编写了这个小代码:

#define CHECK_EVERY_MS 20
#define MIN_STABLE_VALS 5

unsigned long previousMillis;
char stableVals;
char buttonPressed;

...

void  loop() {
    if ((millis() - previousMillis) > CHECK_EVERY_MS)
    {
        previousMillis += CHECK_EVERY_MS;
        if (digitalRead(2) != buttonPressed)
        {
            stableVals++;
            if (stableVals >= MIN_STABLE_VALS)
            {
                buttonPressed = !buttonPressed;
                stableVals = 0;

                if (buttonPressed)
                {
                    //Send an ASCII 'A', 
                    Keyboard.write(65);
                }
            }
        }
        else
            stableVals = 0;
    }
}
在这种情况下,不需要检查前一个值,因为函数只有在状态更改时才已经到达一个点


但是,如果必须对更多按钮使用此选项,则必须复制整个代码并使用更多stableVals变量。这就是我建议您使用Bounce2类的原因。它可以做类似的事情,但是,由于它都包装在一个类中,所以您不需要担心变量。

啊,对不起,习惯的力量我习惯使用一个名为easy AVR的键盘映射器,它可以为您创建一个矩阵。当我使用代码试图一个按钮一个按钮地设置时,它永远不会正常工作。例如,我刚才使用了你的第二套代码。我至少有5个薄膜开关触点中的4个连接,以使一个按钮注册,有时当我从引脚2移除一个按钮时,我需要按下按钮以键入字符,甚至对我来说没有任何意义。即使尝试附加一个单独的双叉瞬时按钮来输入字符,也无法处理这样的代码:对不起,我不明白问题出在哪里。现在我了解的是,您正在尝试模拟键盘,但我建议您更改键盘;到序列号。打印“A”;要了解真正的问题是什么,以及当一个按钮连接到一个pin时,它不能像您所希望的那样工作。在我的代码中,它的工作方式应该是,当你按下按钮时,它只发送一个a,忽略反弹。您收到了什么?我尝试更改为串行,但在这两种情况下都不显示任何内容。我尝试了许多配置,但都没有显示。如果您想在试验板上直观地看到它,下面是我正在考虑的最常见的配置。按钮的腿穿过底部,所以有4个叉,但只有2条真正的线,我曾经尝试过包括和排除这些,但没有从引脚2显示。我应该注意的是,我正在使用代码中的void设置和您建议的代码。还有一个矩阵最好,像这样使用它,理论上每个按钮占用2个引脚。你把引脚模式和数字读取功能改为从引脚1读取,对吗我想是因为按钮在引脚1上;很抱歉迟了答复。哇,我真傻:谢谢!