Forum: Mikrocontroller und Digitale Elektronik AVR per USB als HID-Gerät


von Paul H. (powl)


Lesenswert?

Hi,

in Zukunft werde ich immer wieder Projekte haben bei denen der AVR mit 
dem PC verbunden werden muss und das möglichst über USB. Diese 
Geschichte mit den Virtuellen COM-Ports klingt für mich aber nach 
ziemlichem Murks, da ich aus einem Programm heraus somit nicht erkennen 
kann, ob mein Device nun am PC hängt oder nicht (ohne jetzt auf allen 
freien COM-Ports ne Verbindung aufzubauen und zu fragen "Bist du Device 
XYZ?"), ich müsste das manuell machen. Also CDC ist nix für mich, bleibt 
dann noch HID.

Kann ein USB-Gerät im HID-Modus mit mehr als 100mA an Strom versorgt 
werden oder geht das nur über einen gesonderten Treiber (womit das 
USB-Gerät dann ja auch kein HID mehr wär und wo auch immer man einen 
solchen Treiber nun hernehmen soll...).

Übrigens programmiere ich unter Windows mit C#, hat da schonmal jemand 
was mit USB gemacht? Habe derzeit keine Vorstellung wie man aus C# 
heraus USB-Geräte ansteuert.

lg PoWl

von Christian (Gast)


Lesenswert?

Das mit dem virtuellen ComPort ist einfach nur eine schnelle Lösung.

Mit den FTDI Seriell zu USB Wandlern ist es zb. auch möglich zu erkennen 
ob diese angesteckt sind und auch noch viel mehr. Das Stichwort dafür 
heisst D2XX.dll. Du kannst aus deinem Programm herraus die Funktionen 
der dll nutzen um direkte Verbindungen zu den USB-Seriell Wandlern 
herzustellen, ohne den Umweg über die virtuellen Com Ports.

Das war jetzt zwar nicht direkt die Antwort auf deine Frage aber 
vielleicht hilft es ja auch.

Mfg Christian

von Paul H. (powl)


Lesenswert?

OK, wenn das so möglich ist wär das natürlich recht prima. Ich möchte 
nur den Murks vermeiden, in einer Liste mit möglichen COM-Ports mein 
Gerät herauskramen zu müssen. Wenn das mit der DLL geht wär das schon 
ein entscheidender Schritt. Ich wäre ja auch recht mit einverstanden, 
wenn alle COM-Ports angepollt werden und nach dem verfügbaren Gerät 
gefragt wird, ich hab nur bedenken, dass dadurch andere COM-Geräte 
irgendwelchen Mist machen und danach nicht mehr ansprechbar sind.

Die FTDI-Chips, müssen die nicht zuerst programmiert werden bevor man 
sie benutzen kann? Ist das kompliziert oder kann man dafür schnell ein 
kleines spezialprogramm in den µC in der vorhandenen Schaltung einbauen? 
Wie viel Strom steht durch die FTDI-Chips dem USB-Gerät zur Verfügung?

Die Geräte sollen hinterher teilweise komplett, auch mit bis zu 500mA 
per USB versorgt werden damit ich kein extra Netzteil brauche.

lg PoWl

von Jens S. (Gast)


Lesenswert?

Für C# und USB Programmierung habe ich hier ein paar links, habe mich 
aber auch noch nciht damit befasst, aber du kannst dich gerne mal melden 
wenn du etwas lauffähiges hast :) (habe aber noch nie C# programmiert 
sondern nur C++ und en bissel Java)

http://www.codeproject.com/KB/cs/USB_HID.aspx

http://www.codeproject.com/KB/cs/essentialpinvoke.aspx

http://msdn.microsoft.com/de-de/library/aa446536.aspx


500 mA müsstest du per USB versorgen können, dass ist doch nach Norm die 
höchste zulässige Stromstärke. Oder täusche ich mich nun?

von Christian (Gast)


Lesenswert?

Naja also der Strom geht theoretisch bis zu den 500 mA. Ich hab ehrlich 
gesagt noch nie mehr als 100 mA über USB versorgt.

Die Chips müssen grundsätzlich nicht programmiert werden damit sie 
funktionieren. Die Einstellungen auf dem Chip werden nur über die USB 
Verbindung gemacht. Es gibt dazu ein Programm von FTDI. Nennt sich 
MProg. Da kann man auch schön alle möglichen Einstellungen sehen. 
Besonders kompliziert fand ich das nicht. Die Programmierung ist aber 
auch über die dll möglich. Also könnte das auch ohne weiteres 
automatisiert werden.

