Forum: Mikrocontroller und Digitale Elektronik Wie von Python zu I²C via pyUSB und I2C-Tiny-USB gelangen? Wie geht das mit libusb0?


von Peter M. (peter0)


Lesenswert?

Hallo allerseits,

ich möchte von einem Windows-XP-PC aus mittels einer Skriptsprache (am 
liebsten Python – habe Python 2.7 eh installiert) zu Testzwecken mit 
anzuschließenden I²C-Slaves quatschen. Der PC soll also I²C-Master sein.

Dazu habe ich mir Folgendes überlegt:
Hardware-Interface: i2c_tiny_usb  (siehe Anm. 1)

Software-Interface: pyUSB  (siehe Anm. 2)

Bis hierher eine kurze Zwischenfrage: Bin ich schon auf dem Holzweg?

Damit die beiden Ebenen sich verstehen, braucht es noch eine 
Zwischenschicht (wie etwa libusb0, libusbx, libusb-win32, WinUSB). Und 
dort hapert es bei meinem Verständnis. Soweit ich das verstehe, gibt es 
einmal Quellen, die ein C-Programmierer nutzen kann, um in seiner 
Anwendung die bereitgestellte Funktion dynamisch oder statisch 
einzulinken. Andererseits gibt es einen, ich nenne es mal so, Treiber, 
der in meinem Fall von pyUSB benutzt wird, um mit der unterliegenden 
Hardware zu quatschen. (Von pyUSB "Backend" genannt.)
Da ich ja von Python und pyUSB ausgehen will und nicht von C, dachte ich 
an letzteren Fall.

Nach ein bisschen Gesurfe fand ich das hier: 
http://sourceforge.net/projects/libwdi/ . Von dort habe ich 
zadig_v2.0.1.154.7z runtergeladen und damit "libusb-win32" installiert. 
Windows fragt beim Einstecken nun nicht mehr nach Treibern. Das 
Beispielprogramm zu pyUSB (siehe Anmerkung 2 ganz unten) erkennt auch 
das Backend (libusb-win32) und die Hardware (i2c_tiny_usb, idVendor & 
idProduct entsprechend angepasst, natürlich), aber in der dritten Zeile 
nach "# get an endpoint instance", also bei "alternate_setting = …", 
erhalte ich die Fehlermeldung
1
USBError: [Errno None] libusb0-dll:err [control_msg] sending control message failed, win error: Die Anforderung wird nicht unterstützt.
 aus den Tiefen vom pyUSB-Code.

Vom Wortlaut her würde ich das naiverweise so interpretieren, dass pyUSB 
nicht im Backend implementierte Funktionalität nutzen will, dass also 
libusb-win32 nicht neu genug ist.

Hat jemand von Euch hat Erfahrung damit und kann mich in die richtige 
Richtung stupsen, um weiterzukommen?
Ich habe schon verschiedene Backends ausprobiert: Die von zadig 
angebotenen (libusb 1.2.5.0, WinUSB v6.1.7600.16385, libusbK v3.0.4.0), 
libusb_0.1.12.2, libusb-win32-bin-1.2.6.0.
Entweder kommen die genauso weit, oder sie erkennen die Hardware nicht, 
oder pyUSB erkennt sofort das Backend nicht.

Gruß – Peter

1)
Siehe http://www.harbaum.org/till/i2c_tiny_usb/index.shtml . Ich habe 
einfach die dort mitgelieferte Firmware (also die Datei 
i2c_tiny_usb-2009-02-10.zip\i2c_tiny_usb\firmware\firmware.hex ) ohne 
Kompilieren auf den ATTiny45 draufgespielt. Ergebnis: Windows erkennt 
das Teil nach dem Einstecken und will Treiber installieren.
Soweit also erstmal gut.

2)
Siehe http://sourceforge.net/apps/trac/pyusb/ . pyusb-1.0.0a2.zip habe 
ich von dort heruntergeladen und installiert (per "python setup.py 
-install").
Für den Beginn las ich 
https://github.com/walac/pyusb/blob/master/docs/tutorial.rst und dachte, 
erstmal mit dem Beispiel unter "Let's get it started" anzufangen – 
erstmal ignorierend, dass das physische Interface nur per Control 
Endpoint reden möchte.

von Peter M. (peter0)


Lesenswert?


von Rainer U. (r-u)


Lesenswert?

Ein USB-Gerät dafür zu erfinden/zu programmieren ist nicht trivial.

Mach es doch einfacher: Nimm Dir einen AVR, der I2C und RS232 kann (als 
TTL reicht ja). Es gibt jede Menge fertige Adapter USB-RS232. Es gibt 
auch jede Menge Beispielprogramme, um vom PC RS232 zu senden oder zu 
empfangen.

Auf dem AVR schreibst Du ein kleines Programm, das Deine RS232-Eingaben 
interpretiert, nach I2C sendet / empfängt und Dir das I2C-Empfangene per 
RS232 zurücksendet. Wenn das Programm gut ist, kann es verschiedene 
Paketlängen etc. (Manche Chips wollen mehr Bytes als andere... :-)

von Peter (Gast)


Lesenswert?

Es gibt ja die Hardware, die direkt umsetzt; und meine Fragen diesbzgl. 
wurden ja auch beantwortet (siehe Link im Posting vom 4. Oktober).

Irgendwann will ich auch von dem RS232-Scheiß wegkommen.

Gruß – Peter

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.