Arduino

Ligando um teclado PS2 ao Arduino

Escrito por: ­ 9 de out de 2016 ­ 5.364 views

Muitos projetos feito com o Arduino (os mais legais), necessitam captar entrada de dados. Normalmente para cada entrada, um pino é utilizado e caso você não esteja utilizando o Arduino Mega, sua opções começam a ficar mais limitada.
A entrada de dados, pode ocorrer através de um botão (táctil – push button), um sensor de toque (touch sensor), sensor de presença (ultrassônico ou infravermelho),um LDR (Light-Dependent Resistor – sensor fotovoltaico – sensor de luz), etc…

Caso você tenha um teclado antigo, com conexão PS2 será possível expandir a capacidade do seu Arduino. Utilizando somente 2 pinos (Clock e Data) + Ground e 5v, é possível trabalhar com até 209 teclas (incluindo funções com Shift e Alt Gr).

Nós modificamos a biblioteca (library) da equipe do PJRC para o teclado mais utilizado no Brasil, o ABNT-2.

A biblioteca (library) do PS2Keyboard desenvolvida pelo pessoal do PJRC e poderá ser baixada aqui.

A biblioteca modificada está disponível em nossa área de download.


Agora vamos ao que interessa:

O que você vai precisar:

1 conector PS2 – o nosso extraímos de uma placa mãe antiga.
4 fios para conexão (somente para o teclado)
1 placa Arduino  ** A Conexão varia conforme a placa.
IDE do Arduino


Identificando as portas:

Primeiramente você deverá identificar as portas do seu conector:

teste_Continuidade

 

Cada entrada deverá ser identificada com sua saída equivalente.
Uma maneira simples de saber qual é a porta correta é através do teste de continuidade do multímetro.
Através dessa função, quando a ponta de prova estiver no local correto ele soará um apito indicado a continuidade.

Exemplo:
Coloque uma ponta de prova do multímetro em 2 e a outra em 1. Sendo a mesma, uma informação sonora será ouvida.

 

Uma vez identificada, usaremos somente as 4 portas indicadas abaixo:

Ps2 Conexao


Conectando ao Arduino/Genuino:

A conexão é muito simples, porém atenção ao tipo de Arduino que você utiliza (veja tabela abaixo).

A Placa UNO, por exemplo, consegue receber os dados do Clock somente através dos pinos 2 e 3, o Duemilanova, em todos os pinos, exceto o 13. Esses pinos são conhecidos como IRQ (Interrupt Request).

Veja Tabela abaixo:

Arduino Pinos IRQ – Interrupção
Uno, Nano, Mini e outras placas baseada no 328 2, 3
Mega, Mega2560, MegaADK 2, 3, 18, 19, 20, 21
Micro, Leonardo e outras placas baseada no 32u4 0, 1, 2, 3, 7
Zero todos os pinos digitais, exceto 4
MKR1000 Rev.1 0, 1, 4, 5, 6, 7, 8, 9, A1, A2
Duemilanove todos os pinos digitais, exceto 13
101 todos os pinos digitais

Fonte: https://www.Arduino.cc/en/Reference/AttachInterrupt


Veja os caracteres que nós mapeamos para uso do teclado ABNT2.

Arduino Serial

IDE Arduino com os caracteres mapeados

Posição das teclas mapeadas no array da library:

teclado_para_array


Programando a IDE do Arduino:

Uma vez que o Arduino esteja conectado ao teclado, é necessário instalar o programa de comunicação:
A biblioteca precisa já estar instalada na pasta equivalente (antes de abrir a IDE).

#include <PS2Keyboard.h>

/*  PS2Keyboard library example
  
  PS2Keyboard now requries both pins specified for begin()

  keyboard.begin(data_pin, irq_pin);
  
  Valid irq pins:
     Arduino Uno:  2, 3
     Arduino Due:  All pins, except 13 (LED)
     Arduino Mega: 2, 3, 18, 19, 20, 21
  
  for more information you can read the original wiki in arduino.cc
  at http://www.arduino.cc/playground/Main/PS2Keyboard
  or http://www.pjrc.com/teensy/td_libs_PS2Keyboard.html
  
  Like the Original library and example this is under LGPL license.
  
  Modified by Cuninganreset@gmail.com on 2010-03-22
  Modified by Paul Stoffregen <paul@pjrc.com> June 2010
  Modified by Edson Sobreira <edson.sobreira@gmail.com> October 2016
*/

#include <PS2Keyboard.h>

const int DataPin = 8;
const int IRQpin =  2;
int led = 5;           // the pin that the LED is attached to
int b = 0;    // how bright the LED is
int f = 5;    // how many points to fade the LED by

