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:
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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
| /* 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 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
Para se aprofundar:
0 comentários:
Postar um comentário