Der Knopf
Posted on Mi 08 Mai 2019 in Computer & Electronics
Dies ist ein re-Post eines Artikels, den ich im Juni 2015 ursprünglich auf unserem CE&PP Techblog veröffentlicht hatte. In letzter Zeit habe ich wieder ein paar ähnliche Knöpfe gebaut und so dachte ich mir ich ziehe das mal auf meinen neuen Blog um.
"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\phil) und schon tut der Knopf sein Werk.