Clavier CopyPaste DIY ou le clavier parfait dans un monde où chaque ligne de code est déjà écrite

Beaucoup de gens qui commencent tout juste à apprendre la programmation posent la question - est-ce correct de copier-coller le code de quelqu'un d'autre? Étant donné qu'une personne est une créature paresseuse et que le temps d'un programmeur coûte de l'argent - la réponse, à mon avis, est évidente - oui. Mais à ceux qui portent ce principe au point d'absurdité, qui copient sans réfléchir ni comprendre , ainsi qu'à ceux qui rédigent un diplôme, cet essai est dédié à ce clavier et cet article. Et oui, ce clavier contient exactement deux boutons - copier-coller.

image

Sous la coupe sera une histoire sur l'assemblage et le firmware - nous verrons même le rebond d'un analyseur logique

J'ai donc décidé d'assembler ce clavier. J'ai décidé de commencer par les composants - digispark (une petite écharpe avec attiny85 et une liaison USB qui peut être insérée directement dans l'ordinateur), la laisser capturer les frappes et émuler le clavier. Maintenant, je n'ai pas de boutons - je n'ai pas de boutons mécaniques normaux pour le clavier, mais je n'ai pas envie d'attendre, alors prenons les boutons smd. Comme ceux-ci:

Boutons


Après avoir décidé des composants, nous allons maintenant dessiner le panneau avant pour l'imprimer sur une imprimante à l'avenir. Dimensions 45 mm * 21 mm, tailles de coussinets pour boutons 10 mm * 10 mm
Écrivez quelque chose en haut et en bas.

Il s'est avéré quelque chose comme ceci:



Le prochain problème est les boutons smd, donc ils doivent être soudés à une sorte de carte. Puisque l'empoisonnement de la planche pour une telle chose n'a pas de sens - nous rayons le textolite avec la lettre T:



La distance entre les centres des boutons est de 15 mm. Soudez-les sur une planche improvisée.

Nous soudons trois fils. Lorsque le bouton est enfoncé, il fermera l'un des fils les plus extérieurs au fil central.



Ensuite, prenez le premier morceau de plastique PVC qui vient et collez notre panneau avant dessus, et collez leurs buses sur les boutons. La seule chose que je n'ai pas prise en compte, c'est que la partie elle-même qui appuie sur la membrane tourne sur les boutons tactiles. Si vous souhaitez améliorer la conception - utilisez les commutateurs normaux .

Le résultat devrait être ce que vous avez vu au début de l'article. Un autre angle.



Ainsi, à l'aide d'appareils simples, vous pouvez créer un clavier à deux boutons, MAIS POURQUOI?


Nous connectons trois fils dans digispark.



Schéma du «clavier»



Ensuite, nous devons faire semblant digispark d'être un clavier et envoyer CTRL + C / CTRL + V en appuyant sur le bouton.

Donc, nous devons attraper le clic. Pour commencer, si vous connectez le fil central à + 5V et connectez les fils latéraux aux broches configurées pour l'entrée, alors lorsque le bouton est enfoncé, oui, il y aura 1 sur la broche, mais lorsque la broche n'est pas enfoncée, il interceptera les interférences et ne suivra pas ce qui est pressant, et quel obstacle. Ce problème est résolu étonnamment simple - vous devez tirer les broches au sol à travers une grande résistance (des dizaines d'ohms). En ouvrant la fiche technique sur le microcontrôleur, vous pouvez voir qu'à l'intérieur, vous pouvez allumer l'ascenseur, mais uniquement en VCC (+ alimentation). En fait, ce n'est pas un problème - il vous suffit de connecter la broche centrale à GND (masse) et d'inverser la logique de travail.

Vous pouvez l'imaginer de cette façon:



Mais il y a encore un problème. Nous vivons dans un monde imparfait où les boutons ont un contact mécanique.
Et il est imparfait. Et notre contrôleur est rapide - et il s'avère donc qu'au moment de la commutation, le bouton ne se ferme pas instantanément, mais sa résistance saute pendant quelques millisecondes - cela s'appelle le rebond. En raison du rebond, le contrôleur peut décider d'appuyer sur le bouton plusieurs fois, mais, par exemple, 10. Voici une illustration de ce phénomène sur Internet:



Mais ce n'est pas non plus intéressant! Peut-être que nous n'avons pas de rebond. Pour le découvrir, j'ai découvert un analyseur logique. Voyons maintenant ... Nous assemblons une configuration de test - un élévateur 10-com, 16 millions de mesures par seconde

Installation


On voit que le pressage a duré 0,1176 ms. On se rapproche du



moment de relâchement du bouton (surligné en rouge).



Sur le côté il y a quelques mesures des "émissions", et en tout le rebond a duré environ 0,1435 ms. Oui, je sais que cela ne suffit pas, mais cela vaut la peine de considérer que je n'ai que des boutons de la bande, les contacts n'ont pas encore eu le temps de s'oxyder ou de changer de forme. Et avec le temps, la situation ne fera qu'empirer. Comment gérer le rebond? Il existe trois façons principales:

  1. Déclencheur Schmidt + circuit RC - vous permet d'obtenir le signal parfait
  2. Circuit RC - vous permet de faire un glissement hors des émissions (signal augmentant en douceur)

Mais nous avons tout un microcontrôleur - et donc nous avons 3 méthodes disponibles: les retards
Une des façons de gérer le rebond est de vérifier si le bouton est toujours enfoncé après un certain rebond. S'il est implémenté par des retards, le code sera bloquant, mais comment le faire correctement peut être vu dans des centaines d'articles sur la lutte contre le rebond et l'arduino.

Nous avons donc réalisé que le bouton était enfoncé - et ensuite? Dites à l'ordinateur que CTRL + C / V est enfoncé.

Cela se fait à l'aide de la bibliothèque standard de digispark.

Le code résultant est sorti comme ceci:

#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);
    }
  }
}

Voici un projet en 3 heures je l'ai eu. N'ayez pas peur de copier le code de quelqu'un d'autre!

Copier et coller à partir d'un débordement de pile


All Articles