Montag, 1. Juni 2015

Der Knopf™

"Mal schnell den Knopf drücken" ist zum geflügelten Wort bei uns in der Abteilung geworden, wenn jemand meint, dass eine zuvor sauber programmierte Analyse ja quasi von alleine durchläuft. Das stößt nicht immer auf Gegenliebe bei denjenigen, die "nur mal den Knopf drücken" müssen und so habe ich beschlossen, das Thema aufzugreifen. Wörtlich.

Ein Knopf musste also her, der automatisch was startet. In der Bastelkiste hatte ich noch mehrere AVR USB-Sticks, wie diesen:
Hat beim netten Chinesen auf eBay nur 3,50 oder so gekostet und ist eine tolle Spielwiese: AT90usb162 Microcontroller, ein Taster, zwei LEDs – was will man mehr? Das Tasterchen entsprach aber nun gar nicht meinen eher plakativen Vorstellungen, also habe ich den USB-A Stecker entfernt und durch ein langes USB-Kabel ersetzt. An den Taster habe ich zwei Schaltdrähte drangelötet und an den schließenden Taster eines Pilztasters geklemmt. Das Ganze dann mit doppelseitigem Klebeband im Innenleben fixiert und mit Kabelbinder und etwas Sugru die Zugentlastung gebastelt:
Gehäuse wieder zusammenschrauben und fertig ist das Prachtstück:
Das sieht doch schon mal gut aus. Nun noch Firmware schreiben. Auch das war recht einfach. Ich habe als Startpunkt ein Stück Code für den Teensy verwendet, der demonstriert, wie man ein USB-HID device programmiert und das einfach nach meinen Bedürfnissen angepasst. Hier das Hauptprogramm:

/*
 *  DER KNOPF
*/
#include <avr/io.h>
#include <util/delay.h>
#include "usb_keyboard.h"

#define CPU_PRESCALE(n)    (CLKPR = 0x80, CLKPR = (n))

int main(void){
    uint8_t lock; // locking flag
    CPU_PRESCALE(0);

    DDRD &= ~(1<<PD7);
  // configure PD7 as input
    PORTD |= (1<<PD7);
  // turn on pull-up
    usb_init();
    while (!usb_configured()); // wait for host
    _delay_ms(1000);    //  sleep 1 more second, just in case

    lock = 0; // unlock key
    // job loop
    while (1) {
        if ( !(PIND & (1 << PIND7)) ){
            // key pressed
            if ( !lock ) {
                lock = 1; // lock key

                // type command
                usb_keyboard_press(KEY_R, KEY_LEFT_GUI);
                _delay_ms(300); // wait for dialog to open
                usb_keyboard_press(KEY_D, 0);
                usb_keyboard_press(KEY_E, 0);
                usb_keyboard_press(KEY_R, 0);
                usb_keyboard_press(KEY_K, 0);
                usb_keyboard_press(KEY_N, 0);
                usb_keyboard_press(KEY_O, 0);
                usb_keyboard_press(KEY_P, 0);
                usb_keyboard_press(KEY_F, 0);
                usb_keyboard_press(KEY_PERIOD, 0);
                usb_keyboard_press(KEY_B, 0);
                usb_keyboard_press(KEY_A, 0);
                usb_keyboard_press(KEY_T, 0);
                usb_keyboard_press(KEY_ENTER, 0);
            }
        } else {
            // key released
            lock = 0; // unlock key
        }
        _delay_ms(100); // delay for debouncing
    }
}


Steckt man das Ding nun an den Rechner, meldet sich der Knopf als Human Interface Device an - konkret behauptet er eine Cherry Tastatur zu sein (kann man in usb_keyboard.c konfigurieren). Wenn man ihn drückt, "tippt" er dann zunächst  Win+R (also "run command" unter Windows) und danach "DERKNOPF.BAT". Nun muss man also nur noch dafür sorgen, dass ein batch File dieses Namens im Pfad liegt (z.B. c:\Benutzer\philipp\) und schon tut der Knopf sein Werk.

Keine Kommentare:

Kommentar veröffentlichen