ELECT 21: Connectar un teclat PS2 a l'Arduino

De wikijoan
Salta a la navegació Salta a la cerca

La idea és connectar un teclat PS2 a l'Arduino, i escriure per la pantalla de l'ordinador allà que vaig escrivint en el teclat.

Exemples de connectar un teclat a l'Arduino són.

Aquest és un pas previ per connectar el Arduino al HTC Dream, i aconseguir un sistema autònom d'escriptura i presa d'apunts: teclat extern - arduino - HTC Dream.

Importar la llibreria PS2Keyboard.h

To install A LIBRARY, unzip the library to a sub-directory of the libraries sub-directory of your Arduino sketchbook directory (shown in the Arduino preferences dialog). If this is the first library you've installed, you'll need to create the libraries directory. After unzipping the library, (re-)launch the Arduino environment; you should see the library in the Import Library menu.

S'ha de descomprimir el fitxer zip de la llibreria i copiar el contingut dins de hardware/libraries. Veiem que el nom de la carpeta coincideix amb el nom del fitxer .h.

To use an existing library in a sketch, go to the Sketch menu, choose "Import Library", and pick from the libraries available. This will insert one or more #include statements at the top of the sketch and allow it to use the library.

Because libraries are uploaded to the board with your sketch, they increase the amount of space it takes up. If a sketch no longer needs a library, simply delete its #include statements from the top of your code.

Copio el codi de http://www.arduino.cc/playground/Main/PS2Keyboard, i compilo. Error de compilació:

error: ‘byte’ does not name a type

és una mica complicat aquest error, però l'he solucionat instal.lant una altra llibreria més actualitzada: PS2Keyboard_014.zip en comptes de PS2Keyboard_002.zip.


En el Arduino Mega les interrupcions estan configurades de la següent manera:

External Interrupts: 2 (interrupt 0), 3 (interrupt 1), 18 (interrupt 5), 19 (interrupt 4), 20 (interrupt 3), and 21 (interrupt 2). These pins can be configured to trigger an interrupt on a low value, a rising or falling edge, or a change in value. See the attachInterrupt() function for details.

En el meu codi fico

#define DATA_PIN 53

i això vol dir que utilitzaré l'entrada digital 53 del Arduino Mega.

Les connexions del connector PS2 estan ben explicades a http://en.wikipedia.org/wiki/PS/2_connector. Es mostra també el color del cable segons el connector que jo tinc:

Pin 1 	+DATA             Vermell
Pin 2 	Not connected
Pin 3 	GND               Taronja  
Pin 4 	Vcc               Negre 
Pin 5 	+CLK              Marró
Pin 6 	Not connected 

però compte amb el dibuix!! Mirant el connector femella:

6  ||  5
4      3
  2  1

és a dir, que el dibuix de la web que segueixo està molt mal explicat.

Ja ho tinc! Aleshores el CLK (marró) es connecta al pin3 (PWM), que es correspon a la interrupció; i el DATA (vermell) es connecta al PIN 53 digital. Compte! perquè només funcionen les tecles numèriques, ENTER i ESC.

#include <PS2Keyboard.h>

#define DATA_PIN 53
PS2Keyboard keyboard;

void setup() {
  keyboard.begin(DATA_PIN);

  Serial.begin(9600);
  Serial.println("hi");
  delay(1000);
}

void loop() {
  if(keyboard.available()) {
    byte dat = keyboard.read();
    byte val = dat - '0';

    if(val >= 0 && val <= 9) {
      Serial.print(val, DEC);
    } else if(dat == PS2_KC_ENTER) {
      Serial.println();
    } else if(dat == PS2_KC_ESC) {
      Serial.println("[ESC]");
    } 
  }

}

llibreria PS2KeyboardExt

PS2KeyboardExt is an extension of the original PS2Keyboard library. It works on top of the original library to provide the following additional features:

   * Support for letter, punctuation and additional function keys
   * Backspace
   * Limited "shift" support through caps lock (see Functionality for more information)
   * Additional functions for dealing with input 

Aquesta llibreria no m'ha acabat de funcionar. Errors de compilació.

2a extensió: PS2KeyboardExt2

http://www.arduino.cc/playground/Main/PS2KeyboardExt2

S'utilitza una nova versió dels fitxers PS2Keyboard.cpp i PS2Keyboard.h (encara no està com a llibreria independent).

Ara ja puc utilitzar totes les lletres, majúscules, minúscules,... el que no puc fer encara és accents.

#include <PS2Keyboard.h>

// Simple test program for new PS2Keyboard library
// Connect a PS2 keyboard to pins 3 & 4 (CLK and DATA respectively) and supply 5V to the keyboard
// For examples, see here: http://www.arduino.cc/playground/ComponentLib/Ps2mouse
// or                here: http://www.beyondlogic.org/keyboard/keybrd.htm
// That second article is a great place to start if you want to understand whats going on
//
// When you've compiled the code and uploaded it to the board, start a serial monitor at
// 9600bd.  Then press keys on your PS2 keyboard (the one connected to Arduino, not the one
// connected to your computer!) Try using <shift>, <ctrl> and <alt> keys
// and check that the caps_lock key sets the caps_lock light.
// Pressing <esc> key should reset the keyboard and you should see all 3 lights go on briefly.

#define KBD_CLK_PIN  3
#define KBD_DATA_PIN 53

PS2Keyboard keyboard;

void setup() {
  keyboard.begin(KBD_DATA_PIN);

  Serial.begin(9600);
  delay(1000);
}

#define is_printable(c) (!(c&0x80))   // don't print if top bit is set

void loop() {

  if(keyboard.available()) {

    // reading the "extra" bits is optional
    byte   extra = keyboard.read_extra(); // must read extra before reading the character byte
    byte       c = keyboard.read();

    boolean ctrl = extra & 1;  // <ctrl> is bit 0
    boolean  alt = extra & 2;  //  <alt> is bit 1

    if (ctrl) Serial.print('^');
    if (alt)  Serial.print('_');

    if      (c==PS2_KC_UP)      Serial.print("up\n");
    else if (c==PS2_KC_DOWN)    Serial.print("down\n");
    else if (c==PS2_KC_BKSP)    Serial.print("backspace\n");
    else if (c==PS2_KC_ESC)   { Serial.print("escape and reset\n"); keyboard.reset(); }
    else if ( is_printable(c) ) Serial.print(c);   // don't print any untrapped special characters
  } 
}


creat per Joan Quintana Compte, setembre 2009