Arduino + клавиатура

Клавиатура — весьма удобная вещь для ввода текста или другой информации. В некоторых проектах на Arduino это может пригодиться.
Самый распространенный тип: PS/2, его мы и будем подключать.

Если посмотреть на разъём типа «мама», который стоит на материнской плате ПК, то увидим такую картину: а второй, на штекере — «папа»

c0baace6fc

  • Pin 1 +DATA — Data
  • Pin 2 N/C — Not connected
  • Pin 3 GND — Ground
  • Pin 4 Vcc — +5 V
  • Pin 5 +CLK — Clock
  • Pin 6 N/C — Not connected

Второй нам собственно и нужен. Я подпаял к нему проводки и напрямую подключил к портам ардуино.

Untitled-Sketch_bb1

Протокол передачи данные не из замудренных:

wave2

 

Дергаем clock, отправляем пакет данные + старт и стоп биты.

ArduinoCC уже позаботились о бибилиотеке, поэтому велосипед изобретать нам не придется. Скачиваем PS2.ZIP, распаковываем и кладем в arduino-xx\libraries\. Загрузим простой пример:

При нажатии клавиш в COM порт будут поступать скан-коды. Формат данных об одной клавише будет таким:

1
2
3
4
0x5A //Нажали ENTER
..........
0xF0 //Отпустили
0x5A

Но читать коды клавиш не очень интересно 🙂 Можно сделать простенькое пианино  на основе этого, подключив еще динамик:

Untitled-Sketch_bb1

А вот и скетч:

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
#include <ps2.h>
 
#define note_len 200000
#define play_z 4000
#define play_c 3830
#define play_d 3400
#define play_e 3038
#define play_f 2864
#define play_g 2550
#define play_a 2272
#define play_b 2028
#define play_C 1912
 
unsigned char code;
 
PS2 kbd(7, 5);
 
void playTone(int note ) {
  long elapsed_time = 0;
  while (elapsed_time < note_len) {
    digitalWrite(9,HIGH);
    delayMicroseconds(note / 2);
    digitalWrite(9, LOW);
    delayMicroseconds(note / 2);
    elapsed_time += (note);
  }
}
 
void kbd_init() {
  char ack;
  kbd.write(0xff);
  ack = kbd.read();
  ack = kbd.read();
}
 
void setup(){
  Serial.begin(9600);
  pinMode(9,OUTPUT);
  kbd_init();
}
 
void loop() {
 
  code = kbd.read();
 
  if (code==0xF0) {
    code = kbd.read();
    code=0;
  }
 
  if (code==0x1C) {
    playTone(play_z); } else if (code==0x1B) {
    playTone(play_c); } else if (code==0x23) {
    playTone(play_d); } else if (code==0x2B) {
    playTone(play_e); } else if (code==0x34) {
    playTone(play_f); } else if (code==0x33) {
    playTone(play_g); } else if (code==0x3B) {
    playTone(play_a); } else if (code==0x42) {
    playTone(play_b); } else if (code==0x4B) {
    playTone(play_C);
  }
 
  Serial.println(code, HEX);
 
}

Теперь компилируем и записываем в мк. Если хотите, можете послушать.

Клавиши управления: «A» «S» «D» «F» «G» «H» «J» «K» «L»

Файлы проекта

Вы можите оставить комментарий, или поставить трэкбек со своего сайта.

2 комментария к “Arduino + клавиатура”