Categorie

Rimappare i tasti in Linux con xev e xmodmap

 

 

 

 

 

Sul mio vecchio notebook (un Medion della Microstar 😀 ) da quando ho eliminato Windows XP ed installato una distro (qualunque) di Linux ho sempre avuto un problemino con la tastiera: il pulsante “< / >” (maggiore/minore) non ha mai funzionato correttamente, ma ha sempre stampato i caratteri “ù / §“.

In un pc che utilizzo esclusivamente per la programmazione la cosa può risultare un po’ fastidiosa.

Vediamo come rimappare quel tasto (ma la guida rimane valida in generale).

In questo caso particolare il tasto “< / >”  è del tutto equivalente al tasto “ù / §“, quindi presumo che “a fine trattamento” anche il secondo tasto si comporterà come il primo, quindi niente più “ù” (nello specifico il fastidio è trascurabile).

Ci servono due programmi che vanno lanciati da terminale: xev e xmodmap (di norma si trovano già installati con il sistema operativo).

 

Apriamo un terminale e lanciamo:

$ xev

Si aprirà una piccola finestrella sopra il nostro terminale, tale finestrella è quella che deve essere selezionata per catturare gli eventi (viene selezionata di default all’avvio di xev).

Clicchiamo sul tasto incriminato “< / >”  e analizziamo il risultato:

Scopriamo due cose molto interessanti: al nostro tasto corrisponde il keycode 51 ed è associato il simbolo ugrave.

A questo punto possiamo anche chiudere xev (basta chiudere la finestrella bianca).

Adesso sempre nel terminale lanciamo:

$ man xmodmap

per capire un po’ meglio il tool xmodmap.
Quindi possiamo passare alla modifica vera e propria:

$ xmodmap -e "keycode shift 51 = less great"

cioè diciamo ad X di associare il simbolo “<“ al pulsante corrispondente al keycode 51 e il simbolo “>” al pulsante corrispondente al keycode 51 quando è premuto il modificatore shift.

La modifica ha subito effetto, ma non viene salvata per il riavvio successivo di X.

Per renderla definitiva occorre salvare la configurazione attuale in un file nella home utente:

$ xmodmap -pke &gt; ~/.Xmodmap

e quindi creare uno script particolare che viene eseguito all’avvio:

$ nano ~/.xinitrc

con il seguente contenuto:

xmodmap .Xmodmap

Salvare il file e riavviare.

Fonte: http://askubuntu.com/questions/24916/how-do-i-remap-certain-keys

Collegare un keypad a matrice ad Arduino

logo arduino

 

 

 

 

 

 

Componenti necessari:

  • Arduino
  • matrix keypad (il mio è un 4×4 a membrana, tipo questo).
  • 4 resistori di pull up da 10kΩ

Arduino e keypad matric

 

La libreria da utilizzare con arduino la trovate sul sito ufficiale: keypad matrix library

Il componente keypad matrix 4×4 per Fritzing l’ho creato modificando la versione 3×4 che si scarica da qui.

[UPDATE-20130731]:

Un classico esempio di utilizzo del tastierino e della libreria, il codice lo potete trovare anche qui.

Controllo accesso con password (la password viene testata automaticamente all’immissione dell’ultimo carattere, ma si può implementare  in mille altri modi):

/* @original file HelloKeypad.pde
|| @version 1.0
|| @original author Alexander Brevig
|| @editor Daniele Forti (aka willygroup)
||
|| @description
|| | Demonstrates use of the matrix Keypad library in "checking password".
|| #
*/
#include <Keypad.h>

const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};
byte rowPins[ROWS] = {5, 4, 3, 2}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {8, 7, 6}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

char password[5] = "1234";
char tempPassword[5];
int tempPasswordIndex = 0;
void setup(){
  Serial.begin(9600);
}

void loop(){
  char key = keypad.getKey();

  if (key){
    tempPassword[tempPasswordIndex] = key;
    tempPasswordIndex++;
    if(tempPasswordIndex>4)
    {
      tempPasswordIndex = 0;
      if(checkPassword())
      {
        Serial.println("Password corretta");
      }
      else
      {
        Serial.println("Password errata");
      }
    }
  }
  delay(250);
}

boolean checkPassword()
{
  if(strncmp(password, tempPassword, 4) == 0)
  {
    return true;
  }
  return false;
}