PS2Keyboard keyboard;

  void setup() {
  pinMode(5, OUTPUT);
  delay(1000);
  keyboard.begin(DataPin, IRQpin);

//Selecione o seu teclado - não selecionar nenhum = Teclado US. Select your keyboard. Not selecting = US keyboard
//keyboard.begin(DataPin, IRQpin, PS2Keymap_French);
  keyboard.begin(DataPin, IRQpin, PS2Keymap_Brazil  );
//keyboard.begin(DataPin, IRQpin, PS2Keymap_German  );

  Serial.begin(9600);
  Serial.println("Keyboard Test Hackeduca:");
}

void loop() {
  if (keyboard.available()) {
    
    // read the next key
    byte c = keyboard.read();
    if (c == PS2_ENTER) {
      Serial.println();
    } else if (c == PS2_TAB) {
      Serial.print("[Tab]");
    } else if (c == PS2_ESC) {
      Serial.print("[ESC]");
    } else if (c == PS2_PAGEDOWN) {
      Serial.print("[PgDn]");
    } else if (c == PS2_PAGEUP) {
      Serial.print("[PgUp]");
    } else if (c == PS2_LEFTARROW) {
      Serial.print("[Esquerda]");
    } else if (c == PS2_RIGHTARROW) {
      Serial.print("[Direita]");
    } else if (c == PS2_UPARROW) {
      Serial.print("[Cima]");
    } else if (c == PS2_DOWNARROW) {
      Serial.print("[Baixo]");
    } else if (c == PS2_DELETE) {
      Serial.print("[Del]");
  
  //Teste para ligar o LED no Pino 04 após tecla DEL
  //Test to turn  a LED on when keystroke 'a' or 'A' is pressed
    } else if (c == 'a') { // LED will be on for 1 second - LED irá ligar por 1 segundo
      Serial.write(c); 
      digitalWrite(led, HIGH);
      delay(1000);
      digitalWrite(led, LOW);

    } else if (c == 'A') {// LED irá piscar 10 vezes - LED will blink 10 times
      Serial.write(c); 
      for (int l=1; l<=10; l=l+1) {
      digitalWrite(led, HIGH);
      delay(100);
      digitalWrite(led, LOW); 
      delay(100);
    }

    } else if (c== 225) {// LED irá fazer um efeito Fade e depois apagar - LED will fade until max and turn off
      Serial.write(c); 
      for (int b = 0; b <= 255; b++) {
      analogWrite(led, b);
      delay(40);
    }
      analogWrite(led, 0);
    } else {
      
      // otherwise, just print all normal characters
      Serial.write(c);
    }
  }
}

No exemplo que fizemos, ocorrerá o seguinte:

Pressionando a tecla ‘A’ o LED irá acender conforme abaixo:

‘a’ – LED irá piscar, permanecendo aceso por 1 segundo.
‘A’ [Shift + a] – LED irá piscar por 10 vezes antes se de apagar
‘á’ [Alt Gr + a] – LED irá fazer um FADE até 255 (pino PWM) e depois se apagará.


Este é um bom exemplo do uso dessa biblioteca, onde uma única tecla se transforma em uma combinação com 3 funções.


Esquema de ligação do LED no Arduino:

 

conexao_arduino_teclado

 

Não deixe de compartilhar conosco o seu projeto!

print
Previous Post Next Post

Você também pode gostar / You Might Also Like

8 Comments

  • Reply gladson barroso 1 de jan de 2017 at 12:00

    como faço para usar as teclas F1 F2 e etc ?

    • Reply Edson Sobreira 3 de jan de 2017 at 08:32

      As teclas F1, F2, etc… são identificadas como PS2_F1, PS2_F2, etc…
      Exemplo:

      } else if (c == ‘PS2_F1’) {// LED irá piscar 10 vezes – LED will blink 10 times
      Serial.write(c);
      for (int l=1; l<=10; l=l+1) { digitalWrite(led, HIGH); delay(100); digitalWrite(led, LOW); delay(100); }

      Na library disponível para download também está disponível essa informação.

      Se inscreva em nosso site para receber novidades

  • Reply gladson barroso 3 de jan de 2017 at 17:27

    obrigado!!

  • Reply Helder Ferreira 24 de nov de 2017 at 06:36

    Este programa apaga a informação? eu experimentei um parecido num arduino uno e o clicava em apagar no (backspace) e aperecia (DEL) em vez de apagar.

    • Reply Edson Sidnei Sobreira 24 de nov de 2017 at 08:48

      Olá!
      A qual informação você se refere?
      A ideia desta biblioteca é transformar um teclado em múltiplos botões para serem utilizados em um projeto com Arduino.

  • Reply joao 20 de set de 2018 at 14:12

    ele lê mais de uma tecla ao mesmo tempo?

  • Leave a Reply

    Show Buttons
    Siga-nos no Facebook
    Siga-nos no Twitter
    Siga-nos no Google Plus
    Siga-nos no Pintrest
    Siga-nos no Youtube
    Siga-nos no Scratch
    Hide Buttons
    Top
    HackEduca