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

17 Comments

  1. bom dia
    eu não estou conseguindo receber o dado do teclado poderia me ajudar ??
    instalei a bliblioteca.
    coloquei o programa no arduino.
    abri a serial port e não recebo nada digitado por mim

  2. Olá, Paulo.

    Sabe me dizer como eu faço uso do teclado numérico? Como estariam representados na biblioteca?

    Obrigado.

  3. Olá Paulo,
    eu fiz esta conversão descrita no tuto, funcionou perfeitamente para um teclado normal, seja ele ps2 ou USB, porém não consegui fazer ele funcionar com o teclado numérico USB. Sabe dizer se tem alguma maneira, ou porque nao funciona?
    Obrigado!

  4. Cara, funcionou certinho, mas queria que o dado lido fosse jogado em uma caxa de texto qualquer, ou bloco de notas por exemplo, e não no serial monitor, pode me ajudar??

    vlw.

    1. Oi Renato,
      ok neste caso você precisa interfacear o Arduino via Serial com uma linguagem como Java, e fazer essa leitura normalmente e por fim escrever em um arquivo. Procure por java + arduino que irá encontrar tutoriais para interfaceá-los.

      Bons estudos!

  5. Boa noite Paulo!
    Achei bem interessante o tutorial…mas saberia me informar o porque o código da erro na linha:

    PS2Keyboard keyboard;

    Instalei a biblioteca certinho, mas não descobri o porque disso.
    Grato!

  6. poderia me falar se eu conectar um displai de cristal liquido, eu consigo ver oque eu digitei no teclado?
    estou começãndo agora nesta area

  7. O programa rodou certinho e escreve na serial tudo que digito no teclado …
    Pensei então o seguinte … Se eu tiver esse arduino conectado a outro arduino via bluettoth ( ou seja, se eu digito no arduino q tem o teclado ele escreverá na serial do outro arduino ) e aí será que eu consigo extrair esses valores da serial do segundo arduino e mandar via ps2 de um micro criando assim a experiência de um teclado sem fio via arduino ? As saídas analógicas me parece que retorna apenas de 0 a 255 .. como enviar os caracteres reais a entrada ps2 do micro que esta ligado ao arduino receptor ?

Leave a Reply