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:
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.
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
thank you very good, helped a lot, excuse me English because I am Brazilian. att Fernando
cara’ como seria o esquema para ligar um teclado usb
..
Olá Pedro,
olha só o que achei: http://blog.petrockblock.com/2012/05/19/usb-keyboard-with-arduino-and-v-usb-library-an-example/
Nunca trabalhei desta maneira, mas parece funcionar muito bem!
Abraços
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
Oi Guilherme,
desculpe a demora. Já testou outros teclados??
Olá, Paulo.
Sabe me dizer como eu faço uso do teclado numérico? Como estariam representados na biblioteca?
Obrigado.
Oi Felipe,
quando você fala em teclado numérico, refere-se àqueles teclados usb?
Ou um “teclado membrana”?
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!
Oi Camilo, provavelmente este teclado numérico específico trabalhe com algum driver adicional, por isso não funciona.
Bons testes!
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.
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!
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!
Olá Allan,
tente baixar a última versão da biblioteca aqui: http://playground.arduino.cc/Main/PS2Keyboard
Lembre-se sempre de reiniciar a IDE para que tenha efeito ok?
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
Oi Leandro, sim, você pode fazer isso desde que o software leia os dados do teclado e insira no display lcd.
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 ?
Nunca testei Fernando, mas me parece que esta biblioteca faz o que você precisa: https://www.arduino.cc/en/Reference/MouseKeyboard