Arduino 键盘矩阵示例? (青少年杜伊诺)
Arduino keypad matrix example? ( teensyduino )
我是初学者,使用带有 Teensy 3.2 板的 Arduino 并将其编程为 USB 键盘。
我有两个 4 键薄膜开关。它们的按钮触点位于引脚 1-8 上,第 9 引脚将两个薄膜开关的 "ground" 线或任何它的真实名称焊接在一起;完成电路的线路。
基本上,当您按下按钮时,它们应该分别简单地键入 "a, b, c..."。有人告诉我我需要为此使用矩阵。
我正在寻找一个示例,说明如何编写有效支持一个 row/9 列行的键盘矩阵(反之亦然?)我一直无法在线找到该解决方案。
到目前为止我只有这段代码,当按下第二个引脚上的按钮时,它会发送大量 "AAAAAAAAAAAAAAAA" 击键。
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 行键盘不是矩阵。或者更好,从技术上讲,它可以被认为是一个矩阵,但是......矩阵键盘是这样的:
看到了吗?为了扫描这个你必须
- 将第 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;
当然需要在loop
函数外声明oldValue
,在main中初始化为HIGH
。
使用此代码,您不会收到大量的“A”,但是每次按下按钮时您都会看到大约 5-10 个“A”。为什么?因为按钮的弹跳。这就是去抖动技术的用途!
我建议您查看 class Bounce2
以获得易于使用的 class 按钮。如果你更喜欢一些代码,我为另一个问题写了这个小代码:
#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
class 的原因(它会做类似这样的事情,但是,因为它全部包含在 class 中,您不需要为变量操心)。
我是初学者,使用带有 Teensy 3.2 板的 Arduino 并将其编程为 USB 键盘。 我有两个 4 键薄膜开关。它们的按钮触点位于引脚 1-8 上,第 9 引脚将两个薄膜开关的 "ground" 线或任何它的真实名称焊接在一起;完成电路的线路。
基本上,当您按下按钮时,它们应该分别简单地键入 "a, b, c..."。有人告诉我我需要为此使用矩阵。
我正在寻找一个示例,说明如何编写有效支持一个 row/9 列行的键盘矩阵(反之亦然?)我一直无法在线找到该解决方案。
到目前为止我只有这段代码,当按下第二个引脚上的按钮时,它会发送大量 "AAAAAAAAAAAAAAAA" 击键。
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 行键盘不是矩阵。或者更好,从技术上讲,它可以被认为是一个矩阵,但是......矩阵键盘是这样的:
看到了吗?为了扫描这个你必须
- 将第 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;
当然需要在loop
函数外声明oldValue
,在main中初始化为HIGH
。
使用此代码,您不会收到大量的“A”,但是每次按下按钮时您都会看到大约 5-10 个“A”。为什么?因为按钮的弹跳。这就是去抖动技术的用途!
我建议您查看 class Bounce2
以获得易于使用的 class 按钮。如果你更喜欢一些代码,我为另一个问题写了这个小代码:
#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
class 的原因(它会做类似这样的事情,但是,因为它全部包含在 class 中,您不需要为变量操心)。