在已经编写了每一行代码的世界中,CopyPaste DIY键盘或完美的键盘

许多刚开始学习编程的人会问这个问题-复制粘贴别人的代码可以吗?鉴于一个人是个懒惰​​的人,而程序员的时间却要花钱-我认为答案很明显-是的。但是对于那些将此原则带到荒谬之处,不加思考或理解而抄袭的人,以及对写文凭的人来说,这篇文章都是专门针对此键盘和文章的。是的,此键盘仅包含两个按钮-复制和粘贴。

图片

削减将是关于组装和固件的故事-我们甚至还会看到逻辑分析仪的反弹

因此,我决定组装此键盘。我决定从组件开始-digispark(带有attiny85和USB绑定的小围巾,可以直接插入计算机),让它捕获击键并模拟键盘。现在,我没有按钮-键盘没有普通的机械按钮,但是我不想等待,所以让我们来看看smd按钮。像这些:

纽扣


确定了组件之后,现在我们将绘制前面板,以便将来在打印机上进行打印。尺寸为45mm * 21mm,按键垫尺寸为10mm * 10mm
在顶部和底部写一些东西。

结果是这样的:



下一个问题是smd按钮,因此需要将它们焊接到某种板上。由于为了这种事情而使板中毒没有意义-我们用字母T划伤纺织品,



按钮中心之间的距离为15mm。将它们焊接到临时板上。

我们焊接三根线。当按下按钮时,它将使最外面的一根导线闭合到中间一根。



接下来,拿起第一块PVC塑料,将我们的前面板粘在上面,然后将其喷嘴粘在按钮上。我唯一没有考虑的是,按压薄膜的部分本身在轻触按钮上旋转。如果要改进设计-请使用常规开关。

结果应该是您在本文开头看到的。另一个角度。



因此,借助简单的设备,您可以制作带有两个按钮的键盘,但是为什么呢?


我们在digispark中连接三根电线。



“键盘”的方案



接下来,我们需要使digispark假装成键盘,并通过按下按钮发送CTRL + C / CTRL +V。

因此,我们需要抓住点击。首先,如果您将中心线连接到+ 5V,并将侧线连接到配置用于输入的引脚,那么当按下按钮时,是的,引脚上将有1,但是当未按下该引脚时,它将捕获干扰并且无法追踪到什么。紧迫,这是一个障碍。解决这个问题的方法出奇的简单-您需要通过一个大电阻器(数十欧姆)将引脚拉到地。打开微控制器上的数据表,您可以看到它内部可以打开电梯,但只能打开VCC(+电源)。实际上,这不是问题-您只需要将中心引脚连接到GND(接地)并反转工作逻辑即可。

您可以这样想象:



但是还有另一个问题。我们生活在一个不完美的世界中,按钮具有机械接触。
而且他并不完美。而且控制器速度很快-事实证明,在切换按钮时并不会立即闭合,但其电阻会跳跃几毫秒-这称为反弹。由于弹跳,控制器可能会决定多次按下按钮,例如10。这是Internet上这种现象的例证:



但这也并不有趣!也许我们没有反弹。为了找出答案,我发现了一个逻辑分析仪。现在让我们看看...我们正在组装一个测试装置-10 com提升机,每秒1600万次测量

安装


我们看到按下持续了0.1176毫秒,大约是



按钮释放时刻(红色突出显示)



,侧面有一些“排放”的测量值,总颤动持续了约0.1435毫秒。是的,我知道这还不够,但是值得考虑的是,我只有胶带上的按钮,触点还没有时间氧化或改变形状。随着时间的流逝,情况只会恶化。如何应对弹跳?主要有三种方法:

  1. 施密特触发器+ RC电路-让您获得完美的信号
  2. RC电路-可让您滑出辐射(信号平稳增加)

但是我们有一个完整的微控制器-因此我们有3种可用的方法:延迟
处理跳动的方法之一是检查一定量的跳动后是否仍然按下按钮。如果通过延迟实现,则代码将被阻塞,但是如何正确执行此操作可以在数百篇有关反跳和arduino的文章中看到。

因此,我们意识到按下了按钮-接下来是什么?告诉计算机已按下CTRL + C / V。

这是使用digispark的标准库完成的。

结果代码如下所示:

#include "DigiKeyboard.h" // library for emulate keyboard
#define COPY 2 // copy button pin
#define PASTE 0// paste button pin
#define GND 1// center must be connected to ground
void setup() {
  pinMode(COPY, INPUT); // set pin to input
  digitalWrite(COPY, HIGH);// turn on pullup
  pinMode(PASTE, INPUT);
  digitalWrite(PASTE, HIGH);
  pinMode(GND, OUTPUT); // set pin to output
  digitalWrite(GND, LOW);// and set on pin GND
}


void loop() {
  // if something COPY or PASTE clicked
  if (!digitalRead(COPY) || !digitalRead(PASTE)) {
    delay(30); // wait(debounce)
    if (!digitalRead(COPY)) { // if copy still pressed send CTRL+C
      DigiKeyboard.sendKeyStroke(KEY_C , MOD_CONTROL_LEFT);
      delay(30);
    }
    else if (!digitalRead(PASTE)) {// if paste still pressed send CTRL+V
      DigiKeyboard.sendKeyStroke(KEY_V , MOD_CONTROL_LEFT);
      delay(200);
    }
  }
}

这是我在3个小时内得到的一个项目。不要害怕复制别人的代码!

从堆栈溢出复制和粘贴


All Articles