Mfg Christian

von Paul H. (powl)


Lesenswert?

Ja, richtig, allerdings kriegen USB-Geräte erstmal nur 100mA zur 
Verfügung. Ich bin mir nun leider nicht so ganz darüber im Klaren ob die 
500mA durch entsprechende PC-Software (mein Programm!) freigegeben 
werden können oder ob es dazu einen gesonderten Treiber braucht (der 
FTDI-Treiber?). Sollten die 500mA auch für CDC-Geräte verfügbar gemacht 
werden können wäre eine solche Lösung ja auch ganz nett, zumal es da 
Projekte gibt, in dem man den AVR im CDC-Modus direkt an USB anschließt.

von Christian (Gast)


Lesenswert?

Bei den FTDI-Chips ist der maximale Strom, der vom Bus gezugen werden 
kann, in den Einstellungen auf dem Chip enthalten. Der Chip stellt dann 
einen PWREN# Pin zur Verfügung, mit dem die größeren Verbraucher nach 
der erfolgreichen Anmeldung eingeschaltet werden können. Aber selber 
verwendet hab ich diese Feature noch nicht. Mfg

von John-eric K. (mockup)


Angehängte Dateien:

Lesenswert?

Also ich habe das so auf meinem AVR-Demoboard.
Und es läuft ohne Probleme, nutze aber den COM-Port, aber das ist ja nur 
eine Treiber sache.
Die Einstellungen werden über MPROG gemacht, hier das PDF dazu 
http://www.ftdichip.com/Resources/Utilities/MProg.pdf
Habe es auch auf 500mA gestellt. Du kannst auch deine eigene PID/VID 
vergeben. Diese muss dann aber in der inf-Datei des Treibers dann mit 
drinne stehen. Kannst sogar einen eigenen Namen vergeben und so.

Das zum Thema ansprechen des Treibers
http://www.ftdichip.com/Documents/ProgramGuides/D2XXPG34.pdf

Gruß John

von Christian (Gast)


Lesenswert?

Wenn man die FT232R Typen nimmt spart man auch das externe EEPROM.

Mfg

von Paul H. (powl)


Lesenswert?

OK, danke, da werd ich mich mal einlesen. Wie schauts mit sowas aus: 
http://www.recursion.jp/avrcdc/

von VUSB (Gast)


Lesenswert?

Und schau Dir mal VUSB an, vielleicht gibt's da die Lösungen, die Du 
suchst.

Die haben eine ganze Seite über damit realisierte HID-Projekte:

http://www.obdev.at/products/vusb/prjhid.html

von Student (Gast)


Lesenswert?

Insbesondere auch die SharpUSBLib dürfte in Verbindung mit C# für dich 
interessant sein...damit geht so ziemlich alles was du an Anforderungen 
hattest, bis auf die Sache mit den 500mA, da bin ich mir nicht sicher...

Hat eben auch den Nachteil dass man das auch alles wirklich selbst 
implementieren muss...

von Student (Gast)


Lesenswert?

Argh, ich meinte natürlich zusammen mit VUSB, also VUSB + C# + 
SharpUSBLib sind eine gute Kombi...

von Paul H. (powl)


Lesenswert?

OK, mal reinlesen. Danke!

Weiß nun jemand noch genau wie es mit dem Strom aussieht? Welche 
möglichkeit gibt es für USB-Geräte an die vollen 500mA zu kommen? Wie 
siehts jeweils für CDC und für HID geräte aus? Können die einfach nach 
mehr Strom nachfragen? Geht das aus der PC-Software heraus mit der die 
Geräte kommunizieren? Oder nur über einen gesonderten Treiber?

lg PoWl

von Thomas R. (tinman) Benutzerseite


Lesenswert?


von rik (Gast)


Lesenswert?

Wie viel Strom Deine Schaltung braucht sagt das Gerät selber. USB ist 
nun mal relativ komplex und wenn man ne eigene ID will auch teuer. Wenn 
man dann noch Treiber unter Windows entwickelt und die von Microsoft 
abgesegnet sein sollen, dann wirds richtig teuer.

Es gibt aber Lösungen um das quasi zu umschiffen. Ein virtueller 
COM-Port ist wohl das einfachste, führt aber die Idee hinter USB ad 
absurdum.
Für AVRs gibts auch einen Software-USB-Stack. Einen Treiber für Linux zu 
schreiben ist auch kein Hexenwerk und die ID kann man bei einem Reseller 
kaufen. Aber für eine große Serienproduktion gibts wohl nur den 
offiziellen weg.

