Infrarot-USB-Maus im Eigenbau
Aus BraLUG-Wiki
Inhaltsverzeichnis |
Motivation
Bei der Entwicklung des BLIT2008-Board ist eine Beispiel-Applikation erstellt worden, mit der es möglich ist, dieses Board als Infrarot-USB-Maus, welche mit einer handelsüblichen Infrarot-Fernbedienung gesteuert werden kann, zu verwenden. Da ich gerade etwas Zeit hatte, habe ich nun dieses Beispiel in einer, hardwareseitig abgerüsteten Variante, als eigene Baugruppe aufgebaut. Kernstück dieses Moduls ist diesmal ein ATtiny45, der für diese Funktion vollkommen ausreicht. Entstanden ist eine kleines kompaktes Modul, welches hier beschrieben werden soll.
Hardware
Schaltung
Grundlage der Schaltung ist das BLIT2008-Board gewesen. Unnötige Komponenten (z.B. LED, I²C- und ISP-Anschluss) wurden weggelassen. Der ATmega8 wurde durch einen ATtiny45 ersetzt. Die Schaltung wurde auf einer kleinen Lochrasterplatine aufgebaut. (Der ISP-Anschluss ist im Schaltbild noch enthalten, aber dann nicht einbaut worden. Siehe dazu auch weiter unten...)
Die Stromversorgung der Baugruppe erfolgt, wie bei USB-Mäusen üblich, über die USB-Schnittstelle.
Programmieradapter
Um nicht unnötig Platz auf der Platine zu verschwenden, ist auch auf den ISP-Anschluss, den man ja eigentlich zum Flashen des Programmes auf den Mikrocontroller benötigt, verzichtet worden. Vielmehr habe ich diese Idee für eine Art Adapter aufgegriffen, die ich mal durch Zufall beim Rumstöbern im Internet gefunden hatte. Auf obigen Bildern sieht man meine Umsetzung. Die Jumperstifte sind so angeordnet, dass sie auf den ATtiny aufgesteckt werden können und mit etwas Glück auch halten (;-)). Die entsprechenden Pins zum Programmieren des Mikrocontrollers (RESET, SCK, MISO, MOSI, Vcc und GND) sind zum Wannenstecker auf der anderen Seite geführt und dort so verdrahtet, dass hier die übliche Flash-Hardware angeschlossen werden kann.
Die ganze Geschichte ist etwas fummelig. Aber da es sich bei der IR-USB-Maus quasi um ein Fertiggerät handelt, was nicht ständig neu programmiert werden muss, ist es eine gangbare Lösung, um den Platz für den ISP-Stecker auf der Platine einzusparen. Natürlich hätte man auch einen Bootloader auf dem ATtiny installieren können, aber auch der muss erstmal im Flash installiert werden...
Fuse-Bits
Im Auslieferungszustand des ATtiny sind dessen Fuse-Bits auf 0xDF (High) und 0x62 (Low) gesetzt. U.a. ist damit die Taktquelle des Mikrocontroller auf den internen Oszillator eingestellt, was für obige Schaltung nicht brauchbar ist, weil ein externer 12MHz-Quarz die Taktversorgung übernehmen soll. Also müssen die Fuses, z.B. via avrdude, umgestellt werden. Mit folgendem Befehl kann man sinnvolle Werte (lfuse=0XEF; hfuse=0xDD) einstellen (als Programmieradapter wird dabei ein USBasp verwendet):
avrdude -c usbasp -p attiny45 -U hfuse:w:0xDD:m -U lfuse:w:0xEF:m
Wer genau wissen möchte, was mit diesen Fuse-Bits auf dem ATtiny45 eingestellt wird, dem ist z.B. der AVR Fuse Calculator zu empfehlen.
Software
Firmware: Tiny_rc5_usb_mouse.tar.gz
Grundstock der Firmware sind:
- AVR-USB von Objective development
- und eine sehr schöne RC5-Routine von Peter Dannegger
Prinzipiell wird der, von einer RC5-Infrarot-Fernbedienung, gesendete Code decodiert und via USB zum PC gesendet. Dabei meldet sich die Mikrocontroller-Baugruppe als USB-Maus (definiert durch die USB-Klasse und die verwendete Ventor-/Produkt-ID) am PC an, so dass keine speziellen Treiber auf PC-Seite installiert werden müssen.
Durch die verschiedenen Tasten der Fernbedienung werden die 3 üblichen Maustasten und die 4 Richtungen der Mausbewegung emuliert. Welche Tasten es genau sind, kann dem Quelltext der Firmware entnommen werden.
Wenn die Baugruppe hard- und softwareseitig korrekt arbeitet sollte, ist auf einem Linux-PC ungefähr folgendes zu sehen sein:
> dmesg ... usb 1-4.3: new low speed USB device using ehci_hcd and address 41 usb 1-4.3: configuration #1 chosen from 1 choice input: obdev.at DataStore as /class/input/input9 input: USB HID v1.01 Mouse [obdev.at DataStore] on usb-0000:00:02.1-4.3 ...
> lsusb -v ... Bus 001 Device 041: ID 6666:1147 Prototype product Vendor ID Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 1.10 bDeviceClass 0 (Defined at Interface level) bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 8 idVendor 0x6666 Prototype product Vendor ID idProduct 0x1147 bcdDevice 1.00 iManufacturer 1 obdev.at iProduct 2 DataStore iSerial 0 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 34 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 0 bmAttributes 0x80 (Bus Powered) MaxPower 20mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 3 Human Interface Devices bInterfaceSubClass 0 No Subclass bInterfaceProtocol 0 None iInterface 0 HID Device Descriptor: bLength 9 bDescriptorType 33 bcdHID 1.01 bCountryCode 0 Not supported bNumDescriptors 1 bDescriptorType 34 Report wDescriptorLength 52 Report Descriptors: ** UNAVAILABLE ** Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0008 1x 8 bytes bInterval 100 Device Status: 0x0000 (Bus Powered) ...
Ist dies der Fall, kann nun der PC via Infrarot-Fernbedienung gesteuert werden. Z.B. ist soetwas bei Präsentationen ganz praktisch...
Kontakt
Ich, Uwe, bin jederzeit an weiteren Ideen zum Thema Mikrocontroller interessiert!
Weitere Mikrocontroller-Projekte von mir: