Infrarot-USB-Maus im Eigenbau

Aus BraLUG-Wiki

(Unterschied zwischen Versionen)
Wechseln zu: Navigation, Suche
(Programmieradapter)
(Software)
 
(14 dazwischenliegende Versionen von einem Benutzer werden nicht angezeigt)
Zeile 1: Zeile 1:
 +
[[Kategorie:Hardware]]
 +
 
=Motivation=
 
=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 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 [http://atmel.com/dyn/resources/prod_documents/doc2586.pdf ATtiny45], der für diese Funktion vollkommen ausreicht. Entstanden ist eine kleines kompaktes Modul, welches hier beschrieben werden soll.  
+
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 [http://atmel.com/dyn/resources/prod_documents/doc2586.pdf ATtiny45], der für diese Funktion vollkommen ausreicht. Entstanden ist eine kleines kompaktes Modul, welches hier beschrieben werden soll.
  
 
=Hardware=
 
=Hardware=
Zeile 7: Zeile 9:
 
[[Bild:Ir usb maus schaltung.png|320px|IR-USB-Maus Schaltplan]]
 
[[Bild:Ir usb maus schaltung.png|320px|IR-USB-Maus Schaltplan]]
 
[[Bild:Ir usb maus baugruppe.JPG|320px|IR-USB-Maus Baugruppe]]
 
[[Bild:Ir usb maus baugruppe.JPG|320px|IR-USB-Maus Baugruppe]]
 +
 +
Grundlage der Schaltung ist das [[BLIT2008-Board#Basis-Board|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==
 
==Programmieradapter==
Zeile 12: Zeile 18:
 
[[Bild:Ir usb maus adapter1.JPG|320px|Programmieradapter]]
 
[[Bild:Ir usb maus adapter1.JPG|320px|Programmieradapter]]
 
[[Bild:Ir usb maus adapter2.JPG|320px|Programmieradapter auf ATtiny gesteckt]]
 
[[Bild:Ir usb maus adapter2.JPG|320px|Programmieradapter auf ATtiny gesteckt]]
 +
 +
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 [http://elm-chan.org/works/avrx/report_e.html 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==
 
==Fuse-Bits==
 +
 +
Im Auslieferungszustand des ATtiny sind dessen [http://www.mikrocontroller.net/articles/AVR_Fuses 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 [http://www.mikrocontroller.net/articles/AVRDUDE avrdude], umgestellt werden. Mit folgendem Befehl kann man sinnvolle Werte (lfuse=0XEF; hfuse=0xDD) einstellen (als Programmieradapter wird dabei ein [http://www.fischl.de/usbasp/ 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 [http://www.engbedded.com/cgi-bin/fc.cgi/ AVR Fuse Calculator] zu empfehlen.
  
 
=Software=
 
=Software=
Funktioniert zwar scon, muss aber noch ein wenig verbessert werden. Kommt also, wenn sie fertig ist...
+
 
 +
Firmware: [http://bralug.de/wiki-common/images/f/fd/Tiny_rc5_usb_mouse.tar.gz Tiny_rc5_usb_mouse.tar.gz]
 +
 
 +
Grundstock der Firmware sind:
 +
* [http://obdev.com/products/avrusb/index-de.html AVR-USB] von Objective development
 +
* und eine sehr schöne [http://www.mikrocontroller.net/topic/12216 RC5-Routine] von Peter Dannegger
 +
 
 +
Prinzipiell wird der, von einer [http://www.opendcc.de/info/rc5/rc5.html 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 arbeiten sollte, ist auf einem Linux-PC ungefähr folgendes zu sehen sein:
 +
 +
<code>
 +
> 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
 +
...
 +
</code>
 +
 
 +
<code>
 +
> 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)
 +
...
 +
</code>
 +
 
 +
Ist dies der Fall, kann nun der PC via Infrarot-Fernbedienung gesteuert werden. Z.B. ist soetwas bei Präsentationen ganz praktisch...
  
 
=Kontakt=
 
=Kontakt=

Aktuelle Version vom 8. Januar 2009, 23:42 Uhr


Inhaltsverzeichnis

[Bearbeiten] 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.

[Bearbeiten] Hardware

[Bearbeiten] Schaltung

IR-USB-Maus Schaltplan IR-USB-Maus Baugruppe

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.

[Bearbeiten] Programmieradapter

Programmieradapter Programmieradapter auf ATtiny gesteckt

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...

[Bearbeiten] 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.

[Bearbeiten] Software

Firmware: Tiny_rc5_usb_mouse.tar.gz

Grundstock der Firmware sind:

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 arbeiten 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...

[Bearbeiten] Kontakt

Ich, Uwe, bin jederzeit an weiteren Ideen zum Thema Mikrocontroller interessiert!

Weitere Mikrocontroller-Projekte von mir:

'Persönliche Werkzeuge