Arduino jako USB klávesnice

Tímto článkem bych chtěl rozšířit text, který vyšel v únorovém čísle časopisu Praktická Elektronika (2/2012, vyšlo 6. 2. 2012). Článek se jmenuje Arduino jako IR přijímač a byl zaměřen na úplné začátečníky, kteří ještě nikdy s Arduinem nepracovali. Jako příklad jsem zvolil jednoduchý přijímač signálu z dálkových ovladačů. Rád bych tento příklad rozšířil a udělal z Arduina USB klávesnici, která při příjmu předem daného kódu z DO odešle do PC určitou klávesu.

Cílem je tedy vytvořit aplikaci, která přijme signál z DO a na základě toho pak odešle kód zmáčknuté klávesy. Pokud máte doma například počítač připojen k TV a pouštíte si na této sestavě filmy, budete si tak moct jednoduše vytvořit přijímač, kterým se bude dát tento PC ovládat.

Nejdříve si musíte vybrat dálkové ovládání a zjistit, jaké kódy vysílá. Tuto část jsem popsal ve zmíněném článku v Praktické Elektronice. Proto jenom krátce:

  • Stáhnout pro Arduino knihovnu IRremote (případně upravená verze pro Arduino IDE 1.0).
  • Nahrát do Arduina program ir-prijimac.ino, který najdete v tomto ZIP archivu.
  • Zapojit Arduino a IR přijímač podle schématu (ve zmíněném ZIP Archivu nebo z Praktické Elektronice).
  • V Arduino IDE otevřete Serial Monitor a postupně si zapište všechny kódy, které vyšlete z dálkového ovladače.

Jakmile budete mít toto hotovo, pak už jen stačí do Arduina nahrát program, který při přijmu určitého kódu DO odešle skrz rozhraní UART stisk určité klávesy. Kódy kláves USB klávesnice najdete v dokumentu  Universal Serial Bus HID Usage Tables (PDF, strana 53 kapitola 10 Keyboard/Keypad Page).

Zdrojový kód pro Arduino je velmi jednoduchý a přímočarý. Pro názornost jsem použil switch, kterým se rozhoduji, jaké tlačítko na DO bylo zmáčknuto a jakou klávesu na klávesnici odešlu. Původně jsem tímto ovládal přehrávač filmů mplayer.

#include

// Kódy kláves CTRL a SHIFT
#define KEY_LEFT_CTRL   0x01
#define KEY_LEFT_SHIFT  0x02
#define KEY_RIGHT_CTRL  0x10
#define KEY_RIGHT_SHIFT 0x20
// Pro počítače Mac pak ještě klávesa Command
#define KEY_COMMAND     0x08

// Instance třídy IRrecv.
// Přijímač je připojen k pinu 11.
IRrecv irrecv(11);

// Přijatá data se budou ukládat do proměnné 'results'.
decode_results results;

// Toto pole slouží jako buffer, který se vyplní
// kódy stisknutých kláves a odešle skrz Serial
// do USB.
uint8_t buf[8] = { 0 };

// Nastavíme sériové rozhraní a IR přijímač.
void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();
}

// V nekonečné smyčce budeme čekat na příjem
// kódu z DO. Pokud se nám kód povede rozpoznat,
// odešleme stisknutou klávesu.
void loop() {
  if (irrecv.decode(&results)) {
    if(results.decode_type != UNKNOWN)
      send_key(results.value);
    irrecv.resume(); // Začni přijímat další data.
  }
}

/**
 * Tato funkce odesílá stisknuté klávesy.
 * Jediný parametr funkce je přijatý kód z DO.
 * Podle toho, jaký kód byl přijat, vyplníme
 * buffer 'buf' a odešleme jej do PC.
 */
void send_key(unsigned long value) {
  switch(value) {
  // Tlačítko PLAY
  case 0x4CB92:
    buf[2] = 0x2C; // Klávesa mezerník
    break;
  // Tlačítko QUIT
  case 0xA90:
    buf[0] = KEY_COMMAND; // Klávesa Command
    buf[2] = 0x1A; // Klávesa W
    break;
  // Tlačítko FULLSCREEN
  case 0x2AB92:
    buf[2] = 0x09; // Klávesa F
    break;
  // Tlačíto VOLUME DOWN
  case 0xC90:
    buf[2] = 0x2D; // Klávesa -
    break;
  // Tlačítko SUBTITLES
  case 0x8CB92:
    buf[2] = 0x16; // Klávesa S
    break;
  default:
    return;
  }

  // Nejdříve odešleme stisk klávesy
  Serial.write(buf, 8);

  // Smažeme buffer a odešleme,
  // že klávesa byla uvolněna.
  buf[0] = 0;
  buf[2] = 0;
  Serial.write(buf, 8);

  delay(100);
}

Jakmile si tento zdrojový kód upravíte podle svých potřeb, nahrajte jej do Arduina a vyzkoušejte. Pokud zmáčknete na DO tlačítko, měli byste v Serial Monitoru Arduina vidět sekvenci nesmyslných znaků. To znamená, že vše funguje jak má a zbývá tedy poslední krok — změnit firmware mikrokontroléru ATMega8U2, který slouží jako UART-USB převodník. Potřebujeme totiž, aby se Arduino hlásilo počítači jako standardní HID zařízení, tedy jako klávesnice. Více o tomto kroku naleznete v minulém článku Arduino a USB a potřebný firmware pak najdete v článku Arduino UNO Keyboard (soubor Arduino-keyboard-0.3.hex).

A tím máme hotovo. Teď už stačí jenom Arduino připojit k PC, ten by si měl automaticky najít ovladače a rozpoznat jej jako klávesnici.

Otázky?
Pokud se vyskytl jakýkoliv problém, se kterým si nevíte rady, případně byste se chtěli zeptat na další podrobnosti, můžete tak  učinit na našem fóru pro otázky a odpovědi.