von Paul H. (powl)


Lesenswert?

Ne VID wollte ich mir jetzt nicht unbedingt besorgen müssen. Wann 
braucht man die denn und gibts da Umwege? Was machen die Leute mit ihren 
selbstbau USB-Projekten?

Ich möchte nichts weiter als mit dem USB-Gerät gelegentlich mal ein 
wenig kommunizieren, muss auch erstmal kein dauerhafter und regelmäßiger 
Datenstrom sein. Das USB-Gerät als HID zu verwenden wäre natürlich ne 
möglichkeit, ist aber wohl komplexer da ich mich dann auch noch in die 
SharpUSBLib einarbeiten müsste und mir das gegenüber CDC wohl keine 
Vorteile bringt (widersprecht mir ruhig!). Per CDC könnte ich die 
normalen Serial-Port Funktionen nutzen und einfach alle freien 
verfügbaren COM-Ports anpollen um das Gerät zu erkennen.

So nun zur wichtigsten Frage die über letztes entscheidet: Das USB-Gerät 
sagt dem PC wie viel Strom es benötigt? Geht das auch mit einem 
USB-Device das über CDC am PC dran hängt (braucht man da eigentlich auch 
ne VID)?

lg PoWl

von Thorsten (Gast)


Lesenswert?

Hallo Paul

Eine VID/PID brauchst Du immer. Solange Deine Kombination aus VID/PID 
nicht mit irgend einem existierenden Gerät an Deinem PC kollidiert, hast 
Du auch keine Probleme. In Deinen vier Wänden kann es Dir keiner 
verbieten, bei Problemen kann Dir aber auch keiner helfen und ich würde 
in so einer Situation auch keinen Fremden an meinen PC lassen.

Wenn kein Treiber sich das Gerät anhand der VID/PID Kombination exklusiv 
schnappt, dann ist VID/PID in der Praxis egal und kann auch mehrfach von 
unterschiedlichen Geräten benutzt werden. So gesehen, z.B. bei einem 
portablem Navi. Das hat die Device Klasse Massstorrage, darüber wurde 
der Treiber gefunden. Als VID war die von Microsoft eingetragen und als 
PID 0xFFFF. Nun wird in den Windows CE Lizenz Bedinungen wohl 
drinstehen, dass der Hersteller das durfte. Microsoft wird wohl aber 
etwas dagegen haben, wenn das gleiche Spielchen mit einem AVR getrieben 
worden wäre. Ich habe noch nicht gesehen, dass ein MS-OS auf so einem 
Teil gebootet hat...

Das Feld zur Stromversorgung gibt es bei jeder Konfiguration

Ein Device Descriptor beschreibt das Gerät (VID/PID) Name ... und wie 
viele  Konfigurationen es unterstützt. Eine Konfiguration beschreibt 
dann erst die Geräte Klasse CDC/MDC, da sich ein Gerät einmal als Modem 
ausgeben könnte und wenn es das OS für sinnvoll hält als spezielles 
Gerät oder Masss Storrage Device. In jeder Dieser Konfigurationen kann 
es vorgeben unterschiedlich viel Strom zu verbrauchen. Wenn das Gerät 
nicht gelogen hat, kann so das Betriebssystem entscheiden bei Akku 
betrieb z.B. die sparsamste Konfiguration zu benutzen.

Zu jeder Konfiguration gehören dann ein oder mehr Endpoints über die 
dann die eigentliche Übertragung der Daten stattfindet.

Einerseits gibt es Bücher zu USB, die das Wesentliche zusammen fassen. 
Du wirst aber  nicht um herkommen die Spezifikation zu lesen.

http://www.usb.org/developers/docs/usb_20_052709.zip (1. Einstiegspunkt 
wäre dann usb_20.pdf. )

Da steht von der Bauform der Stecker, über die Signale auf der Leitung, 
Codierung bis hin zu den für alle Geräte gültigen Operationen alles 
drin. Je nachdem für welche Geräteklasse Du Dich entscheidest solltest 
Du auch die Dokumentation dazu lesen.

Viele Grüße,
  Thorsten

von Paul H. (powl)


Lesenswert?

Ich habe das Buch "USB 2.0 Studienausgabe". Ich denk da werde ich mich 
mal reinlesen, das ist zwar trocken, aber nicht ganz so trocken wie die 
reinen specs. Danke!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.