Conectando um teclado PS/2 no Arduino

Exitem certas aplicações onde desejamos enviar uma grande quantia de dados do usuário para um microcontrolador. Um sistema de cadastro de usuários em uma Bina, por exemplo. Neste post, irei mostrar como é simples trabalhar com um teclado PS/2 no Arduino.

O conector PS/2

A origem do nome PS/2 vem do primeiro computador da IBM à usar este tipo de conectores[1]. Por seguirem o padrão dos conectores DIN (padronizado pelo instituto Alemão de padrões [2]), e serem menores, são conhecidos como mini-din [3]. Esse conector é menor que seu antecessor e muito mais sensível, portanto cuidado ao conectá-lo em sua placa mãe.

Este conector permite a conexão tanto de mouse quanto teclado. Aqui iremos trabalhar com o teclado apenas, mas o conceito para se trabalhar com mouse é o mesmo.

O circuito eletrônico

As conexões são bastante simples, não necessitando, além do conector ps/2, de nenhum componente externo extra. Como pode ser visto nas figuras abaixo:

Conector PS/2 para teclado ou mouse. Fonte – 4: http://www.pjrc.com/teensy/ td_libs_PS2Keyboard.html

Conexões teclado PS/2 e Arduino. Fonte – 5: http://nocommercialpotential.posterous.com/ interfacing-the-ps2-keyboard

O mais difícil em relação à parte eletrônica é conseguir um conector padrão PS/2. Retirei um de uma placa mãe com ajuda de uma estação de solda a vapor e soldei os 4 fios necessários. Abaixo vemos as conexões elétricas e o teste feito via Serial.

Arduino com soquete para teclado PS/2

Testes via Serial

A camada de software

O exemplo testado aqui está presente na biblioteca PS2Keyboard [4]. Alterei os pinos de conexão, sendo o pino 4 no DataPin e o pino 2 no IRQpin. Lembrando que o IRQ deve ser uma interrupção externa e no Arduino Duemilanove ou Uno pode ser usado o pino 2 ou 3 digital para esta função.

Abaixo o código fonte padrão usado para testes. As únicas linhas modificadas foram as de seleção dos pinos citados acima. A biblioteca utilizada e este código encontram-se disponíveis para download aqui.

/*  PS2Keyboard library example

  PS2Keyboard now requries both pins specified for begin()

  keyboard.begin(data_pin, irq_pin);

  Valid irq pins:
     Arduino:      2, 3
     Arduino Mega: 2, 3, 18, 19, 20, 21
     Teensy 1.0:   0, 1, 2, 3, 4, 6, 7, 16
     Teensy 2.0:   5, 6, 7, 8
     Teensy++ 1.0: 0, 1, 2, 3, 18, 19, 36, 37
     Teensy++ 2.0: 0, 1, 2, 3, 18, 19, 36, 37
     Sanguino:     2, 10, 11

  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  June 2010
*/

#include < PS2Keyboard.h >

const int DataPin = 4;
const int IRQpin =  2;

PS2Keyboard keyboard;

void setup() {
  delay(1000);
  keyboard.begin(DataPin, IRQpin);
  Serial.begin(9600);
  Serial.println("Keyboard Test:");
}

void loop() {
  if (keyboard.available()) {

    // read the next key
    char c = keyboard.read();

    // check for some of the special keys
    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("[Left]");
    } else if (c == PS2_RIGHTARROW) {
      Serial.print("[Right]");
    } else if (c == PS2_UPARROW) {
      Serial.print("[Up]");
    } else if (c == PS2_DOWNARROW) {
      Serial.print("[Down]");
    } else if (c == PS2_DELETE) {
      Serial.print("[Del]");
    } else {

      // otherwise, just print all normal characters
      Serial.print(c);
    }
  }
}

Conclusão

Como podemos perceber, é relativamente fácil receber dados do teclado com o Arduino, mas tome cuidado com as conexões do soquete PS/2, pois é fácil de se confundir ao trabalhar com ele. Lembre-se que o esquema elétrico mostra a pinagem do conetor fêmea (da placa mãe).

Repare que a biblioteca por padrão não implementa um teclado padrão ABNT2, mas parece-me ser possível sua adaptação, afinal ela já suporta 2 tipos de teclados: US e Alemão.

Agora você já pode fazer seu Arduino receber uma grande quantia de dados do usuário sem precisar de um computador!

Referências

[1] http://en.wikipedia.org/wiki/IBM_Personal_System/2

[2] http://en.wikipedia.org/wiki/Deutsches_Institut_f%C3%BCr_Normung

[3] http://en.wikipedia.org/wiki/Mini-DIN_connector

[4] http://www.pjrc.com/teensy/td_libs_PS2Keyboard.html

[5] http://nocommercialpotential.posterous.com/interfacing-the-ps2-keyboard

Para se aprofundar:

http://www.computer-engineering.org/ps2keyboard/

http://www.computer-engineering.org/ps2protocol/

http://www.practicalarduino.com/projects/ps2-keyboard-or-mouse

Comments

  1. By Fernando Sancho

    Responder

  2. By pedro

    Responder

  3. By guilhermepires@gmail.com

    Responder

  4. By FELIPE

    Responder

    • Responder

  5. By Camilo Leles

    Responder

    • Responder

  6. By Renato

    Responder

    • Responder

  7. By Allan Carniel

    Responder

  8. By lenadro luis

    Responder

    • Responder

  9. By Fernando

    Responder

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *